|
|
1.1 ! root 1: {Set Program,GPMDOC} ! 2: {Set Version,Version 6.10} ! 3: ! ! 4: {Setq Macdescr,- ! 5: {Set Macroname,{Caps @1}}- ! 6: {Sec {1}{Cond {Leq @Mode,TEXT},~({2})}}- ! 7: {Tset Toc,{Rpad {Dbl @1}~-~{2}~,50,.~}~A-{Pagenum}}- ! 8: {Nfj}- ! 9: {Macsec Format}- ! 10: } ! 11: ! ! 12: {Setq Macsec,- ! 13: {Cond {Leq {Caps @1},FORMAT},{Ls 1}Format:{Ls 1}{Lin 8}{Nfj},- ! 14: {Leq {Caps @1},DESCRIPTION},{Ls 1}{Restore Lmg}{Fj},- ! 15: ,{Hl {+ @Seclevel,2},{Caps @1}}{Fj}- ! 16: }- ! 17: } ! 18: ! ! 19: ! Define the list items macros ! 20: ! Bl is used to begin a new list. It should be on the same physical ! 21: ! line with the rest of the text. It does an initial {Li...} ! 22: ! ! 23: {Setq Bl,{Set.Add1 Numlist}- ! 24: {Set LIST${Numlist},0}- ! 25: {Brk}- ! 26: {Lin 4}- ! 27: {Li @1}- ! 28: } ! 29: ! ! 30: ! Li is called to start a new item in a list. ! 31: ! (Bl does this automatically for the first item) ! 32: ! ! 33: {Setq Li,{Ls 1}{Set.Add1 LIST${Numlist}}- ! 34: {Outdent {Size {1}{Setv Listlabel,- ! 35: {Dowhile{Set Listi,@Numlist} {Gt @Listi,1},- ! 36: {LIST${Numlist}}.{Set.Sub1 Listi}- ! 37: }- ! 38: {LIST$1}:~}}- ! 39: }{1}{Listlabel}- ! 40: } ! 41: ! ! 42: ! El is used to return to the previous list level. ! 43: ! ! 44: {Setq El,{Brk}{Restore Lmg}{Set.Sub1 Numlist}} ! 45: ! ! 46: {Exclude HELP} ! 47: {Load SYS$LIBRARY:AUXLIB.GPM,ROMAN} ! 48: {Setq Endpage,{Ls 2}{Center A-{Roman @Pagenum}}{Eject}} ! 49: {Tsetq Newpage,{Ls 3}} ! 50: {Ls 1}{Center APPENDIX A} ! 51: {Ls 1}{Center - NOTES -}{Ls 2} ! 52: This section contains a complete description of the ! 53: GPMDOC system macros in alphabetical order for {version}. ! 54: Some abbreviations are used in the Format descriptions which ! 55: require explanation: ! 56: !** ! 57: {Exclude TEXT} ! 58: {Sec GPMDOC} ! 59: HELP is provided for all intrinsic GPMDOC macros. ! 60: Macros are explained under the subheading corresponding to the ! 61: macro's name. ! 62: In addition, ! 63: an explanation of the abbreviations used in the "Format"s can be ! 64: obtained under the subheading "Formats". ! 65: {Newsec} ! 66: {Sec Formats} ! 67: !** ! 68: {Ls 1}{Lin 6}{OUTDENT 6} ! 69: <"{MACRO arg1,arg2,...}":> ! 70: {Ls 1}This means you can use the MACRO with the ! 71: normal GPMDOC evaluation process. ! 72: If MACRO ! 73: takes arguments (arg1, arg2) they are shown. ! 74: Optional arguments are noted in the description. ! 75: {Ls 1} ! 76: Macros place restrictions or interpretations ! 77: on the arguments that you can pass to them. ! 78: The required form of an argument is given in the format description ! 79: for each macro according to the following convention: ! 80: {Ls 1}{Lin 8}{OUTDENT 8} ! 81: "mname"~The argument text, after evaluation, is ! 82: used as the {ul name} of a macro. ! 83: Any "mname" can optionally be suffixed with a backslash ("\") followed ! 84: by a property table name, otherwise, the null property table ! 85: is assumed. ! 86: {Ls 1}Since any string ! 87: of text can serve as a macro name, "mname" can be ! 88: anything. ! 89: However, "mname" denotes the fact that ! 90: the macro being described will {ul interpret} ! 91: this argument to be a macro name. ! 92: {ls 1}{outdent 8} ! 93: "n"~~~~~The argument text must evaluate to a {ul number}. ! 94: Either integers or fractional real numbers with decimal points ! 95: can be used. ! 96: In cases where an integer is required and a ! 97: real number is used, the real number is converted to an ! 98: integer by disregarding the fractional part. ! 99: The acceptable range of n may be restricted for some macros, ! 100: this is noted in accompanying description. ! 101: For the purposes of arithmetic, a null string is interpreted as zero. ! 102: {Ls 1}{Outdent 8}"pred"~~The evaluated argument is considered by the ! 103: macro to be a {ul predicate}. ! 104: Predicates designate true/false values with a null value ! 105: being considered "true," and any string of actual size greater than ! 106: zero is thus considered "false." ! 107: The GPMDOC built-in system predicate macros such as LT, EVEN, etc. ! 108: return null when they evaluate true, and (by convention) evaluate to ! 109: "1" otherwise. ! 110: Users defining their own predicate-valued macros are urged to ! 111: follow this convention. ! 112: {ls 1}{outdent 8} ! 113: "str"~~~The argument text can evaluate to any text {ul string}. ! 114: {ls 1}{restore lmg} ! 115: In addition, any of these forms may be preceeded by the letter 'q'. ! 116: For example, "qstr", "qpred" and the like. ! 117: This indicates that the argument is {ul not} evaluated by GPMDOC ! 118: before it is given to the macro. ! 119: The macro itself may, if it chooses, evaluate the argument on its own. ! 120: This is used primarily by system macros that must {ul conditionally} ! 121: evaluate arguments (e.g. COND, DOWHILE, DOPROP). ! 122: {Ls 1}{outdent 6} ! 123: <"{D MACRO}":>{LS 1} ! 124: This says that the textual definition of MACRO can ! 125: be retrieved. ! 126: Some system macros are compiled into an internal coded form with no textual ! 127: representation. ! 128: D applied to these macros will give the same result as "<{MACRO}>", ! 129: and the D form is not shown for them. ! 130: {Ls 1}The "@mname" abbreviation form for arguments is, in operation, ! 131: entirely equivalent to the <"{D mname}"> macro form, ! 132: and these same remarks apply. ! 133: {ls 1}{outdent 6} ! 134: <"{SET MACRO,argument}":>{brk} ! 135: {LS 1} ! 136: This format means that MACRO can sensibly be redefined ! 137: using any form of set (SET, TSET, SETQ, SETV, etc.). ! 138: Many system macros will have side effects when set, ! 139: such as altering ! 140: the margins or causing spacing down the page. ! 141: {ls 1}{restore lmg} ! 142: The examples try to present several different facets ! 143: of the uses for the macro being described. ! 144: (The examples are all shown in upper case for emphasis; ! 145: but keep in mind that the case of macro names is not significant.) ! 146: {Ls 1}To avoid making the examples trivial, most of them are ! 147: "real-life", some easy and others a bit more involved. ! 148: An asterisk next to an example indicates that the ! 149: example is a particularly advanced one. ! 150: You may wish to skip over these. ! 151: As a final note, this section does not describe the many macros ! 152: available in libraries. ! 153: {Exclude HELP} ! 154: {P} ! 155: {Restore Newpage} ! 156: {Setq Endpage,{Ls 2}{Center A-{D Pagenum} [{D Macroname}]}{Eject}} ! 157: !** ! 158: ! ! 159: ! Start the descriptions ! 160: ! ! 161: ! ! 162: ! ADD1 ! 163: ! ! 164: {macdescr ADD1,Add One To Numeric} ! 165: <{ADD1 n}> ! 166: {macsec description} ! 167: The value of ADD1 is one added to n. It is equivalent ! 168: to <{+~n,1}>. ! 169: {macsec examples} ! 170: {bl}Add one to the current page number: ! 171: {ls 1} ! 172: {Center <{SET.ADD1 PAGENUM}>} ! 173: {Ls 1} ! 174: {Li *~}Here is a definition for a macro, CASE, that evaluates one ! 175: of its arguments depending on the value of a 'control argument': ! 176: {Ls 1}{Center <{SETQ CASE,{{ADD1 @1}}}>}{Ls 1} ! 177: A macro reference such as <"{CASE~2,SNURF,BLURF,ERFF}"> would ! 178: evaluate to "BLURF" because the "2", in effect, 'selects' argument #3. ! 179: It does this by adding one to the 2, and then using the resulting "3" ! 180: as the name of a macro to be evaluated. ! 181: If any of the arguments themselves contained macro calls that were to be ! 182: conditionally evaluated, they could be placed in quotes to defer the ! 183: evaluation. ! 184: {Ls 1}This is not a wholly satisfactory definition, since "<{CASE~0,...}>" ! 185: will evaluate to "0" (argument #1), ! 186: whereas all other values of the first argument that are out of range will ! 187: evaluate null. ! 188: The definition of CASE could be revised a bit using a COND macro to be: ! 189: {Ls 1}{Center <{SETQ CASE,{COND {NE @1,0},{{ADD1 @1}}}}>}{Ls 1} ! 190: {EL} ! 191: {P} ! 192: ! ! 193: ! APPEND ! 194: ! ! 195: {macdescr APPEND,Join Two Strings} ! 196: <{APPEND str1,str2}> ! 197: {macsec description} ! 198: The value of APPEND is the text value formed by ! 199: appending str1 on the right of str2. ! 200: {macsec notes} ! 201: {bl}A simple left to right juxtaposition of text is ! 202: sufficient to perform this function, so APPEND is only ! 203: useful in extended sets (see example). ! 204: {el} ! 205: {macsec examples} ! 206: {bl}Print an extra line after the page heading from now on: ! 207: {Ls 1}{Center <{SET.APPEND NEWPAGE,<{LS 1}>}>}{Ls 1} ! 208: {EL} ! 209: {P} ! 210: ! ! 211: ! BEGINTEXT ! 212: ! ! 213: {macdescr BEGINTEXT,Starting Input Line} ! 214: <{set BEGINTEXT,str}> ! 215: <{BEGINTEXT}> ! 216: <{D BEGINTEXT}> ! 217: {Macsec Description} ! 218: The value of BEGINTEXT is used with INPUT to define the starting ! 219: line of the new file. ! 220: If BEGINTEXT is non-null when INPUT is set, GPMDOC will skip over ! 221: input lines looking for one that matches BEGINTEXT. ! 222: When one is found, input starts with the line that follows. ! 223: {Macsec Notes} ! 224: {Bl}The input lines that are skipped are physical lines of the designated ! 225: input file, not logical lines. ! 226: This means that continuations are not processed, and also that ! 227: comment lines (those that begin with an exclamation point) can ! 228: are candidates for BEGINTEXT. ! 229: Comment lines are recommended for BEGINTEXT, as they are otherwise ! 230: ignored by GPMDOC when processing a file. ! 231: {Li}The line for BEGINTEXT must match exactly. ! 232: The case of letters is significant. ! 233: {el} ! 234: {Macsec examples} ! 235: {bl}Read the file MACLIB.GPM starting at the line following ! 236: one which reads "!LIST 3", and finishing at the line which reads ! 237: "!END 3": ! 238: {Ls 1} ! 239: {Center <{TSET INPUT,MACLIB.GPM,STARTTEXT=!LIST 3,ENDTEXT=!END 3}>} ! 240: {LS 1} ! 241: This sort of thing is useful for a 'macro library' which could contain ! 242: sets of macro definitions for different purposes. ! 243: {el} ! 244: {p} ! 245: ! ! 246: ! BIAS ! 247: ! ! 248: {Macdescr BIAS,Set Page Bias} ! 249: <{set BIAS,n}> (Default: BIAS=0) ! 250: <{BIAS}> ! 251: {Macsec DESCRIPTION} ! 252: BIAS controls the size of the left hand "gutter." ! 253: Its effect is similar to that of setting the left margin, ! 254: except that the right margin is also moved a corresponding amount, ! 255: so the linelength remains unchanged. ! 256: The sum of BIAS and LMG (current left margin) must always be positive. ! 257: {Macsec NOTES} ! 258: {Bl}BIAS is useful for printing documents on varying devices which ! 259: start printing at different locations. ! 260: {Li}Setting BIAS has no effect on the values of LMG or RMG. ! 261: {El} ! 262: {P} ! 263: ! ! 264: ! BRK ! 265: ! ! 266: {macdescr BRK,Force Line Break} ! 267: <{BRK}> ! 268: {MACSEC DESCRIPTION} ! 269: This macro is identical to <{LS~0}> or <{LS}>. ! 270: It causes the text line ! 271: currently being assembled to be flushed to the output stream. ! 272: This is termed a "line break". ! 273: Right justification is not applied, ! 274: regardless of whether or not it is enabled. ! 275: {MACSEC NOTES} ! 276: {BL}Line break is normally used to force printing to begin on a new ! 277: line when line fill is on, or whilst typing in the middle of a line, ! 278: or within a macro. ! 279: Note that line fill being off (non-null) forces ! 280: an automatic line break after reading each input line. ! 281: {EL} ! 282: {macsec examples} ! 283: {BL}This example shows how to print successive items on ! 284: separate lines when line fill is enabled, using BRK: ! 285: {ls 1} ! 286: A. Two eggs<{brk}>B. Three cups flour<{brk}>C. Two tbsp. butter ! 287: {ls 1} ! 288: would print as: ! 289: {ls 1} ! 290: A. Two eggs{brk}B. Three cups flour{brk}C. Two tbsp. butter ! 291: {el} ! 292: {P} ! 293: ! ! 294: ! BSLACK ! 295: ! ! 296: {Macdescr BSLACK,End-of-Page Runout} ! 297: <{set BSLACK,n}> (Default: BSLACK=0) ! 298: <{BSLACK}> ! 299: <{D BSLACK}> ! 300: {MACSEC DESCRIPTION} ! 301: The value of BSLACK is used by the system to determine when ! 302: to run out the rest of a page during line skipping. ! 303: Assuming BSLACK has the value "n" and an attempt is made to skip ! 304: lines when less than "n" lines remain on the page, the page is ! 305: simply run out, and an ENDPAGE condition occurs. ! 306: (Line skipping means either an <{LS...}> or ! 307: a <{SET~LINENUM,...}>.) ! 308: {MACSEC NOTES} ! 309: {BL}The value for n cannot be negative. ! 310: {LI}BSLACK can be used to avoid such situations as the first line ! 311: of a paragraph being printed at the bottom of a page. ! 312: {LI}Setting BSLACK to zero effectively nullifies any BSLACK action. ! 313: {EL} ! 314: {P} ! 315: ! ! 316: ! CAB ! 317: ! ! 318: {MACDESCR CAB,Close Angle Bracket} ! 319: <{CAB}> ! 320: {MACSEC DESCRIPTION} ! 321: Evaluates to ">". ! 322: {MACSEC NOTES} ! 323: {BL}This macro, and its companion <{OAB}>, are used in situations ! 324: where the quote symbols are needed without causing the effect ! 325: of quoting, or where they appear in an unbalanced way. ! 326: {EL} ! 327: {MACSEC EXAMPLES} ! 328: {BL}Computer programs often use the GPMDOC quote symbols to ! 329: signify the operations of comparison (less than and greater than). ! 330: For instance: ! 331: {LS 1} ! 332: {center IF A {OAB} B AND A {CAB} C} ! 333: {LS 1} ! 334: in GPM would print as: ! 335: {LS 1} ! 336: {Center IF A B AND A C} ! 337: {LS 1} ! 338: The CAB (and OAB) macros could be used: ! 339: {LS 1} ! 340: {CENTER IF A <{OAB}> B AND A <{CAB}> C.} ! 341: {LS 1} ! 342: which evaluates correctly. (It would also be possible to ! 343: achieve the same effect in this example by quoting the entire ! 344: line, or with the use of INFORMAT.) ! 345: {EL} ! 346: {P} ! 347: ! ! 348: ! CAPS ! 349: ! ! 350: {macdescr CAPS,Capitalize Text} ! 351: <{CAPS str}> ! 352: {macsec description} ! 353: The value of a call to CAPS is str, except all lower ! 354: case letters are replaced with their equivalents in ! 355: upper case. ! 356: It is the same as: ! 357: {ls 1} ! 358: <{REPLACE str,abc...xyz,ABC...XYZ}> ! 359: {macsec examples} ! 360: {bl}Print the text of the macro TITLE capitalized: ! 361: {ls 1}{Center <{CAPS @TITLE}>} ! 362: {Li *~}Read "FILE1" if the user responds "No" and "FILE2" if ! 363: the user responds "Yes" ! 364: {Ls 1}{Nfj} ! 365: <{TSET INPUT,-> ! 366: <{COND -> ! 367: <{LEQ {CAPS {SUBSTR {QUERY Enter Yes or No: },1,1}},N},-> ! 368: <FILE1,,FILE2-> ! 369: <}-> ! 370: <}> ! 371: {Fj} ! 372: {Ls 1}Note that only the first cahracter of the response ! 373: is compared. ! 374: It is capitalized so that regardless of whether the user types ! 375: "N" or "n", ! 376: it is still perceived as a 'no' response. ! 377: {Ls 1}You might want to write a predicate macro that would issue a general ! 378: yes/no question (supplied as an argument) to be true if the response ! 379: is affirmative, ! 380: and false if the response is negative. ! 381: As an enhancement, ! 382: the macro will loop until it gets one of the two responses. ! 383: {Ls 1}{Nfj} ! 384: <{SETQ YNQ,-> ! 385: <{SET YNQ$R}-> ! 386: <{DOWHILE {LNE @YNQ$R,N}{LNE @YNQ$R,Y},-> ! 387: <{SET YNQ$R,{CAPS {SUBSTR {QUERY @1},1,1}}}-> ! 388: <}-> ! 389: <{COND {LEQ @YNQ$R,N},1}-> ! 390: <}> ! 391: {Ls 1}{Fj} ! 392: {el} ! 393: {P} ! 394: ! ! 395: ! CENTER ! 396: ! ! 397: {macdescr CENTER,Center a Text Line} ! 398: <{CENTER str}> ! 399: {macsec description} ! 400: CENTER prints str padded on the left with hard spaces so as to cause it to ! 401: appear centered between the current left and right margins. ! 402: A line break is forced before and after str is printed. ! 403: The value of the CENTER macro is always null, ! 404: (the centered text is sent directly to the output stream). ! 405: {macsec notes} ! 406: {bl}If str is longer than <{LINELENGTH}>, the text will ! 407: be printed on multiple, uncentered lines. ! 408: {el} ! 409: {macsec examples} ! 410: {bl}Print the text "SUBMITTED IN PARTIAL FULFILLMENT" centered on line 30: ! 411: {Ls 1}{Center <{SET LINENUM,30}{CENTER SUBMITTED IN PARTIAL FULFILLMENT}{BRK}>} ! 412: {Ls 1} ! 413: {Li}Print the text stored in the macro TITLE, centered at the top of every ! 414: page:{Ls 1}{Center <{SETQ NEWPAGE,{CENTER @TITLE}}{BRK}>}{LS 1} ! 415: {el} ! 416: {P} ! 417: ! ! 418: ! CODE ! 419: ! ! 420: {Macdescr CODE,Define Internal Macro Code} ! 421: <{CODE mname,str}> ! 422: {Macsec Description} ! 423: CODE is used to define mname as an internal code sequence in order to ! 424: improve efficiency, or to make available functions that cannot be realistically ! 425: coded in macro form. ! 426: Str must represent a legitimate internal code string. ! 427: Evaluation of CODE will 'compile' STR and bind the resulting code ! 428: to mname as a system macro. ! 429: The value of CODE is null. ! 430: {Ls 1}As this is not a systems reference document, no further elaboration ! 431: of CODE is given here. ! 432: {P} ! 433: ! ! 434: ! COND ! 435: ! ! 436: {MACDESCR COND,Conditional Evaluation} ! 437: <{COND qpred1,qstr1,qpred2,qstr2, ...}> ! 438: {MACSEC DESCRIPTION} ! 439: COND will conditionally evaluate one of str1,~str2,~etc. in ! 440: the following way. ! 441: First, pred1 is evaluated. ! 442: If it is null (true), then the value of the COND becomes the ! 443: evaluation of str1. ! 444: Otherwise, the COND continues by evaluating pred2, and if ! 445: it is true, the value of COND becomes the value of str2. ! 446: {Ls 1}COND allows an indefinite number of predicate-string ! 447: pairs. ! 448: Since any unspecified arguments are taken as null strings, ! 449: if none of the predicates evaluates null (true), then an implied ! 450: null predicate will be 'seen' past the given arguments and the ! 451: following implied null string will be returned as the value. ! 452: {macsec notes} ! 453: {Bl}While any text may be given for a predicate, generally ! 454: one of the system predicate macros is used. ! 455: These predicates are described fully under their own sections. ! 456: {Ls 1}For numeric tests, LT, LE, GT, GE, NE, EQ, EVEN and ODD ! 457: are the system predicates. ! 458: {Ls 1}For comparing strings, LLT, LLE, LGT, LGE, LNE, and LEQ ! 459: are the system predicates. ! 460: {Li}All system predicates use the string "1" as the standard ! 461: 'false' value. ! 462: Uses writing their own predicate-valued macros are urged to ! 463: adopt this convention. ! 464: {EL} ! 465: {macsec examples} ! 466: {BL}If less than ten lines remain on the page then skip to a new ! 467: page: ! 468: {LS 1} ! 469: {CENTER <{COND {LT {- @LINENUM,@PAGELENGTH},10},{SET LINENUM,1}}>} ! 470: {LS 1} ! 471: (Note that in this example qpred2 and qstr2 are omitted, ! 472: so they are assumed to be null.) ! 473: {LI}Define a macro <{IFLINES n}> to do the same thing, allowing any ! 474: number n. ! 475: {LS 1} ! 476: {NFJ} ! 477: <{SETQ IFLINES,{COND {LT {- @LINENUM,@PAGELENGTH},@1},-> ! 478: <{SET LINENUM,1}}}> ! 479: {FJ} ! 480: {LI}Move the left margin out 5 spaces, unless it is less than ! 481: 5 from the edge already, in which case set it to 1. ! 482: {LS 1} ! 483: {CENTER <{SET LMG,{COND {LE @LMG,5},1,,{- @LMG,5}}}>} ! 484: {CENTER or} ! 485: {CENTER <{COND {LE @LMG,5},{SET LMG,1},,{SET.- LMG,5}}>} ! 486: {EL} ! 487: {p} ! 488: ! ! 489: ! CREPROP ! 490: ! ! 491: {macdescr CREPROP,Create Property Table} ! 492: <{CREPROP str}> ! 493: {Macsec Description} ! 494: CREPROP generates a property table with the name "str". ! 495: Once such a table has been created, named values can be ! 496: set in the table using the property table name suffixed ! 497: onto the macro name with a backslash ("\"). ! 498: {Macsec Notes} ! 499: {bl}Only one property table is initially defined - the so-called ! 500: null property table. ! 501: The null property table is where all system defined macro values ! 502: reside, and the table which, by default, is referred to if a ! 503: macro name contains no property table reference. ! 504: {li}TSET stacks for the same name in different property tables are ! 505: distinct. ! 506: {li}DELPROP can be used to eliminate a property table and all ! 507: associated values when they are no longer of use. ! 508: {li}DOPROP allows examination of all the values of a property ! 509: table. ! 510: {Li}Numeric names in property tables other than the null table ! 511: do {ul not} refer to argument values, numeric names function no ! 512: differently from other names in these tables. ! 513: {El} ! 514: {macsec examples} ! 515: {bl}Create a property table "SECNUM" and set name "I" in it ! 516: to zero: ! 517: {Ls 1}{Center <{CREPROP SECNUM}{SET I\SECNUM,0}>}{Ls 1} ! 518: {li}The description of DOPROP contains more examples of ! 519: property tables. ! 520: {el} ! 521: {p} ! 522: ! ! 523: ! CS ! 524: ! ! 525: {MACDESCR CS,Create Control Sequence} ! 526: <{CS str}> ! 527: {Macsec description} ! 528: The value of CS is a control sequence for str. ! 529: A control sequence is printed as "str" but has a defined length of ! 530: zero, regardless of the length of str. ! 531: Str must not contain any overstrikes or embedded control sequences. ! 532: {Macsec notes} ! 533: {Bl}CS is primarily useful in creating device-dependent control ! 534: sequences that are embedded in the text, but which should not figure ! 535: into line length calculations (e.g. centering, justification, etc.). ! 536: {el} ! 537: {p} ! 538: ! ! 539: ! D ! 540: ! ! 541: {MACDESCR D,Retrieve The Definition of a Macro} ! 542: <{D mname}> ! 543: {macsec description} ! 544: The value of D is the string of characters which form the ! 545: definition of mname. ! 546: {macsec notes} ! 547: {Bl}The definition retrieved is not evaluated, so this is quite ! 548: different from <{mname ...}> if the definition contains quotes ! 549: or macro calls. ! 550: {LI}You can also apply D to arguments as in "<{D~3}>" which will ! 551: give the string of text passed as argument 3, without evaluating it. ! 552: {LI}D applied to system functions will result in the string ! 553: "SYSTEM", since these macros are not defined internally ! 554: using text, but rather as operational sequences using ! 555: a special code. ! 556: {Li}There is an abbreviated form of D which can be used when ! 557: an argument in a macro call is to evaluate to the definition ! 558: of some other macro. ! 559: If an argument begins with the at-sign ("@"), it is considered ! 560: to be such an argument. ! 561: The text of the argument following the at-sign is evaluated ! 562: in the normal way, and the result is taken as an "mname". ! 563: The value of the argument becomes the definition of that mname. ! 564: There are examples of this abbreviation below. ! 565: {Ls 1}Note that to have this effect, ! 566: the leading "@" cannot be a product of the evaluation, ! 567: it must be the {ul actual first character} of the argument text itself. ! 568: {EL} ! 569: {macsec examples} ! 570: {BL}Print the centered definition of a user-defined macro TITLE ! 571: without evaluating it: ! 572: {LS 1} ! 573: {center <{CENTER {D TITLE}}>}{BRK}{Center or}{Brk} ! 574: {Center <{CENTER @TITLE}>} ! 575: {LI}Suffix the string <{LS 1}> onto NEWLINE without upsetting ! 576: things by evaluating the text already in NEWLINE: ! 577: {LS 1} ! 578: {CENTER <{SET NEWLINE,{D NEWLINE}<{LS 1}>}>} ! 579: {center or} ! 580: {CENTER <{SET.APPEND NEWLINE,<{LS 1}>}>} ! 581: {LS 1} ! 582: Note that a form such as: ! 583: {Ls 1}{Center <{SET NEWLINE,@NEWLINE<{LS 1}>}>}{Ls 1} ! 584: would {ul not} be satisfactory because the "@" applies to ! 585: the resulting text of the {ul entire} argument (including the <"<{LS~1}>">, ! 586: not just the initial part of it. ! 587: {el} ! 588: {P} ! 589: ! ! 590: ! DATE ! 591: ! ! 592: {Macdescr DATE,Date Text} ! 593: <{DATE}> ! 594: {Macsec Description} ! 595: The value of DATE is the date-of-year in the form DD-MMM-YYYY. ! 596: For example, 08-SEP-1981. ! 597: {p} ! 598: ! ! 599: ! DBL ! 600: ! ! 601: {macdescr DBL,Double-Strike (Bold) Text} ! 602: <{DBL str}> ! 603: {macsec description} ! 604: <{DBL~str}> is equivalent to <{OS~str,str}>. ! 605: Its value is str overstruck with itself. ! 606: {macsec notes} ! 607: {bl}DBL can be a good substitute for italics. ! 608: {el} ! 609: {macsec examples} ! 610: {bl}Print "THE GETTYSBURG ADDRESS", centered and boldface. ! 611: {LS 1} ! 612: {CENTER <{CENTER {DBL THE GETTYSBURG ADDRESS}}>} ! 613: {ls 1} ! 614: This will print as: ! 615: {ls 1} ! 616: {CENTER {DBL THE GETTYSBURG ADDRESS}} ! 617: {li}Define a macro REALBOLD that will overstrike an image ! 618: with itself sixteen times: ! 619: {ls 1} ! 620: {center <{SETQ REALBOLD,{DBL {DBL {DBL {DBL @1}}}}}>} ! 621: {EL} ! 622: {P} ! 623: ! ! 624: ! DELPROP ! 625: ! ! 626: {Macdescr DELPROP,Delete a Property Table} ! 627: <{DELPROP str}> ! 628: {Macsec Description} ! 629: DELPROP erases a property table and all values and stacks associated ! 630: with it. ! 631: If further use is to be made of the eradicated property table, a ! 632: new CREPROP must be performed for it. ! 633: {p} ! 634: ! ! 635: ! DIAG ! 636: ! ! 637: {macdescr DIAG,Enter Diagnostic Subsystem} ! 638: <{DIAG}> ! 639: {Macsec Description} ! 640: DIAG is used for system testing. ! 641: It enters the system debugger. ! 642: The value of DIAG is null. ! 643: {Ls 1}As this is not a systems manual, no further explanation ! 644: of DIAG is offered here. ! 645: This function is for debugging and development, and should not ! 646: ordinarily be used. ! 647: {P} ! 648: ! ! 649: ! DISPLAY ! 650: ! ! 651: {macdescr DISPLAY,Print Message on Terminal} ! 652: <{DISPLAY str}> ! 653: {macsec description} ! 654: DISPLAY causes the value of str to be displayed on your ! 655: terminal. The value of DISPLAY itself is null. ! 656: {macsec notes} ! 657: {BL}No formatting is applied to str before it is sent to ! 658: the terminal. ! 659: {LI}QUERY can be used for messages where a response is ! 660: desired. ! 661: {EL} ! 662: {macsec examples} ! 663: {bl}Display an instructional message and begin receiving input from the ! 664: terminal: ! 665: {ls 1} ! 666: {nfj} ! 667: <{DISPLAY <Enter your text, use Control-Z to finish>}-> ! 668: <{TSET INPUT,TT:}}> ! 669: {LS 1} ! 670: {FJ} ! 671: {LI *~}Process the first 10 chapters of a document which has ! 672: been segmented into files: CH1.GPM, CH2.GPM, etc. Precede ! 673: each with an informative message to tell you that GPMDOC is ! 674: still alive. ! 675: {ls 1} ! 676: {nfj} ! 677: <{DOWHILE {LT @CHAP,10},{SET.ADD1 CHAP}-> ! 678: <{DISPLAY PRINTING CHAPTER {CHAP}}-> ! 679: <{TSET INPUT,CH{CHAP}.GPM}}> ! 680: {FJ} ! 681: {EL} ! 682: {P} ! 683: ! ! 684: ! DOPROP ! 685: ! ! 686: {macdescr DOPROP,Evaluate Property Table} ! 687: <{DOPROP str1,qstr2,str3}> ! 688: {Macsec Description} ! 689: DOPROP uses str1 (case irrelevant) ! 690: as a property table name (the backslash is not specified). ! 691: Qstr2 is repeatedly evaluated for each non-null ! 692: value in the indicated property table. ! 693: The context of this evaluation has <{D~1}> (argument one) set to the ! 694: macro name in the property table (without the table name suffix), and ! 695: <{D~2}> set to its corresponding value. ! 696: {Ls 1}If str3 evaluates to the string "UP" (case irrelevant), then ! 697: the table names are presented in ascending sorted order. ! 698: Similarly, "DOWN" will cause the names to be sorted in descending ! 699: order. ! 700: Otherwise, the names are presented in an unpredictable order. ! 701: In all cases, all the name-value pairs are evaluated exactly once. ! 702: {Ls 1}The value of DOPROP is the concatenated result formed by the ! 703: successive evaluations of qstr2. ! 704: {Macsec Notes} ! 705: {bl}For UP and DOWN sorts, names which are numeric will be sorted ! 706: as numbers, not as alphanumerics. ! 707: For example, the "2" is, as a number, less than "10", but ! 708: considered as a text string, "2" would be greater than "10". ! 709: {el} ! 710: {macsec examples} ! 711: {bl *~}DOPROP can be useful for generating sorted indices. ! 712: First, define a macro at the beginning of the document such as: ! 713: {Ls 1}{Center <{SETQ INDEX,{SET.APPEND {1}\INDEX,<,>{PAGENUM}}}>} ! 714: {Ls 1}This macro, when invoked in the document with a reference such ! 715: as "<{INDEX Pancakes}>" will append a comma and the current page number to ! 716: the value for PANCAKES on the INDEX property table. Before using ! 717: the macro, it is also necessary to establish the property table ! 718: with a macro call such as: "<{CREPROP INDEX}>". ! 719: {Ls 1}At the end of the document, you can 'dump' this property table in ! 720: a neat format. ! 721: The following DOPROP macro shows one way to do this: ! 722: {Ls 1}{Center <{DOPROP INDEX,{RPAD {SUBSTR @1,2},30,.}{2}{BRK},UP}>} ! 723: {Ls 1}This will print successive lines of the form: ! 724: {Ls 1}{Center <PANCAKES.....................18,45,104>}{Ls 1} ! 725: The SUBSTR is used to eliminate the initial comma which the INDEX macro ! 726: puts in front of each page number (including the first). ! 727: {el} ! 728: {p} ! 729: ! ! 730: ! DOWHILE ! 731: ! ! 732: {Macdescr DOWHILE,Repeated Evaluation} ! 733: <{DOWHILE pred,qstr}> ! 734: {MACSEC DESCRIPTION} ! 735: DOWHILE is evaluated by first evaluating the given predicate, and ! 736: if it is true, evaluating qstr. ! 737: This cycle is repeated until pred becomes non-null (false). ! 738: The value of the DOWHILE is ! 739: the concatenated values of the successive evaluations of qstr. ! 740: {macsec notes} ! 741: {BL}Be careful that the given predicate will eventually become ! 742: false, or an "infinite loop" will result, and you will have ! 743: to abort GPMDOC. ! 744: {EL} ! 745: {macsec examples} ! 746: {BL *~}Print the numbers from 1 to 20 on successive lines down ! 747: the left margin of the page: ! 748: {Ls 1}{Center <{SET NUM,0}{DOWHILE {LT {SETV.ADD1 NUM},20},{NUM}{BRK}}>} ! 749: {LS 1}Note that the macro NUM is the 'counter,' and that it is ! 750: initialized to zero. ! 751: {LI *~}Print ten numbered copies of a document: ! 752: {LS 1} ! 753: {Center <{SET D#,0}{DOWHILE {LT {SETV.ADD1 D#},10},{TSET INPUT,DOC.GPM}}>} ! 754: {ls 1} ! 755: DOC.GPM presumably contains references to <{D#}> which will ! 756: contain the document number as a result of the DOWHILE. ! 757: {EL} ! 758: {P} ! 759: ! ! 760: ! DSIZE ! 761: ! ! 762: {macdescr DSIZE,Size of Defined Macro} ! 763: <{DSIZE mname}> ! 764: {Macsec Description} ! 765: The value of DSIZE is the number of print columns in the definition ! 766: of mname. ! 767: DSIZE is equivalent to <{SIZE~{D~mname}}> or <{SIZE~@mname}>, ! 768: but is simpler and more efficient. ! 769: {Macsec Notes} ! 770: {bl}If the definition of mname contains no overstrikes ! 771: then the value of DSIZE is equal to the number of characters in the ! 772: definition. ! 773: {li}DSIZE applied to coded system macros (those for which <"{D mname}"> ! 774: is the same as <"{mname}">, will yield the same as <"{SIZE {mname}}">. ! 775: {el} ! 776: {p} ! 777: ! ! 778: ! DUPL ! 779: ! ! 780: {macdescr DUPL,Duplicate a String} ! 781: <{DUPL str,n}> ! 782: {macsec description} ! 783: The value of DUPL is str repeated n times. If n is zero, ! 784: the value of DUPL is null. ! 785: {macsec notes} ! 786: {BL}N must be non-negative. ! 787: {el} ! 788: {macsec examples} ! 789: {bl}Produce 20 periods: ! 790: {ls 1} ! 791: {nfj} ! 792: <{DUPL .,20}> ! 793: {fj} ! 794: {ls 1} ! 795: {li}Print a line of hyphens across the page: ! 796: {ls 1} ! 797: {nfj} ! 798: <{BRK}{DUPL -,@LINELENGTH}> ! 799: {FJ} ! 800: {LI *~}Define a macro CPAD, that will return its argument ! 801: text prefixed with the correct number of hard spaces to ! 802: cause the argument to be centered on the line (assuming it is printed ! 803: from the left margin). ! 804: {ls 1} ! 805: {nfj} ! 806: <{SETQ CPAD,{DUPL @HS,-> ! 807: <{DIV {- @LINELENGTH,{DSIZE 1}},2}}{D 1}}> ! 808: {FJ} ! 809: {Ls 1} ! 810: This macro calculates the number of hard spaces to produce ! 811: by subtracting the size of the argument text from the ! 812: length of the line, and dividing it by two. The argument text ! 813: is appended onto the right of these hard spaces. ! 814: {Ls 1} ! 815: The advantage that this macro might have over the system ! 816: CENTER macro is that CPAD only returns the argument text ! 817: padded on the left with hard spaces. ! 818: It does not cause any line breaks as does CENTER. ! 819: This means it would be possible for ! 820: you to print text on the same line to the right of the centered ! 821: text. ! 822: {el} ! 823: {p} ! 824: ! ! 825: ! EJECT ! 826: ! ! 827: {macdescr EJECT,Form Feed} ! 828: <{EJECT},> (Default: See Description) ! 829: <{D EJECT},> ! 830: <{set EJECT},> ! 831: {macsec description} ! 832: <{EJECT}> is initialized with the character codes or ! 833: sequence needed to cause a "form feed" (page eject) ! 834: on the system standard hard copy device. ! 835: {macsec notes} ! 836: {bl}If you are directing OUTPUT to other than the standard ! 837: device, it may be advantageous to set EJECT to a suitable ! 838: value first. ! 839: {li}<{EJECT}> has no effect on <{PAGENUM}>, and for ! 840: that reason is generally only used in ENDPAGE. ! 841: {el} ! 842: {macsec examples} ! 843: {bl}Skip to a new page at the bottom of each page ! 844: {ls 1} ! 845: {nfj} ! 846: <{SETQ ENDPAGE,{EJECT}}> ! 847: {ls 1} ! 848: {fj} ! 849: {el} ! 850: {p} ! 851: ! ! 852: ! END ! 853: ! ! 854: {macdescr END,Terminate GPMDOC Session} ! 855: <{END}> ! 856: {macsec description} ! 857: An evaluation of <{END}> will cause GPMDOC to flush its ! 858: output stream, close all files, and exit. ! 859: The value of END is irrelevant. ! 860: {macsec notes} ! 861: {BL}You can exit from GPMDOC by finishing input from the ! 862: initial input file (see the description of INPUT). ! 863: {LI}END can be used at any point in any file regardless ! 864: of present activity. ! 865: {Li}The use of END is normally discouraged, ! 866: as document files that contain it cannot be included (TSET INPUT) ! 867: from other document files. ! 868: {EL} ! 869: {macsec examples} ! 870: {BL}If <{FILENAME}> is null, print an error message and ! 871: terminate the session. ! 872: {ls 1} ! 873: {nfj} ! 874: <{COND {LEQ @FILENAME},{DISPLAY YOU HAVEN'T SPECIFIED><-> ! 875: <A FILE!}{END}}> ! 876: {FJ} ! 877: {EL} ! 878: {P} ! 879: ! ! 880: ! ENDPAGE ! 881: ! ! 882: {macdescr ENDPAGE,Ending Page Event} ! 883: <{set ENDPAGE,str}> (Default: <ENDPAGE={EJECT}>) ! 884: <{ENDPAGE}> ! 885: <{D ENDPAGE}> ! 886: {macsec description} ! 887: When the value of LINENUM becomes greater than the ! 888: value of PAGELENGTH, an ENDPAGE event occurs, which ! 889: causes the following sequence of events: ! 890: {bl}The line to be printed and any other text in the ! 891: output stream are put aside. ! 892: {li}NEWLINE is TSET to null, SPACING is TSET to one, ! 893: LMG is TSET to 10 and RMG is TSET to 75. ! 894: {li}<"{ENDPAGE}"> is evaluated. ! 895: {li}NEWLINE, SPACING, LMG and RMG are all restored. This ! 896: completes the ENDPAGE event. ! 897: {el} ! 898: {macsec notes} ! 899: {bl}If NEWLINE, SPACING, LMG or RMG are changed by ! 900: ENDPAGE, changes will only have effect during the ENDPAGE ! 901: event, as these macros are TSET and RESTOREd. ! 902: If you desire a permanent change, first do a RESTORE, and ! 903: then SET your desired permanent value for the macro. ! 904: (This will become the value restored at the end of the ENDPAGE ! 905: condition.) ! 906: Then TSET back the value for the ENDPAGE context. ! 907: {li}NEWPAGE and ENDPAGE conditions are inhibited while ! 908: the ENDPAGE condition is being processed. ! 909: {el} ! 910: {macsec examples} ! 911: {bl}Print the current page number, centered between hyphens ! 912: at the bottom of every page: ! 913: {ls 1} ! 914: {center <{SETQ ENDPAGE,{CENTER - {PAGENUM} -}}>} ! 915: {LI *~}In documents that are to be bound after they ! 916: are printed, it is frequently necessary to provide a ! 917: "gutter" on each page so that printing does not disappear ! 918: down into the binding. If printing is to be two-sided, ! 919: then odd-numbered pages will need to have this gutter ! 920: on the left, and even-numbered pages will have it on the ! 921: right (or vice-versa). This, in effect, necessitates ! 922: "sliding" the text horizontally back-and-forth on ! 923: successive pages. The place to do such sliding is ! 924: ENDPAGE. (NEWPAGE would be too late, since the margin ! 925: for the first line has already been formed when NEWPAGE occurs.) ! 926: {ls 1} ! 927: <{SETQ ENDPAGE,->{Brk} ! 928: < {SET.+ BIAS,{COND {EVEN @PAGENUM},5,,-5}}}> ! 929: {El} ! 930: {P} ! 931: ! ! 932: ! ENDTEXT ! 933: ! ! 934: {macdescr ENDTEXT,Ending Input Line} ! 935: <{set ENDTEXT,str}> ! 936: <{ENDTEXT}> ! 937: <{D ENDTEXT}> ! 938: {Macsec Description} ! 939: If ENDTEXT is non-null each physical line read by GPMDOC is compared ! 940: to the definition of ENDTEXT. ! 941: If it matches, INPUT is RESTOREd immediately. ! 942: The ENDTEXT line itself is discarded. ! 943: {Macsec Notes} ! 944: {Bl}The input lines that are examined are physical lines of the designated ! 945: input file, not logical lines. ! 946: This means that continuations are not processed, and also that ! 947: comment lines (those that begin with an exclamation point) ! 948: are candidates for ENDTEXT. ! 949: Comment lines are recommended for ENDTEXT, as they are otherwise ! 950: ignored by GPMDOC when processing a file. ! 951: {Li}The line for ENDTEXT must match exactly. ! 952: The case of letters is significant. ! 953: {Li}The ENDTEXT macro is most useful to terminate the context of a ! 954: pseudo-read. ! 955: To conditionally skip over text in the input stream, ! 956: the SKIPTEXT macro is more useful. ! 957: {el} ! 958: {p} ! 959: ! ! 960: ! EQ ! 961: ! ! 962: {Macdescr EQ,Predicate Comparison for Equality} ! 963: <{EQ n1,n2}> ! 964: {Macsec Description} ! 965: EQ evaluates to null (true) if "n1" is equal to "n2", ! 966: otherwise it evaluates to "1" (false). ! 967: {Macsec Examples} ! 968: See COND for uses of system predicate macros. ! 969: {P} ! 970: ! ! 971: ! EVEN ! 972: ! ! 973: {macdescr EVEN,Predicate Test for Numeric Even} ! 974: <{EVEN n}> ! 975: {Macsec description} ! 976: This predicate will evaluate null if the given argument is an even ! 977: number (zero and negative even numbers are even). ! 978: Otherwise it evaluates to "1" (false). ! 979: ! ! 980: ! FILL ! 981: ! ! 982: {Macdescr FILL,Line Fill Flag} ! 983: <{set FILL,pred}> (Default: FILL=1) ! 984: <{FILL}> ! 985: <{D FILL}> ! 986: {Macsec Description} ! 987: FILL is a flag that controls line fill mode on input. ! 988: If fill is enabled (FILL null) then no line break is forced after ! 989: reading logical lines of input text. ! 990: This allows output to be buffered in the output stream until there ! 991: is enough to just about fit on the line. ! 992: {Macsec Notes} ! 993: {Bl}The FJ and NFJ macros are normally used to control FILL, as ! 994: right justification is usually desired in concert with line fill. ! 995: {el} ! 996: {P} ! 997: ! ! 998: ! FJ ! 999: ! ! 1000: {macdescr FJ,Enable Fill and Justify Flags} ! 1001: <{FJ}> ! 1002: <{D FJ}> ! 1003: {macsec description} ! 1004: <{D~FJ}> is the string; <"{SET~FILL}{SET~JUST}">. ! 1005: It enables both line fill and right justification. ! 1006: The value of FJ is, by the above definition, null. ! 1007: {P} ! 1008: ! ! 1009: ! GE ! 1010: ! ! 1011: {Macdescr GE,Predicate for Greater or Equal} ! 1012: <{GE n1,n2}> ! 1013: {Macsec Description} ! 1014: GE evaluates to null (true) if "n1" is greater than or equal to "n2", ! 1015: otherwise it evaluates to "1" (false). ! 1016: {Macsec Examples} ! 1017: See COND for uses of system predicate macros. ! 1018: {P} ! 1019: ! ! 1020: ! GT ! 1021: ! ! 1022: {Macdescr GT,Predicate Comparison for Greater Than} ! 1023: <{GT n1,n2}> ! 1024: {Macsec Description} ! 1025: GT evaluates to null (true) if "n1" is greater than "n2", ! 1026: otherwise it evaluates to "1" (false). ! 1027: {Macsec Examples} ! 1028: See COND for uses of system predicate macros. ! 1029: {P} ! 1030: ! ! 1031: ! HS ! 1032: ! ! 1033: {MACDESCR HS,Hard Space Character} ! 1034: {TSET HS,%} ! 1035: <{set HS,str}> (Default: HS=~ (tilde)) ! 1036: <{HS}>, ! 1037: <{D HS}> ! 1038: {Restore Hs} ! 1039: {MACSEC DESCRIPTION} ! 1040: HS is used to alter or reference the Hard Space Character of the ! 1041: system. A hard space is a character (other than a space) that ! 1042: GPMDOC translates to a space just before the text is printed. ! 1043: The hard space can be used where it is desirable to prevent ! 1044: line-breaking or right justification. ! 1045: {MACSEC NOTES} ! 1046: {BL}Only the first character of str is taken for the new ! 1047: hardspace. ! 1048: {LI}Hard spacing can be disabled entirely by setting HS to a blank. ! 1049: {LI}It is impossible for the current hard space character to be ! 1050: printed, it must be changed by setting HS first. ! 1051: {LI}Note that hard space translation is applied just as the ! 1052: line is being printed. Thus if the hard space character is ! 1053: changed several times within a line, only the last change will ! 1054: have effect. ! 1055: {LI}Certain system macros (e.g. T (Tab), CENTER, LPAD, RPAD) can ! 1056: emit hard spaces. ! 1057: {EL} ! 1058: {MACSEC EXAMPLES} ! 1059: {BL}Insert ten hard spaces: ! 1060: {LS 1} ! 1061: {Tset Hs,%} ! 1062: {CENTER <{DUPL @HS,10}>} ! 1063: {CENTER or} ! 1064: {BRK} ! 1065: {CENTER <{DUPL ~,10}>} ! 1066: {Restore Hs} ! 1067: {LI} ! 1068: Turn off hard spaces so the tilde can be printed: ! 1069: {Tset Hs,%} ! 1070: {Ls 1}{Center <{TSET HS, }> A tilde looks like "~"<{BRK}{RESTORE HS}>} ! 1071: {El} ! 1072: {Restore Hs} ! 1073: ! ! 1074: ! INDEX ! 1075: ! ! 1076: {Macdescr INDEX,Locate Position of Substring} ! 1077: <{INDEX str1,str2}> ! 1078: {Macsec Description} ! 1079: The value of INDEX is the numeric position of the first occurrence ! 1080: of "str2" within "str1". ! 1081: If "str2" is not in "str1", the value of the INDEX macro is zero. ! 1082: If "str2" is null, the value of INDEX is one. ! 1083: {Macsec Notes} ! 1084: {Bl}The value of INDEX is the position of the substring (str2), ! 1085: not the offset. ! 1086: It is thus useful for use in the SUBSTR macro (see description). ! 1087: {el} ! 1088: {Macsec Notes} ! 1089: {Bl}Display a message if the value of the macro FILE does not ! 1090: contain the substring ".GPM": ! 1091: {Ls 1}{Center <{COND {EQ {INDEX @FILE,.GPM}},{DISPLAY WRONG FILE!}}>}{Ls 1} ! 1092: {El} ! 1093: ! ! 1094: ! INFORMAT ! 1095: ! ! 1096: {Macdescr INFORMAT,Logical Line Formatting Flag} ! 1097: <{set INFORMAT,pred}> (Default: INFORMAT=null) ! 1098: <{INFORMAT}> ! 1099: <{D INFORMAT}> ! 1100: {Macsec Description} ! 1101: The INFORMAT flag controls whether any processing is applied to input. ! 1102: If it is false (non-null) then input lines are processed exactly as read. ! 1103: Continuation hyphens are taken as ordinary characters, ! 1104: and comment lines (those that begin ! 1105: with an exclamation point) are processed as any other line. ! 1106: No evaluation of macros takes place. ! 1107: Text is sent to the output stream exactly as it is read. ! 1108: {Macsec Notes} ! 1109: {Bl}Note that output processing (e.g. FILL, JUST) will still be ! 1110: applied according to the setting of the flags. ! 1111: {li}Processing with INFORMAT set false is faster because less computation ! 1112: is required. ! 1113: {Li}In general, INFORMAT is used only in an INPUT TSET, where an ! 1114: ENDTEXT flag can be specified. ! 1115: Otherwise, since embedded macros are not evaluated it is impossible ! 1116: to get INFORMAT set true once it has been set false. ! 1117: {el} ! 1118: {p} ! 1119: ! ! 1120: ! INPUT ! 1121: ! ! 1122: {MACDESCR INPUT,Define the Data Input File} ! 1123: <{set INPUT,str,mname1=str1,mname2=str2,...}> ! 1124: {macsec description} ! 1125: Evaluation of a SET form on the system name INPUT causes GPMDOC ! 1126: to read succeeding lines from the device/file specified by "str". ! 1127: If a TSET form is used on INPUT, the current file is not closed ! 1128: out, and a subsequent RESTORE (or end-of-file) on the new ! 1129: file will cause input to resume from the original file at the ! 1130: line following the one which caused the TSET. ! 1131: In general, "<{SET INPUT,...}>" switches input to a different ! 1132: file, while a TSET suspends the current file temporarily ! 1133: in order to process a new one. ! 1134: {Ls 1}Input completes when an end-of-file condition is encountered, ! 1135: when a <{RESTORE INPUT}> occurs (for a TSET), or when ! 1136: a previously defined ENDTEXT line is seen. ! 1137: {ls 1}Arguments out past "str" should evaluate to text of ! 1138: the form: "mname=str" (e.g. "LMG=40"). ! 1139: Arguments of this form are termed "keyword" arguments, ! 1140: and will be TSET by GPMDOC before initiating ! 1141: the new input stream, and be automatically RESTOREd by GPMDOC when ! 1142: the input is complete. ! 1143: Such keyword arguments are only significant on an INPUT TSET, ! 1144: they are ignored on INPUT SETs. ! 1145: {Ls 1}A null "str" is termed a 'pseudo-read.' ! 1146: It signifies that input should continue from the current file. ! 1147: This is useful for forms which use the keyword arguments ! 1148: to create a 'nested context'. ! 1149: {macsec notes} ! 1150: (INPUT is somewhat implementation dependent, these notes ! 1151: describe the VAX/VMS version.) ! 1152: {BL}INPUT TSETs can only be nested to a system-imposed limit ! 1153: (between 10 and 20). ! 1154: Pseudo-reads do not count toward that limit. ! 1155: INPUT SETs simply cause the current file to be closed, and ! 1156: the designated one to be opened. ! 1157: There is thus no limit to the number of times this can be done. ! 1158: {LI}The STARTTEXT and ENDTEXT macros are useful in conjunction ! 1159: with INPUT TSETs. Either or both can be specified as keyword ! 1160: arguments to the INPUT set to cause the input to begin or end ! 1161: at predetermined points in the file. ! 1162: The INFORMAT system macro flag is also useful in the same ! 1163: way to cause a section of a document to be printed {ul literally}. ! 1164: {LI}"Str" should be a standard device/file specification. If ! 1165: your specification includes commas it must be in quotes ("<<>>") to ! 1166: avoid an incorrect argument scan. ! 1167: {LI}When GPMDOC is first started, it issues several INPUT sets ! 1168: automatically. ! 1169: First is input for the auxilliary built-in ! 1170: function definitions contained in a file called GPMBIF.GPM ! 1171: on a system account. ! 1172: It then attempts to read a file called ! 1173: GPMSTART on your account. ! 1174: (If this file doesn't exist, no error is reported.) ! 1175: GPMDOC finally evaluates the command line and exits. ! 1176: If the command line is empty, then INPUT is automatically ! 1177: TSET to your terminal (the message "READY" is printed to ! 1178: inform you of this condition). ! 1179: A control-Z signals an end-of-file from the terminal, and ! 1180: can thus be used to exit GPMDOC when in this mode. ! 1181: The initial commands you specify, either in the command line ! 1182: or from your terminal can SET or TSET INPUT for the files ! 1183: you want to process. ! 1184: {Ls 1}You may want to put frequently used ! 1185: "private" macros in your GPMSTART file. ! 1186: {LI}INPUT TSETs can be useful in breaking up large documents. ! 1187: Each part of a document can be put in a separate file. ! 1188: These files can then be edited and ! 1189: run off individually. ! 1190: To run off all of them, construct another ! 1191: file which issues INPUT TSETs to each of the individual files in turn. ! 1192: This "master file" might also contain, or read in, the definitions ! 1193: of any macros that are referenced frequently in the document files. ! 1194: {Li}A SET on INPUT does not have any effect until the next line is ! 1195: read in, ! 1196: that is, not until the current line of input has been processed. ! 1197: An INPUT TSET can be issued at any point and has immediate effect. ! 1198: The remainder of the line (if any) where the TSET occurred will be ! 1199: processed when input is restored. ! 1200: {EL} ! 1201: {MACSEC EXAMPLES} ! 1202: {BL}Start GPMDOC and read and process the text in WHITEPAP.GPM. ! 1203: As no output file is specified, output will be directed at ! 1204: the standard output stream. ! 1205: GPMDOC will exit when the file has been processed. ! 1206: {LS 1} ! 1207: {CENTER <GPMDOC6 {SET INPUT,WHITEPAP.GPM}>} ! 1208: {Ls 1}This shows method of specifying a command line to GPMDOC. ! 1209: {LI}This macro reference will read and process the text in the ! 1210: file [1,40]HELP.GPM. ! 1211: When the end-of-file is reached, input will be resumed ! 1212: from the point in the file which issued this TSET. ! 1213: {LS 1}{CENTER <{TSET INPUT,<[1,40]HELP.GPM>}>}{LS 1} ! 1214: Note the use of the angle brackets to shield the comma in the ! 1215: directory string "[1,40]". ! 1216: {LI}Read and process text from the user's terminal until ! 1217: an end-of-file (control Z) is entered. ! 1218: {LS 1} ! 1219: {CENTER <{TSET INPUT,TT:}>} ! 1220: {LI}Define a macro that will read and process text from the ! 1221: user's terminal until *EOF is typed in: ! 1222: {Ls 1}{CENTER <{SETQ REOF,{TSET INPUT,TT:,ENDTEXT=*EOF}}>} ! 1223: {LS 1} ! 1224: {LI}Insert a "boiler-plate" paragraph from a file that the ! 1225: user specifies when the document is run off: ! 1226: {Ls 1}{CENTER <{TSET INPUT,BOILER{QUERY WHICH PARAGRAPH?}.GPM}>} ! 1227: {LS 1} ! 1228: Note: This example assumes that the boiler-plate paragraphs ! 1229: all have the form BOILERXXX.GPM; all the user need do in this ! 1230: case is enter which XXX is desired. ! 1231: {LI}Print a form letter using an address from a file of ! 1232: addresses, "ADDR.GPM". ! 1233: This file is assumed to have the form: ! 1234: {Ls 1}{Nfj} ! 1235: !**PAULS PIZZA ! 1236: PAUL'S PIZZA EMPORIUM ! 1237: 140 SAN PEPPERONI DR. ! 1238: AUSTIN, TEXAS ! 1239: !** ! 1240: !**TERRYS TOYS ! 1241: TERRY'S TOY SHOP ! 1242: #1 NORTH POLE ! 1243: ARTIC CIRCLE ! 1244: !** ! 1245: : ! 1246: : ! 1247: {Ls 1}{Fj} ! 1248: The user will specify which address to use when the letter is run. ! 1249: {Ls 1}{Nfj} ! 1250: ! ! 1251: !Print the Sender's Address ! 1252: ! ! 1253: <{LIN 40}> ! 1254: Acme Collection Agency ! 1255: Hardline Ave. ! 1256: Cleveland, Ohio ! 1257: <{RESTORE LMG}> ! 1258: ! ! 1259: !Now Print the Address ! 1260: ! ! 1261: <{TSET INPUT,-> ! 1262: < ADDR.GPM,STARTTEXT=!**{Query Recipient?},ENDTEXT=!**}> ! 1263: ! ! 1264: !Do the Body ! 1265: ! ! 1266: Dear person:<{Brk}{Fj}>a check of our records ! 1267: : ! 1268: : ! 1269: {Ls 1}{Fj} ! 1270: {LI}Fortran programs contain characters that could cause ! 1271: them to be erroneously processed (e.g. a minus sign at ! 1272: the end of a line). This example shows how to insert the ! 1273: text of such a program in a document using a literal read. ! 1274: {Ls 1}{Center <{TSET INPUT,PROGRAM.FOR,INFORMAT=1,FILL=1,JUST=1}>} ! 1275: {Ls 1} ! 1276: {Li}This example shows how to print a section of a document exactly ! 1277: as it appears using a pseudo-read. ! 1278: {Ls 1}{Nfj} ! 1279: : ! 1280: : ! 1281: <!> Ordinary text ! 1282: : ! 1283: <{TSET INPUT,,INFORMAT=1,FILL=1,JUST=1,Endtext=!**}> ! 1284: : ! 1285: <!> Text to be printed as it appears ! 1286: : ! 1287: !** ! 1288: : ! 1289: <!> Continue with ordinary text ! 1290: : ! 1291: : ! 1292: {Ls 1}{Fj} ! 1293: Note that here ENDTEXT is used to designate a marker ("!**") that will cause ! 1294: the pseudo-read to terminate and thus end literal input. ! 1295: Reading then continues on in the ordinary way after the **. ! 1296: {Li *~}Set up a file to print the first three chapters of the document ! 1297: SHIPLOG. Each chapter is in a separate file. ! 1298: {Nfj}{Ls 1} ! 1299: <{TSET INPUT,SHIPLOG1.GPM}> ! 1300: <{TSET INPUT,SHIPLOG2.GPM}> ! 1301: <{TSET INPUT,SHIPLOG3.GPM}> ! 1302: or ! 1303: <{DOWHILE {LT @LOG#,3},{SET.ADD1 LOG#}-> ! 1304: <{TSET INPUT,SHIPLOG{LOG#}.GPM}}> ! 1305: {Fj} ! 1306: {El} ! 1307: {P} ! 1308: ! ! 1309: ! JUST ! 1310: ! ! 1311: {Macdescr JUST,Right Justification Flag} ! 1312: <{set JUST,pred}> (Default: JUST=null) ! 1313: <{JUST}> ! 1314: <{D JUST}> ! 1315: {Macsec description} ! 1316: JUST is the GPMDOC right justification flag. ! 1317: If true (null) then all lines that are broken off the output stream ! 1318: for printing have spaces inserted in them to cause the rightmost ! 1319: character to line up with the right margin. ! 1320: This action will only be applied if the line is broken off as a ! 1321: consequence of the output stream accumulating as much or more text than will ! 1322: fit on a single output line. ! 1323: Lines printed as a consequence of line breaks are never justified. ! 1324: {Macsec Notes} ! 1325: {bl}FJ and NFJ are normally used to manipulate FILL and JUST together. ! 1326: Under normal circumstances, FILL should be enabled when JUST is enabled. ! 1327: {Li}Spaces are inserted only at points in the line where spaces already ! 1328: exist. ! 1329: Spaces in the line are never removed. ! 1330: The spaces are distributed throughout the lines in such a way as ! 1331: to reduce the possibility of white 'rivers' or 'lakes' running down the ! 1332: page. ! 1333: {el} ! 1334: {p} ! 1335: ! ! 1336: ! LE ! 1337: ! ! 1338: {Macdescr LE,Predicate for Less Than or Equal} ! 1339: <{LE n1,n2}> ! 1340: {Macsec Description} ! 1341: LE evaluates to null (true) if "n1" is less than or equal to "n2", ! 1342: otherwise it evaluates to "1" (false). ! 1343: {Macsec Examples} ! 1344: See COND for uses of system predicate macros. ! 1345: {P} ! 1346: ! ! 1347: ! LEQ ! 1348: ! ! 1349: {Macdescr LEQ,Predicate for Lexical Equality} ! 1350: <{LEQ str1,str2}> ! 1351: {Macsec Description} ! 1352: LEQ evaluates to null (true) if "str1" is equal to "str2" ! 1353: in terms of alphanumeric (lexical) value. ! 1354: This means that the two strings must be identical in all respects, ! 1355: including case. ! 1356: Otherwise it evaluates to "1" (false). ! 1357: {Macsec Examples} ! 1358: {Bl}If the user responds "No" then skip input up to the next line ! 1359: of the form "!**": ! 1360: {Ls 1}{Center <{COND {LEQ NO,{CAPS {QUERY CONTINUE?}}},{SKIPTEXT !**}}>} ! 1361: {Ls 1} ! 1362: Note the use of "CAPS" to insure that regardless of the case ! 1363: of the user's response, ! 1364: the comparison will be true if the response was "no". ! 1365: {El} ! 1366: {Ls 1} ! 1367: See COND for other uses of system predicate macros. ! 1368: {P} ! 1369: ! ! 1370: ! LGE ! 1371: ! ! 1372: {Macdescr LGE,Predicate for Lexical Greater or Equal} ! 1373: <{LGE str1,str2}> ! 1374: {Macsec Description} ! 1375: LGE evaluates to null (true) if "str1" is greater than or equal to "str2" ! 1376: in terms of alphanumeric (lexical) value. ! 1377: Otherwise it evaluates to "1" (false). ! 1378: {Macsec Examples} ! 1379: See COND for uses of system predicate macros. ! 1380: {P} ! 1381: ! ! 1382: ! LGT ! 1383: ! ! 1384: {Macdescr LGT,Predicate for Lexical Greater Than} ! 1385: <{LGT str1,str2}> ! 1386: {Macsec Description} ! 1387: LGT evaluates to null (true) if "str1" is greater than "str2" ! 1388: in terms of alphanumeric (lexical) value. ! 1389: Otherwise it evaluates to "1" (false). ! 1390: {Macsec Examples} ! 1391: See COND for uses of system predicate macros. ! 1392: {P} ! 1393: ! ! 1394: ! LIN ! 1395: ! ! 1396: {Macdescr LIN,Indent the left margin} ! 1397: <{LIN n}> ! 1398: {Macsec Description} ! 1399: <{LIN n}> is equivalent to <{TSET.+ LMG,n}>. ! 1400: It indents the left margin an additional "n" places. ! 1401: {Macsec Notes} ! 1402: {bl}"n" can be negative to outdent the left margin ! 1403: {li}Keep in mind that LIN does a TSET. ! 1404: The left margin prior to the LIN operation is saved on the LMG stack. ! 1405: A subsequent <{RESTORE LMG}> will reactivate it. ! 1406: {li}There is a companion RIN macro to indent the right margin. ! 1407: {EL} ! 1408: {P} ! 1409: ! ! 1410: ! LINELENGTH ! 1411: ! ! 1412: {Macdescr LINELENGTH,Number of Print Positions on a Line} ! 1413: <{set LINELENGTH,n}> (Default: LINELENGTH=66} ! 1414: <{LINELENGTH}> ! 1415: <{D LINELENGTH}> ! 1416: {macsec description} ! 1417: The value of LINELENGTH is the number of print columns between ! 1418: the current left and right margins. Setting LINELENGTH has ! 1419: the effect of altering the value of RMG (the right margin) ! 1420: so as to force <{LINELENGTH}> to equal the requested value. ! 1421: {macsec notes} ! 1422: {BL}n must be positive and non-zero. ! 1423: {el} ! 1424: {macsec examples} ! 1425: {BL}Set the page to have 40 print columns ! 1426: {ls 1} ! 1427: {CENTER <{SET LINELENGTH,40}>} ! 1428: {LI}If there are less than ten columns on the line, then ! 1429: set LINELENGTH to 10. ! 1430: {ls 1} ! 1431: {CENTER <{COND {LT @LINELENGTH,10},{SET LINELENGTH,10}}>} ! 1432: {EL} ! 1433: {P} ! 1434: ! ! 1435: ! LINENUM ! 1436: ! ! 1437: {MACDESCR LINENUM,Current Line on Page} ! 1438: <{set LINENUM,n}> ! 1439: <{LINENUM}> ! 1440: <{D LINENUM}> ! 1441: {macsec description} ! 1442: LINENUM always has the number of the next line to be ! 1443: printed on the page. It is set to one by the system ! 1444: at the conclusion of processing a NEWPAGE condition. ! 1445: Thus lines are numbered consecutively starting at one ! 1446: with the first line on the page. ! 1447: LINENUM can also be set. ! 1448: This forces a line break, and lines to be skipped until ! 1449: the next print line will be at the value specified in the SET. ! 1450: This is termed "vertical tabulation". ! 1451: {macsec notes} ! 1452: {BL}The value for n must be between 1 and <{PAGELENGTH}>. ! 1453: {LI}You can use <{SET~LINENUM,1}> to force printing to begin ! 1454: on a new page. This is different from <{LS~10000}> in that ! 1455: the LS form can cause a blank page to appear if printing ! 1456: is already positioned at the top of a page. ! 1457: The <{SET~LINENUM,1}> ! 1458: form will cause nothing to happen if the current print line is ! 1459: already n. ! 1460: <{SET~LINENUM,1}> should normally be used to begin a page. ! 1461: {LI}If the printing has already gone past line n ! 1462: on a <{SET~LINENUM,n}>, ! 1463: a new page is forced before skipping occurs. ! 1464: {EL} ! 1465: {macsec examples} ! 1466: {BL}Print text centered on line 40. ! 1467: {ls 1} ! 1468: {nfj} ! 1469: <{SET LINENUM,40}{CENTER REPORT SUBMITTED BY:}{BRK}> ! 1470: {FJ} ! 1471: {LI}Skip to a new page if more than ten lines have ! 1472: been already printed. ! 1473: {LS 1} ! 1474: {Center <{COND {GT @LINENUM,10},{LS 10000}}>} ! 1475: {EL} ! 1476: {P} ! 1477: ! ! 1478: ! LITERAL ! 1479: ! ! 1480: {Macdescr LITERAL,Process Text Literally} ! 1481: <{Literal str}> ! 1482: {Macsec Description} ! 1483: LITERAL causes subsequent text lines to be processed exactly as they ! 1484: appear in the input file. ! 1485: Macros are not evaluated, comment lines are passed, and line fill and ! 1486: justification are disabled. ! 1487: {Ls 1}A line identical to 'str' causes termination of the LITERAL, ! 1488: and a resumption of the previous processing state. ! 1489: If str is omitted, it is assumed to be "!**". ! 1490: {Ls 1}LITERAL is defined to be: ! 1491: {Ls 1}~~~~~<{BRK}{TSET INPUT,,INFORMAT={COND {LEQ @1},!**,,@1},-> ! 1492: {Brk }~~~~~<~~~~~INFORMAT=1,JUST=1,FILL=1}> ! 1493: {Ls 1} ! 1494: ! ! 1495: ! LLE ! 1496: ! ! 1497: {Macdescr LLE,Predicate for Lexical Less Than or Equal} ! 1498: <{LLE str1,str2}> ! 1499: {Macsec Description} ! 1500: LLE evaluates to null (true) if "str1" is less than or equal to "str2" ! 1501: in terms of alphanumeric (lexical) value. ! 1502: Otherwise it evaluates to "1" (false). ! 1503: {Macsec Examples} ! 1504: See COND for uses of system predicate macros. ! 1505: {P} ! 1506: ! ! 1507: ! LLT ! 1508: ! ! 1509: {Macdescr LLT,Predicate Comparison for Lexical Less Than} ! 1510: <{LLT str1,str2}> ! 1511: {Macsec Description} ! 1512: LLT evaluates to null (true) if "str1" is less than "str2" ! 1513: in terms of alphanumeric (lexical) value. ! 1514: Otherwise it evaluates to "1" (false). ! 1515: {Macsec Examples} ! 1516: See COND for uses of system predicate macros. ! 1517: {P} ! 1518: ! ! 1519: ! LMG ! 1520: ! ! 1521: {macdescr LMG,Left Margin} ! 1522: <{set LMG,n}> (Default: LMG=10) ! 1523: <{LMG}> ! 1524: <{D LMG}> ! 1525: {MACSEC DESCRIPTION} ! 1526: The value of LMG tells GPMDOC how far to space out each print ! 1527: line from the left BIAS. ! 1528: LMG must always be less than or equal to the right margin (RMG). ! 1529: In addition, the sum of LMG and BIAS must always be a positive value. ! 1530: {macsec notes} ! 1531: {Bl}The value of LMG is only used by GPMDOC when it is ready to ! 1532: print a new line. So if you change LMG several times in a line, ! 1533: only the final change will have effect. ! 1534: {LI}LMG is used prior to evaluating NEWLINE, so if NEWLINE ! 1535: changes LMG, that change will affect the next print line. ! 1536: {EL} ! 1537: {macsec examples} ! 1538: {BL}Set the left margin to 20: ! 1539: {ls 1}{nfj} ! 1540: <{SET LMG,20}> ! 1541: {Fj}{Ls 1} ! 1542: {Li}Set the left margin to 20 to the left of the right ! 1543: margin: ! 1544: {Ls 1}{Nfj} ! 1545: <{SET LMG,{- @RMG,20}}}> ! 1546: {Fj}{Ls 1} ! 1547: Note that <{LINELENGTH}> will now equal 21, not 20 because ! 1548: both <{LMG}> and <{RMG}> are printing columns. ! 1549: {El} ! 1550: {P} ! 1551: ! ! 1552: ! LNE ! 1553: ! ! 1554: {Macdescr LNE,Predicate Comparison for Lexical Not Equal} ! 1555: <{LNE str1,str2}> ! 1556: {Macsec Description} ! 1557: LNE evaluates to null (true) if "str1" is not equal to "str2" ! 1558: in terms of alphanumeric (lexical) value. ! 1559: Otherwise it evaluates to "1" (false). ! 1560: {Macsec Examples} ! 1561: See COND for uses of system predicate macros. ! 1562: {P} ! 1563: ! ! 1564: ! LOAD ! 1565: ! ! 1566: {Macdescr LOAD,Load from Library} ! 1567: <{LOAD str1,str2}> ! 1568: {Macsec Description} ! 1569: Load reads from a user 'macro library'. ! 1570: "Str1" is taken as the filename of the library. ! 1571: "Str2" is the name of the 'module' to be loaded. ! 1572: If "str2" is null, then the entire library is processed. ! 1573: {Macsec Notes} ! 1574: {Bl}The "SYSLOAD" macro can be used when loading from the ! 1575: standard system library. ! 1576: {Li}Normally, library modules should set macro definitions, ! 1577: and not produce any text on their own. ! 1578: {Li}The library must be in a particular form in order for ! 1579: LOAD to work correctly. ! 1580: Each module must be preceeded by a single line containing ! 1581: an exclamation mark in column one, ! 1582: and the module name starting in column two of the line. ! 1583: The remainder of the line must be empty. ! 1584: {Ls 1}The end of the module must be a single line of the form "!**" ! 1585: {Ls 1}LOAD is thus defined as: ! 1586: {Ls 1}{Nfj} ! 1587: <{COND {LEQ @2},{TSET INPUT,@1},-> ! 1588: <{TSET INPUT,@1,STARTTEXT=!{1},ENDTEXT=!**}}> ! 1589: {El} ! 1590: {P} ! 1591: ! ! 1592: ! LPAD ! 1593: ! ! 1594: {macdescr LPAD,Pad a String on the Left} ! 1595: <{LPAD str1,n,str2}> ! 1596: {macsec description} ! 1597: The value of LPAD is str1 prefixed with ! 1598: replications of str2 to produce a result of length n. ! 1599: If str1 is already as long or longer than n, the value of LPAD is str1. ! 1600: The value of LPAD is also str1 if n is zero or negative. ! 1601: If str2 must be replicated a non-integral number of times, the ! 1602: last replication will be truncated to the appropriate length. ! 1603: If str2 is null, then the present hardspace character is used. ! 1604: {macsec notes} ! 1605: {BL}LPAD, along with RPAD, is useful for producing ! 1606: tabular text. ! 1607: {EL} ! 1608: {macsec examples} ! 1609: {BL}Print a line consisting of "PAGE:" and the current ! 1610: page number at the right margin: ! 1611: {Ls 1}{Center <{LPAD PAGE:{PAGENUM},@LINELENGTH}{BRK}>} ! 1612: {Ls 1} ! 1613: The LPAD causes the first argument string (e.g. "PAGE:32") to ! 1614: be prefixed with hard spaces until it is as long as one ! 1615: print line (<{LINELENGTH}>). It will thus appear flush with the ! 1616: right margin. ! 1617: {Li}Print the number in macro LISTNUM, left padded with zeros ! 1618: to 6 digits. ! 1619: {Ls 1}{Center <{LPAD @LISTNUM,6,0}>} ! 1620: {Ls 1} ! 1621: With this macro, if <{LISTNUM}> were defined as "63", ! 1622: the LPAD would return "000063". ! 1623: {El} ! 1624: {P} ! 1625: ! ! 1626: ! LS ! 1627: ! ! 1628: {macdescr LS,Line Spacing} ! 1629: <{LS n}> ! 1630: {macsec description} ! 1631: The LS macro causes a line break and n blank lines to be ! 1632: inserted on the page. This spacing will terminate if ! 1633: it causes an ENDPAGE to occur, regardless of the value of n. ! 1634: The value of LS is null. ! 1635: {macsec notes} ! 1636: {bl}N may not be negative. ! 1637: {LI}LS is subject to the effect induced by the value of ! 1638: BSLACK. ! 1639: {LI}<{LS~0}> is equivalent to <{BRK}>, a line break. No blank ! 1640: lines will be printed. Note that <{LS}> is the same ! 1641: as <{LS~0}>, as the implied null argument in the former ! 1642: will be interpreted as a numeric zero. ! 1643: {LI}LINENUM is also useful for skipping lines, read the ! 1644: description of the LINENUM macro, and particularly the ! 1645: <{SET~LINENUM,n}> form. ! 1646: {EL} ! 1647: {macsec examples} ! 1648: {BL}Skip 10 lines to leave room for a drawing: ! 1649: {Ls 1}{Center <{LS 10}>} ! 1650: {Ls 1} ! 1651: {LI}The example above isn't really very good, since skipping ! 1652: always stops at the end of a page. If the page is already ! 1653: almost full, the <{LS 10}> won't leave enough room. One way to solve ! 1654: this problem would be to run the page out and put the 10 lines ! 1655: at the top of the next page if less than 10 lines remain. This ! 1656: can be done with: ! 1657: {Ls 1}{Center <{COND {GT @LINENUM,{- @PAGELENGTH,10}},{LS 10000}}{LS 10}>} ! 1658: {Ls 1} ! 1659: The <{LS 10000}> will most certainly cause the page to run ! 1660: out (unless you have a {ul very} long page!), but notice ! 1661: that it will only occur if the value of LINENUM is past ! 1662: <{PAGELENGTH}> minus 10. ! 1663: The LS 10 does the skipping. ! 1664: {Li *~}The example just given may not seem all that satisfactory ! 1665: to you either, since it leaves a rather big "white lake" ! 1666: at the bottom of some of the pages for no seemingly good reason. ! 1667: What we really want is to either skip the 10 lines if there is ! 1668: room, or wait and skip the 10 lines when we start the next page. ! 1669: This is fairly straightforward using NEWPAGE. As before, we ! 1670: test LINENUM, and either skip the 10 lines, or if it has gone ! 1671: too far, TSET the <{LS 10}> onto NEWPAGE. ! 1672: {Ls 1}{Nfj} ! 1673: <{COND {LE @LINENUM,{- @PAGELENGTH,10}},{LS 10},-> ! 1674: <{TSET.APPEND NEWPAGE,<{LS 10}{RESTORE NEWPAGE}>}}> ! 1675: {Ls 1}{Fj} ! 1676: The flavor of this is similar to that used with OUTDENT, ! 1677: in that the NEWPAGE "self-destructs" the <{LS 10}> ! 1678: once it has been carried out, by doing a RESTORE on itself. ! 1679: {Li}Here is a macro definition FIGURE for this, to which ! 1680: you can give the number of lines as an argument: ! 1681: {Ls 1}{Nfj} ! 1682: <{SETQ FIGURE,-> ! 1683: <{COND {LE @LINENUM,{- @PAGELENGTH,@1}},{LS @1},-> ! 1684: <,{TSET.APPEND NEWPAGE,<{LS >{1}<}{RESTORE NEWPAGE}>}}-> ! 1685: <}> ! 1686: {Ls 1}{Fj} ! 1687: {EL} ! 1688: {P} ! 1689: ! ! 1690: ! LT ! 1691: ! ! 1692: {Macdescr LT,Predicate Comparison for Less Than} ! 1693: <{LT n1,n2}> ! 1694: {Macsec Description} ! 1695: LT evaluates to null (true) if "n1" is less than "n2", ! 1696: otherwise it evaluates to "1" (false). ! 1697: {Macsec Examples} ! 1698: See COND for uses of system predicate macros. ! 1699: {P} ! 1700: ! ! 1701: ! NEWLINE ! 1702: ! ! 1703: {macdescr NEWLINE,Define Event For Each New Line} ! 1704: <{set NEWLINE,str}> ! 1705: <{NEWLINE}> ! 1706: <{D NEWLINE}> ! 1707: {macsec description} ! 1708: NEWLINE is an evaluated automatically ! 1709: by GPMDOC each time it is ready to print a new line. ! 1710: Any value produced by referencing NEWLINE is discarded. ! 1711: {macsec notes} ! 1712: {BL}The <{NEWLINE}> form is not normally used. The system does ! 1713: this automatically on each newline. ! 1714: {LI}GPMDOC makes no adjustment to the margins as a result of ! 1715: any characters affixed to the line as a result of NEWLINE's ! 1716: evaluation. ! 1717: {LI}The OUTSTREAM macro can be useful in NEWLINE to alter the ! 1718: line to be printed. ! 1719: {LI}The GPMDOC uses NEWLINE for the operation of some of ! 1720: its macros (e.g. OUTDENT). It is thus not ! 1721: normally advisable to set NEWLINE directly, since it may ! 1722: already contain text (your's or GPMDOC's). ! 1723: A ! 1724: {Ls 1}{Center <{SET.APPEND~NEWLINE,text}>} ! 1725: {Center or} ! 1726: {Center <{TSET.APPEND~NEWLINE,text}>} ! 1727: {Ls 1} ! 1728: which affixes your text to any existing text in NEWLINE is ! 1729: preferred. ! 1730: {EL} ! 1731: {macsec examples} ! 1732: (Also see OUTSTREAM macro description). ! 1733: {BL *~}OUTDENT the next line five spaces: ! 1734: {Ls 1}{Nfj} ! 1735: <{TSET.- LMG,5}-> ! 1736: <{TSET.APPEND NEWLINE,<{RESTORE LMG,NEWLINE}}>> ! 1737: {Ls 1}{Fj} ! 1738: This operation proceeds by first temporarily setting (TSET) ! 1739: the left margin out 5 spaces. Then the text ! 1740: <{RESTORE~LMG,NEWLINE}> is tacked onto the end of ! 1741: any existing NEWLINE text and temporarily set back into ! 1742: NEWLINE (TSET.APPEND). ! 1743: Thus when the next line is printed ! 1744: the following actions occur: ! 1745: {BL}The left margin spacing is computed based on the new ! 1746: value which is the old value minus 5. ! 1747: {LI}NEWLINE is evaluated automatically by GPMDOC and this causes ! 1748: the old left margin to be restored (for succeeding lines), ! 1749: NEWLINE then restores its own old value so that the text ! 1750: appended onto it for the outdent effectively "self-destructs". ! 1751: {LS 1} ! 1752: {EL} ! 1753: This is the definition for the system OUTDENT macro. ! 1754: {el} ! 1755: {P} ! 1756: ! ! 1757: ! NEWPAGE ! 1758: ! ! 1759: {MACDESCR NEWPAGE,Define Event For Starting a New Page} ! 1760: <{set NEWPAGE,str}> (Default: NEWPAGE=<{LS 1}-> ! 1761: <{COND {GT @PAGENUM,1},-> ! 1762: <{LPAD PAGE {PAGENUM},@LINELENGTH}}-> ! 1763: <{LS 2}> ! 1764: <{NEWPAGE}> ! 1765: <{D NEWPAGE}> ! 1766: {macsec description} ! 1767: The first line to be printed after an ENDPAGE condition has ! 1768: occurred causes a NEWPAGE event. ! 1769: Before the line is actually printed, the following actions take place: ! 1770: {BL}The line to be printed and any other assembled output text ! 1771: are put aside. ! 1772: {LI}NEWLINE is TSET to null, SPACING is TSET to one (single ! 1773: spacing). LMG is TSET to 10. RMG is TSET to 75. ! 1774: {LI}The value of LINENUM becomes one. ! 1775: {LI}"<{NEWPAGE}>" is given to the evaluator for printing. ! 1776: {LI}NEWLINE, SPACING, LMG and RMG are restored, which completes ! 1777: the NEWPAGE event. ! 1778: {EL} ! 1779: {MACSEC NOTES} ! 1780: {BL}A NEWPAGE event happens on the first line of a ! 1781: document, even though no preceeding ENDPAGE has occurred. ! 1782: {LI}If NEWLINE, SPACING, LMG or RMG are changed in NEWPAGE, ! 1783: changes will only have effect during the NEWPAGE condition, as ! 1784: they are TSET and RESTOREd. ! 1785: If you desire a permanent effect, ! 1786: the NEWPAGE can RESTORE and re-TSET new values ! 1787: that will then be the values ultimately RESTORED at the conclusion ! 1788: of the NEWPAGE condition. ! 1789: {li}NEWPAGE and ENDPAGE conditions are inhibited while ! 1790: the NEWPAGE condition is being processed. ! 1791: {EL} ! 1792: {MACSEC EXAMPLES} ! 1793: {BL}At the top of every page, print two blank lines, the ! 1794: centered text of the user-defined macro TITLE, the page ! 1795: number then two more blank lines: ! 1796: {LS 1}{nfj} ! 1797: <{SETQ NEWPAGE,-> ! 1798: <{LS 2}{CENTER @TITLE}{T 60}PAGE:{PAGENUM}{LS 2}}> ! 1799: {FJ} ! 1800: {EL} ! 1801: {P} ! 1802: ! ! 1803: ! NFJ ! 1804: ! ! 1805: {macdescr NFJ,No Fill or Justify} ! 1806: <{NFJ}> ! 1807: {macsec description} ! 1808: <{D NFJ}> is the string; <"{SET~FILL,FALSE}{SET~JUST,FALSE}">. ! 1809: It disables both line fill and right justification. ! 1810: The value of NFJ is null. ! 1811: {P} ! 1812: ! ! 1813: ! OAB ! 1814: ! ! 1815: {MACDESCR OAB,Open Angle Bracket} ! 1816: <{OAB}> ! 1817: {MACSEC DESCRIPTION} ! 1818: Evaluates to "<". ! 1819: {MACSEC NOTES} ! 1820: {BL}This macro, and its companion <{CAB}>, are used in situations ! 1821: where the quote symbols are needed without causing the effect ! 1822: of quoting, or where they appear in an unbalanced way. ! 1823: {EL} ! 1824: {MACSEC EXAMPLES} ! 1825: See the examples for CAB. ! 1826: {P} ! 1827: ! ! 1828: ! ODD ! 1829: ! ! 1830: {Macdescr ODD,Predicate Test for Numeric Odd} ! 1831: <{ODD n}> ! 1832: {Macsec Description} ! 1833: ODD evaluates to null (true) if "n" is an odd integer, ! 1834: otherwise it evaluates to "1" (false). ! 1835: {Macsec Examples} ! 1836: See the description of COND for examples of the use of predicates. ! 1837: {P} ! 1838: ! ! 1839: ! OS ! 1840: ! ! 1841: {macdescr OS,Overstrike Two Strings} ! 1842: <{OS str1,str2}> ! 1843: {macsec description} ! 1844: OS returns a string which, when printed, will have str1 ! 1845: overprinted with str2. ! 1846: If the two strings are not of the same length, ! 1847: the shorter is padded on the right with blanks ! 1848: before the overstrikes are computed. ! 1849: {macsec notes} ! 1850: {BL}Overstrikes are computed internally with a special ! 1851: backspace character that cannot be entered from the keyboard. ! 1852: Thus overstruck strings can be freely passed about, and joined ! 1853: with other strings. ! 1854: The SIZE macro correctly computes the actual ! 1855: number of print positions of a string, compensating for the ! 1856: extra length caused by the presence of the backspaces. ! 1857: For output, GPMDOC decomposes the print line containing the ! 1858: backspaces into a series of non-overstruck lines that it ! 1859: prints on top of each other. ! 1860: {LI}Overstrikes may themselves be overstruck (to any ! 1861: reasonable degree). ! 1862: Note however, that use of overstriking ! 1863: slows down both the processing and actual printing of such text. ! 1864: {EL} ! 1865: {macsec examples} ! 1866: {BL}Overstrike pairs of characters to get interesting new ! 1867: characters from the ordinary ol' line printer: ! 1868: {ls 1} ! 1869: {nfj} ! 1870: {TSETQ OSC,<{OS >{D 1}<,>{D 2}<} -- >{OS {1},{2}}< >({3}){BRK}} ! 1871: {OSC c,|,cent sign} ! 1872: {OSC -,|,dagger} ! 1873: {OSC |,=,double dagger} ! 1874: {OSC /,=,not equals} ! 1875: {OSC O,-,theta} ! 1876: {OSC 0,/,computer zero} ! 1877: {OSC {oab},-,arrow} ! 1878: {OSC ),/,gamma} ! 1879: {OSC ),\,lambda} ! 1880: {OSC o,_,rising sun} ! 1881: {OSC =,-,equivalence symbol} ! 1882: {OSC \,/,X marks the spot} ! 1883: {OSC <{OS \,/}>,<{OS |,-}>,attention grabber} ! 1884: {RESTORE OSC} ! 1885: {FJ} ! 1886: {LI}Print the text "RIGHT NOW" with the "NOW" underlined: ! 1887: {ls 1}{Center RIGHT <{OS NOW,___}>} ! 1888: {Ls 1}{Fj} ! 1889: {LI *~}Define a macro UNDER that will evaluate to an underlined version ! 1890: of whatever text is given as an argument: ! 1891: {ls 1}{Center <{SETQ UNDER,{OS @1,{DUPL _,{DSIZE 1}}}}>} ! 1892: {ls 1} ! 1893: This macro has a problem in that it will underscore blanks, ! 1894: preventing them from being used as line breaks, or as ! 1895: justification points. ! 1896: This problem can be solved by using ! 1897: REPLACE and IMAGE, which is essentially what is done by the ! 1898: system underlining macro UL. ! 1899: {LI *~}Sometimes when revising a document, it is necessary to ! 1900: show on the new version what changes have been made. ! 1901: "Change bars" in the left margin are usually ! 1902: used to show new or changed lines. ! 1903: Deletions, however, pose a formidable problem. ! 1904: This example shows a way to use NEWLINE to ! 1905: overstrike print lines with hyphens to indicate that they are ! 1906: deleted without actually removing the text: ! 1907: {ls 1}{nfj} ! 1908: <{TSET.APPEND NEWLINE,-> ! 1909: <<{SET OUTSTREAM,{OS @OUTSTREAM,{DUPL -,{DSIZE OUTSTREAM}}}}>}}> ! 1910: {Ls 1}{Fj} ! 1911: {EL} ! 1912: {P} ! 1913: ! ! 1914: ! OUTDENT ! 1915: ! ! 1916: {Macdescr OUTDENT,Outdent a Line} ! 1917: <{OUTDENT n}> ! 1918: {Macsec Description} ! 1919: OUTDENT will cause the left margin to be 'outdented' n spaces on the ! 1920: next line printed. ! 1921: OUTDENT is defined as: ! 1922: {Ls 1}{Center <{BRK}{TSET.- LMG,@1}{TSET.APPEND NEWLINE,->} ! 1923: {Center <<{RESTORE LMG,NEWLINE}>}>} ! 1924: {Ls 1} ! 1925: {p} ! 1926: ! ! 1927: ! OUTOS ! 1928: ! ! 1929: {Macdescr OUTOS,Output Stream Overstrike Flag} ! 1930: <{set OUTOS,pred}> (Default: OUTOS=null) ! 1931: <{OUTOS}> ! 1932: <{D OUTOS}> ! 1933: {Macsec Description} ! 1934: OUTOS is a flag which controls the formatting of overstrikes in the ! 1935: output stream. ! 1936: When OUTOS is true (null), output files are accessed for writing ! 1937: with carriage control properties that will properly display overstruck ! 1938: text. ! 1939: Such files may be difficult to manipulate with other system utilities. ! 1940: If OUTOS is set false (non-null), only the primary images of output ! 1941: lines will be printed (no overstrikes), and output files will be opened ! 1942: with normal, sequential attributes. ! 1943: {Macsec Notes} ! 1944: {Bl}Changing OUTOS will only have effect ! 1945: for output files opened subsequent to the change. ! 1946: {el} ! 1947: {p} ! 1948: ! ! 1949: ! OUTPUT ! 1950: ! ! 1951: {macdescr OUTPUT,Name of Output File} ! 1952: <{set OUTPUT,str}> (Default: OUTPUT=user's terminal device) ! 1953: <{OUTPUT}> ! 1954: <{D OUTPUT}> ! 1955: {Macsec Description} ! 1956: The value you set to OUTPUT instructs GPMDOC as to the name of the ! 1957: current file for print stream output text. ! 1958: Setting a value for OUTPUT causes the present output stream to ! 1959: be closed out, and a new one whose name is given by "str" is ! 1960: created and opened. ! 1961: {Macsec Notes} ! 1962: The nature of OUTPUT is necessarily somewhat system-dependent. ! 1963: These notes and examples pertain to the VAX/VMS version. ! 1964: {Bl}"Str" should be a valid device/file specification, enclosed in ! 1965: quote symbols if it contains any commas. ! 1966: {Li}If TSET is used with OUTPUT, a later RESTORE will not ! 1967: continue with the old file, but will open a new version of it. ! 1968: {El} ! 1969: {Macsec Examples} ! 1970: {Bl}Set the output stream to the terminal: ! 1971: {Ls 1}{Center <{SET OUTPUT,TT:}>}{Ls 1} ! 1972: {Li}Shut off output entirely (direct it to the null device): ! 1973: {Ls 1}{Center <{SET OUTPUT,NL:}>}{Ls 1} ! 1974: {Li}Direct further output to FILE.LST~: ! 1975: {Ls 1}{Center <{SET OUTPUT,FILE.LST}>}{Ls 1} ! 1976: You should be aware that each time OUTPUT is set, a new stream is ! 1977: created and opened. ! 1978: This means that if you set the output stream to the same file ! 1979: repeatedly, GPMDOC will not keep appending to one file, but rather ! 1980: create multiple copies of the same file with successively higher ! 1981: version numbers. ! 1982: {el}{p} ! 1983: ! ! 1984: ! OUTSTREAM ! 1985: ! ! 1986: {MACDESCR OUTSTREAM,The Current Output Stream} ! 1987: <{set OUTSTREAM,str}> (Default: See Description) ! 1988: <{OUTSTREAM}> ! 1989: {macsec description} ! 1990: The value of OUTSTREAM is the currently assembled output stream ! 1991: (no evaluation is done). ! 1992: With a NEWLINE macro, the value of an OUTSTREAM reference is the ! 1993: text of the line about to be printed, excluding the left margin bias. ! 1994: {macsec notes} ! 1995: {BL}Care should be exercised when performing a SET-type operation on ! 1996: OUTSTREAM. ! 1997: This is especially true in a NEWLINE evaluation, ! 1998: as the system will not 'recompensate' for margin or spacing ! 1999: irregularities induced by changing the OUTSTREAM. ! 2000: {EL} ! 2001: {macsec examples} ! 2002: {BL}Print every line with a "*" on the front. ! 2003: {LS 1}{CENTER <{SET.PREPEND OUTSTREAM,*}>} ! 2004: {LI *~}Temporarily change NEWLINE to cause every print line to be ! 2005: underscored until NEWLINE is RESTORED. ! 2006: {LS 1}{CENTER <{TSET.APPEND NEWLINE,<{SET.UL OUTSTREAM}>}>} ! 2007: {EL} ! 2008: {P} ! 2009: ! ! 2010: ! P ! 2011: ! ! 2012: {macdescr P,Skip to New Page} ! 2013: <{P}> ! 2014: <{D P}> ! 2015: {macsec description} ! 2016: P is defined as <{SET LINENUM,1}>, which will cause a new ! 2017: page to be started unless printing is presently at the first ! 2018: line of a page. ! 2019: {macsec notes} ! 2020: {BL}You should read the description of LINENUM for a complete ! 2021: explanation of the effects of <{P}>. ! 2022: {el} ! 2023: {P} ! 2024: ! ! 2025: ! PAGELENGTH ! 2026: ! ! 2027: {Macdescr PAGELENGTH,Defined Length of Page} ! 2028: <{set PAGELENGTH,n}> (Default: PAGELENGTH=55) ! 2029: <{PAGELENGTH}> ! 2030: <{D PAGELENGTH}> ! 2031: {Macsec Description} ! 2032: The value of PAGELENGTH is used by GPMDOC to determine when to signal ! 2033: an ENDPAGE condition. ! 2034: When <{LINENUM}> exceeds <{PAGELENGTH}>, an ENDPAGE (see description) ! 2035: condition is signalled. ! 2036: {Macsec Notes} ! 2037: {Bl}The value of "n" must be positive. ! 2038: {Li}Paging is inhibited by GPMDOC during NEWPAGE/ENDPAGE conditions, ! 2039: so even if the number of lines emitted by NEWPAGE is larger than ! 2040: PAGELENGTH, no endlessly recursive paging is possible. ! 2041: {Li}Assuming that ENDPAGE causes some sort of 'page eject,' ! 2042: PAGELENGTH can be thought of as defining the number of lines on a ! 2043: page. ! 2044: {Li}Setting PAGELENGTH to a very large value will effectively inhibit ! 2045: page conditions. ! 2046: {el} ! 2047: {p} ! 2048: ! ! 2049: ! PAGENUM ! 2050: ! ! 2051: {macdescr PAGENUM,Current Page Number} ! 2052: <{set PAGENUM,n}> (Default: PAGENUM=1) ! 2053: <{PAGENUM}> ! 2054: <{D PAGENUM}> ! 2055: {macsec description} ! 2056: PAGENUM contains its last defined value, but updated ! 2057: by one at the conclusion of each ENDPAGE condition. ! 2058: {macsec notes} ! 2059: {BL}N must be non-negative. ! 2060: {li}Setting PAGENUM has no side-effects. ! 2061: {el} ! 2062: {macsec examples} ! 2063: {bl}Print the page number at the top right-hand corner ! 2064: of every succeeding page. ! 2065: {LS 1}{CENTER <{SETQ NEWPAGE,{LPAD @PAGENUM,@LINELENGTH}}>} ! 2066: {LI}Reset page numbering to one. ! 2067: {ls 1} ! 2068: {Center <{SET PAGENUM,1}>} ! 2069: {el} ! 2070: {p} ! 2071: ! ! 2072: ! PARA ! 2073: ! ! 2074: {macdescr PARA,Start a New Paragraph} ! 2075: <{PARA}> ! 2076: <{D PARA}> ! 2077: {Macsec Description} ! 2078: Referencing PARA will cause a line break, a single blank line and five ! 2079: hard spaces to be sent to the output stream. ! 2080: This is what is normally used for a standard paragraph. ! 2081: {Macsec Notes} ! 2082: {bl}If you want to insure that {ul exactly} five spaces indent the ! 2083: first line of the paragraph then the text of the paragraph should ! 2084: appear immediately following the <{PARA}>. ! 2085: If you start the text on a new logical line, then GPMDOC will ! 2086: (in fill mode) send a single space to the output stream between ! 2087: the <{PARA}> and the text on the next line. ! 2088: This space is subject to justification and could cause thus cause ! 2089: uneven spacing of paragraph indents. ! 2090: {el} ! 2091: {p} ! 2092: ! ! 2093: ! PREPEND ! 2094: ! ! 2095: {macdescr PREPEND,Prefix onto a String} ! 2096: <{PREPEND str1,str2}> ! 2097: {Macsec Description} ! 2098: The value of PREPEND is str2 prefixed onto str1. ! 2099: PREPEND is the complementary macro to APPEND. ! 2100: {macsec notes} ! 2101: {Bl}The PREPEND operation is generally only useful in extended sets. ! 2102: {el} ! 2103: {macsec examples} ! 2104: {bl}Print two extra lines at the bottom of every page, ! 2105: before the page footing: ! 2106: {Ls 1}{Center <{SET.PREPEND ENDPAGE,<{LS 2}>}>}{Ls 1} ! 2107: {el} ! 2108: {p} ! 2109: ! ! 2110: ! QUERY ! 2111: ! ! 2112: {macdescr QUERY,Get Text From The Terminal} ! 2113: <{QUERY str}> ! 2114: {macsec description} ! 2115: The value of QUERY is whatever text is typed in at the terminal ! 2116: in response to str, which is displayed first. ! 2117: {macsec notes} ! 2118: {BL}The response typed in is not evaluated by GPMDOC. ! 2119: {EL} ! 2120: {macsec examples} ! 2121: {BL}Print text containing a response that is typed in. ! 2122: {LS 1} ! 2123: {nfj} ! 2124: {CENTER <We will ship to {QUERY Country? }>} ! 2125: {fj} ! 2126: {ls 1} ! 2127: Note: "Country?" will be displayed at your terminal. ! 2128: Following this, you should enter text (possibly null) ! 2129: terminated by a carriage return. This response becomes the ! 2130: value of the QUERY macro, and hence is effectively inserted ! 2131: in the output stream. ! 2132: {LI}Ask for an address from the terminal to be used ! 2133: later, so place it in a macro called ADDRESS. ! 2134: {ls 1} ! 2135: {Center <{SET ADDRESS,{QUERY WHAT IS THE ADDRESS? }}>} ! 2136: {ls 1} ! 2137: If text such as "#10 Downing St.<{BRK}>London, England" ! 2138: were entered, it would be placed into ADDRESS in that form, ! 2139: since GPMDOC does not evaluate QUERY input. When ADDRESS ! 2140: was used later, the <{BRK}> would be processed by GPMDOC ! 2141: at that point. ! 2142: {LI}Print an address and also put it into ADDRESS to be ! 2143: referenced later: ! 2144: {ls 1} ! 2145: {CENTER <Ship To: {SETV ADDRESS,{QUERY WHAT IS THE ADDRESS? }}>} ! 2146: {LS 1} ! 2147: Notice the use of SETV to effectively 'pass through' the value ! 2148: that was SET, in order for it to be printed. ! 2149: {EL} ! 2150: {P} ! 2151: ! ! 2152: ! REMDR ! 2153: ! ! 2154: {Macdescr REMDR,Arithmetic Remainder} ! 2155: <{REMDR n1,n2}> ! 2156: {Macsec Description} ! 2157: The value of REMDR is the integer remainder after dividing integer ! 2158: n1 by n2. ! 2159: The sign of the result is the same as the sign of n1. ! 2160: {Macsec Examples} ! 2161: {bl}Print a message on the terminal every 10 pages. ! 2162: {ls 1}{Center <{COND {EQ 0,{REMDR @PAGENUM,10}},{DISPLAY Working...}}>} ! 2163: {Ls 1} ! 2164: {Li *~}Here is a set of macros to compute roman numbers given a number. ! 2165: in the range from 0..99. ! 2166: For example <{Roman~17}> will yield "xvii". ! 2167: {Ls 1}{Nfj} ! 2168: <{SETQ ROMAN,{GENROMAN {/ @1,10},x,l,c}-> ! 2169: <{GENROMAN {REMDR @1,10},i,v,x}}> ! 2170: {Ls 1} ! 2171: <{SETQ GENROMAN,{COND -> ! 2172: <{LE @1,3},{DUPL @2,@1},-> ! 2173: <{EQ @1,4},{2}{3},-> ! 2174: <{LE @1,8},{3}{DUPL @2,{- @1,5}},-> ! 2175: <,{2}{4}}}> ! 2176: {Ls 1}{Fj} ! 2177: "Genroman" is an auxilliary macro used by Roman that will generate ! 2178: text according to the rules for roman numbers in the range ! 2179: 0..9. ! 2180: Roman makes two calls on Genroman, one for the 10s digit and one ! 2181: for the ones digit. ! 2182: REMDR is used to extract the ones digit. ! 2183: {Ls 1}Genroman takes in the symbols ("x","l","c", etc.) ! 2184: to be used, since the rules for generating roman numbers are the same ! 2185: for both the 10s digit and the ones digit. ! 2186: {Ls 1}Note that if capital roman numbers were needed, <{CAPS~{ROMAN~n}}> ! 2187: would do the trick. ! 2188: {el} ! 2189: {P} ! 2190: ! ! 2191: ! REPLACE ! 2192: ! ! 2193: {macdescr REPLACE,Substitute for Characters in Text} ! 2194: <{REPLACE str1,str2,str3}> ! 2195: {Macsec Description} ! 2196: The value of REPLACE is the string str1 with each of its characters ! 2197: appearing in str2 being replaced by the corresponding character from ! 2198: str3. ! 2199: {Macsec Notes} ! 2200: {bl}Str2 and str3 must be the same size, and must not be null. ! 2201: {li}Any of the argument strings can contains overstrikes, however, ! 2202: replacement occurs on the individual component characters of ! 2203: overstrikes, not on the overstruck characters as unique elements. ! 2204: {el} ! 2205: {macsec examples} ! 2206: {bl}Print the text of the macro TITLE, with all punctuation replaced ! 2207: by blanks: ! 2208: {Ls 1}{Center <{REPLACE @TITLE,<,.?":;!>,< >}>}{Ls 1} ! 2209: {li}Print text that is typed in from the terminal, with all ! 2210: spaces replaced by hard spaces: ! 2211: {Tset Hs,<@>} ! 2212: {Ls 1}{Center <{REPLACE {QUERY Enter Text},< >,~}>}{Brk} ! 2213: {Restore Hs}{Ls 1} ! 2214: {el} ! 2215: {p} ! 2216: ! ! 2217: ! RESTORE ! 2218: ! ! 2219: {MACDESCR RESTORE,Restore Prior Value of Macros} ! 2220: <{RESTORE mname1,mname2,...}> ! 2221: {macsec description} ! 2222: RESTORE is used to retrieve the last definition of the mnames ! 2223: that were stacked by TSET (see the description of TSET). ! 2224: Each of the given mnames is processed in turn, starting with mname1. ! 2225: A null mname (end of arguments) is assumed to terminate the list. ! 2226: {Ls 1}RESTORE operates exactly like a SET on mname, where the ! 2227: value to be SET comes from the top of the stack for mname. ! 2228: RESTORE also discards this item from the stack, so that ! 2229: successive RESTORE's on the same mname retrieve successive items ! 2230: from mname's stack in inverse order from the order they ! 2231: were stacked by TSET. ! 2232: {macsec notes} ! 2233: {BL}TSET and RESTORE are typically used to save (TSET) ! 2234: and restore (RESTORE) contextual information such as ! 2235: margins, spacing and the like. ! 2236: {LI}An attempt to restore a value from a macro's stack ! 2237: when the stack is empty will result in a "NO VALUE TO RESTORE" ! 2238: error. ! 2239: {Li}A macro may issue a RESTORE on itself (see OUTDENT for example). ! 2240: The restored definition is used in subsequent evaluations of the macro, ! 2241: the evaluation causing the restore continues undisturbed with the previous ! 2242: definition. ! 2243: {Li}Stacks for macros with the same name in different property tables ! 2244: are distinct. ! 2245: {EL} ! 2246: {macsec examples} ! 2247: Examples are shown in the description for TSET. ! 2248: {P} ! 2249: ! ! 2250: ! RIN ! 2251: ! ! 2252: {Macdescr RIN,Indent the right margin} ! 2253: <{RIN n}> ! 2254: {Macsec Description} ! 2255: <{RIN n}> is equivalent to <{TSET.- RMG,n}>. ! 2256: It indents the right margin an additional "n" places. ! 2257: {Macsec Notes} ! 2258: {bl}"n" can be negative to move out the right margin ! 2259: {li}Keep in mind that RIN does a TSET. ! 2260: The right margin prior to the RIN operation is saved on the RMG stack. ! 2261: A subsequent <{RESTORE RMG}> will reactivate it. ! 2262: {li}There is a companion LIN macro to indent the left margin. ! 2263: {EL} ! 2264: {P} ! 2265: ! ! 2266: ! RMG ! 2267: ! ! 2268: {macdescr RMG,Right Margin} ! 2269: <{set RMG,n}> (Default: RMG=75) ! 2270: <{RMG}> ! 2271: <{D RMG}> ! 2272: {macsec description} ! 2273: The value of RMG tells GPMDOC the absolute position of the ! 2274: last printing column on the page. ! 2275: {macsec notes} ! 2276: {BL}N must be greater than or equal to <{LMG}>. ! 2277: {LI}<{RMG}> in fill mode causes lines to be assembled until ! 2278: characters overflow the right margin. Then this assembled ! 2279: line is broken off at a blank closest to the right margin, and ! 2280: printed. If no blank exists in the line, the line is broken ! 2281: at the right margin. If justification is enabled, the part ! 2282: broken off is justified before printing, such that the last ! 2283: character is flush with the right margin. The part of the ! 2284: assembled text not broken off is retained for printing on ! 2285: the next line. With line fill disabled, an automatic ! 2286: line break occurs at the end of each input line, so that <{RMG}> ! 2287: only assumes significance if single input lines exceed the ! 2288: line length. ! 2289: {LI}The LINELENGTH macro can also be used to change the right ! 2290: margin, see the description of LINELENGTH. ! 2291: {EL} ! 2292: {macsec examples} ! 2293: {BL}Set the right margin at column 60: ! 2294: {ls 1} ! 2295: {Center <{SET RMG,60}>} ! 2296: {LI}Set the right margin to 10 past the left margin: ! 2297: {ls 1} ! 2298: {Center <{SET RMG,{+ @LMG,10}}>} ! 2299: {Center or} ! 2300: {Center <{SET LINELENGTH,11}>} ! 2301: {ls 1} ! 2302: You might be tempted to set LINELENGTH to 10, but this is not ! 2303: the same. For instance, if <{LMG}> is 10 and RMG is 20 as ! 2304: a result of this example, then columns 10-20 {UL inclusive} ! 2305: are printing columns. This means there are 11 printing columns. ! 2306: <{LINELENGTH}> will always be <{RMG}> - <{LMG}> + 1. ! 2307: {EL} ! 2308: {P} ! 2309: ! ! 2310: ! RPAD ! 2311: ! ! 2312: {macdescr RPAD,Pad a String on the Right} ! 2313: <{RPAD str1,n,str2}> ! 2314: {macsec description} ! 2315: The value of RPAD is str1 suffixed with replications of str2 to ! 2316: produce a result of length n. ! 2317: If str1 is already as ! 2318: long or longer than n, the value of RPAD is str1. ! 2319: The value of RPAD is also str if n is zero or negative. ! 2320: If an uneven number of replication are necessary to get a result of ! 2321: length n, the last replication will be truncated appropriately. ! 2322: If str2 is null, the present hardspace character is assumed for str2. ! 2323: {macsec notes} ! 2324: {BL}RPAD, along with LPAD, is useful for producing ! 2325: tabular text. ! 2326: {EL} ! 2327: {macsec examples} ! 2328: {Bl}Define a macro, TABULAR, that will print three items in ! 2329: columns ten wide: ! 2330: {Ls 1} ! 2331: {Nfj} ! 2332: <{SETQ TABULAR,-> ! 2333: <{RPAD @1,10}{RPAD @2,10}{RPAD @3,10}}> ! 2334: {FJ} ! 2335: {EL} ! 2336: {P} ! 2337: ! ! 2338: ! SET ! 2339: ! ! 2340: {macdescr SET,Alter The Value of a Macro} ! 2341: <{SET mname,str}> ! 2342: {macsec description} ! 2343: The macro with name mname is given a definition of str. ! 2344: Any previous definition is lost. ! 2345: Future references to <{mname...}> ! 2346: will cause this definition to be retrieved. ! 2347: The value of SET is always null. ! 2348: {macsec notes} ! 2349: {BL}Certain system macros may only be set to a restricted ! 2350: range of values (e.g. INPUT, LMG, RMG, LINENUM etc.). ! 2351: An attempt to set these macros to an improper value results in a ! 2352: "BAD VALUE" error. ! 2353: {LI}All macros not explicitly SET are implicitly null when ! 2354: referenced. ! 2355: {LI}There is an additional syntax available for use with ! 2356: SET, termed "extended set". ! 2357: It is used when an operation is ! 2358: to be applied that involves a macro, and the resulting ! 2359: value is to be SET back into that macro. (See examples below.) ! 2360: The syntax is: ! 2361: {ls 1} ! 2362: {Center <{SET.mname1 mname2,str1,str2...}>} ! 2363: {Ls 1} ! 2364: which is equivalent to: ! 2365: {Ls 1} ! 2366: {Center <{SET mname2,{mname1 @mname2,str1,str2,...}}>} ! 2367: {LS 1} ! 2368: Extended set should not be used with system macros for which ! 2369: the <{D mname}> form is not valid, since the macro's ! 2370: {ul definition} is accessed for extended set. ! 2371: {LI}The argument macros may be used within a macro's ! 2372: definition. ! 2373: They take the form <{n}>. n is a macro whose definition ! 2374: is the nth argument string passed in a call to the ! 2375: macro where the <{n}> occurs, as in: ! 2376: <{mname arg1,arg2,...}>. ! 2377: For instance <{1}> refers to ! 2378: arg1 of this evaluation of mname. ! 2379: An argument macro with a ! 2380: number less than one or greater than the number of arguments ! 2381: given will evaluate to null, as will an argument macro ! 2382: appearing directly in the input text (outside of an evaluation). ! 2383: Argument macros are, as with other system macros, ! 2384: defined in the null property table, however, ! 2385: no form of SET should ever be issued for argument macros. ! 2386: {LI}For the above reasons users should avoid defining their ! 2387: own macros with names: ! 2388: {ls 1} ! 2389: {nfj} ! 2390: - Containing periods or backslashes, or ! 2391: - The same as system macros, or ! 2392: - That are numeric (with the null property table). ! 2393: {fj} ! 2394: {ls 1} ! 2395: {LI}SETting definitions uses up memory space inside GPMDOC. ! 2396: In some implementations on small machines this may be ! 2397: significant in that GPMDOC will run slower when the user has set ! 2398: a large number of definitions because its own internal processing ! 2399: memory is reduced. In extreme cases a "MEMORY OVERFLOW" error ! 2400: may occur. To avoid thses situations, macros can be set to null ! 2401: when they are no longer needed, or an entire property table ! 2402: and its definitions can be eradicated with the DELPROP macro. ! 2403: {EL} ! 2404: {macsec examples} ! 2405: {BL}Set a macro to "University of California" (saves typing): ! 2406: {LS 1}{Center <{SET UC,University of California}>} ! 2407: {LI}Move the left margin in five spaces. ! 2408: {Ls 1}{Center <{SET LMG,{+ 5,@LMG}}>} ! 2409: {Center or} ! 2410: {Center <{SET.+ LMG,5}>} ! 2411: {Center or} ! 2412: {Center <{LIN 5}>} ! 2413: {LI}Set the output file to HELP.DOC on account [1,2]. ! 2414: {LS 1} ! 2415: {Center <{SET OUTPUT,<[1,2]HELP.DOC>}>} ! 2416: {LS 1} ! 2417: Note that the quotes are needed as otherwise the comma ! 2418: within the account specification would be seen as an ! 2419: argument separator, and OUTPUT would be set to ! 2420: "[1" - an error. ! 2421: {LI}Set the hardspace to a backslash: ! 2422: {LS 1}{Center <{SET HS,\}>} ! 2423: {LI}Define a macro PAGE that will skip to a new page ! 2424: when invoked: ! 2425: {LS 1}{Center <{SET PAGE,<{LS 10000}>}>} ! 2426: {LS 1} ! 2427: Note here that the quotes are required to avoid a premature ! 2428: evaluation of the LS. If the quote brackets were not ! 2429: present, when the SET was evaluated, the <{LS 10000}> would then ! 2430: be evaluated as an argument to SET ! 2431: which would immediately force a new page, and ! 2432: the value of the LS (null) would be set to PAGE. It is easier ! 2433: to do this sort of thing with SETQ (see the description of SETQ). ! 2434: {LI}Turn right justification off (set it to null). ! 2435: {LS 1} ! 2436: {Center <{SET JUST}>} ! 2437: {El} ! 2438: {P} ! 2439: ! ! 2440: ! SETQ ! 2441: ! ! 2442: {macdescr SETQ,Quoted SET} ! 2443: <{SETQ mname,qstr}> ! 2444: {macsec description} ! 2445: SETQ functions exactly like SET in that it establishes a connection ! 2446: between mname and qstr. ! 2447: The difference is that SETQ receives the qstr definition in ! 2448: unevaluated form. ! 2449: The definition is thus made with all ! 2450: embedded macro calls and quotes in qstr intact. ! 2451: {macsec notes} ! 2452: {BL}SETQ is included principally to make it easier to define ! 2453: macros that consist of calls on other macros. ! 2454: (See the examples.) ! 2455: {li}Your qstr should not contain "open" commas, that is, commas ! 2456: not contained inside quote symbols or macro braces. The reason ! 2457: is that these commas would be seen as argument separators for the ! 2458: SETQ, causing an incorrect argument scan for the SETQ. ! 2459: {EL} ! 2460: {macsec examples} ! 2461: {BL}Define a macro INMARGINS that will move the left and ! 2462: right margins in by five. ! 2463: {ls 1}{Center <{SETQ INMARGINS,{LIN 5}{RIN 5}}>} ! 2464: {ls 1} ! 2465: This example could be done with SET, it would be written as: ! 2466: {ls 1} ! 2467: {Center <{SET INMARGINS,<{LIN 5}{RIN 5}>}>} ! 2468: {LS 1} ! 2469: The SETQ allows you to eliminate the quote symbols that ! 2470: have to be used in the SET. ! 2471: {el} ! 2472: {P} ! 2473: ! ! 2474: ! SETV ! 2475: ! ! 2476: {macdescr SETV,SET Value For Macro and Return It} ! 2477: <{SETV mname,str}> ! 2478: {macsec description} ! 2479: SETV functions identically to SET except instead of having a ! 2480: a null value, the value of SETV is the text that is set ! 2481: as the definition of mname. ! 2482: {macsec notes} ! 2483: {BL}SETV may be used in extended form as with SET. ! 2484: {EL} ! 2485: {macsec examples} ! 2486: {BL}Indent the left margin five and put the resulting value ! 2487: in the user-defined macro margin. ! 2488: {LS 1}{Center <{SET MARGIN,{SETV.+ LMG,5}}>} ! 2489: {LS 1} ! 2490: {EL} ! 2491: {P} ! 2492: ! ! 2493: ! SIZE ! 2494: ! ! 2495: {macdescr SIZE,Number of Print Positions for Text} ! 2496: <{SIZE str}> ! 2497: {macsec description} ! 2498: The value of SIZE is the (non-negative) integer which ! 2499: gives the number of print columns that would be ! 2500: occupied by str, if it were printed. ! 2501: {macsec notes} ! 2502: {bl}SIZE includes compensation for any overstruck characters ! 2503: in str. Thus SIZE is the number of characters in str if and ! 2504: only if str contains no overstrikes. ! 2505: {li}DSIZE is useful and more efficient for determining the ! 2506: size of a defined macro or argument. (See the description ! 2507: of DSIZE). ! 2508: {el} ! 2509: {p} ! 2510: ! ! 2511: ! SKIPTEXT ! 2512: ! ! 2513: {MACDESCR SKIPTEXT,Skip Input Text} ! 2514: <{SKIPTEXT str}> ! 2515: {Macsec Description} ! 2516: The SKIPTEXT macro causes succeeding lines on the currently active ! 2517: input file to be skipped until a physical line is encountered ! 2518: that exactly matches "str". ! 2519: No evaluation or processing of any kind occurs with the skipped text. ! 2520: Reading will continue with the line following the one matched. ! 2521: The value of SKIPTEXT is always null. ! 2522: {Macsec Notes} ! 2523: {Bl}SKIPTEXT, as with BEGINTEXT and ENDTEXT, works with ! 2524: physical lines, not logical ones. ! 2525: This means that comment lines can be used as SKIPTEXT markers. ! 2526: The reason that this is usually helpful is if the text that is ! 2527: skipped is processed without the SKIPTEXT being invoked. ! 2528: In this case, if the marker is a comment, it will not become ! 2529: part of the text processed. ! 2530: {li}The preferred marker (by convention) is "!**". ! 2531: {Li}The given termination string can be null. ! 2532: In this case, an empty line will terminate the skipping. ! 2533: {el} ! 2534: {Macsec Examples} ! 2535: {bl}Skip some text if the value of MODE is "BRIEF": ! 2536: {Ls 1}{Center <{COND {LEQ @MODE,BRIEF},{SKIPTEXT !**}}>}{Ls 1} ! 2537: This will skip over input through the next "!**" line if the ! 2538: MODE macro has the value "BRIEF". ! 2539: Otherwise, evaluation continues on with no effects. ! 2540: {Ls 1}This shows why the use of "!**" is helpful, since if ! 2541: MODE is not "BRIEF", then the "!**" that is encountered later ! 2542: will be 'ignored.' ! 2543: {el} ! 2544: ! ! 2545: ! SPACING ! 2546: ! ! 2547: {MACDESCR SPACING,Set Inter-line Spacing} ! 2548: <{set SPACING,n}> (Default: SPACING=1) ! 2549: <{SPACING}> ! 2550: <{D SPACING}> ! 2551: {macsec description} ! 2552: The SPACING macro tells GPMDOC how many blank lines to ! 2553: automatically print after each text line is output. When ! 2554: SPACING is one, no extra blank lines are output. SPACING ! 2555: set to 2 means double spacing, and so forth. In general, setting ! 2556: SPACING to n is equivalent to performing an <{LS~{sub1~n}}> ! 2557: after each line is printed. ! 2558: {macsec notes} ! 2559: {BL}N must be greater than or equal to one. ! 2560: {LI}If less than n-1 lines remain on the page, the page ! 2561: is run out, and an endpage condition occurs. ! 2562: {LI}Blank lines inserted by the effect of SPACING are not subject ! 2563: to BSLACK (see the description of BSLACK). ! 2564: {LI}Blank lines emitted by <{LS~...}> will not have additional ! 2565: spacing applied (see example). ! 2566: {EL} ! 2567: {macsec examples} ! 2568: {BL}Set double spacing: ! 2569: {LS 1}{Center <{SET SPACING,2}>} ! 2570: {LI}Temporarily set single spacing for printing a quotation ! 2571: then go back to the old spacing: ! 2572: {LS 1} ! 2573: {Center <{TSET SPACING,1}{LS 2}{LIN 10}{RIN 10}>} ! 2574: {Center :}{Center Text of Quotation}{Center :} ! 2575: {Center <{RESTORE RMG,LMG,SPACING}>} ! 2576: {LI}Define a macro <{LS* n}> that will do the job ! 2577: of LS, but will take into account the value of SPACING, ! 2578: so that each blank line emitted will actually be <{SPACING}> ! 2579: blank lines: ! 2580: {LS 1}{Center <{SETQ LS*,{LS {* @1,@SPACING}}}>} ! 2581: {LS 1} ! 2582: When <{LS*~n}> is called, n is multiplied by ! 2583: the value of SPACING so that the LS actually performed is n ! 2584: times the current spacing. ! 2585: {EL} ! 2586: {P} ! 2587: ! ! 2588: ! SUB1 ! 2589: ! ! 2590: {macdescr SUB1,Subtract One From Numeric} ! 2591: <{SUB1 n}> ! 2592: {macsec description} ! 2593: The value of SUB1 is one subtracted from n. It is ! 2594: equivalent to <{-~n,1}>. ! 2595: {macsec notes} ! 2596: {bl}SUB1 is included for convenience, as it is a frequent ! 2597: operation. ! 2598: {el} ! 2599: {macsec examples} ! 2600: {bl}Subtract one from the current page number: ! 2601: {ls 1} ! 2602: {Center <{SET.SUB1 PAGENUM}>} ! 2603: {EL} ! 2604: {P} ! 2605: ! ! 2606: ! SUBSTR ! 2607: ! ! 2608: {macdescr SUBSTR,Compute Substring} ! 2609: <{SUBSTR str,n1,n2}> ! 2610: {Macsec Description} ! 2611: The value of SUBSTR is n2 contiguous characters of text taken from ! 2612: str, starting at character position n1. ! 2613: {Macsec Notes} ! 2614: {Bl}Both n1 and n2 should be positive, and define a region completely ! 2615: within str. ! 2616: {Li}If n2 is omitted, then the 'rest' of str is assumed by default. ! 2617: {el} ! 2618: {macsec Examples} ! 2619: {Bl}Define a macro to print text with the first character ! 2620: capitalized: ! 2621: {Ls 1}{Center <{SETQ FCC,{CAPS {SUBSTR @1,1,1}}{SUBSTR @2,2}}>} ! 2622: {El}{P} ! 2623: ! ! 2624: ! T ! 2625: ! ! 2626: {macdescr T,Horizontal Tab} ! 2627: <{T n,str}> ! 2628: {macsec description} ! 2629: The value of T is sufficient replications of str to cause the next ! 2630: character to print in column n. ! 2631: N is relative to left margin; ! 2632: n=1 is the first printing column. ! 2633: If str is null, then a hard space is assumed for str. ! 2634: {macsec notes} ! 2635: {BL}N should be less than or equal to <{LINELENGTH}>. ! 2636: If text has ! 2637: already been assembled past column n, a line break occurs ! 2638: before the hard spaces for the tab are emitted. ! 2639: {LI}T should not be used when justification is enabled. ! 2640: Justification may insert additional spaces that will cause ! 2641: the tab to be moved to the right an unpredictable amount. ! 2642: {Li}T looks at the current output stream to determine the size of ! 2643: its result. ! 2644: It operates under the assumption that the result of its evaluation ! 2645: is going to the output stream. ! 2646: If T is used in some other context, such as an ! 2647: argument, then it will evaluate to the appropriate text, but obviously ! 2648: no actual tabbing will occur as a result. ! 2649: {EL} ! 2650: {macsec examples} ! 2651: {BL}Tab over to column 40 and print $1.99: ! 2652: {ls 1} ! 2653: {Center <{T 40}>$1.99} ! 2654: {LI}Print "CONTRACT" in the last 8 columns of the line: ! 2655: {ls 1} ! 2656: {Center <{T {- @LINELENGTH,7}}>CONTRACT} ! 2657: {LS 1} ! 2658: This would be easier to do with LPAD. ! 2659: {LI}Define a macro TOC that will format one line of a ! 2660: table of contents. The format is: the description, then ! 2661: periods to column 35, and then the page number. The ! 2662: description and page number will be given as arguments to TOC: ! 2663: {ls 1}{Center <{SETQ TOC,{1}{T 35,.}{2}}>} ! 2664: {Ls 1} ! 2665: This would be used as in: ! 2666: {Ls 1} ! 2667: {Center <{TOC Chapter 1,1}>} ! 2668: {Center <{TOC Chapter 2,15}>} ! 2669: {Ls 1} ! 2670: Which would appear as: ! 2671: {Ls 1}{Nfj} ! 2672: {TSETQ TOC,{1}{T 35,.}{2}} ! 2673: {TOC Chapter 1,1} ! 2674: {Toc Chapter 2,15} ! 2675: {Restore TOC} ! 2676: {Ls 1}{Fj} ! 2677: {EL} ! 2678: {P} ! 2679: ! ! 2680: ! TSET ! 2681: ! ! 2682: {macdescr TSET,Temporary Set} ! 2683: <{TSET mname,str}> ! 2684: {macsec description} ! 2685: TSET performs identically to SET (see description), except ! 2686: that before the SET is performed, the current value of mname ! 2687: is put on top of a special stack reserved for mname. A ! 2688: <{RESTORE mname}> performed will cause this stacked value to be ! 2689: removed from the top of the stack and restored as the definition ! 2690: of mname. The TSET value (str) will then be lost. Multiple ! 2691: TSETs may be performed on the mname; the values are "unstacked" ! 2692: in reverse from the order they were originally stacked. TSETs ! 2693: performed on different mnames are totally independent. TSET, ! 2694: like SET always evaluates null. ! 2695: {macsec notes} ! 2696: {BL}TSET may be used in extended form. See the description ! 2697: of extended SET. ! 2698: {LI}TSET and RESTORE are normally used jointly. ! 2699: The description of ! 2700: RESTORE should be read for a full understanding of TSET. ! 2701: {LI}The usual use of TSET is as a mechanism for saving, then ! 2702: changing, some part of the context of a document such as margins, ! 2703: spacing, titles, section numbers, and the like. This saved ! 2704: context can then be restored at a later point in the processing. ! 2705: For instance, GPMDOC uses TSET internally when processing ! 2706: NEWPAGE and ENDPAGE. The values of LMG, RMG, SPACING and ! 2707: NEWLINE are TSET to predefined values for processing the page ! 2708: condition, regardless of what their values might be in the body ! 2709: of the text. ! 2710: At the conclusion of the page condition, a RESTORE ! 2711: is done on these macros which brings back the values that existed ! 2712: prior to the occurrence of the page condition. ! 2713: {Li}The TSET form for INPUT allows other TSETs to be ! 2714: incorporated. ! 2715: See the description for INPUT. ! 2716: {EL} ! 2717: {macsec examples} ! 2718: {BL}Set the left margin to five, temporarily: ! 2719: {ls 1}{Center <{TSET LMG,5}>} ! 2720: {LS 1} ! 2721: {LI}Define a macro QUOTATION that will skip down two lines, ! 2722: indent the left and right margins 7 spaces and go to single ! 2723: spacing in order to insert a properly formatted quotation in the ! 2724: document: ! 2725: {ls 1}{Nfj} ! 2726: <{SETQ QUOTATION,{LS 2}-> ! 2727: <{LIN 7}{RIN 7}{TSET SPACING,1}}> ! 2728: {LS 1}{Fj} ! 2729: Note that at the conclusion of the quotation text, the macros ! 2730: <{RESTORE~SPACING,RMG,LMG}{LS 2}> would ! 2731: be included. ! 2732: This could be packaged in a second macro ! 2733: ENDQUOTATION defined as: ! 2734: {ls 1}{Nfj} ! 2735: <{SETQ ENDQUOTATION,-> ! 2736: <{RESTORE LMG,RMG,SPACING}{LS 2}}> ! 2737: {LS 1}{Nfj} ! 2738: The next example, however, shows a simpler way to do this. ! 2739: {LI}Do the same thing, only use a pseudo-read. ! 2740: {ls 1}{nfj} ! 2741: <{SETQ QUOTATION,-> ! 2742: <{LS 2}{LIN 7}{RIN 7}{TSET SPACING,1}-> ! 2743: <{TSET INPUT,,ENDTEXT=!**}-> ! 2744: <{LS 2}{RESTORE LMG,RMG,SPACING}> ! 2745: {LS 1}{FJ} ! 2746: Using the pseudo-read, the way QUOTATION is used is: ! 2747: {ls 1}{nfj} ! 2748: <{QUOTATION}> ! 2749: : ! 2750: : ! 2751: text of quotation ! 2752: : ! 2753: : ! 2754: !** ! 2755: {ls 1}{Fj} ! 2756: The last line terminates the pseudo-read and the QUOTATION ! 2757: macro finishes by evaluating the RESTORE that follows the READ. ! 2758: {ls 1} ! 2759: In the above example, it is important that the <{LS 2}> precede ! 2760: the TESETs and RESTOREs. This is so that the LS can flush out ! 2761: any text (line break) before the margins are changed. ! 2762: {EL} ! 2763: {P} ! 2764: ! ! 2765: ! TSETQ ! 2766: ! ! 2767: {macdescr TSETQ,Temporary Quoted Set} ! 2768: <{TSETQ mname,qstr}> ! 2769: {macsec description} ! 2770: TSETQ functions the same as TSET (see description), but ! 2771: the definition to be set is implicitly quoted. ! 2772: TSETQ is thus to TSET what SETQ is to SET. ! 2773: {macsec notes} ! 2774: {Bl}TSETQ cannot be used in extended form. ! 2775: {el} ! 2776: {macsec examples} ! 2777: See the descriptions of SETQ and TSET for examples. ! 2778: {P} ! 2779: ! ! 2780: ! TSETV ! 2781: ! ! 2782: {Macdescr TSETV,TSET Value for Macro and Return It} ! 2783: <{TSETV mname,str}> ! 2784: {macsec description} ! 2785: TSETV functions identically to TSET (see description) ! 2786: except instead of having a ! 2787: a null value, the value of TSETV is the text that is set ! 2788: as the definition of mname. ! 2789: {macsec notes} ! 2790: {BL}TSETV may be used in extended form (as with TSET). ! 2791: {EL} ! 2792: {macsec examples} ! 2793: See the descriptions of TSET and SETV for examples. ! 2794: {p} ! 2795: ! ! 2796: ! UL ! 2797: ! ! 2798: {macdescr UL,Underline Text} ! 2799: <{UL str1,str2}> ! 2800: {macsec description} ! 2801: The UL macro uses the overstriking ability of GPMDOC ! 2802: to produce a new string consisting of the characters of str1 ! 2803: overstruck with underscores. Characters in str2 will not be ! 2804: underscored in str1. If str2 is not given (null) then all ! 2805: characters of str1 except blanks will be overstruck with ! 2806: underscores in the string produced by UL. ! 2807: {macsec notes} ! 2808: {BL}Str1 may contain overstruck characters (including ! 2809: underscores). ! 2810: {LI}If it is desired to have all characters including blanks ! 2811: overstruck, str2 can be given as a single character which ! 2812: could not reasonably appear in str1 (such as a control ! 2813: character), or the OVER macro can be used to perform the ! 2814: overstriking directly (see examples for OVER). ! 2815: {EL} ! 2816: {macsec examples} ! 2817: {BL}Print the text "Three Leaf Clover", underlined: ! 2818: {LS 1}{Center <{UL Three Leaf Clover.}>} ! 2819: {Ls 1} ! 2820: This will print as: ! 2821: {Ls 1}{Center {UL Three Leaf Clover.}} ! 2822: {Ls 1}{Fj} ! 2823: {LI}Define a macro ULC that will return its text underscored ! 2824: except for lower case letters. ! 2825: {ls 1} ! 2826: {center <{SETQ ULC,{UL {D 1},abcdefghijklmnopqrstuvwxyz}}>} ! 2827: {Ls 1}This would be used as in:{Ls 1} ! 2828: {Center <{ULC Three Leaf Clover.}>} ! 2829: {Ls 1}which would print as: ! 2830: {TSETQ ULC,{UL {D 1},abcdefghijklmnopqrstuvwxyz}} ! 2831: {ULC Three Leaf Clover} ! 2832: {Restore ULC} ! 2833: {EL} ! 2834: {P} ! 2835: ! ! 2836: ! + ! 2837: ! ! 2838: {macdescr +,Add Numerics} ! 2839: <{+ n1,n2}> ! 2840: {macsec description} ! 2841: The value of + is the sum of the two numeric strings n1 and n2. ! 2842: {macsec notes} ! 2843: {BL}For adding or subtracting one, ! 2844: the ADD1 and SUB1 macros are better. ! 2845: {LI}+ is very useful in extended SET forms for incrementing ! 2846: a numeric-valued macro (see examples). ! 2847: {EL} ! 2848: {macsec examples} ! 2849: {Bl}Add the macros PROFIT and NET, print it in column 35: ! 2850: {Ls 1}{Center <{BRK}{T 35}{+ @PROFIT,@NET}>} ! 2851: {EL} ! 2852: {P} ! 2853: ! ! 2854: ! - ! 2855: ! ! 2856: {MACDESCR -,Subtract Numerics} ! 2857: <{- n1,n2}> ! 2858: {macsec description} ! 2859: The value of - is the difference when n2 is subtracted from n1. ! 2860: {macsec notes} ! 2861: {BL}For subtracting one from a number, the SUB1 macro is better. ! 2862: {LI}- is useful in extended SET form for decrementing a ! 2863: numeric-valued macro. ! 2864: {EL} ! 2865: {macsec examples} ! 2866: {Bl}Subtract CREDIT from BILLING and print the result in ! 2867: column 35: ! 2868: {ls 1}{Center <{BRK}{T 35}{- @BILLING,@CREDIT}>} ! 2869: {EL} ! 2870: {P} ! 2871: ! ! 2872: ! * ! 2873: ! ! 2874: {macdescr *,Multiply Numerics} ! 2875: <{* n1,n2}> ! 2876: {Macsec Description} ! 2877: The value of * is the product of the two numeric strings n1 and n2. ! 2878: {p} ! 2879: ! ! 2880: ! / ! 2881: ! ! 2882: {macdescr /,Divide Numerics} ! 2883: <{/ n1,n2}> ! 2884: {Macsec Description} ! 2885: The value of / is the quotient of the two numeric strings n1 and n2. ! 2886: {Macsec notes} ! 2887: {Bl}If both n1 and n2 are integers (no decimal point) then the ! 2888: value of / will also be an integer, formed by discarding any fractional ! 2889: part from the quotient. ! 2890: If either or both of n1 or n2 contain decimals, then the division ! 2891: will produce a real (floating) result. ! 2892: {el} ! 2893: {p} ! 2894: {Exclude HELP} ! 2895: ! ! 2896: ! Print the Index ! 2897: ! ! 2898: {Set pagenum,1} ! 2899: {Tset input,,Spacing=1,Lmg=10,Rmg=70,Endtext=!**INDEX,Pagelength=55,- ! 2900: Newpage=<{Ls 2}{Center Appendix A}{Center Table of Contents}{Ls 2}>,- ! 2901: Endpage=<{Ls 1}{Center TOC-{Pagenum}}>- ! 2902: } ! 2903: {Dowhile {Lne @Toc},{Tset Toca,@Toc}{Restore Toc}} ! 2904: {Set Toc_char} ! 2905: {Dowhile {Lne @Toca},- ! 2906: {Cond {Lne @Toc_char,{Setv Toc_char,{Substr @Toca,1,1}}},{Ls 1},,{Brk}}- ! 2907: {D Toca}- ! 2908: {Restore Toca}- ! 2909: } ! 2910: ! ! 2911: !**INDEX ! 2912: ! ! 2913: {P} ! 2914: !** ! 2915: ! ! 2916: {Exclude TEXT} ! 2917: {Endsec} ! 2918: !** ! 2919: ! 2920:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.