Annotation of researchv10no/cmd/spitbol/gpmdoc.gpm, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

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