At 2023-06-09T02:02:48-0400, Peter Schaffter wrote:
> On Thu, Jun 08, 2023, G. Branden Robinson wrote:
> > At 2023-06-08T18:19:39-0400, Steve Izma wrote:
> > > On Tue, Jun 06, 2023 at 03:07:07PM -0500, G. Branden Robinson wrote:
> > > I'm pretty sure this anomaly has been discussed on the groff list
> > > before, but I don't know of any explanation in the documentation.
> > 
> > It was there until literally days ago.  It seemed like such a subtle
> > point that I thought I might get a Savannah ticket open against it
> > and maybe even fixed for groff-next before anyone noticed.  Sorry.
> > :(
> 
> Hmm...  It might be a subtle point, but mom already compensates for
> it any time \D't n' is used to set line weight in a macro.

Ah.  Unless you compensated with \Z'\D't n'', then it sounds like I need
to sync my pending fix for Savannah #64285 with a change to the mom
macros so that no regression is perceived.

> Equally, the macros for drawing vertical rules, rectangles and
> ellipses always have their depth saved and added to \n[dn] if they are
> the last macro called before completing a diversion.  Not sure how
> germane this is but I thought I should mention it.

I think it's extremely germane to this mail from a week ago:

https://lists.gnu.org/archive/html/groff/2023-06/msg00015.html

This might explain why I've never heard of any complaints.  Only mom(7)
is careful enough to worry about this problem, and she worked around it
internally to the package.  Other *roff users have spent 40+ years
working around it in their _documents_, no doubt.

So similarly to the line thickness issue, I think we should pull this
down into the formatter and coordinate a cut-over to keep mom documents
formatting happily.  But for the broader issue, I have no time frame and
no estimates.

For the line thickness thing, please see the attached diff.

Regards,
Branden
commit 6907eef33bc1f1988b6444dd48963dd0f10fad53
Author:     G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Thu Jun 8 23:08:53 2023 -0500
Commit:     G. Branden Robinson <g.branden.robin...@gmail.com>
CommitDate: Thu Jun 8 23:32:27 2023 -0500

    [troff, grn, pic]: Fix Savannah #64285.
    
    * src/roff/troff/node.cpp (troff_output_file::determine_line_limits):
      Make 't' drawing command perform no limit check at all.  The limit
      check had the side effect of updating the drawing position.
      Consequently...
    
    * src/preproc/grn/hgraph.cpp (HGSetBrush):
    * src/preproc/pic/troff.cpp (troff_output::line_thickness): Stop
      emitting horizontal motion escape sequences to offset the drawing
      position advancement side effect.
    
    Fixes <https://savannah.gnu.org/bugs/?64155>.  Thanks to Steve Izma for
    the report, which came within 2 days of me removing the verbiage warning
    about this weird side effect from our Texinfo manual.
    
    Tested with
    
    ./build/test-groff -pet -ms -Z doc/pic.ms
    ./build/test-groff -M ./doc -ge -me -Z doc/grnexmpl.me
    
    before and after.  This time there were differences, as we'd expect.
    
    Changes to pic-processed documents look like this:
    
    @@ -1905,7 +1905,6 @@
     V301200
     H97200
     Dt -1000 0
    -h1000
     n12000 0
     V319200
     H97200
    @@ -1927,7 +1926,6 @@
     V301200
     H97200
     Dt 100 0
    -H97200
     n12000 0
     V319200
     H187200
    
    Note the repeated absolute horizontal motion in the second hunk.  In the
    first, a relative horizontal motion has gone entirely missing...but
    immediately prior to a line break documentary command and absolute
    motion in both axes.
    
    Changes to grn-processed documents look like this:
    
    @@ -235,7 +235,7 @@
     H79600
     n14400 0
     V203400
    -H72850
    +H73600
     Dt 750 0
     n14400 0
     V387862
    @@ -347,7 +347,7 @@
     DP 0 3385 -1692 0 -1692 -1692 1692 -1693 1692 0
     n14400 0
     V203400
    -H73150
    +H73600
     Dt 450 0
     n14400 0
     V315093
    
    Here, we see horizontal motions larger by exactly as much as the line
    thickness drawing commands formerly caused.
    
    Moreover, the only differences in PostScript output...
    
    ./build/test-groff -pet -ms doc/pic.ms
    ./build/test-groff -M ./doc -ge -me doc/grnexmpl.me
    
    ...are updates to the "CreationDate" comment.

diff --git a/ChangeLog b/ChangeLog
index a5a38ab35..1cd163738 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2023-06-08  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+	[troff, grn, pic]: Fix Savannah #64285.
+
+	* src/roff/troff/node.cpp
+	(troff_output_file::determine_line_limits): Make 't' drawing
+	command perform no limit check at all.  The limit check had the
+	side effect of updating the drawing position.  Consequently...
+	* src/preproc/grn/hgraph.cpp (HGSetBrush):
+	* src/preproc/pic/troff.cpp (troff_output::line_thickness):
+	Stop emitting horizontal motion escape sequences to offset the
+	drawing position advancement side effect.
+
+	Fixes <https://savannah.gnu.org/bugs/?64155>.  Thanks to Steve
+	Izma for the report, which came within 2 days of me removing the
+	verbiage warning about this weird side effect from our Texinfo
+	manual.
+
 2023-06-08  G. Branden Robinson <g.branden.robin...@gmail.com>
 
 	* src/roff/troff/node.cpp
diff --git a/src/preproc/grn/hgraph.cpp b/src/preproc/grn/hgraph.cpp
index 9ed81a449..38fc83f8b 100644
--- a/src/preproc/grn/hgraph.cpp
+++ b/src/preproc/grn/hgraph.cpp
@@ -399,7 +399,7 @@ HGSetBrush(int mode)
   }
   if (linethickness != thick[mode]) {
     linethickness = thick[mode];
-    printf("\\h'-%.2fp'\\D't %.2fp'", linethickness, linethickness);
+    printf("\\D't %.2fp'", linethickness);
     printed = 1;
   }
   if (printed)
