#1134825 fvwm: Fvwm2Cpp(1) man page: IP mark can directly abut paragraph text in groff 1.24+

Package:
fvwm
Source:
fvwm
Description:
F(?) Virtual Window Manager
Submitter:
Vincent Lefevre
Date:
2026-04-28 13:37:03 UTC
Severity:
normal
#1134825#5
Date:
2026-04-24 17:34:33 UTC
From:
To:
Due to a deliberate change in groff 1.24, "man Fvwm2Cpp" now gives
in Section "CONFIGURATION OPTIONS":

     VERSIONThe X11 version.

     RELEASEThe X server release number.

     OPTIONSSome combination of SHAPE, XPM, NO_SAVEUNDERS, and Cpp, as  defined
            in configure.h at compile time.

("VERSION", "RELEASE" and "OPTIONS" were previously on a separate line
due to the lack of space). See bug 1134776

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1134776

for the explanation. Here, this is due to

.IP VERSION
The X11 version.

etc.

The source of the man page needs an update to avoid IP in this list
of options.

#1134825#8
Date:
2026-04-28 07:23:08 UTC
From:
To:
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

#1134825#13
Date:
2026-04-28 11:46:52 UTC
From:
To:
[...]

Thanks! There is an issue in the diff: the ASCII dashes appear as
U+2010 HYPHEN characters, which is obviously wrong in cases like

  fvwm‐config ‐‐bindir ‐‐mandir ‐‐fvwm‐datadir

#1134825#16
Date:
2026-04-28 13:34:22 UTC
From:
To:
At 2026-04-28T13:46:52+0200, Vincent Lefevre wrote:
are what I maintain.

Debian's packages carry a patch that overcome this issue.

https://salsa.debian.org/debian/groff/-/commit/d5394c68d7

Unescaped hyphens were representative of many other issues with these
man pages I could have addressed, but I allocated only a discrete amount
of time to them.

Bottom line: the issue you note should not be a problem for fvwm on
Debian, unless a site admin edits /etc/groff/man.local to make it
visible again.

Regards,
Branden