Please find attached a fix for the reported problem, others like it, and
several other issues.
Please also find attached a diff of the text renderings using groff
1.23.0 and groff 1.24.1, to illustrate the corrected issues. **Note
that SGR escape sequences are present**, so the file must be viewed with
"less -R" or something similarly capable.
I made the following changes.
1. Commented out `UC` macro calls. fvwm was not distributed with 3BSD
(1980). Making this call not only made the man page footers
inaccurate, but clobbered the "Fvwm" indicator of provenance that
otherwise would have been shown.
groff_man(7):
Deprecated features
Use of the following in man pages for public distribution is
discouraged.
...
.UC [version]
Alter the footer for use with legacy BSD man pages,
overriding any definition of the footer‐inside argument to
TH. This macro exists only to render man pages from
historical systems.
The inside footer is populated per the value of version.
3 3rd Berkeley Distribution (default)
4 4th Berkeley Distribution
5 4.2 Berkeley Distribution
6 4.3 Berkeley Distribution
7 4.4 Berkeley Distribution
2. Corrected a markup error fvwm-config(1); you can't employ an `SH`
macro while a `TP` macro's input trap is pending. Doing so is not
specified by any version of man(7) known to me, and it produces
wildly varying results on various formatters.
For more, see <https://savannah.gnu.org/bugs/?68279>.
3. Converted nonidiomatic uses of `IP` in FvwmButtons(1) to use `SS`,
the subsectioning macro, instead. The arguments to "IP" were not
serving as marks or paragraph tags, but as headings. This changed
the indentation of much associated material, fitting more on the
output lines.
4. Converted uses of `IP` for definition lists (syntax synopses) to
`TP` in FvwmButtons(1), FvwmCpp(1), FvwmIconMan(1), FvwmM4(1), and
FvwmRearrange(1), avoiding the abutment problem reported in this
bug.
5. I converted an application of font selection escape sequences in a
paragraph tag in FvwmButtons(1) to use font alternation macros and
the output line continuation escape sequence to solve "the three
font problem".
groff_man_style(7):
• The output line continuation escape sequence \c is used with
font style alternation macros to allow all three font styles to
be set without (breakable) space among them; see subsection
“Portability” below.
...
\c End a text line without inserting space or attempting a
break. Nothing on the input line after this escape
sequence is formatted. \c is useful when three font
styles are needed in a single word, as in a command
synopsis.
.RB [ \-\-stylesheet=\c
.IR name ]
\c also helps when changing font styles in EX/EE
examples, since they are not filled.
.EX
$ \c
.B groff \-T utf8 \-Z \c
.I file \c
.B | grotty \-i
.EE
Normally, if filling is enabled, the formatter treats the
end of a text line like a space. It checks for the end
of a sentence, and may break the output line (if not, it
inserts an adjustable space). If filling is disabled,
the formatter will break the output line, as in EX/EE
examples. The formatter interprets the next input line
as usual, recognizing control lines, including macro
calls (contrast with \newline).
The \f font selection escape sequence is an alternative
to \c; see below. Using \c to continue a TP paragraph
tag across multiple input lines renders incorrectly with
groff 1.22.3, mandoc 1.14.1, older versions of these
programs, and perhaps with some other formatters.
6. In FvwmButtons(1), I unmarked the word "Example:" as a paragraph
mark since it wasn't used that way, and omitting it was more
consistent with other uses of "Example:" in the rest of the
document. See lines 227, 500, and 669.
7. In FvwmIconMan(1), I added some conditional guards around
nonportable attempts at font selection. They'll work on groff and
Heirloom Doctools (at least in its groff compatibility mode) but
elsewhere they are like to not operate. However they should not
cause warnings, and no longer do with groff.
From groff 1.24.0 "NEWS":
* The device-specific macro files loaded by "troffrc" automatically
on startup, such as "html.tmac", no longer perform font
translations for some font names used by varieties of AT&T troff
('C', 'Hb', 'HX', and several others).
These names are not portable: in AT&T troff, the font repertoire,
like the special character repertoire, was device-dependent.
Since groff 1.23.0, GNU troff diagnoses attempts to use
nonexistent font names. We recommend addressing such portability
issues wherever suits you: (1) in a document, perhaps by using
`ie` and `el` requests and the `.g` register to test whether the
formatter claims support for groff extensions, then `ie` and `el`
again with the `F` groff conditional expression operator to check
for font availability, and to perform font remappings with the
groff `ftr` request as desired; (2) doing so in your "troffrc"
file; or (3) by modifying these macro files similarly. Users of
the "dvi" and "lbp" output devices should be aware that these
devices don't supply full families of monospaced fonts (and never
have). See grodvi(1) and grolbp(1) for lists of font names
supported by each device.
The legacy names are retained for the "pdf" and "ps" devices for
this release; however, use of them prompts one warning in the
"font" category from the formatter per deprecated name. We
expect to withdraw support for the names completely in a future
groff release. See gropdf(1) and grops(1) for lists of font
names supported by each device.
8. In FvwmPager(1), I corrected a clearly mistaken font selection
escape sequence, \fT -> \fI. That was likely a typo. With older
versions of groff not throwing diagnostics on failed font
selections, it's no wonder this problem went uncaught for decades.
9. In FvwmRearrange(1), I replaced some blank-line paragraphing with
argumentless `IP` calls, which are more idiomatic.
groff_man_style(7):
.IP [mark [indentation]]
Set an indented paragraph with an optional mark. Arguments,
if present, are handled as with TP, except that the mark
argument to IP cannot include a macro call, and the tag
separation amount stored in the TS register is not enforced.
Two convenient uses for IP are
(1) to start a new paragraph with the same indentation
as an immediately preceding IP or TP paragraph, if
no indentation argument is given; and
(2) to set a paragraph with a short mark that is not
semantically important, such as a bullet
(•)——obtained with the \[bu] special character
escape sequence——or list enumerator, as seen in
this very paragraph.
10. In FvwmRearrange(1), I converted some blank lines prior to section
headings, which cause vertical spacing anyway, with empty requests.
groff_man_style(7):
Fundamental concepts
...
A roff document can contain control lines, which start with a dot
(.) or neutral apostrophe ('). All other input lines are text
lines to be formatted. A macro collects control and/or text lines
to ease document composition. man is a macro package. To call a
macro, put its name after a dot on a control line. Some macros
interpret arguments, words that follow its name. A newline, unless
escaped (see subsection “Portability” below), marks the end of the
macro call. A control line with no macro name on it is called an
empty request; it does nothing.
...
• The empty request (.), which does nothing, vertically spaces the
input file for readability by the document maintainer; see
subsection “Portability” below regarding blank lines.
...
Portability
...
Do not put blank (empty) lines in a man page source document. They
can produce excessive space in the output, or less than is
attempted; some man(1) programs “squeeze” multiple blank output
lines into one.
Regarding the attached diff of rendered pages, here was my technique.
I gathered the set of man pages that appear to maintained in source
form; contrast "perlpod" documents.
$ cat MANS
bin/fvwm-bug.1.in
bin/fvwm-config.1.in
bin/fvwm-convert-2.6.1.in
bin/fvwm-menu-desktop.1.in
bin/fvwm-root.1.in
doc/fvwm/fvwm.1
modules/FvwmAnimate/FvwmAnimate.1.in
modules/FvwmAuto/FvwmAuto.1.in
modules/FvwmBacker/FvwmBacker.1.in
modules/FvwmBanner/FvwmBanner.1.in
modules/FvwmButtons/FvwmButtons.1.in
modules/FvwmCommand/FvwmCommand.1.in
modules/FvwmCommand/scripts/focus-link.1
modules/FvwmConsole/FvwmConsole.1.in
modules/FvwmConsole/FvwmConsoleC.pl.1.in
modules/FvwmCpp/FvwmCpp.1.in
modules/FvwmEvent/FvwmEvent.1.in
modules/FvwmForm/FvwmForm.1.in
modules/FvwmIconMan/FvwmIconMan.1.in
modules/FvwmIdent/FvwmIdent.1.in
modules/FvwmM4/FvwmM4.1.in
modules/FvwmPager/FvwmPager.1.in
modules/FvwmProxy/FvwmProxy.1.in
modules/FvwmRearrange/FvwmRearrange.1.in
modules/FvwmScript/FvwmScript.1.in
$ cat render.bash
#!/bin/bash
MANS=$(<MANS)
(cd fvwm-2.7.0.orig && ~/groff-1.23.0/bin/nroff -d AD=l -r HY=0 -m an $MANS) > fvwm-with-groff-1230.txt
(cd fvwm-2.7.0 && ~/groff-1.24.1/bin/nroff -d AD=l -r BP=7n -r HY=0 -r LL=78n -r TS=1n -m an $MANS) > fvwm-with-groff-1241.txt
$ diff -u fvwm-with-groff-12* | less -R
The string and register settings were to reduce the number of spurious
differences. All are explained in groff 1.24.1's groff_man(7) document.
Besides the 10 changes enumerated above, you'll notice another: the
horizontal rules between documents are 1n shorter in groff 1.24.1.
That's due to a bug fix in GNU tbl(1).
https://savannah.gnu.org/bugs/?62471
Regards,
Branden