|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.