Annotation of 43BSDReno/share/doc/usd/25.trofftut/tt14, revision 1.1.1.1

1.1       root        1: .\"    @(#)tt14        6.1 (Berkeley) 5/23/86
                      2: .\"
                      3: .NH
                      4: Diversions
                      5: .PP
                      6: There are numerous occasions in page layout when it is necessary to store some text
                      7: for a period of time without actually printing it.
                      8: Footnotes are the most obvious example:
                      9: the text of the footnote usually appears in the input well before the place
                     10: on the page where it is to be printed is reached.
                     11: In fact,
                     12: the place where it is output normally depends on how big it is,
                     13: which implies that there must be a way
                     14: to process the footnote at least
                     15: enough to decide its size
                     16: without printing it.
                     17: .PP
                     18: .UL troff
                     19: provides a mechanism called a diversion
                     20: for doing this processing.
                     21: Any part of the output may be diverted into a macro instead
                     22: of being printed,
                     23: and then at some convenient time the macro may be put back into
                     24: the input.
                     25: .PP
                     26: The command
                     27: .BD .di\ xy
                     28: begins a diversion _ all subsequent output is collected into the macro
                     29: .BD xy
                     30: until the command
                     31: .BD .di
                     32: with no arguments is encountered.
                     33: This terminates the diversion.
                     34: The processed text is available at any time thereafter, simply
                     35: by giving the command
                     36: .P1
                     37: ^xy
                     38: .P2
                     39: The vertical size of the last finished diversion is contained in
                     40: the built-in number register
                     41: .BD dn .
                     42: .PP
                     43: As a simple example,
                     44: suppose we want to implement a `keep-release'
                     45: operation,
                     46: so that text between the commands
                     47: .BD .KS 
                     48: and
                     49: .BD .KE
                     50: will not be split across a page boundary
                     51: (as for a figure or table).
                     52: Clearly, when a
                     53: .BD .KS
                     54: is encountered, we have to begin diverting
                     55: the output so we can find out how big it is.
                     56: Then when a
                     57: .BD .KE
                     58: is seen, we decide
                     59: whether the diverted text will fit on the current page,
                     60: and print it either there if it fits, or at the top of the next page if it doesn't.
                     61: So:
                     62: .P1 2
                     63: .ta .6i
                     64: ^de KS \e" start keep
                     65: ^br    \e" start fresh line
                     66: ^ev 1  \e" collect in new environment
                     67: ^fi    \e" make it filled text
                     68: ^di XX \e" collect in XX
                     69: ^^
                     70: .P2
                     71: .P1 2
                     72: .ta .6i
                     73: ^de KE \e" end keep
                     74: ^br    \e" get last partial line
                     75: ^di    \e" end diversion
                     76: ^if \e\en(dn>=\e\en(.t .bp   \e" bp if doesn't fit
                     77: ^nf    \e" bring it back in no-fill
                     78: ^XX    \e" text
                     79: ^ev    \e" return to normal environment
                     80: ^^
                     81: .P2
                     82: Recall that number register
                     83: .BD nl
                     84: is the current position
                     85: on the output page.
                     86: Since output was being diverted, this remains
                     87: at its value when the diversion started.
                     88: .BD dn
                     89: is the amount of text in the diversion;
                     90: .BD .t
                     91: (another built-in register)
                     92: is the distance to the next trap,
                     93: which we assume is at the bottom margin of the page.
                     94: If the diversion is large enough to go past the trap,
                     95: the
                     96: .BD .if
                     97: is satisfied, and
                     98: a
                     99: .BD .bp
                    100: is issued.
                    101: In either case, the diverted output is then brought back with
                    102: .BD .XX .
                    103: It is essential to bring it back in no-fill mode so
                    104: .UL troff
                    105: will do no further processing on it.
                    106: .PP
                    107: This is not the most general keep-release,
                    108: nor is it robust in the face of all conceivable inputs,
                    109: but it would require more space than we have here to write it
                    110: in full generality.
                    111: This section is not intended
                    112: to teach everything about diversions,
                    113: but to sketch out enough that you can read
                    114: existing macro packages with some comprehension.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.