diff --git a/src/preproc/pic/troff.cpp b/src/preproc/pic/troff.cpp
index 3dc87a721..00d244c84 100644
--- a/src/preproc/pic/troff.cpp
+++ b/src/preproc/pic/troff.cpp
@@ -475,7 +475,7 @@ void troff_output::line_thickness(double p)
   if (p < 0.0)
     p = RELATIVE_THICKNESS;
   if (driver_extension_flag && p != last_line_thickness) {
-    printf("\\D't %.3fp'\\h'%.3fp'\n.sp -1\n", p, -p);
+    printf("\\D't %.3fp'\n.sp -1\n", p);
     last_line_thickness = p;
   }
 }
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index b272d040a..fcafcd41d 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -1428,8 +1428,10 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
     }
     do_generic_limit_check = false;
     break;
-  case 'l':
   case 't':
+    do_generic_limit_check = false;
+    break;
+  case 'l':
   case '~':
     break;
   default:

commit 312c104976594324b5ddd10acd78f47e72203a16
Author:     G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Thu Jun 8 23:31:26 2023 -0500
Commit:     G. Branden Robinson <g.branden.robin...@gmail.com>
CommitDate: Thu Jun 8 23:32:18 2023 -0500

    [troff]: Warn on unrecognized drawing command.
    
    * src/roff/troff/node.cpp (troff_output_file::determine_line_limits):
      Throw syntax warning if an unrecognized drawing command is
      encountered; it is not ignored, but does use the generic output limit
      check.
    
    * doc/groff.texi (Drawing Geometric Objects):
    * man/groff.7.man (Drawing commands): Document handling of unrecognized
      drawing commands.
    
    * doc/groff.texi (Warnings):
    * src/roff/troff/troff.1.man (Warnings): Document new use of "syntax"
      warning category.

diff --git a/ChangeLog b/ChangeLog
index a240e1468..a5a38ab35 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2023-06-08  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+	* src/roff/troff/node.cpp
+	(troff_output_file::determine_line_limits): Throw syntax warning
+	if an unrecognized drawing command is encountered; it is not
+	ignored, but does use the generic output limit check.
+
 2023-06-08  G. Branden Robinson <g.branden.robin...@gmail.com>
 
 	* src/roff/troff/node.cpp
