|
|
1.1 ! root 1: .\" @(#)tt11 6.1 (Berkeley) 5/23/86 ! 2: .\" ! 3: .NH ! 4: Macros with arguments ! 5: .PP ! 6: The next step is to define macros that can change from one ! 7: use to the next ! 8: according to parameters supplied as arguments. ! 9: To make this work, we need two things: ! 10: first, when we define the macro, we have to indicate that some ! 11: parts of it will be provided as arguments when the macro is called. ! 12: Then when the macro is ! 13: called ! 14: we have to provide actual arguments ! 15: to be plugged into the definition. ! 16: .PP ! 17: Let us illustrate by defining a macro ! 18: .BD .SM ! 19: that will print its argument two points ! 20: smaller than the surrounding text. ! 21: That is, the macro call ! 22: .P1 ! 23: ^SM TROFF ! 24: .P2 ! 25: will produce ! 26: .UC TROFF . ! 27: .PP ! 28: The definition of ! 29: .BD .SM ! 30: is ! 31: .P1 ! 32: ^de SM ! 33: \es\-2\e\e$1\es+2 ! 34: ^^ ! 35: .P2 ! 36: Within a macro definition, ! 37: the symbol ! 38: .BD \e\e$n ! 39: refers to the ! 40: .BD n th ! 41: argument ! 42: that the macro was called with. ! 43: Thus ! 44: .BD \e\e$1 ! 45: is the string to be placed in a smaller point ! 46: size when ! 47: .BD .SM ! 48: is called. ! 49: .PP ! 50: As a slightly more complicated version, the following definition of ! 51: .BD .SM ! 52: permits optional second and third arguments ! 53: that will be printed in the normal size: ! 54: .P1 ! 55: ^de SM ! 56: \e\e$3\es\-2\e\e$1\es+2\e\e$2 ! 57: ^^ ! 58: .P2 ! 59: Arguments not provided when the macro is called are treated ! 60: as empty, ! 61: so ! 62: .P1 ! 63: ^SM TROFF ), ! 64: .P2 ! 65: produces ! 66: .UC TROFF ), ! 67: while ! 68: .P1 ! 69: ^SM TROFF ). ( ! 70: .P2 ! 71: produces ! 72: .UC TROFF ). ( ! 73: It is convenient to reverse ! 74: the order of arguments because trailing punctuation ! 75: is much more common than leading. ! 76: .PP ! 77: By the way, the number of arguments that a macro was called with ! 78: is available in number register ! 79: .BD .$ . ! 80: .PP ! 81: The following macro ! 82: .BD ^BD ! 83: is the one used to make the ! 84: `bold roman' we have been using for ! 85: .UL troff ! 86: command names in text. ! 87: It combines horizontal motions, width computations, ! 88: and argument rearrangement. ! 89: .P1 2 ! 90: \&.de BD ! 91: \e&\e\e$3\ef1\e\e$1\eh'\-\ew'\e\e$1'u+1u'\e\e$1\efP\e\e$2 ! 92: \&.. ! 93: .P2 ! 94: The ! 95: .BD \eh ! 96: and ! 97: .BD \ew ! 98: commands need no extra backslash, as we discussed above. ! 99: The ! 100: .BD \e& ! 101: is there in case the argument begins with a period. ! 102: .WS ! 103: .PP ! 104: Two backslashes are needed with the ! 105: .BD \e\e$n ! 106: commands, though, ! 107: to protect one of them when the macro is ! 108: being defined. ! 109: Perhaps a second example will make this clearer. ! 110: Consider a macro called ! 111: .BD .SH ! 112: which ! 113: produces section headings rather like those in this paper, ! 114: with the sections numbered automatically, ! 115: and the title in bold in a smaller size. ! 116: The use is ! 117: .P1 ! 118: ^SH "Section title ..." ! 119: .P2 ! 120: (If the argument to a macro is to contain blanks, ! 121: then it must be ! 122: .ul ! 123: surrounded ! 124: by double quotes, ! 125: unlike a string, where only one leading quote is permitted.) ! 126: .PP ! 127: Here is the definition of the ! 128: .BD .SH ! 129: macro: ! 130: .P1 ! 131: .ta .75i 1.15i ! 132: ^nr SH 0 \e" initialize section number ! 133: ^de SH ! 134: ^sp 0.3i ! 135: ^ft B ! 136: ^nr SH \e\en(SH+1 \e" increment number ! 137: ^ps \e\en(PS\-1 \e" decrease PS ! 138: \e\en(SH. \e\e$1 \e" number. title ! 139: ^ps \e\en(PS \e" restore PS ! 140: ^sp 0.3i ! 141: ^ft R ! 142: ^^ ! 143: .P2 ! 144: The section number is kept in number register SH, which is incremented each ! 145: time just before it is used. ! 146: (A number register may have the same name as a macro ! 147: without conflict but a string may not.) ! 148: .PP ! 149: We used ! 150: .BD \e\en(SH ! 151: instead of ! 152: .BD \en(SH ! 153: and ! 154: .BD \e\en(PS ! 155: instead of ! 156: .BD \en(PS . ! 157: If we had used ! 158: .BD \en(SH , ! 159: we would get the value of the register at the time the macro was ! 160: .ul ! 161: defined, ! 162: not at the time it was ! 163: .ul ! 164: used. ! 165: If that's what you want, fine, ! 166: but not here. ! 167: Similarly, ! 168: by using ! 169: .BD \e\en(PS , ! 170: we get the point size at the time the macro is called. ! 171: .WS ! 172: .PP ! 173: As an example that does not involve numbers, ! 174: recall our ! 175: .BD .NP ! 176: macro which had a ! 177: .P1 ! 178: ^tl 'left'center'right' ! 179: .P2 ! 180: We could make these into parameters by using instead ! 181: .P1 ! 182: ^tl '\e\e*(LT'\e\e*(CT'\e\e*(RT' ! 183: .P2 ! 184: so the title comes from three strings called LT, CT and RT. ! 185: If these are empty, then the title will be a blank line. ! 186: Normally CT would be set with something like ! 187: .P1 ! 188: \&^ds CT - % - ! 189: .P2 ! 190: to give just the page number between hyphens (as on the top of this page), ! 191: but a user could supply private definitions for ! 192: any of the strings.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.