summaryrefslogtreecommitdiffstats
path: root/contrib/mm
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 /contrib/mm
parentInitial commit. (diff)
downloadgroff-f22bf21391d2b916c7303c565592ae6e99efbb58.tar.xz
groff-f22bf21391d2b916c7303c565592ae6e99efbb58.zip
Adding upstream version 1.23.0.upstream/1.23.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'contrib/mm')
-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
45 files changed, 22472 insertions, 0 deletions
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: