[net.wanted.sources] Orphans & Widows Fix for Troff Wanted

jdw@garth.UUCP (Doug Waidhofer) (04/29/86)

I'm interested in any hacks or purchaseable software that fixes
the problems of Orphans and Widows in Troff.

In case you don't know what an Orphan or a Widow in text processing is:

Orphan - When the last line of a paragraph ends up all alone
	 just after a page break.

Widow -  When the first line of a paragraph ends up all alone
	 just before a page break.

Thanx in advance,

-jdw

roy@phri.UUCP (Roy Smith) (05/03/86)

In article <312@garth.UUCP> jdw@garth.UUCP (Doug Waidhofer) writes:
> I'm interested in any hacks or purchaseable software that fixes
> the problems of Orphans and Widows in Troff.
> 
	We fixed widow lines by imbedding a ".ne 3" request in the
paragraph macro (I think -me has this by default).

	Orphan lines are harder to deal with; I could see a scheme whereby
you divert output in the start-paragraph macro, and have an end-paragraph
macro that sees how long the paragraph is, and how much is left on the page
and inserts a .bp at the right place.  Yuck!
-- 
Roy Smith, {allegra,philabs}!phri!roy
System Administrator, Public Health Research Institute
455 First Avenue, New York, NY 10016

ron@brl-sem.ARPA (Ron Natalie <ron>) (05/04/86)

In article <312@garth.UUCP>, jdw@garth.UUCP (Doug Waidhofer) writes:
> 
> Widow -  When the first line of a paragraph ends up all alone
> 	 just before a page break.
> 
Widows are easily fixed (and are in most macro packages), just do a
need in your paragraph start macro.

-Ron

idallen@watmath.UUCP (05/05/86)

I know of no cheap way to eliminate those stray lines at the tops of
pages, but a simple addition to your local macro package can at least
tell you about most pages on which they occur.  Most macro packages
have an internal "reset-parameters" macro that does a break then resets
various format things.  Modify this macro so that after the break it
checks to see where you are on the current page.  If you are exactly
one line down from the top of the text portion of the page, you've just
generated a widowed line, and you can .tm this to the user.  The user
can do a dry run of the document without printing it to get a list of
the problem pages, then go back and edit text on the previous pages to
remove the problem areas.

For the -ms macros, the modification might read something like this.
You have to add some complications to allow the SH/NH title macros to put
one-line titles at page top without complaint, and the easiest thing to
do is to catch widows at paragraph end only.

Add this line to the end of the LP macro; add it to PP and IP too if necessary:

	.nr WI \\n%

Add this line to the end of the SH macro; add it to NH too if necessary:

	.nr SH 1

Define an "error message" macro of some sort, such as:

	.de ER
	.tm MS MACROS: Input line \\n(.c: \\$1
	.if \\n(.$>1 .tm ... \\$2
	.if \\n(.$>2 .tm ... \\$3
	.if \\n(.$>3 .tm ... \\$4
	.if \\n(.$>4 .tm ... \\$5
	.if \\n(.$>5 .tm ... \\$6
	.if \\n(.$>6 .tm ... \\$7
	.if \\n(.$>7 .tm ... \\$8
	..

Put this at the beginning of the RT macro:

	.br
	.if \\n(WI&(\\n(SH=0) .if \\n(.z \{\
	.	if (\\n(.h>\\n(HM)&(\\n(WI<\\n%)&(\\n(.h<(\\n(HM+1.2v)) .ER \
	"Possible single line widow at top of page '\\n(PN'"
	.	nr WI 0
	.\}
	.nr SH 0

\n(HM is the -ms register containing the size of the top margin.
-- 
        -IAN!  (Ian! D. Allen)      University of Waterloo