| An experiment in page makeup for troff output... |
| |
| -mpm is a version of standard -ms that causes extra |
| information for vertical justification and figure |
| placement to be included in troff output. Commands that |
| have been augmented to provide paddable space are |
| |
| .SH and .NH |
| .PP and .LP no space if \n(PD is 0; normally .nr PD 0.3v; leave at least 1u |
| .IP and .QP also |
| .EQ and .EN |
| .TS and .TE no space if \n(TS is 0; normally .nr TS 0.5v |
| .PS and .PE |
| .P1 and .P2 display programs in CW font |
| .DS and .DE |
| .QS and .QE |
| |
| Other commands, registers, strings, etc.: |
| |
| .SP n explicit paddable space, just like .sp n. |
| generally you should ALWAYS use .SP instead of .sp. |
| if you need exactly a given vertical space, you can say |
| .SP 3i exactly |
| this space won't be padded. |
| .Tm words prints "words" and the output page number on stderr |
| sorry about the spelling; -ms pre-empted .TM |
| .NE n like .ne. note: does not cause a break |
| |
| Others may be added as the need arises. |
| |
| .nr FO n Set the page length. This value is the bottom of |
| the text on the page; a bottom title may lie below. |
| default is 10i (== 10 inches). |
| %o, %e are strings containing odd and even page titles |
| %# is the current page number (often useless) |
| .PT is a macro invoked at the top of each "page"; |
| it will normally use %e, %o and %#. There is also |
| a .BT for page bottoms if desired. |
| .BP force a page break |
| .FL force all waiting figures out before any more running text |
| .1C, .2C multiple columns; number registers CW and GW set |
| the column and gutter width if you don't like the default. |
| absent a .FC command, all two-column contents collect |
| together on the page |
| .FC freeze current two-column contents and start afresh. |
| necessary if you want to switch between 1 and 2 column |
| text and keep the relative order among them. |
| |
| Usage is some variant of |
| |
| ... | troff -mpm |
| |
| /usr/lib/tmac/pm is the page-justifier itself; it is called automatically |
| by the -mpm macro package. If you are installing this yourself, you will |
| have to edit the 2nd line of tmac.pm to arrange that pm is called directly |
| from troff. |
| |
| There are several lines in tmac.pm that say |
| .so /n/coma/usr/bwk/... |
| You should delete these; they are placeholders for some experiments. |
| |
| If you use -mm, you are more or less out of luck, although we will be |
| happy to provide a crude and incomplete program that purports to convert |
| -mm to -ms. It may suggest what you need but it won't do the job. |
| |
| To compile pm, you need a C++ compiler, preferably release 2.0 or later. |
| Put the .c and .h files in a directory, and type |
| make |
| This process may well fail. The usual cause is that different systems |
| put function declarations in different header files, and C++ insists that |
| all functions be properly declared. You can almost always get through this |
| part by adding function declarations. The most likely offender is malloc; |
| a line like |
| extern char *malloc(int); |
| near the top of slug.c will solve this one. |
| |
| |
| Bugs, etc.: |
| |
| not all -ms commands have been decorated; in particular, |
| the rich variety of document types (TM, CSTR, etc.,) is not |
| really supported. |
| |
| there are problems with funny first pages and troff input |
| that moves back up the page. |
| |
| multiple columns: only .2C is available. The program does not check |
| whether something is wide or narrow: user has responsibility to mark |
| which with .1C or .2C. |
| |
| headings are a bit tricky if you want things like |
| running titles that include the current section title. |
| normally a two-pass procedure using .Tm is needed. |
| |
| It's a pain to force a blank vertical space of specified height. |
| Try this: |
| .de x |
| \v'\\$1'\0\h'-\w'\0'u'\c |
| .. |
| .x 2.5i |
| |
| |
| If you want to roll your own, the following components are |
| included in pm's "command language". They are inserted in |
| the troff output in the form of "x X ..." commands, which |
| are created either by \X'...' or by the .X macro in -mpm. |
| Look at how they are used in /usr/lib/tmac/tmac.pm for examples. |
| |
| |
| BS n breakable stream n = min # lines that must appear on page |
| use: PP, LP, IP, ... |
| |
| US unbreakable stream use: KS/KE, DS/DE, TS/TE, EQ/EN, PS/PE, etc. |
| |
| BF v breakable float v = preferred vertical location of box center |
| use: FS/FE |
| use two successive BF's to give two preferences |
| |
| UF v unbreakable float v = preferred vertical location of box center |
| use: KF/KE |
| use two successive UF's to give two preferences |
| |
| PT page title use: user has absolute control between PT and END |
| no SP's or other pm commands inside are processed |
| |
| BT bottom title use: user has absolute control between BT and END |
| |
| END end end a US, BF, UF, PT, or BT |
| all constructs nest, but a float within another float |
| or a US block will not float within or outside the block |
| |
| NE n need break page if a VBOX of height n would not fit on page |
| use: .NE n |
| |
| SP n space paddable space of n |
| use: .SP n |
| |
| PARM NP v top of pm text at v |
| new page |
| |
| PARM FO v bottom of pm text at v |
| footer length of text on page = FO-NP |
| |
| PARM PL v physical page ends at v |
| page length default = FO + NP |
| |
| PARM MF x tolerance to prevent padding |
| minimum fullness default = 0.9 |
| |
| PARM CT x tolerance for two-column operation |
| column tolerance default = 0.5 |
| |
| PARM DBG x debugging flag |
| |
| TM str message .Tm words prints <pageno> <tab> <words> on stderr |
| |
| MC n o multiple column n columns, offset o. |
| Only 1 and 2 columns will work. |
| |
| CMD BP break page force page break |
| |
| CMD FL flush force all queued figures out before any more |
| stream material is output |
| |
| CMD FC freeze columns force out current two-column contents; |
| start a fresh one |
| |
| Something like this will probably have to be added: |
| |
| NC new column HARD! |
| |
| Known botches in the existing implementation of pm: |
| |
| If a footnote is split across two pages, any associated separator line |
| will not be copied. If there are multiple footnotes on one page, there |
| will be multiple separators too. -mpm's .FS macro does not provide a |
| separator. If you want a separator line, put it in explicitly with |
| a call to the .FA macro. |
| |
| There are not enough settable parameters; in particular, the |
| way to control the height is a botch. |
| |
| |
| Historical note: There is a simpler version of pm and -mpm |
| called pj and -mpj that only does vertical justification of |
| pages that have already been laid out by conventional means. |
| This simpler version may be adequate, but it is no longer |
| supported and memory of how it works is growing dim. |