diff --git a/doc/groff.texi b/doc/groff.texi
index 6372162ac..0e2a0ce09 100644
--- a/doc/groff.texi
+++ b/doc/groff.texi
@@ -14208,6 +14208,14 @@ @node Drawing Geometric Objects
 default.
 @end table
 @endDefesc
+
+Unrecognized drawing commands cause GNU @code{troff} to emit a warning
+in the @code{syntax} category, but are still sent to the output device
+to support device-specific extensions.  Such commands are assumed to
+update the drawing position to the final coordinate pair in their
+argument list.  To override this assumption, wrap such a drawing command
+escape sequence with the @code{\Z} escape sequence.  @xref{Page
+Motions}.
 @c END Keep (roughly) parallel with subsection "Drawing commands" of
 @c groff(7).
 
@@ -16861,8 +16869,9 @@ @node Warnings
 A self-contradictory hyphenation mode was requested; an empty or
 incomplete numeric expression was encountered; an operand to a numeric
 operator was missing; an attempt was made to define a recursive, empty,
-or nonsensical character class; or a @code{groff} extension conditional
-expression operator was used while in compatibility mode.
+or nonsensical character class; an unrecognized drawing command was
+encountered; or a @code{groff} extension conditional expression operator
+was used while in compatibility mode.
 
 @item di
 @itemx 256
diff --git a/man/groff.7.man b/man/groff.7.man
index 40ca41297..78c22fa3b 100644
--- a/man/groff.7.man
+++ b/man/groff.7.man
@@ -5541,6 +5541,25 @@ .SS "Drawing commands"
 selects a thickness proportional to the type size;
 this is the default.
 .LE
+.
+.
+.P
+Unrecognized drawing commands cause GNU
+.I troff \" GNU
+to emit a warning in the
+.B syntax
+category,
+but are still sent to the output device to support device-specific
+extensions.
+.
+Such commands are assumed to update the drawing position to the final
+coordinate pair in their argument list.
+.
+To override this assumption,
+wrap such a drawing command escape sequence with the
+.B \[rs]Z
+escape sequence.
+.\" @xref{Page Motions}.
 .\" END Keep (roughly) parallel with groff.texi node "Drawing
 .\" commands".
 .
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index 82f487fee..b272d040a 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -1433,6 +1433,7 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
   case '~':
     break;
   default:
+    warning(WARN_SYNTAX, "unrecognized drawing command '%1'", code);
     break;
   }
 
diff --git a/src/roff/troff/troff.1.man b/src/roff/troff/troff.1.man
index d83c4a515..03815da01 100644
--- a/src/roff/troff/troff.1.man
+++ b/src/roff/troff/troff.1.man
@@ -744,6 +744,7 @@ .SH Warnings
 an attempt was made to define a recursive,
 empty,
 or nonsensical character class;
+an unrecognized drawing command was encountered;
 or a
 .I groff
 extension conditional expression operator was used while in

commit 342452d25d2ff0123dd415c64ae184d3b87da3d5
Author:     G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Thu Jun 8 20:11:09 2023 -0500
Commit:     G. Branden Robinson <g.branden.robin...@gmail.com>
CommitDate: Thu Jun 8 23:28:57 2023 -0500

    [troff]: Refactor to clarify.
    
    * src/roff/troff/node.cpp (troff_output_file::determine_line_limits):
      Make the 'l', 't', and '~' commands (more clearly) use the generic
      output limit check.  More clearly make the 'a' command not use it.
    
    Tested with
    
    ./build/test-groff -pet -ms -Z doc/pic.ms
    ./build/test-groff -M ./doc -ge -me -Z doc/grnexmpl.me
    
    before and after.  No change.

diff --git a/ChangeLog b/ChangeLog
index c2774fbba..a240e1468 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2023-06-08  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+	* src/roff/troff/node.cpp
+	(troff_output_file::determine_line_limits): Make the 'l', 't',
+	and '~' commands (more clearly) use the generic output limit
+	check.  More clearly make the 'a' command not use it.
+
 2023-06-08  G. Branden Robinson <g.branden.robin...@gmail.com>
 
 	* src/roff/troff/node.cpp
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index bca8a3f7e..82f487fee 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -1408,8 +1408,6 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
     }
     do_generic_limit_check = false;
     break;
