Imposition example: 2 across
This page applies to Harlequin v13.1r0 and later; both Harlequin Core and Harlequin MultiRIP.
This example uses a number of RIP extensions, which will be explained in the rest of this chapter, after the example has been described.
This layout can be done easier by (HMR) selecting the 2-across Imposition setup from the Page Setup dialog box or (Core) using the NUp_1s_1
scheme from Simple imposition schemes. This code is being provided as a simple example to the RIP extensions.
First, a global dictionary is set up to keep a running page count and to store some constants. Though the page feature implements two pages side by side, we could form any grid of abutting input pages by varying the constants N-Across
and N-Down
.
currentglobal true setglobal
userdict /SW-Page-Imposition 6 dict put setglobal
userdict /SW-Page-Imposition get begin
/N-Across 2 def % number of pages in the x direction of the page
/N-Down 1 def % number of pages in the y direction of the page
/PageCount 0 def % keep our own record of number of pages seen
/N-Total N-Across N-Down mul def % for convenience
% A constant which triggers device deactivation
% when passed to EndPage; defined for clarity
/PageDeactivation 2 def
Then we set our own BeginPage
and EndPage
procedures (using the setpagedevice
operator) which are used to make changes between pages. The page device extension Scaling
(see Configuring the page device) is used to multiply up the page size requested by the number of pages in each direction, and then each page is scaled back down again and translated into its position in the grid. ExtraOrientation
is a RIP extension which behaves like Orientation
(again, see Configuring the page device) and is used here to turn the page through 90 degrees.
<<
currentpagedevice begin
% reset /Scaling using its current value and the values of
% N-Down and N-Across
/Scaling [
Scaling null eq {
//N-Across //N-Down
}{
Scaling 0 get //N-Across mul Scaling 1 get //N-Down mul
} ifelse
]
/ExtraOrientation ExtraOrientation 1 sub dup 0 lt { pop 3 } if
/BeginPage { % showpagecount on stack
% This procedure is executed at the beginning and just after
% each showpage, that is, at the start of each new page.
pop
//SW-Page-Imposition begin
currentpagedevice /PageSize get aload pop
% scale down by the number of pages we have to fit in
1 //N-Across div 1 //N-Down div scale
% calculate the translation for this page on the output
PageCount //N-Total mod
dup //N-Across mod 3 index mul
exch //N-Across idiv //N-Down 1 sub exch sub 2 index mul
translate
% Clip to the area occupied by this input page; because
% we have already done the translation, this is in the
% page's coordinate system.
% | w h
0 0 4 2 roll rectclip
end
} bind
The EndPage
procedure decides whether to output the page. It is called near the beginning of each showpage
and (loosely speaking) at the end of the job (known as device deactivation). If it returns true
, the pages accumulated so far will be output, otherwise not. We want output to occur when a full sheet of input pages is ready, and for any leftover pages at the end.
/EndPage { % showpagecount code -> bool
exch pop
//SW-Page-Imposition /PageCount 2 copy get
4 -1 roll //PageDeactivation eq {
% here on device deactivation deal with the final
% incomplete sheet
//N-Total mod 0 ne % the boolean result that
% EndPage has to produce
3 1 roll 0 put % restart counter
}{
% here on normal showpage
1 add
dup //N-Total mod
4 1 roll put % increment page counter
0 eq % deliver page if it is complete
} ifelse
} bind
end % currentpagedevice
/Imposition true % RIP extension
>> setpagedevice
end % SW-Page-Imposition
userdict /SW-Page-Imposition undef % for the sake of tidiness.
The following code paints some pages:
%%PlateColor: Cyan
0.9 setgray clippath fill
0.5 setgray
20 20 300 300 rectfill showpage
%%PlateColor: Magenta
0.7 setgray clippath fill
0.5 setgray
120 120 400 400 rectfill showpage
%%PlateColor: Yellow
0.9 setgray clippath fill
0.5 setgray
180 180 400 400 rectfill showpage
%%PlateColor: Black
0.7 setgray clippath fill
0.5 setgray
280 280 200 500 rectfill showpage
%%PlateColor: Grass Green
0.9 setgray clippath fill
0.5 setgray
320 320 200 500 rectfill showpage