Hi Russ,

At 2026-07-11T08:58:35-0700, Russ Allbery wrote:
> "G. Branden Robinson" <[email protected]> writes:
> > At 2026-06-19T03:07:34+0200, Guillem Jover wrote:
> 
> >> Hmm, this seems unrelated though? Or I don't understand the
> >> relation between CW/CR and .IP? (Just in case, I tried to call
> >> pod2man with --fixed=CR but that did not seem to fix this problem?)
> 
> > There are multiple changes queued up in pod2man.  Yes, the font name
> > selection issue is separate from the indentation applied to
> > paragraphs populated with the `IP` man(7) macro.
> 
> I have not made any changes in podlators in Git related to the .IP
> macro.

Acknowledged.

> This is the first that I've heard of this backwards-incompatible
> change in groff.

I see.  Tracking upstream changes across high-volume development
channels--and the groff-commit list is surely that--can challenge
downstream maintainers.  This change percolated in groff's Git "master"
branch for two years, followed by four public release candidates, and
then the final 1.24.0 release announcement, without drawing comment.

https://lists.gnu.org/archive/html/groff-commit/2024-01/msg00148.html
https://lists.gnu.org/archive/html/info-groff/2026-01/msg00000.html
https://lists.gnu.org/archive/html/info-groff/2026-01/msg00001.html
https://lists.gnu.org/archive/html/info-groff/2026-02/msg00000.html
https://lists.gnu.org/archive/html/info-groff/2026-02/msg00001.html
https://lists.gnu.org/archive/html/info-groff/2026-02/msg00002.html

What notification channels do you suggest are more appropriate for a
tool generating input for groff?

An approach I am keen to avoid, but with which we are both familiar, is
building a private, solicited, closed circle of "trusted" downstream
maintainers and/or "stakeholders" who expect the groff maintainer to
quietly seek their approval before making behavioral changes.  While
stratified governance models are common in FLOSS projects, the groff
project does not operate that way.

The groff discussion list has maintained a flat community of co-equal
participants since May 1999.  It is, I think, a proud tradition--one
that I aim to preserve.  Changes are debated openly, and all
participants are heard on an equitable footing.

> > The change in `IP` handling is known in _groff_ upstream, and
> > documented in the groff 1.24.0 release notes.
> 
> > NEWS:
> 
> > *  The an (man) macro package's `IP` macro no longer honors the
> >    formerly hard-coded 1n tag separation noted in the previous item.
> >    This means that the first argument to the `IP` macro can abut the
> >    text of the paragraph with no intervening space.  If you use a
> >    word instead of punctuation or a list enumerator for `IP`'s first
> >    argument, consider migrating to `TP`.
> 
> What was the motivation for making this change?

