summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorG. Branden Robinson <g.branden.robinson@gmail.com>2023-01-24 14:47:24 -0600
committerG. Branden Robinson <g.branden.robinson@gmail.com>2023-01-25 14:08:58 -0600
commit814e204d1675ef9c6da4fb4e2736d5937256f106 (patch)
treeccec1f880cb819927a628eed6db545d9a68a770d /contrib
parent827c767f047c222d03fd5216cf39fa3e24d4a5de (diff)
downloadgroff-git-814e204d1675ef9c6da4fb4e2736d5937256f106.tar.gz
[mm]: Fix Savannah #54909.
When register `Pt` was 2, paragraphs immediately following displays and lists were being indented, contrary to DWB mm behavior. * m.tmac: Replace `par@ind-flag` register with two separate state bits, `par*indentation-eligible` and `par@suppress-indentation`. (P, nP): Remove complex test for deciding whether the current paragraph is being set immediately after a heading. (P): Set `par*indentation-eligible` to the logical complement of `par@suppress-indentation`. Call `par@doit` (which underlies both `P` and `nP`) unconditionally. (nP): Force `par*indentation-eligible` off, since numbered paragraphs are not influenced by a `Pt` value of "2" in DWB mm. {The paragraph number occupies the indentation space.} (par@doit): Introduce local register `par*do-indent`, manipulate it, and use it to control `ti` request instead of scattering the request across multiple locations. Remove this register when done. Clear `par@suppress-indentation` at end, since after indentation is suppressed once, it should not happen again until a special circumstance (the setting of a heading, display, or list) arises. (H): Convert test of `hd*htype` register, which tells us if we're setting a run-in heading or not, from `if` to `ie`. (The first paragraphing macro call after a run-in heading should _not_ have its indentation suppressed, because the material after the heading title constitutes a first pagraph.) In the true arm, set `par@suppress-indentation`; in the new else arm, clear it. This replaces the "complex test" above, and seems much more straightforward and reliable. Stop manipulating `par@ind-flag`. (df@end, ds@end, LC): Set `par@suppress-indentation` instead of clearing `par@ind-flag`. (LE): Set `par@suppress-indentation`. Fixes Savannah #54909. Thanks to Jeff Conrad for the report.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/mm/ChangeLog39
-rw-r--r--contrib/mm/m.tmac48
2 files changed, 63 insertions, 24 deletions
diff --git a/contrib/mm/ChangeLog b/contrib/mm/ChangeLog
index 89525546f..b5ba8c0ef 100644
--- a/contrib/mm/ChangeLog
+++ b/contrib/mm/ChangeLog
@@ -1,5 +1,44 @@
2023-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+ When register `Pt` was 2, paragraphs immediately following
+ displays and lists were being indented, contrary to DWB mm
+ behavior.
+
+ * m.tmac: Replace `par@ind-flag` register with two separate
+ state bits, `par*indentation-eligible` and
+ `par@suppress-indentation`.
+ (P, nP): Remove complex test for deciding whether the current
+ paragraph is being set immediately after a heading.
+ (P): Set `par*indentation-eligible` to the logical complement of
+ `par@suppress-indentation`. Call `par@doit` (which underlies
+ both `P` and `nP`) unconditionally.
+ (nP): Force `par*indentation-eligible` off, since numbered
+ paragraphs are not influenced by a `Pt` value of "2" in DWB mm.
+ {The paragraph number occupies the indentation space.}
+ (par@doit): Introduce local register `par*do-indent`,
+ manipulate it, and use it to control `ti` request instead of
+ scattering the request across multiple locations. Remove this
+ register when done. Clear `par@suppress-indentation` at end,
+ since after indentation is suppressed once, it should not happen
+ again until a special circumstance (the setting of a heading,
+ display, or list) arises.
+ (H): Convert test of `hd*htype` register, which tells us if
+ we're setting a run-in heading or not, from `if` to `ie`. (The
+ first paragraphing macro call after a run-in heading should
+ _not_ have its indentation suppressed, because the material
+ after the heading title constitutes a first pagraph.) In the
+ true arm, set `par@suppress-indentation`; in the new else arm,
+ clear it. This replaces the "complex test" above, and seems
+ much more straightforward and reliable. Stop manipulating
+ `par@ind-flag`.
+ (df@end, ds@end, LC): Set `par@suppress-indentation` instead of
+ clearing `par@ind-flag`.
+ (LE): Set `par@suppress-indentation`.
+
+ Fixes #54909. Thanks to Jeff Conrad for the report.
+
+2023-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
Regression-test Savannah #54909.
* tests/P-indentation-works.sh: Do it.
diff --git a/contrib/mm/m.tmac b/contrib/mm/m.tmac
index 42eaf349c..0a5ab82b0 100644
--- a/contrib/mm/m.tmac
+++ b/contrib/mm/m.tmac
@@ -437,7 +437,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%]
.p=\\n[.p] .t=\\n[.t] .z=\\n[.z] nl=\\n[nl] dn=\\n[dn] n=\\n[debug*n]
..
.\" ####### module par #################################
-.nr par@ind-flag 1 \" indent on following P if Pt=2
+.nr par*indentation-eligible 1 \" indent following P if Pt=2
+.nr par@suppress-indentation 0
.nr hd*last-pos -1
.nr hd*last-hsize -1
.nr par*number 0 1
@@ -468,39 +469,36 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%]
. tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
. tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
.\}
-.if !((\\n[nl]=\\n[hd*last-pos])&(\\n[hd*last-hsize]=\\n[.k])) \{\
-. if \\n[D]>2 .tm Paragraph set ind-flag=1
-. nr par@ind-flag 1
-. \" any collected unprinted text?
-. par@doit \\$*
-.\}
+.nr par*indentation-eligible 1-\\n[par@suppress-indentation]
+.par@doit \\$*
.if \\n[Np] \\n[H1].\\n+[par*number]\ \ \c
..
.\"------------
.de nP
-.\" skip P if previous heading
.if \\n[D]>2 \{\
. tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
. tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
.\}
-.if !((\\n[nl]=\\n[hd*last-pos])&(\\n[hd*last-hsize]=\\n[.k])) \{\
-. if \\n[D]>2 .tm Paragraph set ind-flag=1
-. nr par@ind-flag 1
-.\}
-.par@doit \\$*
+.\" A first-line indentation is meaningless for a numbered paragraph.
+.nr par*indentation-eligible 0
+.par@doit
\\n[H2].\\n+[par*number2]\ \ \c
-.nr par@ind-flag 1
..
.\"------------
.de par@doit
.SP (u;\\n[Ps]*\\n[Lsp])
-.ie \\n[.$] \{\
-. if \\$1=1 .ti +\\n[Pi]n
+.nr par*do-indent 0
+.ie \\n[.$] \{\
+. if \\$1=1 .nr par*do-indent 1
.\}
.el \{\
-. if \\n[Pt]=1 .ti +\\n[Pi]n
-. if (\\n[Pt]=2)&\\n[par@ind-flag] .ti +\\n[Pi]n
+. if \\n[Pt]=1 .nr par*do-indent 1
+. if (\\n[Pt]=2)&\\n[par*indentation-eligible] \
+. nr par*do-indent 1
.\}
+.if \\n[par*do-indent] .ti +\\n[Pi]n
+.rr par*do-indent
+.nr par@suppress-indentation 0
..
.\" ####### module line #######################################
.de SP
@@ -1177,13 +1175,15 @@ numeric; got '\\$1'
.\" do break or space
.if \\n[hd*htype] .br
.if \\n[hd*htype]>1 .SP (u;\\n[Lsp]*\\n[Hss])
-.if \\n[hd*htype] \{\
+.ie \\n[hd*htype] \{\
. \" indent if Hi=1 and Pt=1
. if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n
. \" indent size of mark if Hi=2
. if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u
+. nr par@suppress-indentation 1
.\}
-.nr par@ind-flag 0 \" no indent on .P if Pt=2
+.\" We're setting a run-in heading; the next paragraph is normal.
+.el .nr par@suppress-indentation 0
.\"
.\" check if it is time to reset footnotes
.if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1
@@ -1199,7 +1199,6 @@ numeric; got '\\$1'
.if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
.nr hd*last-pos \\n[nl]
.nr hd*last-hsize \\n[.k]
-.nr par@ind-flag 0
.\" HTML: end of heading
.misc@tag EO-H
..
@@ -1978,7 +1977,7 @@ within DF/DE
.\" move div to the floating display list
.rn df*div df*fdiv!\\n[df*fnr]
.\"
-.nr par@ind-flag 0
+.nr par@suppress-indentation 1 \" no indentation after displays
.\" print float if queue is empty and the display fits into
.\" the current page
.if ((\\n[df*fnr]>=\\n[df*o-fnr])&(\\n[dn]<\\n[.t])) .df@print-float 1
@@ -2256,7 +2255,7 @@ within DF/DE
.if \\n[ds*format]=4 'rj 0
.rm ds*div!\\n[ds*snr]
.nr ds*snr -1
-.nr par@ind-flag 0
+.nr par@suppress-indentation 1 \" no indentation after displays
.ev
..
.\"########### module list ###################
@@ -2356,6 +2355,7 @@ first
and LI first
.li@pop
.if '\\$1'1' .SP \\n[Lsp]u
+.nr par@suppress-indentation 1 \" no indentation after lists
..
.\"-------------
.\" list status clear.
@@ -2369,7 +2369,7 @@ and LI first
.if \\n[li*i]>\\n[li*lvl] .@error \\$0 invalid argument: \\n[li*i] \
exceeds depth of nested lists (\\n[li*lvl])
.while \\n[li*lvl]>\\n[li*i] .li@pop
-.nr par@ind-flag 0
+.nr par@suppress-indentation 1 \" no indentation after lists
..
.\"-------------
.de AL