|
|
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.