Update of bug #64275 (group groff):
Status: None => In Progress
Assigned to: None => gbranden
Planned Release: None => 1.25.0
Summary: [troff] throw warning in "style" category when
temporary indentation used with `ce` and `rj` => [PATCH] [troff] throw warning
in "style" category when temporary indentation used with `ce` and `rj`
_______________________________________________________
Follow-up Comment #2:
diff --git a/ChangeLog b/ChangeLog
index fead03ec8..7cd62918b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,35 @@
+2026-03-14 G. Branden Robinson <[email protected]>
+
+ * src/roff/troff/env.cpp: Throw warning in category "style" if
+ {a} centering or right-alignment is configured while a temporary
+ indentation is in effect; or {b} a temporary indentation request
+ is issued while centering or right-alignment are in effect.
+ (cancel_temporary_indentation): New function--which I suspect
+ should be a member function of class `environment`, but which
+ would be confusingly inconsistent with existing practice--sets
+ the temporary indentation amount to zero and sets the property
+ of having a temporary indent off. (Those are not the same
+ thing. Temporary indentation _overrides_ ordinary indentation,
+ so a temporary indent of zero is often sensible.) Also tell the
+ mysterious MTSM machine that temporary indentation is off.
+ (center): Throw the aforementioned warning from this `ce`
+ request handler.
+ (right_justify): Throw the aforementioned warning from this `rj`
+ request handler.
+ (temporary_indent): Throw the aforementioned warning from this
+ `ti` request handler.
+ * src/roff/troff/env.h (class environment): Declare new non-OO
+ `cancel_temporary_indentation()` function as a friend.
+ {Eighties-style. <finger guns>}
+
+ * doc/groff.texi.in (Warnings):
+ * src/roff/troff/troff.1.man (Warnings): Document it.
+
+ Fixes <https://savannah.gnu.org/bugs/?64275>. See
+ <https://lists.gnu.org/archive/html/groff/2023-05/msg00079.html>
+ for illustration of the ill-defined composition of these
+ features and (brief) discussion.
+
2026-03-14 G. Branden Robinson <[email protected]>
* src/roff/troff/env.cpp (environment::space): Throw warning in
diff --git a/doc/groff.texi.in b/doc/groff.texi.in
index 9986d0b37..0271d139d 100644
--- a/doc/groff.texi.in
+++ b/doc/groff.texi.in
@@ -21535,7 +21535,10 @@
Input was non-idiomatic or likely to produce an unexpected result
(or none at all),
but is not invalid:
-the end of a sentence was detected prior to the end of a text line.
+the end of a sentence was detected prior to the end of a text line;
+or
+an attempt was made to combine temporary indentation
+with centering or right-adjustment.
@item scale
@itemx 32
diff --git a/src/roff/troff/env.cpp b/src/roff/troff/env.cpp
index b9db99ca1..173b6f0ba 100644
--- a/src/roff/troff/env.cpp
+++ b/src/roff/troff/env.cpp
@@ -1463,6 +1463,13 @@ void no_fill()
tok.next();
}
+void cancel_temporary_indentation()
+{
+ curenv->temporary_indent = 0;
+ curenv->have_temporary_indent = false;
+ curdiv->modified_tag.excl(MTSM_TI);
+}
+
void center()
{
int n;
@@ -1474,6 +1481,10 @@ void center()
tok.next();
if (was_invoked_with_regular_control_character)
curenv->do_break();
+ if (curenv->have_temporary_indent)
+ warning(WARN_STYLE, "ignoring temporary indentation while"
+ " centering request in effect");
+ cancel_temporary_indentation();
curenv->right_aligned_line_count = 0;
curenv->centered_line_count = n;
curdiv->modified_tag.incl(MTSM_CE);
@@ -1491,6 +1502,10 @@ void right_justify()
tok.next();
if (was_invoked_with_regular_control_character)
curenv->do_break();
+ if (curenv->have_temporary_indent)
+ warning(WARN_STYLE, "ignoring temporary indentation while"
+ " right-alignment request in effect");
+ cancel_temporary_indentation();
curenv->centered_line_count = 0;
curenv->right_aligned_line_count = n;
curdiv->modified_tag.incl(MTSM_RJ);
@@ -1619,8 +1634,19 @@ void temporary_indent()
// character this request still breaks the line.
}
else {
+ if (curenv->centered_line_count > 0) {
+ is_valid = false;
+ warning(WARN_STYLE, "ignoring temporary indentation request while"
+ " centering text");
+ }
+ if (curenv->right_aligned_line_count > 0) {
+ is_valid = false;
+ warning(WARN_STYLE, "ignoring temporary indentation request while"
+ " right-aligning text");
+ }
if (!read_hunits(&temp, 'm', curenv->get_indent()))
is_valid = false;
+ // XXX: Why not `skip_line()`?
while (!tok.is_newline() && !tok.is_eof())
tok.next();
}
@@ -1636,7 +1662,7 @@ void temporary_indent()
curenv->have_temporary_indent = true;
curdiv->modified_tag.incl(MTSM_TI);
}
- tok.next();
+ tok.next(); // XXX: Why not `skip_line()`?
}
void configure_underlining(bool want_spaces_underlined)
diff --git a/src/roff/troff/env.h b/src/roff/troff/env.h
index 25612b1f9..c2e7935f6 100644
--- a/src/roff/troff/env.h
+++ b/src/roff/troff/env.h
@@ -104,6 +104,11 @@ class font_family;
class pending_output_line;
// declarations to avoid friend name injection problems
+// XXX: Why are all of these global functions and not object methods?
+// Can't we make most/all of these ordinary member functions of class
+// `environment`? And have request handlers read and validate request
+// arguments and then, if everything is kosher, call curenv->[one of the
+// below]? --GBR, 2026
void title_length();
void space_size();
void fill();
@@ -403,6 +408,7 @@ public:
friend void temporary_indent();
friend void configure_underlining(bool);
friend void do_input_trap(bool);
+ friend void cancel_temporary_indentation();
friend void set_tabs();
friend void margin_character();
friend void no_number();
diff --git a/src/roff/troff/troff.1.man b/src/roff/troff/troff.1.man
index 39fdd7372..b61f0c604 100644
--- a/src/roff/troff/troff.1.man
+++ b/src/roff/troff/troff.1.man
@@ -813,7 +813,10 @@ .SH Warnings
Input was non-idiomatic or likely to produce an unexpected result
(or none at all),
but is not invalid:
-the end of a sentence was detected prior to the end of a text line.
+the end of a sentence was detected prior to the end of a text line;
+or
+an attempt was made to combine temporary indentation
+with centering or right-adjustment.
T}
.
.
_______________________________________________________
Reply to this item at:
<https://savannah.gnu.org/bugs/?64275>
_______________________________________________
Message sent via Savannah
https://savannah.gnu.org/
signature.asc
Description: PGP signature