-  case 't':
-    break;
   case 'a':
     double c[2];
     int p[4];
@@ -1427,12 +1425,13 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
 			      &minx, &maxx, &miny, &maxy);
       check_output_limits(minx, miny);
       check_output_limits(maxx, maxy);
-      break;
     }
-    // fall through
-  case 'l':
     do_generic_limit_check = false;
     break;
+  case 'l':
+  case 't':
+  case '~':
+    break;
   default:
     break;
   }

commit 89c9ca9eaff009ef005409295c50ef9137bb4b00
Author:     G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Thu Jun 8 19:46:29 2023 -0500
Commit:     G. Branden Robinson <g.branden.robin...@gmail.com>
CommitDate: Thu Jun 8 22:43:50 2023 -0500

    [troff]: Slightly refactor.
    
    * src/roff/troff/node.cpp (troff_output_file::determine_line_limits):
      Slightly refactor.  Stop repeating code.  Add new Boolean,
      `do_generic_limit_check`, defaulting true.  In the switch that handles
      various drawing commands, set it false for those that perform
      specialized output limit checks.
    
    Tested with
    
    ./build/test-groff -pet -ms -Z doc/pic.ms
    ./build/test-groff -M ./doc -ge -me -Z doc/grnexmpl.me
    
    before and after.  No change.

diff --git a/ChangeLog b/ChangeLog
index 3156b69b2..c2774fbba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2023-06-08  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+	* src/roff/troff/node.cpp
+	(troff_output_file::determine_line_limits): Slightly refactor.
+	Stop repeating code.  Add new Boolean, `do_generic_limit_check`,
+	defaulting true.  In the switch that handles various drawing
+	commands, set it false for those that perform specialized output
+	limit checks.
+
 2023-06-08  G. Branden Robinson <g.branden.robin...@gmail.com>
 
 	[man, mdoc]: Parameterize page offset.
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index 4d872189e..bca8a3f7e 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -1373,6 +1373,7 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
 					      int npoints)
 {
   int i, x, y;
+  bool do_generic_limit_check = true;
 
   if (!is_on())
     return;
@@ -1385,6 +1386,7 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
 			output_vpos - point[0].h.to_units()/2);
     check_output_limits(output_hpos + point[0].h.to_units(),
 			output_vpos + point[0].h.to_units()/2);
+    do_generic_limit_check = false;
     break;
   case 'E':
   case 'e':
@@ -1392,6 +1394,7 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
 			output_vpos - point[0].v.to_units()/2);
     check_output_limits(output_hpos + point[0].h.to_units(),
 			output_vpos + point[0].v.to_units()/2);
+    do_generic_limit_check = false;
     break;
   case 'P':
   case 'p':
@@ -1403,15 +1406,9 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
       y += point[i].v.to_units();
       check_output_limits(x, y);
     }
+    do_generic_limit_check = false;
     break;
   case 't':
-    x = output_hpos;
-    y = output_vpos;
-    for (i = 0; i < npoints; i++) {
-      x += point[i].h.to_units();
-      y += point[i].v.to_units();
-      check_output_limits(x, y);
-    }
     break;
   case 'a':
     double c[2];
@@ -1434,16 +1431,13 @@ void troff_output_file::determine_line_limits(char code, hvpair *point,
     }
     // fall through
   case 'l':
-    x = output_hpos;
-    y = output_vpos;
-    check_output_limits(x, y);
-    for (i = 0; i < npoints; i++) {
-      x += point[i].h.to_units();
-      y += point[i].v.to_units();
-      check_output_limits(x, y);
-    }
+    do_generic_limit_check = false;
     break;
   default:
+    break;
+  }
+
+  if (do_generic_limit_check) {
     x = output_hpos;
     y = output_vpos;
     for (i = 0; i < npoints; i++) {

Attachment: signature.asc
Description: PGP signature

Reply via email to