Hi Branden, On 2/21/23 01:29, G. Branden Robinson wrote:
At 2023-02-21T00:46:11+0100, Alex Colomar wrote:On 2/21/23 00:30, Alex Colomar wrote:Hummm, this is definitely not as simple as "breaks the line and moves the margin". The margin is not moved because of 0, so this should be just equivalent to .br from your own definition. However, it's not. It does some extra magic, which I'd call "RS sets the indentation of the scoped block to 0; RE resets to the previous indentation".That's not even completely true. Let's try something more precise. RS breaks the line, moves the left margin by a relative inset, and sets the indentation to 0.Close. .\" Start a relative inset level (by the amount given in the argument). .\" .RS [indent]
Which reminds us that this was missing in your recent patch, right? :)
.de1 RS . nr an-saved-margin\\n[an-inset-level] \\n[an-margin] . nr an-saved-prevailing-indent\\n[an-inset-level] \ \\n[an-prevailing-indent] . ie \\n[.$] .nr an-margin +(n;\\$1) . el .nr an-margin +\\n[an-prevailing-indent] . in \\n[an-margin]u . nr an-prevailing-indent \\n[IN] . nr an-inset-level +1 .. RS (1) saves the previous margin setting and "prevailing indent" (this term goes all the way back to McIlroy's 1979 man(7)); (2) insets (moves right) the margin by the amount in the argument, or by the aforementioned prevailing indent if there is no argument; (3) sets the formatter's indentation to this new value (not "0"); (4) updates the prevailing indent by the user-configurable standard indentation (register `IN`); and (5) increments the inset level.
This confuses me again. All the references to indentation mean the inset-amount, right? What happens to the actual indentation (as in IP)?
RE breaks the line, resets the left margin to the previous value, and resets the default indentation of indented paragraphs to the one previous to RS (so if the next paragraph is IP, it will continue with the old indentation).It does a lot of error checking first. .\" End relative inset level, backing up by one level (or to the level .\" given by the argument). .\" .RE [inset-level] .de1 RE . ie \\n[.$] .nr an-RE-requested-level \\$1 . el .nr an-RE-requested-level (\\n[an-inset-level] - 1) . ie \\n[.$] \{\ . if (\\n[an-RE-requested-level] = \\n[an-inset-level]) \ . ds an-RE-problem already at level \\n[an-inset-level]\" . if (\\n[an-RE-requested-level] > \\n[an-inset-level]) \ . ds an-RE-problem too large\" . if (\\n[an-RE-requested-level] < 1) \ . ds an-RE-problem too small\" . if d an-RE-problem \ . an-style-warn argument """\\$1""" to .\\$0 \\*[an-RE-problem] . rm an-RE-problem . \} . el .if !(\\n[an-RE-requested-level]) .an-style-warn unbalanced .\\$0 . rr an-RE-requested-level ...and with that out of the way, we get to an implementation fairly symmetric with RS. . ie \\n[.$] .nr an-inset-level ((;\\$1) <? \\n[an-inset-level]) . el .nr an-inset-level -1 . nr an-inset-level (1 >? \\n[an-inset-level]) . nr an-margin \\n[an-saved-margin\\n[an-inset-level]] . nr an-prevailing-indent \ \\n[an-saved-prevailing-indent\\n[an-inset-level]] . in \\n[an-margin]u .. Essentially it "pops" the prevailing indent and margin that `RS` pushed, permitting multiple pops at once.I'm not sure how to word it better.What I quoted in my previous message in the best I've been able to do.
Let's try to improve that then. I'm still not convinced ;)
You will note that neither macro _explicitly_ breaks. That is because the `in` request causes a break (when invoked with the regular control character). And both macros _always_ invoke `in`, barring usage errors. Regards, Branden
Cheers, Alex -- <http://www.alejandro-colomar.es/> GPG key fingerprint: A9348594CE31283A826FBDD8D57633D441E25BB5
OpenPGP_signature
Description: OpenPGP digital signature