bug-groff
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug #60836] Improve documentation of output-comparison operator


From: G. Branden Robinson
Subject: [bug #60836] Improve documentation of output-comparison operator
Date: Thu, 13 Jan 2022 20:54:52 -0500 (EST)
User-agent: Lynx/2.8.9rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/3.6.7

Follow-up Comment #10, bug #60836 (project groff):

Hi Dave,

I still wasn't happy with this.  The following commit is pending; please
let me know what you think.


$ git show --word-diff
commit 274038e9955a88a2e595c7133a050b99ef901a36 (HEAD -> master)
Author: G. Branden Robinson <g.branden.robinson@gmail.com>
Date:   Fri Jan 14 12:44:02 2022 +1100

    [docs]: Explain output comparison operator, pt. 2.
    
    Whack on it some more.
    
    * Tighten verbiage about delimited arguments; this is covered at length
      in an earlier node, already cross-referenced.
    * Motions do _not_ have to "exactly" match, but only insofar as the
      device is capable of distinguishing them: explain.
    * Explicitly identify "string comparison" as an application of \? with
      the output comparison operator.
    * Point out that while this sort of string comparison doesn't require
      valid groff syntax, the escape character still serves its _lexical_
      function.  (Blissfully, people looking for a string comparison
      operator are probably accustomed to the possibility of escape
      characters in comparands.)
    * Tighten wording about operator combinations, and refer to the `!`
      correctly as performing complementation, not negation.
    
    Port the foregoing discussion, minus examples, to groff(7).

diff --git a/doc/groff.texi b/doc/groff.texi
index 0e7063cde..9ec847d0a 100644
--- a/doc/groff.texi
+++ b/doc/groff.texi
@@ -11835,11 +11835,10 @@ Versatec and Benson-Varian plotters.}