1.  It relieves man(7) authors of having to undertake hacks to
    "backspace" over the tag separation when they didn't want it, which
    can (heretofore) be achieved only by inlining horizontal motion
    escape sequences like `\h'1n'` or embedded ASCII BS (\010)
    characters in the text stream, an obscure feature.

    I noticed this problem in groff's own man pages; historically, it
    appears in gropdf(1) and grops(1).  (I didn't put it there.)

2.  It gives the `IP` and `TP` macros different reasons for existing
    from a semantic perspective, a distinction that has been lacking in
    the man(7) language.  Any paragraph mark that one might use, such as
    `*`, `-`, `+`, or `(1)`, could be simply an item mark, or could have
    semantic meaning, with the former examples being especially common
    in documentation of programming languages or any tool that can
    evaluate arithmetic expressions.  To date, in man(7), there has been
    no way at the lexical level to distinguish these.

    I admit I don't know how POD solves this problem for its own
    purposes when faced with `=over` and then `=item`, and the first
    item is a symbol that _looks_ like an enumerator or unordered list
    mark.  Maybe you could tell me.

    If you expect the POD author to say `=item C<*>` instead of `=item
    *` to begin a list of language operators, then you are asking that
    author for the same semantic hint that I am.

> Nothing about the handling of .IP has changed in podlators since 2001
> and I don't remember encountering this problem before.  It seems
> strictly worse than the previous behavior?

What's worse about it?

> > If by "upstream" you meant pod2man, it's worth exploring whether that
> > tool is generating `TP` macros for things like definition lists, or
> > `IP`. `TP` is a better choice and it is going to become increasingly
> > important given changes expected in groff 1.25 and planned for the
> > future.
> 
> I suppose I can do this if I have to,

No one is saying you have to do it.  If Debian applies the workaround I
suggested and which Vincent passed along in comment #10, Debian's users
will never be exposed to the change.

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

In your upstream capacity, you can point other distributors to the same
workaround, and/or advise users to raise their concerns on the groff
discussion list, where they'll be heard, as noted, co-equally with
everyone else.

> but to say that I'm annoyed at being asked to change something that
> was working fine because groff decided to break existing manual pages
> is putting it mildly.

I'm sorry to hear that.  I've stated the objectives above.  Ah, I see
that you took note of them in a subsequent follow-up.  I'll go ahead and
quote that now.

>> Schematically:
> 
>> IP
>> +-- ordered/enumerated list item (HTML: <OL><LI>)
>> +-- unordered/marked list item (HTML: <UL><LI>)
> 
>> TP
>> +-- definition list item (HTML: <DL><LI>)
> 
> [citation needed]

The foregoing translation to HTML is not yet implemented, because
grohtml(1) has proven challenging to work on.  I hope to land the change
in time for groff 1.26, scheduled for December of this year.  The
progress of this work is tracked in Savannah #68335.

https://savannah.gnu.org/bugs/?68335

You can find the design sketch and discussion in the GNU coreutils
discussion list, whence it arose organically in response to a technique
involving the `PD` macro that Pádraig Brady was using to achieve
"compact list rendering", and which I had seen other seasoned man(7)
authors, like Chet Ramey, use.  The `PD` technique is tedious and
error-prone.

https://lists.gnu.org/r/coreutils/2026-05/msg00021.html

> I have not seen any indication that the difference between .TP and .IP
> has any semantic meaning in the documentation that I have previously
> reason.

That's because no such distinction has heretofore existed.  There's been
no way to express "this blob of text has inherent semantics and should
be indexed and/or 'tagged' as a potential hyperlink destination".

> It's of course possible that I have missed something along the way.

No, not in this case.  Just a point of evolution.

> pod2man has used .IP exclusively since Tom Christansen's original
> version in the 1990s, so the corpus of man pages that a semantic
> change to .IP will break is not small.

I'd say it's not a semantic change because `IP` hasn't had a semantic
value to change, or impart.  The change that prompted this Debian bug
report is to rendering/formatting.

> > On the bright side, I know of no man(7) generator that is so
> > militant, so, with a _little_ adaptation on their part, we can more
> > strongly semantically distinguish the purposes of `IP` and `TP`, and
> > potentially reap rich rewards in improving the searchability and
> > navigability of man(7) documents.
> 
> I appreciate why you want to do this, but I'm not particularly
> enthused about helping.

Okay.

> It seems like a hack.

What alternative do you propose?  Adding yet another new macro seems
like a non-starter; we already have two for _almost_ the same purpose.
(Similarly, I find the presence of 3 synonymous paragraphing macros,
`LP`, `PP`, and `P`, an annoyance.)  A new macro meaning "semantic tag
here" faces an immensely strong headwind: text discard by renderers that
have no definition for it.

> I have been headed in the opposite direction in general in pod2man
> from hard-won experience:

Do you expect to ever stop emitting `IX` calls in podlators's man(7)
output?  Why or why not?

> removing attempts to guess at the user's meaning by imposing semantics
> where there were no semantics in the original input,

That's what this change attempts to do; by corraling non-semantic
paragraph marks within the `IP` pen, and "meaningful" paragraph marks in
the `TP` pen, groff man(7) encourages the author to _express_ what had
previously been implicit and unreliably guessable.

* This is a multiplication operator.

* This is a paragraph bullet.

> and accepting the limitations of the input method.

People have been unwilling to accept the limitations of the man(7)
format in this respect since approximately 1990, with 4.3BSD-Reno's
mdoc(7) package.  Sadly, for a variety of reasons, alternatives have
failed to reach "critical mass".

https://lore.kernel.org/linux-man/alFWqYWKJkQQxtJ6@devuan/T/#m9fda91ba28ca257c67d4595f81d38b32c5c9c937

Among the deepest of those reasons, one that has to date defeated any
technology or tooling thrown at the problem, is that it's a huge
challenge to get hackers to think in terms of semantic categories when
they write documentation.  "Vibe coding"--pattern-driven composition of
program code--is not new, but an old phenomenon newly accelerated by LLM
assistance.  Asking hackers to apply semantic categories to the
conceptual lexicon embodied by the code they've written is like asking
them to red-team their own design.

(Back when I worked at Progeny, developing our Debian-based distro, my
friend and colleague Tim Ottinger labelled me "the lexicon guy" because
I was always asking for meaningful labels we could apply to the notions
our programming team came up with while prototyping.)

One thing hackers _can_ do pretty reliably, though, is distinguish a
"literal" from a "non-literal".  Or, in this context, a "non-semantic"
paragraph mark that is simply a bullet splat or list enumerator versus a
semantically loaded integer like '128' or a multiplication operator that
happens to be graphically represented by a bullet splat.

Thus, from one digital bit of information--`IP` or `TP`?--we can
leverage an advantage in semantic interconnect and document navigation.

Again, as I noted, POD already tried, and apparently succeeded, at
solving this problem with all those `IX` calls--but only for its own
ecosystem, and not in a way that was generally leveragable via man(1)
and the pager.  I think the problem _can_ be solved at that level, and
would like to do so.

You do not have to help in this effort.  POD already has something that
works.  But I think, with only a modest effort, non-POD man pages can
enjoy the semantic advantage of POD's `IX` calls--and more.

Regards,
Branden

Attachment: signature.asc
Description: PGP signature

Reply via email to