Plan 9 from Bell Labs’s /usr/web/sources/contrib/steve/root/sys/src/cmd/pm/README

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


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.

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.