groff: while
5.20.3 while
------------
'gtroff' provides a looping construct using the 'while' request, which
is used much like the 'if' (and related) requests.
-- Request: .while expr anything
Evaluate the expression EXPR, and repeatedly execute ANYTHING (the
remainder of the line) until EXPR evaluates to 0.
.nr a 0 1
.while (\na < 9) \{\
\n+a,
.\}
\n+a
=> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Some remarks.
* The body of a 'while' request is treated like the body of a
'de' request: 'gtroff' temporarily stores it in a macro that
is deleted after the loop has been exited. It can
considerably slow down a macro if the body of the 'while'
request (within the macro) is large. Each time the macro is
executed, the 'while' body is parsed and stored again as a
temporary macro.
.de xxx
. nr num 10
. while (\\n[num] > 0) \{\
. \" many lines of code
. nr num -1
. \}
..
The traditional and often better solution (Unix 'troff'
doesn't have the 'while' request) is to use a recursive macro
instead that is parsed only once during its definition.
.de yyy
. if (\\n[num] > 0) \{\
. \" many lines of code
. nr num -1
. yyy
. \}
..
.
.de xxx
. nr num 10
. yyy
..
Note that the number of available recursion levels is set
to 1000 (this is a compile-time constant value of 'gtroff').
* The closing brace of a 'while' body must end a line.
.if 1 \{\
. nr a 0 1
. while (\n[a] < 10) \{\
. nop \n+[a]
.\}\}
=> unbalanced \{ \}
-- Request: .break
Break out of a 'while' loop. Be sure not to confuse this with the
'br' request (causing a line break).
-- Request: .continue
Finish the current iteration of a 'while' loop, immediately
restarting the next iteration.
⇒Expressions.