> To generate a page break within a table, one is supposed to use
>
> .de BP
> . ie ā\\n(.zāā .bp \\$1
> . el \!.BP \\$1
> ..
>
> Could some kind soul explain the working of this macro? The else
> branch looks like a recursive call. And why does plain .bp not
> work?
A table is normally built-up within a diversion, and page breaks don't
work within a diversion. This diversion gets emitted right before the
table definition ends.
The macro BP first tests whether we are within a diversion. The
number register \n[.z] contains the name of the current diversion
(yes, a number register which contains a string); if it is empty, we
are not within a diversion. While defining a table, \n[.z] is *not*
empty, so the macro embeds a call to `.BP' uninterpreted into the
diversion (due to the leading `\!' escape). As soon as the diversion
is emitted, it now interprets the `.BP' macro. Since \n[.z] is empty
this time, the call to `.bp' gets executed.
Note that `.BP' even works with GNU tbl's option `nokeep'.
Werner