[comp.lang.postscript] how to print multiple pages on one page

cyosta@taux01.UUCP ( Yossie Silverman ) (07/12/89)

I once wrote a program to generate an "load-average" plot for a UNIX system.
This program now runs on many machines, each one producing a single page plot.
We run the program with the 'rsh' interface from one computer catching the
output from each into the same file which is then sent to the LaserWriter
for output.  The problem was that we were generating 70+ pager per run, which
was wasteful and unmanagable.  Since we are getting even more computers (work
stations) in the near future, we had to find a solution.  The soltution was to
cram 9 plots into a single page.  The problem with this was we wanted to do it
without changing the C program that generates the postscript data.  The way
I did it was to override a few of the PostScript operators with my own
procedures.  I based this on the fact that I had exactely one  'clippath' call
at the start of a single page output and either 'showpage' or 'erasepage
initgraphics' at the end.  The following code will do what is needed.  The
only thing to make note of is that 'showpage' should be called an extra
8 times at the end of the postscript in order to flush the last page (anyone
have a better idea?  Something that could be set up at the start to trap
the 'end-of-job' condition?).

- Yossie

---
% place this code segment before the collection of output pages.
% place a file with eight 'showpage's at the end.
/Initgraphics {initgraphics} bind def
/initgraphics {} def
/Erasepage {erasepage} bind def
/erasepage {Clippath pathbbox 1 setgray fill} def
/Showpage {showpage} bind def
/showpage {
	Which 1 add 9 mod dup /Which exch def
	0 eq {Showpage} if
} def
/Clippath {clippath} bind def
/clippath {
	Initgraphics 1 3 div dup scale
	Clippath pathbbox
	2 index sub 3 div dup 5 1 roll 2 Which 3 mod sub mul exch
	3 index sub 3 div dup 6 1 roll 2 Which 3 idiv sub mul exch
	translate translate 2 copy
	newpath 0 0 moveto 0 exch lineto exch lineto 0 lineto 0 0 lineto clip
} def
/Which 0 def
-- 
Yossie Silverman                                   What did the Caspian sea?
National Semiconductor Ltd. (Israel)
cyosta%taux01@nsc.nsc.COM         or        RPR1YOS@TECHNION.BITNET
NSA LSD FBI KGB PCP CIA MOSAD NUCLEAR MI5 SPY ASSASSINATE SDI -- OOCLAY ITAY

amanda@intercon.uu.net (Amanda Walker) (07/12/89)

In article <2148@taux01.UUCP>, cyosta@taux01.UUCP ( Yossie Silverman ) writes:
> The
> only thing to make note of is that 'showpage' should be called an extra
> 8 times at the end of the postscript in order to flush the last page (anyone
> have a better idea?  Something that could be set up at the start to trap
> the 'end-of-job' condition?).

How about adding a definition along the lines of:

/Flushpages { Which 0 neq { Showpage } if } def

This does a "real" showpage if the last page hasn't.

--
Amanda Walker
InterCon Systems Corporation
--
amanda@intercon.uu.net  | ...!uunet!intercon!amanda

cyosta@taux01.UUCP ( Yossie Silverman ) (07/13/89)

In article <1265@intercon.UUCP> amanda@intercon.uu.net (Amanda Walker) writes:
.In article <2148@taux01.UUCP>, cyosta@taux01.UUCP ( Yossie Silverman ) writes:
.> The
.> only thing to make note of is that 'showpage' should be called an extra
.> 8 times at the end of the postscript in order to flush the last page (anyone
.> have a better idea?  Something that could be set up at the start to trap
.> the 'end-of-job' condition?).
.
.How about adding a definition along the lines of:
.
./Flushpages { Which 0 neq { Showpage } if } def
.
.This does a "real" showpage if the last page hasn't.
.
.--
.Amanda Walker
.InterCon Systems Corporation
.--
.amanda@intercon.uu.net  | ...!uunet!intercon!amanda

And is about as long as typing 'showpage' 8 times.  No, I am looking for
something that can set at the START of the header and will take effect at
the END of the job.  It's not really that important...      - Yossie
-- 
Yossie Silverman                                   What did the Caspian sea?
National Semiconductor Ltd. (Israel)
cyosta%taux01@nsc.nsc.COM         or        RPR1YOS@TECHNION.BITNET
NSA LSD FBI KGB PCP CIA MOSAD NUCLEAR MI5 SPY ASSASSINATE SDI -- OOCLAY ITAY