|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.