gbranden pushed a commit to branch master
in repository groff.
commit 4109dfedea521c33b9c5b12b21dd8de3b6f138f6
Author: G. Branden Robinson <[email protected]>
AuthorDate: Sat Jul 5 11:54:20 2025 -0500
[pic]: Adjust polygon feature (Savannah #67250).
Adopt the term "reference points" for object-relative locators, and
rename the `.p[oint]` specimen thereof to `.mid[point]`.
* src/preproc/pic/lex.cpp (get_token_after_dot):
* src/preproc/pic/yex.cpp: Rename `DOT_P` symbol/token to `DOT_MID`.
* src/preproc/pic/lex.cpp (get_token_after_dot): Recognize `mid` and
`midpoint`, rather than `p` and `point`, as token `DOT_MID` instead of
`DOT_P`.
Fixes <https://savannah.gnu.org/bugs/?67250>. Thanks to Doug McIlroy
for the discussion.
---
ChangeLog | 16 +++++++++++++
doc/pic.ms | 59 +++++++++++++++++++++++++++++-----------------
src/preproc/pic/lex.cpp | 31 +++++++++++++++++-------
src/preproc/pic/object.cpp | 2 +-
src/preproc/pic/pic.1.man | 56 +++++++++++++++++++++++++++++++++----------
src/preproc/pic/pic.ypp | 8 +++----
6 files changed, 124 insertions(+), 48 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 4c7b76190..c53818342 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2025-07-05 G. Branden Robinson <[email protected]>
+
+ [pic]: Adjust new polygon feature. Adopt the term "reference
+ points" for object-relative locators, and rename the `.p[oint]`
+ specimen thereof to `.mid[point]`.
+
+ * src/preproc/pic/lex.cpp (get_token_after_dot):
+ * src/preproc/pic/yex.cpp: Rename `DOT_P` symbol/token to
+ `DOT_MID`.
+ * src/preproc/pic/lex.cpp (get_token_after_dot): Recognize `mid`
+ and `midpoint`, rather than `p` and `point`, as token `DOT_MID`
+ instead of `DOT_P`.
+
+ Fixes <https://savannah.gnu.org/bugs/?67250>. Thanks to Doug
+ McIlroy for the discussion.
+
2025-07-03 G. Branden Robinson <[email protected]>
* src/utils/addftinfo/addftinfo.cpp (usage): Summarize purpose
diff --git a/doc/pic.ms b/doc/pic.ms
index 7f2ba58c2..76a58439e 100644
--- a/doc/pic.ms
+++ b/doc/pic.ms
@@ -655,9 +655,9 @@ GNU \fBgpic\fP supports arbitrary polygons constructed with
the same syntax as m
.KS
.PS
POLY: polygon up 1 then down 0.5 right 1;
-"up 1" rjust at POLY.p`1' + (-0.1, 0.0);
-"down 0.5 right 1" ljust at POLY.p`2' + (0.0, 0.1);
-"automatically drawn" ljust at POLY.p`3' + (0.0, -0.1);
+"up 1" rjust at POLY.mid`1' + (-0.1, 0.0);
+"down 0.5 right 1" ljust at POLY.mid`2' + (0.0, 0.1);
+"automatically drawn" ljust at POLY.mid`3' + (0.0, -0.1);
.PE
.CE "5: \fBpolygon up 1 then down 0.5 right 1\fP"
.LP
@@ -1284,14 +1284,31 @@ critical(spline right 1 then up right then left then
left 1);
.NH 4
Locations Relative to Polygons
.PP
-Polygons have three types of named points: (\fB.vertex\fP, \fB.ver\fP,
\fB.v\fP), (\fB.point\fP, \fB.p\fP), and (\fB.center\fP, \fB.c\fP).
-They can also be used without leading dots in the \fBof\fP prefix form.
-The center of a polygon is the centroid, and may give unexpected results for
non-simple polygons.
-.PP
-\fB.v\fP and \fB.p\fP locate the vertices and mid-points of the edges,
respectively. They can be used in the forms \fB.v\fP \fIexpr\fR
-, or \fB.v\fP \[ga]\fIexpr\fR\[aq].
-The latter is required when the vertex/point expression is followed by an
additional expression,
-as \fBpic\fP will otherwise attempt to reduce them to a single expression.
+Polygons have three types of reference points:
+.I vertices
+(\fB.vertex\fP, \fB.ver\fP, \fB.v\fP),
+.I midpoints
+of edges between the vertices
+(\fB.midpoint\fP, \fB.mid\fP),
+and a
+.I center
+(\fB.center\fP, \fB.c\fP).
+Reference points can be used
+without leading dots in the \fBof\fP prefix form.
+The center of a polygon is the centroid,
+and may give unexpected results for non-simple polygons.
+.PP
+GNU
+.B pic
+numbers vertices and midpoints in drawing order starting from
+.B 1 .
+Express them in the forms \fB.v\fP \fIexpr\fR
+or
+\fB.v\fP \[ga]\fIexpr\fR\[aq].
+The latter is required when the vertex/point expression is followed
+by an additional expression,
+as \fBpic\fP otherwise attempts to reduce them
+to a single expression.
For example,
.IP
.KS
@@ -1300,7 +1317,7 @@ For example,
for i = 1 to n do {
circle rad 0.05 fill 1 at last polygon.vi
}
-circle rad 0.05 fill 1 at last polygon.p \[ga]1\[aq] + (0.0,0.1)
+circle rad 0.05 fill 1 at last polygon.mid \[ga]1\[aq] + (0.0,0.1)
.DE
.R
.KE
@@ -1313,14 +1330,14 @@ define vertices {
dot(VER.c); "\fB.center\fP" at VER.center + (0.0, 0.1)
for i = 1 to $2 do {
dot(VER.vi);
- dot(VER.pi);
+ dot(VER.midi);
}
"\fB.v1\fP" at VER.v`1' + (-0.1, -0.1);
"\fB.v2\fP" at VER.v`2' + (-0.1, 0.1);
"\fB.v3\fP" at VER.v`3' + (0.1, 0.1);
- "\fB.p1\fP" at VER.p`1' + (-0.1, 0.1);
- "\fB.p2\fP" at VER.p`2' + (0.1, 0.1);
- "\fB.p3\fP" at VER.p`3' + (0.1, -0.1);
+ "\fB.mid1\fP" at VER.mid`1' + (-0.1, 0.1);
+ "\fB.mid2\fP" at VER.mid`2' + (0.1, 0.1);
+ "\fB.mid3\fP" at VER.mid`3' + (0.1, -0.1);
]
}
vertices(polygon up 1 then down 0.5 right 1, 3);
@@ -3137,9 +3154,9 @@ There are lots of different ways to specify positions:
<place> ::=
<label>
<label> <corner>
- <label> <vertex>
+ <label> <reference-point>
<corner> [of] <label>
- <vertex> of <label>
+ <reference-point> of <label>
Here
.R
.DE
@@ -3165,11 +3182,11 @@ There are lots of different ways to specify positions:
.DE
.DS
.CW
-<vertex> ::=
+<reference-point> ::=
.v[er[tex]] <expr>
.v[er[tex]] \[ga] <expr> \[aq]
- .p[oint] <expr>
- .p[oint] \[ga] <expr> \[aq]
+ .mid[point] <expr>
+ .mid[point] \[ga] <expr> \[aq]
.R
.DE
.DS
diff --git a/src/preproc/pic/lex.cpp b/src/preproc/pic/lex.cpp
index 43131c6a8..d81781031 100644
--- a/src/preproc/pic/lex.cpp
+++ b/src/preproc/pic/lex.cpp
@@ -892,28 +892,41 @@ int get_token_after_dot(int c)
}
context_buffer = ".v";
return DOT_V;
- case 'p':
+ case 'm':
input_stack::get_char();
c = input_stack::peek_char();
- if (c == 'o') {
+ if (c == 'i') {
input_stack::get_char();
c = input_stack::peek_char();
- if (c == 'i') {
+ if (c == 'd') {
input_stack::get_char();
c = input_stack::peek_char();
- if (c == 'n') {
+ if (c == 'p') {
input_stack::get_char();
c = input_stack::peek_char();
- if (c == 't') {
+ if (c == 'o') {
input_stack::get_char();
- context_buffer = ".point";
- return DOT_P;
+ c = input_stack::peek_char();
+ if (c == 'i') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'n') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ context_buffer = ".midpoint";
+ return DOT_MID;
+ }
+ }
+ }
}
}
+ context_buffer = ".mid";
+ return DOT_MID;
}
}
- context_buffer = ".p";
- return DOT_P;
+ // fall through
default:
context_buffer = '.';
return '.';
diff --git a/src/preproc/pic/object.cpp b/src/preproc/pic/object.cpp
index b5c98d9db..a8e079be0 100644
--- a/src/preproc/pic/object.cpp
+++ b/src/preproc/pic/object.cpp
@@ -1474,7 +1474,7 @@ protected:
int vertex_number;
public:
polygon_object(const position &s, const position &e, position *, int);
- position point(); // Select center point between two vertices
+ position point(); // Select midpoint between two vertices
position vertex(); // Select vertex
position center(); // Calculate centroid of the polygon
void set_vertex_number(int);
diff --git a/src/preproc/pic/pic.1.man b/src/preproc/pic/pic.1.man
index 26357d7ed..97157079f 100644
--- a/src/preproc/pic/pic.1.man
+++ b/src/preproc/pic/pic.1.man
@@ -1329,26 +1329,52 @@ and
.B \%shaded
attributes may be used.
.
-The final drawing position and direction are specified by the last
-user-specified line segment.
+The last user-specified line segment determines the polygon's
+final drawing position and direction.
+.
For example,
draw and fill a triangle
with the following.
-.IP
+.
+.
+.RS
+.P
.EX
polygon up 1 then right 1 down 0.5 fill 0.5
.EE
-.LP
-To position polygons,
-two new suffixes are available:
-.RB \[lq] .v
+.RE
+.
+.
+.P
+Two reference point suffixes permit the positioning
+of drawing elements relative to a polygon.
+.
+.RB \[lq] .vertex
.IR expr \[rq]
-for locating the vertices,
+locates the vertices,
and
-.RB \[lq] .p
+.RB \[lq] .midpoint
.IR expr \[rq]
-for locating the center points of edges.
+for locating the midpoints of edges.
.
+GNU
+.B pic
+numbers vertices and midpoints in drawing order starting from
+.B 1 .
+.
+You can abbreviate
+.B \%.vertex
+as
+.B .v
+or
+.BR .ver ,
+and
+.B \%.midpoint
+as
+.BR .mid .
+.
+.
+.P
For example,
.IP
.EX
@@ -1364,9 +1390,13 @@ arrow down from last polygon.v4
.P
creates and correctly places a flowchart decision diamond.
.
-.B .c
-is also available but the compass points will not work as expected and
-should not be used with polygons.
+.
+.P
+.B \%.center
+.RB ( .c )
+is also available,
+but compass points do not work as expected
+and should not be used with polygons.
.
.
.\" ====================================================================
diff --git a/src/preproc/pic/pic.ypp b/src/preproc/pic/pic.ypp
index 69c99ca43..b34749d7a 100644
--- a/src/preproc/pic/pic.ypp
+++ b/src/preproc/pic/pic.ypp
@@ -179,7 +179,7 @@ char *do_sprintf(const char *fmt, const double *v, int nv);
%token DOT_NW
%token DOT_SW
%token DOT_C
-%token DOT_P
+%token DOT_MID
%token DOT_V
%token DOT_START
%token DOT_END
@@ -275,7 +275,7 @@ parses properly. */
/* these must have higher precedence than CHOP so that 'label %prec CHOP'
works */
-%left DOT_N DOT_E DOT_W DOT_S DOT_NE DOT_SE DOT_NW DOT_SW DOT_C DOT_P DOT_V
+%left DOT_N DOT_E DOT_W DOT_S DOT_NE DOT_SE DOT_NW DOT_SW DOT_C DOT_MID DOT_V
%left DOT_START DOT_END TOP BOTTOM LEFT_CORNER RIGHT_CORNER
%left UPPER LOWER NORTH SOUTH EAST WEST CENTER START END
@@ -1571,13 +1571,13 @@ vertex:
$$.crn = &object::vertex;
$$.vertex_number = $3;
}
- | DOT_P expr
+ | DOT_MID expr
{
$$.crn = &object::point;
$$.vertex_number = $2;
$$.is_edge = 1;
}
- | DOT_P '`' expr '\''
+ | DOT_MID '`' expr '\''
{
$$.crn = &object::point;
$$.vertex_number = $3;
_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit