|
|
1.1 root 1: .so ../ADM/mac
2: .XX pm 21 "The \f(CW\-mpm\fP Macro Package"
3: .Tm typesetting g
4: .TL
5: The \&\f(CB\-mpm\fP Macro Package
6: .AU
7: Brian W. Kernighan
8: Christopher J. Van Wyk
9: .AI
10: .MH
11: .AB
12: The
13: .CW -mpm
14: macro package is an alternative to the standard
15: .CW -ms
16: macros|reference(latest msmacros) that is designed to produce better page makeup than
17: .CW -ms
18: does.
19: It includes most of the
20: .CW -ms
21: macros, while doing vertical justification and automatic figure placement,
22: and avoiding widows.
23: .AE
24: .2C
25: .NH
26: Executive Summary
27: .EQ
28: delim $$
29: .EN
30: .PP
31: Any document in generic
32: .CW -ms
33: format (not a
34: .CW .TM
35: or a
36: .CW .TR ,
37: for example) is formatted by
38: .P1
39: ... | troff -ms
40: .P2
41: Just by changing this command (and not the document) to
42: .P1
43: ... | troff -mpm
44: .P2
45: the
46: .CW -mpm
47: macro package, which defines most of the same macros as
48: .CW -ms ,
49: automatically invokes a
50: .I troff
51: postprocessor
52: .CW /usr/lib/tmac/pm ) (
53: that produces vertically justified pages
54: according to makeup rules that control figure placement
55: and prevent the creation of widow lines in text.
56: The general approach and algorithms of
57: .I pm
58: are described in |reference(page makeup).
59: .NH
60: Macros
61: .PP
62: The following macros are different from or not part of
63: .CW -ms .
64: Vertical distances denoted by
65: .I n
66: have default value
67: .CW 1v ,
68: i.e., one line.
69: .IP " \f(CW.SP\fP \f2n\fP"
70: .br
71: Add paddable space of height $n$.
72: The key word here is ``paddable'':
73: this space may expand or be removed to aid vertical justification.
74: Spaces produced by
75: .CW .sp
76: (instead of
77: .CW .SP )
78: may or may not appear in the output.
79: .IP " \f(CW.SP\fP \f2n\fP \f(CWexactly\fP"
80: .br
81: Add unpaddable space of height $n$.
82: This space cannot be removed.
83: .IP " \f(CW.KF\fP \f2m\fP"
84: .br
85: Text through a subsequent
86: .CW .KE
87: line defines a ``floating keep,''
88: whose center will be placed as close as possible to
89: vertical position $m$ on the page.
90: If $m$ is omitted,
91: the keep will appear at the top or bottom of a page.
92: The macro recognizes
93: .CW top
94: and
95: .CW bottom
96: as values for $m$.
97: .IP " \f(CW.FL\fP"
98: .br
99: Flush out all queued keeps before producing any more running text
100: (useful when a section or chapter ends).
101: .IP " \f(CW.BP\fP"
102: .br
103: Force a page break.
104: The
105: .I troff
106: command
107: .CW .bp
108: will not cause a page break.
109: .IP " \f(CW.NE\fP \f2n\fP"
110: .br
111: Start a new page if a chunk of output $n$ high would not fit here on the page.
112: .CW .NE
113: does not cause a break.
114: .IP " \f(CW.P1\fP, \f(CW.P2\fP, \f(CW.P3\fP"
115: .br
116: .CW .P1
117: begins a program display (Courier font);
118: .CW .P2
119: ends it;
120: .CW .P3
121: inserts an optional break point in a program display.
122: .IP " \f(CW.Tm\fP \f2any text\fP"
123: .br
124: On the standard error output, print
125: the current page number, a tab, and
126: .I "any text" .
127: The spelling is unusual because
128: .CW -ms
129: pre-empted
130: .CW .TM .
131: .IP " \f(CW.X\fP \f2any text\fP"
132: .br
133: Present
134: .I "any text
135: to the page-makeup program
136: as part of the sequence
137: .CW x
138: .CW X
139: .I "any text
140: (an output-device-dependent line in
141: .I troff
142: output).
143: This is equivalent to the
144: .I troff
145: command
146: .CW \eX'\f2any\ text\fP' .
147: .NH
148: Two-Column Operation
149: .PP
150: The page-makeup program maintains two ``regions''
151: on each page of output\(emone for single-column text
152: that is the full width of the page,
153: and one for two-column text that is about half the width of the page.
154: This convention makes it easy to insert single-column
155: figures into two-column text.
156: If one wishes to alternate single- and two-column output on a page
157: (as some journals alternate two-column text with single-column equations),
158: it is possible to ``freeze'' the contents of the current two-column region,
159: add the result to the single-column region,
160: and start with a fresh two-column region.
161: .PP
162: The following commands are related to two-column operation:
163: .IP " \f(CW.1C\fP
164: .br
165: Subsequent text up to the next
166: .CW .2C
167: command should be added to the single-column region.
168: .IP " \f(CW.2C\fP
169: .br
170: Subsequent text up to the next
171: .CW .1C
172: command should be added to the two-column region.
173: .LP
174: Note that it is the user's responsibility to label text with
175: .CW .1C
176: or
177: .CW .2C ;
178: the page-makeup program does not check whether the text widths make sense.
179: .IP " \f(CW.FC\fP"
180: .br
181: Freeze the current two-column region and start a new (empty) one.
182: .NH
183: Some Useful Number Registers and Strings
184: .PP
185: Table 1 shows some number registers that users may wish to set.
186: The value of register
187: .CW \en(PD
188: should be at least 1u to make vertical justification possible.
189: The value of register
190: .CW \en(TS
191: should be zero for side-by-side tables.
192: .1C
193: .KF
194: .nr PS 9
195: .nr VS 11
196: .ps 9
197: .vs 11
198: .TS
199: center, box;
200: cfI lfI lfI lfI
201: afCW a lfCWw(2i) a.
202: Register Default Used By Purpose
203: =
204: \f(CWPS\f1 10p point size
205: \f(CWVS\f1 12p vertical spacing
206: \f(CWLL\f1 6i line length
207: \f(CWLT\f1 \f(CW\en(LL\f1 title length
208: \f(CWFL\f1 \f(CW\en(LL\f1 footnote length
209: \f(CWCW\f1 7\(mu\f(CW\en(LL\f1/15 column width for two-column output
210: \f(CWGW\f1 \f(CW\en(LL\f1/15 gutter width for two-column output
211: _
212: HM 1i .PT header margin
213: FM 1i .BT footer margin
214: FO 10i vertical position of bottom margin
215: _
216: PO 1i page offset from left margin
217: PI 5n .PP paragraph indent
218: QI 5n .QP,.QS/.QE quotation indent
219: _
220: PD .3v .PP,.LP,.IP,.QP,.QS/.QE inter-paragraph vertical space
221: TS .5v .TS/.TE vertical space around tables
222: Kf .5v .KF/.KE vertical space around fixed keeps
223: Ks .5v .DS/.DE,.IS/.IE,.KS/.KE vertical space around floating keeps
224: _
225: dP 1p .P1/.P2 point-size decrease in programs
226: dT 8 .P1/.P2 spaces per tab stop in programs
227: dV 2p .P1/.P2 vertical-spacing decrease in programs
228: DV .5v .P1/.P2 vertical space around program displays
229: .TE
230: .ce 1
231: .B "Table 1
232: .nr PS 10
233: .nr VS 12
234: .ps 10
235: .vs 12
236: .KE
237: .2C
238: .PP
239: The vertical spacings shown in Table 1 are all paddable.
240: The macros shown in Table 2 produce vertical spacing that
241: cannot be adjusted by the user.
242: .KF bottom
243: .nr PS 9
244: .nr VS 11
245: .ps 9
246: .vs 11
247: .TS
248: center, box;
249: lfI lfI
250: afCW a.
251: Macro Vertical Spacing
252: =
253: \&.EQ .5v
254: \&.EN .5v
255: \&.NH 1v
256: \&.PS .35v
257: \&.PE .65v
258: \&.SH 1v
259: .TE
260: .ce 1
261: .B "Table 2
262: .nr PS 10
263: .nr VS 12
264: .ps 10
265: .vs 12
266: .KE
267: .PP
268: Table 3 shows strings used to produce page headers.
269: The value of
270: .CW \en(%#
271: at most points in the input is unrelated to the number of the page
272: on which that point will appear in the output.
273: .1C
274: .KF
275: .nr PS 9
276: .nr VS 11
277: .ps 9
278: .vs 11
279: .TS
280: center, box;
281: cfI cfI lfI
282: afCW lfCW a.
283: String Used by Purpose
284: =
285: %# .PT\fR,\fP .BT page number
286: %e .PT header for even-numbered pages
287: %o .PT header for odd-numbered pages
288: %E .BT footer for even-numbered pages
289: %O .BT footer for odd-numbered pages
290: .TE
291: .ce 1
292: .B "Table 3
293: .nr PS 10
294: .nr VS 12
295: .ps 10
296: .vs 12
297: .KE
298: .2C
299: .NH
300: Features
301: .PP
302: Warnings appear as comments in the standard output,
303: preceded by
304: .CW "MESSAGE TO USER:" '' ``
305: Common warnings concern pages that were not justified
306: because they were too empty and
307: keeps that had to be split because they were too large.
308: Users can set the
309: .CW WARN
310: parameter to see warnings on the standard error output;
311: see Section 6.
312: .PP
313: The
314: .CW -mpm
315: macro package does not support completely the rich variety of document types
316: (TM, CSTR, etc.,) that
317: .CW -ms
318: does, and does not provide obsolete styles like Engineer's Notes at all.
319: .PP
320: The interaction between
321: .I troff
322: and the page-makeup program produces strange results when
323: .I troff
324: input spaces up the page past paddable space.
325: (See the comment about
326: .CW \en(TS
327: in Section 4.)
328: .CW -mpm
329: issues a warning about ``an embedded SP.''
330: .PP
331: More generally, the ``flyback'' commands in
332: .I pic
333: and
334: .I ideal
335: .CW .PF "" (
336: and
337: .CW .IF ,
338: respectively) do not work with
339: .CW -mpm .
340: One can usually place narrow figures beside narrow text or other narrow figures
341: by setting the pieces in two columns and using the
342: .CW .FC
343: command.
344: .PP
345: The
346: .CW .FS
347: macro in
348: .CW -mpm
349: does not provide a line to separate footnotes from running text.
350: There are two reasons:
351: (1) if multiple footnotes appeared on a page,
352: each would have a separating line;
353: (2) if a footnote split across two pages,
354: no separator line would be provided
355: for the second part of the footnote.
356: Users can add footnote separating lines explicitly by calling the
357: .CW .FA
358: macro.
359: .PP
360: The implementation of multiple columns is incomplete:
361: .CW -mpm
362: provides only
363: .CW .2C .
364: .PP
365: Users who find that the page-makeup program stretches
366: their pages too much can experiment with adjusting the
367: minimum fullness and column tolerance parameters
368: described in Section 6.
369: .PP
370: Headings are a bit tricky if you want things like
371: running titles that include the current section title.
372: Normally you will need a two-pass procedure using
373: .CW .Tm
374: output.
375: On the bright side,
376: this procedure will produce correct headings,
377: where the standard one-pass procedure of resetting headers
378: in the
379: .CW .SH
380: macro can produce incorrect headers on odd-numbered pages.
381: .NH
382: Rolling Your Own
383: .PP
384: If you want to create your own macros that control
385: .I pm ,
386: Table 4 shows the components of
387: .I pm 's
388: ``command language.'' They are inserted into
389: the
390: .I troff
391: output in the form of
392: .CW "x X ..." '' ``
393: commands, created either by
394: .CW \eX'...'
395: or by the
396: .CW .X
397: macro in
398: .CW -mpm .
399: .CW /usr/lib/tmac/tmac.pm
400: contains examples of use.
401: .1C
402: .KF
403: .nr PS 9
404: .nr VS 11
405: .ps 9
406: .vs 11
407: .TS
408: center, box;
409: lfI lfI lfI lfI
410: lfCW l lw(2.75i) lfCWw(.55i).
411: Command Name Description Used by
412: =
413: SP $n$ space T{
414: Paddable space of $n$
415: T} .SP
416: BS $n$ breakable stream T{
417: $n ~=$ minimum number of lines from the stream that must appear on page
418: T} T{
419: \&.PP,.LP,
420: \&.IP,.QP
421: T}
422: US unbreakable stream T{
423: An \f(CWEND\fP-terminated item that cannot float or be broken
424: T} T{
425: \&.DS,\&.EQ,\&.IS,
426: \&.KS,\&.TS,\&.PS
427: T}
428: BF $v$ breakable float T{
429: An \f(CWEND\fP-terminated item that can float or be broken;
430: $v$ = preferred vertical location of box center;
431: two successive commands give two preferences
432: T} .FS
433: UF $v$ unbreakable float T{
434: An \f(CWEND\fP-terminated item that can float but cannot be broken;
435: $v$ = preferred vertical location of box center;
436: two successive commands give two preferences
437: T} .KF
438: PT page title T{
439: User has absolute control between PT and END;
440: no SP's or other
441: .I pm
442: commands inside are processed.
443: T} .PT
444: BT bottom title T{
445: User has absolute control between BT and END, as for PT.
446: T} .BT
447: END end T{
448: End a US, BF, UF, PT, or BT.
449: All constructs nest, but a float within another float
450: or US will not float within or outside the block.
451: T} T{
452: \&.DE,\&.EN,\&.FE,
453: \&.IE,\&.KE,\&.TE,
454: \&.PE
455: T}
456: TM $str$ message T{
457: Print the page number, a tab, and $str$ on standard error output.
458: T} .Tm
459: COORD $str$ output coordinates T{
460: Print $str$ with current page number and output $x$ and $y$ coordinates.
461: T}
462: NE $n$ need T{
463: Break page if a VBOX of height $n$ would not fit on page
464: T} .NE,.SH,.NH
465: MC $n$ $o$ multiple column T{
466: $n$ columns, $i$th offset from first by $o(i-1)$.
467: Only 1 and 2 columns work.
468: T} .1C,.2C
469: CMD FC freeze columns T{
470: Force out current two-column contents;
471: start a fresh one.
472: T} .FC
473: CMD FL flush T{
474: Force all queued figures out before any more
475: stream material is output.
476: T} .FL
477: CMD BP break page T{
478: Force page break.
479: T} .BP
480: PARM NP $v$ new page T{
481: Top of
482: .I pm
483: text at vertical position $v$.
484: T}
485: PARM FO $v$ footer T{
486: Bottom of
487: .I pm
488: text at vertical position $v$;
489: length of text on page = FO\ \-\ NP.
490: T}
491: PARM PL $v$ page length T{
492: Physical page ends at $v$;
493: default = FO + NP.
494: T}
495: PARM MF $x$ minimum fullness T{
496: Tolerance to prevent padding;
497: default = 90.
498: A page that is less than $x$% full will not be padded.
499: T}
500: PARM CT $x$ column tolerance T{
501: Tolerance for two-column operation;
502: default = 50.
503: Values larger than 50% will generally cause more text
504: to be included in the first column.
505: T}
506: PARM WARN $x$ warning flag T{
507: Print warnings on standard error output if $x != 0$.
508: T}
509: .TE
510: .ce 1
511: .B "Table 4
512: .nr PS 10
513: .nr VS 12
514: .ps 10
515: .vs 12
516: .KE
517: .2C
518: .NH
519: References
520: .LP
521: |reference_placement
522: .ig
523: ``Page Makeup by Postprocessing Text Formatter Output,''
524: Brian W. Kernighan and Christopher J. Van Wyk,
525: .I "Computing Systems,
526: $bold "2"$, 2, Spring 1989, pp 103-132.
527: ..
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.