Annotation of 43BSDReno/share/doc/usd/24.troff/m5, revision 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.