manpagez: man pages & more
info groff
Home | html | info | man

File: groff.info,  Node: Conditional Blocks,  Next: while,  Prev: Operators in Conditionals,  Up: Conditionals and Loops

5.23.4 Conditional Blocks
-------------------------

It is frequently desirable for a control structure to govern more than
one request, macro call, text line, or a combination of the foregoing.
The opening and closing brace escape sequences '\{' and '\}' define such
groups.  These "conditional blocks" can furthermore be nested.

 -- Escape sequence: \{
 -- Escape sequence: \}
     '\{' begins a conditional block; it must appear (after optional
     spaces and tabs) immediately subsequent to the conditional
     expression of an 'if', 'ie', or 'while' request,(1) (*note
     Conditional Blocks-Footnote-1::) or as the argument to an 'el'
     request.

     '\}' ends a condition block and should appear on a line with other
     occurrences of itself as necessary to match '\{' sequences.  It can
     be preceded by a control character, spaces, and tabs.  Input after
     any quantity of '\}' sequences on the same line is processed only
     if all of the preceding conditions to which they correspond are
     true.  Furthermore, a '\}' closing the body of a 'while' request
     must be the last such escape sequence on an input line.

     Brace escape sequences outside of control structures have no
     meaning and produce no output.

     *Caution:* Input lines using '\{' often end with '\RET', especially
     in macros that consist primarily of control lines.  Forgetting to
     use '\RET' on an input line after '\{' is a common source of error.

   We might write the following in a page header macro.  If we delete
'\RET', the header will carry an unwanted extra empty line (except on
page 1).

     .if (\\n[%] != 1) \{\
     .  ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title]
     .  el                    .tl \\*[odd-numbered-page-title]
     .\}

   Let us take a closer look at how conditional blocks nest.

     A
     .if 0 \{ B
     C
     D
     \}E
     F
         => A F

     N
     .if 1 \{ O
     .  if 0 \{ P
     Q
     R\} S\} T
     U
         => N O U

   The above behavior may challenge the intuition; it was implemented to
retain compatibility with AT&T 'troff'.  For clarity, it is idiomatic to
end input lines with '\{' (followed by '\' if appropriate), and to
precede '\}' on an input line with nothing more than a control
character, spaces, tabs, and other instances of itself.

   We can use 'ie', 'el', and conditional blocks to simulate the
multi-way "switch" or "case" control structures of other languages.  The
following example is adapted from the 'groff' 'man' package.
Indentation is used to clarify the logic.

     .\" Simulate switch/case in roff.
     .      ie '\\$2'1' .ds title General Commands\"
     .el \{.ie '\\$2'2' .ds title System Calls\"
     .el \{.ie '\\$2'3' .ds title Library Functions\"
     .el \{.ie '\\$2'4' .ds title Kernel Interfaces\"
     .el \{.ie '\\$2'5' .ds title File Formats\"
     .el \{.ie '\\$2'6' .ds title Games\"
     .el \{.ie '\\$2'7' .ds title Miscellaneous Information\"
     .el \{.ie '\\$2'8' .ds title System Management\"
     .el \{.ie '\\$2'9' .ds title Kernel Development\"
     .el                .ds title \" empty
     .\}\}\}\}\}\}\}\}

© manpagez.com 2000-2024
Individual documents may contain additional copyright information.