@item @code{'}@var{xxx}@code{'}@var{yyy}@code{'}
True if formatting the comparands @var{xxx} and @var{yyy} produces the
same[-motions, glyphs, and-] output commands.  Other
[-characters-]{+delimiters+} can be used in place of the
[-single quotes; the same set of delimiters as for-]
[-the @code{\D} escape is used-]{+neutral apostrophes+} (@pxref{Escape
Sequences}).  GNU @code{troff}
formats @var{xxx} and @var{yyy} in separate environments; after the
[-comparison-]{+comparison,+} the resulting data are discarded.

@Example
.ie "|"\fR|\fP" \
@@ -11856,20 +11855,23 @@ sequences used to obtain them.  In the previous
example, @samp{|} and
@samp{\fR|\fP} result in @samp{|} glyphs in the same typefaces at the
same positions, so the comparands are equal.  If @samp{.ft@tie{}I} had
been added before the @samp{.ie}, they would differ: the first @samp{|}
would produce an italic @samp{|}, not a roman one.  [-By contrast,
motions-]{+Motions+} must [-@emph{exactly} match.-]{+match+}
{+in orientation and magnitude to within the applicable horizontal or+}
{+vertical resolution of the device, after rounding.+}  @samp{.if
[-"\u\d""}-]{+"\u\d"\v'0'"}+} is false even though both comparands result in
zero net
motion, because motions are not interpreted or optimized but sent as-is
to the output.@footnote{Because formatting of the comparands takes place
in a dummy environment, vertical motions within them cannot spring
traps.}  On the other hand, @samp{.if "\d"\v'0.5m'"} is true, because
@code{\d} is defined as a downward motion of one-half em.@footnote{All
of this is to say that the lists of output nodes created by formatting
@var{xxx} and @var{yyy} must be identical.  @xref{Gtroff Internals}.}

@cindex string comparison
@cindex comparison of strings
Surround the comparands with @code{\?} to avoid formatting [-them.-]{+them;
this+}
{+causes them to be compared character by character, as with string+}
{+comparisons in other programming languages.+}

@Example
.ie "\?|\?"\?\fR|\fP\?" \
@@ -11883,23 +11885,25 @@ false
@cindex copy mode, and @code{\?}
@cindex mode, copy, and @code{\?}
@noindent
Since comparands protected with @code{\?} are read in copy mode, [-it
is-]{+they+}
{+need+} not [-erroneous to use syntactically invalid input.-]{+even be valid
@code{groff} syntax.  The escape character is+}
{+still lexically recognized, however, and consumes the next character.+}

@Example
.ds a \[
.ds b \[
[-.ie-]{+.if+} '\?\*a\?'\?\*b\?' [-\-]{+a and b+} true
[-.el \-]
[-false-]{+.if '\?\\?'\?\\?' backslash true \" doesn't work+}
    @result{} {+a and b+} true
{+@c slack lines for pagination control+}
{+@c    @error{} warning: missing closing delimiter in+}
{+@c    @error{} conditional expression (got newline)+}
@endExample
@end table

The above operators can't be combined with [-others like @samp{:} or-]
[-@samp{&}; only-]{+most others, but+} a leading
@samp{!} (without spaces or tabs between the exclamation mark and the
operator) can be used to [-negate-]{+complement+} the result.

@Example
.nr x 1
diff --git a/man/groff.7.man b/man/groff.7.man
index e88633873..e11c2570e 100644
--- a/man/groff.7.man
+++ b/man/groff.7.man
@@ -1242,6 +1242,8 @@ The truth values of other conditional expression
operators are as shown
below.
.
.
{+.\" BEGIN Keep (roughly) parallel with groff.texi node "Operators in+}
{+.\" Conditionals".+}
.P
.ne 14v
.TS
@@ -1326,12 +1328,74 @@ T}
.
.
.P
[-These-]{+The first of the above,+}
{+the+}
{+.I "output comparison operator,"+}
{+interpolates a true value if formatting its comparands+}
{+.I s1+}
{+and+}
{+.I s2+}
{+produces the same output commands.+}
{+.+}
{+Other delimiters can be used in place of the neutral apostrophes.+}
{+.+}
{+.I \%@g@troff+}
{+formats+}
{+.I s1+}
{+and+}
{+.I s2+}
{+in separate environments;+}
{+after the comparison,+}
{+the resulting data are discarded.+}
{+.+}
{+The resulting glyph properties,+}
{+including font family,+}
{+style,+}
{+size,+}
{+and+}
{+slant,+}
{+must match,+}
{+but not necessarily the requests and/or escape sequences used to obtain+}
{+them.+}
{+.+}
{+Motions must match in orientation and magnitude to within the applicable+}
{+horizontal or vertical resolution of the device,+}
{+after rounding.+}
{+.+}
{+.\" TODO: Uncomment and add forward reference when we add a "GNU troff+}
{+.\" internals" subsection to this page.+}
{+.\"(All of this is to say that the lists of output nodes created by+}
{+.\"formatting+}
{+.\".I s1+}
{+.\"and+}
{+.\".I s2+}
{+.\"must be identical.)+}
{+.+}
{+.+}
{+.P+}
{+Surround the comparands with+}
{+.B \[rs]?\&+}
{+to avoid formatting them;+}
{+this causes them to be compared character by character,+}
{+as with string comparisons in other programming languages.+}
{+.+}
{+Since comparands protected with+}
{+.B \[rs]?\&+}
{+are read in copy mode,+}
{+they need not even be valid+}
{+.I groff+}
{+syntax.+}
{+.+}
{+The escape character is still lexically recognized,+}
{+however,+}
{+and consumes the next character.+}
{+.+}
{+.+}
{+.P+}
{+The above+} operators can't be combined with [-others like-]
[-.RB \[lq] : \[rq]-]
[-or-]
[-.RB \[lq] & \[rq];-]
[-only-]{+most others,+}
{+but+} a leading
.RB \[lq] [-! \[rq]\&-]{+!\& \[rq]+}
{+(without spaces or tabs between the exclamation mark and the operator)+}
can be used to complement the result.
.
Spaces and tabs are optional immediately after the
@@ -1348,6 +1412,8 @@ but immediately after
they cause the condition to evaluate false
(this bizarre behavior maintains compatibility with AT&T
.IR troff ).
{+.\" END Keep (roughly) parallel with groff.texi node "Operators in+}
{+.\" Conditionals".+}
.
.
.\" ====================================================================



    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?60836>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]