Annotation of 43BSDReno/share/doc/usd/24.troff/m5, revision 1.1.1.1

1.1       root        1: .\"    @(#)m5  6.1 (Berkeley) 4/17/86
                      2: .\"
                      3: .pn 28
                      4: .ds H T
                      5: .tr |
                      6: .tr ~|
                      7: .de x1
                      8: .xx
                      9: .ftB
                     10: .in .2i
                     11: .nf
                     12: .ne 2.1
                     13: .ta 1i
                     14: ..
                     15: .de x2
                     16: .fi
                     17: .in0
                     18: .ftR
                     19: .xx
                     20: ..
                     21: .br
                     22: .ce
                     23: .ftB
                     24: .rs
                     25: .sp 0.5i
                     26: TUTORIAL EXAMPLES
                     27: .ftR
                     28: .sp2
                     29: .nr p 0
                     30: .2C
                     31: .ns
                     32: .mh
                     33: .mk
                     34: Introduction
                     35: .pg
                     36: Although \*(NR and \*(TR
                     37: have by design a syntax reminiscent
                     38: of earlier text processors*
                     39: .fn
                     40: .xx
                     41: *For example:
                     42: P.|A.|Crisman, Ed.,
                     43: .ul
                     44: The Compatible Time-Sharing System,
                     45: MIT Press, 1965, Section|AH9.01
                     46: (Description of RUNOFF program on MIT's CTSS system).
                     47: .ef
                     48: with the intent of easing their use,
                     49: it is almost always necessary to
                     50: prepare at least a small set of macro definitions
                     51: to describe most documents.
                     52: Such common formatting needs
                     53: as page margins and footnotes
                     54: are deliberately not built into \*(NR and \*(TR.
                     55: Instead,
                     56: the macro and string definition, number register, diversion,
                     57: environment switching, page-position trap, and conditional input mechanisms
                     58: provide the basis for user-defined implementations.
                     59: .pg
                     60: The examples to be discussed are intended to be useful and somewhat realistic,
                     61: but won't necessarily cover all relevant contingencies.
                     62: Explicit numerical parameters are used
                     63: in the examples
                     64: to make them easier to read and to
                     65: illustrate typical values.
                     66: In many cases, number registers would really be used
                     67: to reduce the number of places where numerical
                     68: information is kept,
                     69: and to concentrate conditional parameter initialization
                     70: like that which depends on whether \*(TR or \*(NR is being used.
                     71: .mh
                     72: Page Margins
                     73: .pg
                     74: As discussed in \(sc3,
                     75: \fIheader\fR and \fIfooter\fR macros are usually defined
                     76: to describe the top and bottom page margin areas respectively.
                     77: A trap is planted at page position 0 for the header, and at
                     78: \fI\-N\fR (\fIN\fR from the page bottom) for the footer.
                     79: The simplest such definitions might be
                     80: .x1
                     81: &de hd \e"define header
                     82: \'sp 1i
                     83: &&     \e"end definition
                     84: &de fo \e"define footer
                     85: \'bp
                     86: &&     \e"end definition
                     87: &wh 0 hd
                     88: &wh \-1i fo
                     89: .x2
                     90: which provide blank 1|inch top and bottom margins.
                     91: The header will occur on the \fIfirst\fR page,
                     92: only if the definition and trap exist prior to
                     93: the initial pseudo-page transition (\(sc3).
                     94: In fill mode, the output line that springs the footer trap
                     95: was typically forced out because some part or whole word didn't fit on it.
                     96: If anything in the footer and header that follows causes a \fIbreak\fR,
                     97: that word or part word will be forced out.
                     98: In this and other examples,
                     99: requests like \fBbp\fR and \fBsp\fR that normally cause breaks are invoked using
                    100: the \fIno-break\fR control character \fB\'\fR
                    101: to avoid this.
                    102: When the header\(slfooter design contains material
                    103: requiring independent text processing, the
                    104: environment may be switched, avoiding
                    105: most interaction with the running text.
                    106: .pg
                    107: A more realistic example would be
                    108: .x1
                    109: &de hd \e"header
                    110: &if t .tl \'\|\e(rn\'\'\e(rn\'  \e"troff cut mark
                    111: &if \e\en%>1 \e{\e
                    112: \'sp ~\|0.5i\-1        \e"tl base at 0.5i
                    113: &tl \'\'\- % \-\'\'    \e"centered page number
                    114: &ps    \e"restore size
                    115: &ft    \e"restore font
                    116: &vs  \e}       \e"restore vs
                    117: \'sp ~\|1.0i   \e"space to 1.0i
                    118: &ns    \e"turn on no-space mode
                    119: &&
                    120: &de fo \e"footer
                    121: &ps 10 \e"set footer\(slheader size
                    122: &ft R  \e"set font
                    123: &vs 12p        \e"set base-line spacing
                    124: &if \e\en%=1 \e{\e
                    125: \'sp ~\|\e\en(.pu\-0.5i\-1  \e"tl base 0.5i up
                    126: &tl \'\'\- % \-\'\' \e}  \e"first page number
                    127: \'bp
                    128: &&
                    129: &wh 0 hd
                    130: &wh \-1i fo
                    131: .x2
                    132: which sets the size, font, and base-line spacing for the
                    133: header\(slfooter material, and ultimately restores them.
                    134: The material in this case is a page number at the bottom of the
                    135: first page and at the top of the remaining pages.
                    136: If \*(TR is used, a \fIcut mark\fR is drawn in the form
                    137: of \fIroot-en\fR's at each margin.
                    138: The \fBsp\fR's refer to absolute positions to avoid
                    139: dependence on the base-line spacing.
                    140: Another reason for this in the footer
                    141: is that the footer is invoked by printing a line whose
                    142: vertical spacing swept past the trap position by possibly
                    143: as much as the base-line spacing.
                    144: The \fIno-space\fR mode is turned on at the end of \fBhd\fR
                    145: to render ineffective
                    146: accidental occurrences of \fBsp\fR at the top of the running text.
                    147: .pg
                    148: The above method of restoring size, font, etc. presupposes
                    149: that such requests (that set \fIprevious\fR value) are \fInot\fR
                    150: used in the running text.
                    151: A better scheme is save and restore both the current \fIand\fR
                    152: previous values as shown for size in the following:
                    153: .x1
                    154: &de fo
                    155: &nr s1 \e\en(.s        \e"current size
                    156: &ps
                    157: &nr s2 \e\en(.s        \e"previous size
                    158: &  --- \e"rest of footer
                    159: &&
                    160: &de hd
                    161: &  --- \e"header stuff
                    162: &ps \e\en(s2   \e"restore previous size
                    163: &ps \e\en(s1   \e"restore current size
                    164: &&
                    165: .x2
                    166: Page numbers may be printed in the bottom margin
                    167: by a separate macro triggered during the footer's
                    168: page ejection:
                    169: .x1
                    170: &de bn \e"bottom number
                    171: &tl \'\'\- % \-\'\'    \e"centered page number
                    172: &&
                    173: &wh \-0.5i\-1v bn       \e"tl base 0.5i up
                    174: .x2
                    175: .mh
                    176: Paragraphs and Headings
                    177: .pg
                    178: The housekeeping
                    179: associated with starting a new paragraph should be collected
                    180: in a paragraph macro
                    181: that, for example,
                    182: does the desired preparagraph spacing,
                    183: forces the correct font, size, base-line spacing, and indent,
                    184: checks that enough space remains for \fImore than one\fR line,
                    185: and
                    186: requests a temporary indent.
                    187: .x1
                    188: &de pg \e"paragraph
                    189: &br    \e"break
                    190: &ft R  \e"force font,
                    191: &ps 10 \e"size,
                    192: &vs 12p        \e"spacing,
                    193: &in 0  \e"and indent
                    194: &sp 0.4        \e"prespace
                    195: &ne 1+\e\en(.Vu        \e"want more than 1 line
                    196: &ti 0.2i       \e"temp indent
                    197: &&
                    198: .x2
                    199: The first break in \fBpg\fR
                    200: will force out any previous partial lines,
                    201: and must occur before the \fBvs\fR.
                    202: The forcing of font, etc. is
                    203: partly a defense against prior error and
                    204: partly to permit
                    205: things like section heading macros to
                    206: set parameters only once.
                    207: The prespacing parameter is suitable for \*(TR;
                    208: a larger space, at least as big as the output device vertical resolution, would be
                    209: more suitable in \*(NR.
                    210: The choice of remaining space to test for in the \fBne\fR
                    211: is the smallest amount greater than one line
                    212: (the \fB.V\fR is the available vertical resolution).
                    213: .pg
                    214: A macro to automatically number section headings
                    215: might look like:
                    216: .x1
                    217: &de sc \e"section
                    218: &  --- \e"force font, etc.
                    219: &sp 0.4        \e"prespace
                    220: &ne 2.4+\e\en(.Vu \e"want 2.4+ lines
                    221: .lg 0
                    222: &fi
                    223: .lg
                    224: \e\en+S.
                    225: &&
                    226: &nr S 0 1      \e"init S
                    227: .x2
                    228: The usage is \fB.sc\fR,
                    229: followed by the section heading text,
                    230: followed by \fB.pg\fR.
                    231: The \fBne\fR test value includes one line of heading,
                    232: 0.4 line in the following \fBpg\fR, and
                    233: one line of the paragraph text.
                    234: A word consisting of the next section number and a period is
                    235: produced to begin the heading line.
                    236: The format of the number may be set by \fBaf\fR (\(sc8).
                    237: .pg
                    238: Another common form is the labeled, indented paragraph,
                    239: where the label protrudes left into the indent space.
                    240: .x1
                    241: &de lp \e"labeled paragraph
                    242: &pg
                    243: &in 0.5i       \e"paragraph indent
                    244: &ta 0.2i 0.5i  \e"label, paragraph
                    245: &ti 0
                    246: \et\e\e$1\et\ec        \e"flow into paragraph
                    247: &&
                    248: .x2
                    249: The intended usage is "\fB.lp\fR \fIlabel\fR\|";
                    250: \fIlabel\fR will begin at 0.2\|inch, and
                    251: cannot exceed a length of 0.3\|inch without intruding into
                    252: the paragraph.
                    253: The label could be right adjusted against 0.4\|inch by
                    254: setting the tabs instead with \fB.ta|0.4iR|0.5i\fR.
                    255: The last line of \fBlp\fR ends with \fB\ec\fR so that
                    256: it will become a part of the first line of the text
                    257: that follows.
                    258: .mh
                    259: Multiple Column Output
                    260: .pg
                    261: The production of multiple column pages requires
                    262: the footer macro to decide whether it was
                    263: invoked by other than the last column,
                    264: so that it will begin a new column rather than
                    265: produce the bottom margin.
                    266: The header can initialize a column register that
                    267: the footer will increment and test.
                    268: The following is arranged for two columns, but
                    269: is easily modified for more.
                    270: .x1
                    271: &de hd \e"header
                    272: &  ---
                    273: &nr cl 0 1     \e"init column count
                    274: &mk    \e"mark top of text
                    275: &&
                    276: &de fo \e"footer
                    277: &ie \e\en+(cl<2 \e{\e
                    278: &po +3.4i      \e"next column; 3.1+0.3
                    279: &rt    \e"back to mark
                    280: &ns \e}        \e"no-space mode
                    281: &el \e{\e
                    282: &po \e\enMu    \e"restore left margin
                    283: &  ---
                    284: \'bp \e}
                    285: &&
                    286: &ll 3.1i       \e"column width
                    287: &nr M \e\en(.o \e"save left margin
                    288: .x2
                    289: Typically a portion of the top of the first page
                    290: contains full width text;
                    291: the request for the narrower line length,
                    292: as well as another \fB.mk\fR would
                    293: be made where the two column output was to begin.
                    294: .mh
                    295: Footnote Processing
                    296: .pg
                    297: The footnote mechanism to be described is used by
                    298: imbedding the footnotes in the input text at the
                    299: point of reference,
                    300: demarcated by an initial \fB.fn\fR and a terminal \fB.ef\fR:
                    301: .x1
                    302: &fn
                    303: \fIFootnote text and control lines...\fP
                    304: &ef
                    305: .x2
                    306: In the following,
                    307: footnotes are processed in a separate environment and diverted
                    308: for later printing in the space immediately prior to the bottom
                    309: margin.
                    310: There is provision for the case where the last collected
                    311: footnote doesn't completely fit in the available space.
                    312: .x1
                    313: &de hd \e"header
                    314: &  ---
                    315: &nr x 0 1      \e"init footnote count
                    316: &nr y 0\-\e\enb        \e"current footer place
                    317: &ch fo \-\e\enbu       \e"reset footer trap
                    318: &if \e\en(dn .fz       \e"leftover footnote
                    319: &&
                    320: &de fo \e"footer
                    321: &nr dn 0       \e"zero last diversion size
                    322: &if \e\enx \e{\e
                    323: &ev 1  \e"expand footnotes in ev1
                    324: &nf    \e"retain vertical size
                    325: &FN    \e"footnotes
                    326: &rm FN \e"delete it
                    327: &if "\e\en(.z"fy" .di   \e"end overflow diversion
                    328: &nr x 0        \e"disable fx
                    329: &ev  \e}       \e"pop environment
                    330: &  ---
                    331: \'bp
                    332: &&
                    333: &de fx \e"process footnote overflow
                    334: &if \e\enx .di fy      \e"divert overflow
                    335: &&
                    336: &de fn \e"start footnote
                    337: &da FN \e"divert (append) footnote
                    338: &ev 1  \e"in environment 1
                    339: &if \e\en+x=1 .fs       \e"if first, include separator
                    340: .lg0
                    341: &fi    \e"fill mode
                    342: .lg
                    343: &&
                    344: &de ef \e"end footnote
                    345: &br    \e"finish output
                    346: &nr z \e\en(.v \e"save spacing
                    347: &ev    \e"pop ev
                    348: &di    \e"end diversion
                    349: &nr y \-\e\en(dn       \e"new footer position,
                    350: &if \e\enx=1 .nr y \-(\e\en(.v\-\e\enz) \e
                    351:        \e"uncertainty correction
                    352: &ch fo \e\enyu \e"y is negative
                    353: &if (\|\e\en(nl+1v)>(\|\e\en(.p+\e\eny) \e
                    354: &ch fo \e\en(nlu+1v     \e"it didn't fit
                    355: &&
                    356: &de fs \e"separator
                    357: \el\'\|1i\'    \e"1 inch rule
                    358: &br
                    359: &&
                    360: &de fz \e"get leftover footnote
                    361: &fn
                    362: &nf    \e"retain vertical size
                    363: &fy    \e"where fx put it
                    364: &ef
                    365: &&
                    366: &nr b 1.0i     \e"bottom margin size
                    367: &wh 0 hd       \e"header trap
                    368: &wh 12i fo     \e"footer trap, temp position
                    369: &wh \-\e\enbu fx       \e"fx at footer position
                    370: &ch fo \-\e\enbu       \e"conceal fx with fo
                    371: .x2
                    372: The header \fBhd\fR initializes a footnote count register \fBx\fR,
                    373: and sets both the current footer trap position register \fBy\fR and
                    374: the footer trap itself to a nominal position specified in
                    375: register \fBb\fR.
                    376: In addition, if the register \fBdn\fR indicates a leftover footnote,
                    377: \fBfz\fR is invoked to reprocess it.
                    378: The footnote start macro \fBfn\fR begins a diversion (append) in environment 1,
                    379: and increments the count \fBx\fR; if the count is one, the footnote separator \fBfs\fR
                    380: is interpolated.
                    381: The separator is kept in a separate macro to permit user redefinition.
                    382: The footnote end macro \fBef\fR restores
                    383: the previous environment and ends the diversion after saving the spacing size in register \fBz\fR.
                    384: \fBy\fR is then decremented by the size of the footnote, available in \fBdn\fR;
                    385: then on the first footnote, \fBy\fR is further decremented by the difference
                    386: in vertical base-line spacings of the two environments, to
                    387: prevent the late triggering the footer trap from causing the last
                    388: line of the combined footnotes to overflow.
                    389: The footer trap is then set to the lower (on the page) of \fBy\fR or the current page position (\fBnl\fR)
                    390: plus one line, to allow for printing the reference line.
                    391: If indicated by \fBx\fR, the footer \fBfo\fR rereads the footnotes from \fBFN\fR in nofill mode
                    392: in environment 1,
                    393: and deletes \fBFN\fR.
                    394: If the footnotes were too large to fit, the macro \fBfx\fR will be trap-invoked to redivert
                    395: the overflow into \fBfy\fR,
                    396: and the register \fBdn\fR will later indicate to the header whether \fBfy\fR is empty.
                    397: Both \fBfo\fR and \fBfx\fR are planted in the nominal footer trap position in an order
                    398: that causes \fBfx\fR to be concealed unless the \fBfo\fR trap is moved.
                    399: The footer then terminates the overflow diversion, if necessary, and
                    400: zeros \fBx\fR to disable \fBfx\fR,
                    401: because the uncertainty correction
                    402: together with a not-too-late triggering of the footer can result
                    403: in the footnote rereading finishing before reaching the \fBfx\fR trap.
                    404: .pg
                    405: A good exercise for the student is to combine the multiple-column and footnote mechanisms.
                    406: .mh
                    407: The Last Page
                    408: .pg
                    409: After the last input file has ended, \*(NR and \*(TR
                    410: invoke the \fIend macro\fR (\(sc7), if any,
                    411: and when it finishes, eject the remainder of the page.
                    412: During the eject, any traps encountered are processed normally.
                    413: At the \fIend\fR of this last page, processing terminates
                    414: \fIunless\fR a partial line, word, or partial word remains.
                    415: If it is desired that another page be started, the end-macro
                    416: .x1
                    417: &de en \e"end-macro
                    418: \ec
                    419: \'bp
                    420: &&
                    421: &em en
                    422: .x2
                    423: will deposit a null partial word,
                    424: and effect another last page.

unix.superglobalmegacorp.com

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