summaryrefslogtreecommitdiff
path: root/Master/xemtex/gslib/gsnup.ps
blob: bec6f72539e883f39053036ff292da3676d9cf72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
%!
%    Copyright (C) 1999 Aladdin Enterprises.  All rights reserved.
% 
% This program is free software; you can redistribute it and/or modify it
% under the terms of the GNU General Public License as published by the
% Free Software Foundation; either version 2 of the License, or (at your
% option) any later version.
%
% This program is distributed in the hope that it will be useful, but
% WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
% Public License for more details.
%
% You should have received a copy of the GNU General Public License along
% with this program; if not, write to the Free Software Foundation, Inc.,
% 59 Temple Place, Suite 330, Boston, MA, 02111-1307.

% $Id: gsnup.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
% Prefix this to very well-behaved PostScript files for n-up printing.

/cdef { 1 index where { pop pop } { def } ifelse } def

%%%%%%%%%%%%%%%% Begin parameters %%%%%%%%%%%%%%%%

% All parameters are also settable from the command line with -d, e.g.,
% -d.Nx=3

/.Nx 2 cdef			% # of pages across the physical page
/.Ny 2 cdef			% # of pages down the physical page
/.Landscape false cdef		% if true, rotate page by 90 degrees

%%%%%%%%%%%%%%%% End parameters %%%%%%%%%%%%%%%%

vmstatus pop pop 0 eq { save pop } if
.Landscape {
  currentpagedevice /PageSize get aload pop
  exch 2 array astore
  1 dict dup /PageSize 4 -1 roll put
  setpagedevice
} if
/.BP currentpagedevice /BeginPage get def
/.EP currentpagedevice /EndPage get def
/.Ps 1 string def	% survive save/restore
/.Pn { .Ps 0 get } def
true setglobal		% protect from restore
/.ELevel [0] def
/.Rmat matrix def
false setglobal
/.max { 2 copy lt { exch } if pop } cdef
% Work around the common save ... showpage ... restore locution.
/restore {
  .Rmat currentmatrix pop restore
  vmstatus pop pop .ELevel 0 get lt { .Rmat setmatrix } if
} bind def
<<
  /BeginPage {
    .BP .Nx .Ny .max
    gsave
      initclip clippath pathbbox exch 4 -1 roll sub 3 1 roll exch sub
    grestore
    2 copy exch .Nx div exch .Ny div
    .Pn dup .Nx mod exch .Nx idiv .Ny 1 sub exch sub
		% Stack: nmax pw ph pw/nx ph/ny ix iy
    exch 3 index mul exch 2 index mul
    translate
		% Stack: nmax pw ph pw/nx ph/ny
    4 -1 roll 4 index div 4 -1 roll 4 index div
		% Stack: nmax pw/nx ph/ny pw/nmax ph/nmax
    exch 4 -1 roll exch sub 2 div
    3 1 roll sub 2 div
    translate
		% Stack: nmax
    1 exch div dup scale
  }
  /EndPage {
    .ELevel 0 vmstatus pop pop put
    .Ps 0 .Pn 1 add .Nx .Ny mul mod put    
    .Pn 0 eq {
      .EP
    } {
      pop pop false
    } ifelse
  }
>> setpagedevice
/.EOJ {
  { .Pn 0 eq { exit } if showpage } loop
} def

{ currentfile cvx exec .EOJ } exec