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.
