page-imp.mkxl /size: 50 Kb    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=page-imp, % was: core-pag,
3%D        version=1998.01.15,
4%D          title=\CONTEXT\ Page Macros,
5%D       subtitle=Pagebody Building (Imposition),
6%D         author=Hans Hagen & Willi Egger,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14% much of this can more to run time loading !
15
16\writestatus{loading}{ConTeXt Page Macros / Pagebody Building}
17
18\unprotect
19
20%D \macros
21%D   {starttextdata}
22%D
23%D This is a user macro (appending to every last shipout is not really user
24%D friendly).
25
26\newtoks\t_page_text_data
27
28\permanent\protected\def\starttextdata#1\stoptextdata
29  {\glet\page_shipouts_flush_text_data\page_shipouts_flush_text_data_indeed
30   \globaladdtotoks\t_page_text_data{#1}}
31
32\aliased\let\stoptextdata\relax
33
34\def\page_shipouts_flush_text_data_indeed
35  {\vsmashed{\expand\t_page_text_data}%
36   \global\t_page_text_data\emptytoks
37   \glet\page_shipouts_flush_text_data\relax}
38
39\let\page_shipouts_flush_text_data\relax
40
41\prependtoks
42    \page_shipouts_flush_text_data
43\to \everylastshipout
44
45%D Problem: we need to apply the finalizers to a to be shipped out page (as we can
46%D have positioning involved). However, we can also add stuff in the imposition,
47%D like cropmarks. Fortunately we do that with metapost so colors etc are dealt with
48%D at that end.
49
50% \starttypen
51% \def\pagestoshipout{1,3,5}
52% \stoptypen
53
54\installcorenamespace{shipoutmethod}
55\installcorenamespace{layoutarranger}
56\installcorenamespace{layoutarrangeoption}
57
58\newinteger    \shippedoutpages
59\newinteger    \combinedpagescounter
60\newconstant   \whichpagetoshipout % 0=all 1=odd 2=even
61\newbox        \shipoutscratchbox
62\setnewconstant\shipoutfinalizemethod\plusone
63
64\mutable\lettonothing\pagestoshipout % {1,3,6}
65
66\permanent\protected\def\shipoutrange#1#2%
67  {\begingroup
68   \scratchtoks\emptytoks
69   \dostepwiserecurse{#1}{\numexpr#2-\plusone\relax}\plusone{\etoksapp\scratchtoks{##1,}}%
70   \xdef\pagestoshipout{\the\scratchtoks,\number#2}%
71   \gtoksapp\everyaftershipout{\ifnum\realpageno>\numexpr#2+\plusone\relax\global\everypar{\normalend}\fi}%
72   \endgroup}
73
74\permanent\protected\def\installshipoutmethod#1#2%      % a handler takes one argument: something to be boxed
75  {\gdefcsname\??shipoutmethod#1\endcsname##1{#2{##1}}} % and shipped out (don't depend on the exact package)
76
77\aliased\let\installpagehandler\installshipoutmethod % will go
78
79\permanent\protected\def\invokepagehandler#1%
80  {\expandnamespacevalue\??shipoutmethod{#1}\v!normal}
81
82\def\page_shipouts_handle
83  {\ifcsname\??shipoutmethod\v_page_target_method\endcsname
84     \expandafter\lastnamedcs
85   \else
86     \expandafter\page_shipouts_ignore
87   \fi}
88
89\installshipoutmethod \v!normal
90  {\ifarrangingpages
91     \expandafter\page_shipouts_arrange
92   \else
93     \expandafter\page_shipouts_normal
94   \fi}
95
96\installshipoutmethod \v!none
97  {\page_shipouts_ignore}
98
99% \setuppaper[method=rotate,rotation=15] \showframe
100% \starttext \dorecurse{10}{\input knuth\endgraf} \stoptext
101
102\installshipoutmethod\v!rotate
103  {\page_shipouts_rotate}
104
105\protected\def\page_shipouts_rotate#1%
106  {\invokepagehandler\v!normal{\rotate[\c!rotation=\rootlayouttargetparameter\c!rotation]{#1}}}
107
108% inject an empty page after each page
109
110\def\page_shipouts_double#1%
111  {\page_shipouts_normal{#1}%
112   \page_shipouts_normal{\null}}
113
114\installshipoutmethod \v!doublesided
115  {\ifarrangingpages
116     \expandafter\page_shipouts_arrange
117   \else
118     \expandafter\page_shipouts_double
119   \fi}
120
121% extension mechanism
122
123\newinteger\c_page_boxes_flush_n % set at the lua end
124
125\let\page_boxes_flush_before\relax
126\let\page_boxes_flush_after \relax
127
128% used here:
129
130\def\page_boxes_shipout#1% or: \page_shipouts_apply
131  {\dontcomplain         % redundant
132   \ifcase\c_page_boxes_flush_n\else
133     \page_boxes_flush_before
134   \fi
135   \expand\everybeforeshipout
136   \ifcase\shipoutfinalizemethod % not nice ... needs thinking
137     \page_shipouts_handle{#1}%
138   \else
139     \setbox\shipoutscratchbox\hpack
140       {#1}% just in case there are objects there, hook for testing (will go away)
141     \page_shipouts_handle
142       {\finalizeshipoutbox\shipoutscratchbox
143        \box\shipoutscratchbox}%
144   \fi
145   \setnextrealpageno       % so this comes before \everyaftershipout so in fact:
146   \expand\everyaftershipout   % at this point we're already on the next realpage
147   \ifcase\c_page_boxes_flush_n\else
148     \page_boxes_flush_after
149   \fi}
150
151\def\page_shipouts_ignore#1%
152  {\begingroup
153   \writestatus\m!system
154     {\ifarrangingpages arranged\normalspace\fi page\normalspace
155      \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
156       not\normalspace flushed}%
157 % \setbox\scratchbox\hpack
158 %   {#1}% no finalize
159   \deadcycles\zerocount
160   \endgroup}
161
162\def\page_otr_flush_every_stuff
163  {\begingroup
164   \setbox\scratchbox\hpack
165     {% before the main one !
166      \ifcase\realfolio \or
167        \expand\everyfirstshipout
168        \global\everyfirstshipout\emptytoks
169      \fi
170      % the main one
171      \expand\everyshipout\relax
172      % always last (and after the main one)
173      \ifnum\realpageno=\lastpage\relax
174        \expand\everylastshipout
175        \global\everylastshipout\emptytoks
176      \fi}%
177   \smashbox\scratchbox
178   \box\scratchbox
179   \endgroup}
180
181%D We just ignore \type {\shipout}.
182
183\pushoverloadmode
184
185\permanent\protected\def\shipout
186  {\begingroup\dowithnextboxcs\endgroup}
187
188\popoverloadmode
189
190%D Also in normal \MKIV\ we nos use the indirect way so that we benefit from timing
191%D and tracing.
192
193\def\page_shipout_show_box{\showbox diagnose}
194
195\protected\def\page_shipout_box#1%
196  {\ifcase\tracingoutput\else
197     \page_shipout_show_box#1\relax
198   \fi
199   \clf_shipoutpage#1\relax
200   \global\setbox#1\emptybox
201   \global\deadcycles\zerocount
202   \clf_cleanupattributes}
203
204\def\page_shipouts_normal#1%
205  {\global\advanceby\shippedoutpages\plusone
206   % this is not resource safe!
207   \ifempty\pagestoshipout
208     \ifcase\whichpagetoshipout\relax
209       \donetrue
210     \or % 1
211       \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi
212     \or % 2
213       \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi
214     \else
215       \donetrue
216     \fi
217   \orelse\ifinset{\the\shippedoutpages}{\pagestoshipout}%
218     \donetrue
219   \else
220     \donefalse
221   \fi
222   \ifdone
223     \setbox\shipoutscratchbox\hpack
224       {#1}% finalizes
225     \ifcase\shipoutfinalizemethod
226       \finalizeshipoutbox\shipoutscratchbox
227     \fi
228     \setbox\shipoutscratchbox\vpack
229       {\hpack
230          {\page_otr_flush_every_stuff
231           \page_otr_flush_special_content
232           \box\shipoutscratchbox}}%
233     \page_shipout_box\shipoutscratchbox % takes a box number!
234   \else
235     \page_shipouts_ignore{#1}%
236   \fi}
237
238\newconditional\c_page_shipouts_use_objects \c_page_shipouts_use_objects\conditionaltrue
239
240\installcorenamespace {arrangedpage}
241
242\def\page_shipouts_arrange#1%
243  {\begingroup
244   \setbox\shipoutscratchbox\hpack
245     {#1}% finalizes
246   \setbox\shipoutscratchbox\hpack
247     {\page_otr_flush_every_stuff
248      \page_otr_flush_special_content
249      \box\shipoutscratchbox}%
250   %
251   \ifconditional\c_page_shipouts_use_objects
252     \setobject\??arrangedpage{\the\realpageno}\hpack{\box\shipoutscratchbox}%
253     \setbox\shipoutscratchbox\hpack{\getobject\??arrangedpage{\the\realpageno}}%
254   \fi
255   %
256   \pusharrangedpage\shipoutscratchbox
257   \deadcycles\zerocount
258   \endgroup}
259
260%D We need a couple of boxes for duplex printing \unknown
261
262\newbox\arrangedpageA \newbox\arrangedpageB
263\newbox\arrangedpageC \newbox\arrangedpageD
264\newbox\arrangedpageE \newbox\arrangedpageF
265\newbox\arrangedpageG \newbox\arrangedpageH
266
267\newconditional\arrangedswapstate
268\newconditional\arrangednegatestate
269\newconditional\arrangedmirrorstate
270\newconditional\arrangeddoublestate
271\newconditional\arrangingdisabledstate
272\newconditional\arrangedbackgroundstate
273
274\mutable\def\arrangedrotationO{0}
275\mutable\def\arrangedrotationE{0}
276
277\newinteger\arrangedpageN
278\newinteger\arrangedpageM
279
280\newinteger\arrangedpageT \arrangedpageT\plusone
281\newinteger\arrangedpageX \arrangedpageX\plusone
282\newinteger\arrangedpageY \arrangedpageY\plusone
283
284\def\page_paper_set_offsets
285  {\global\paperoffset\v_page_target_offset
286   \global\advanceby\paperwidth -2\dimexpr\paperoffset/\arrangedpageX\relax
287   \global\advanceby\paperheight-2\dimexpr\paperoffset/\arrangedpageY\relax}
288
289\permanent\protected\def\doinstallarrangedoption#1#2%
290  {\gdefcsname\??layoutarrangeoption#1\endcsname{#2}}
291
292\permanent\def\doinstalledarrangedoption#1%
293  {\ifcsname\??layoutarrangeoption#1\endcsname
294     \lastnamedcs
295   \else
296     \checkinstalledpagearrangement{#1}% this installs the arranger
297   \fi}
298
299\doinstallarrangedoption\empty
300  {} % no default and check if empty, we can have ,,,
301
302\doinstallarrangedoption\v!disable
303  {\global\arrangingdisabledstate\conditionaltrue}
304
305\doinstallarrangedoption\v!mirrored
306  {\global\arrangedmirrorstate\conditionaltrue}
307
308\doinstallarrangedoption\v!doublesided
309  {\global\arrangeddoublestate\conditionaltrue}
310
311\doinstallarrangedoption\v!negative
312  {\global\arrangednegatestate\conditionaltrue}
313
314\doinstallarrangedoption\v!rotated
315  {\gdef\arrangedrotationO {90}%
316   \gdef\arrangedrotationE{270}%
317   \swapcounts\c_page_marks_nx\c_page_marks_ny}
318
319\doinstallarrangedoption{90}
320  {\gdef\arrangedrotationO {90}%
321   \gdef\arrangedrotationE{270}%
322   \swapcounts\c_page_marks_nx\c_page_marks_ny}
323
324\doinstallarrangedoption{180}
325  {\gdef\arrangedrotationO{180}%
326   \gdef\arrangedrotationE  {0}}
327
328\doinstallarrangedoption{270}
329  {\gdef\arrangedrotationO{270}%
330   \gdef\arrangedrotationE {90}%
331   \swapcounts\c_page_marks_nx\c_page_marks_ny}
332
333\doinstallarrangedoption\s!reset
334  {\global\arrangingpagesfalse}
335
336\doinstallarrangedoption\v!background
337  {\global\arrangedbackgroundstate\conditionaltrue}
338
339\aliased\let\poparrangedpages  \relax
340\aliased\let\pusharrangedpage  \gobbleoneargument
341\aliased\let\handlearrangedpage\relax
342
343\permanent\protected\def\setuparranging[#1]%
344  {\ifconditional\arrangingdisabledstate \else
345     %global\arrangingdisabledstate\conditionalfalse
346     \global\arrangingpagestrue % will be conditional
347     \global\arrangednegatestate\conditionalfalse
348     \global\arrangedmirrorstate\conditionalfalse
349     \global\arrangeddoublestate\conditionalfalse
350     \global\arrangedswapstate\conditionalfalse
351     \gdef\arrangedrotationO{0}%
352     \gdef\arrangedrotationE{180}%
353     % if we use --arrange we have an initial "disable" here
354     \processcommalist[#1]\doinstalledarrangedoption
355     \ifrelax\poparrangedpages
356       \global\arrangingpagesfalse % nothing set yet
357     \fi
358     \setuppapersize
359     \ifarrangingpages
360        \ifconditional\c_page_shipouts_use_objects\else
361          \clf_disablejobsave
362          \clf_synctexdisable
363         %\disabledirective[job.save]%
364        \fi
365     \fi
366   \fi}
367
368\permanent\protected\def\installpagearrangement #1 % will change, no space
369  {\gdefcsname\??layoutarranger#1\endcsname}
370
371\permanent\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb
372  {\begincsname\??layoutarranger#1\endcsname}
373
374\permanent\protected\def\dosetuparrangement#1#2#3#4#5#6#7#8%
375  {\global\arrangedpageX  #1%
376   \global\arrangedpageY  #2%
377   \global\arrangedpageT  #3%
378   \global\c_page_marks_nx#4%
379   \global\c_page_marks_ny#5%
380   \enforced\glet\pusharrangedpage  #6%
381   \enforced\glet\poparrangedpages  #7%
382   \enforced\glet\handlearrangedpage#8}
383
384\installpagearrangement {\v!normal}
385  {\global\arrangingpagesfalse}
386
387%D (WS:) Watch out with 2UP and A4/A5:
388%D
389%D \definepapersize [A4] [width=210mm,height=297mm]
390%D \definepapersize [A5] [width=148mm,height=210mm]
391%D
392%D 297 mm - 2 * 148 mm = 1 mm
393%D
394%D This is only visible when we have a full background.
395
396\installpagearrangement 2*16
397  {\dosetuparrangement{4}{4}{16}{5}{5}%
398     \pusharrangedpageTHIRTYTWO\poparrangedpagesAB\relax}
399
400\installpagearrangement 2*8
401  {\dosetuparrangement{4}{2}{8}{5}{3}%
402     \pusharrangedpageSIXTEEN\poparrangedpagesAB\relax}
403
404\installpagearrangement 2*4
405  {\dosetuparrangement{2}{2}{4}{3}{3}%
406     \pusharrangedpageEIGHT\poparrangedpagesAB\relax}
407
408\installpagearrangement 2*2
409  {\dosetuparrangement{2}{1}{2}{3}{2}%
410     \pusharrangedpageFOURA\poparrangedpagesAB\relax}
411
412\installpagearrangement 2**2
413  {\dosetuparrangement{2}{1}{2}{3}{2}%
414     \pusharrangedpageFOURB\poparrangedpagesAB\relax}
415
416\installpagearrangement 2SIDE
417  {\dosetuparrangement{2}{1}{2}{3}{2}%
418     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageSIDE}
419
420\installpagearrangement 2TOP
421  {\dosetuparrangement{1}{2}{2}{2}{3}%
422     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageTOP}
423
424\installpagearrangement 2UP
425  {\dosetuparrangement{2}{1}{4}{3}{2}%
426     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWOUP}
427
428\installpagearrangement 2DOWN
429  {\dosetuparrangement{1}{2}{4}{2}{3}%
430     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}
431
432\installpagearrangement 2*4*2 % one defined by Willy Egger:
433  {\dosetuparrangement{2}{2}{4}{3}{3}%
434     \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
435
436\installpagearrangement 2*2*4 % another one of Willy Egger
437  {\dosetuparrangement{2}{1}{8}{3}{2}%
438     \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax}
439
440\installpagearrangement 2TOPSIDE
441  {\dosetuparrangement{1}{2}{4}{2}{3}%
442     \pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP}
443
444\permanent\protected\def\filluparrangedpages % beware: \realpageno is 1 ahead
445  {\ifarrangingpages
446     \scratchcounter\numexpr\realpageno-\plusone\relax
447     \dosetmodulo\scratchcounter\arrangedpageT\scratchcounter
448     \ifcase\scratchcounter\else
449       \advanceby\scratchcounter \plusone
450       \dostepwiserecurse\scratchcounter\arrangedpageT\plusone
451         {\noheaderandfooterlines\page_otr_insert_dummy_page}%
452     \fi
453   \fi}
454
455\permanent\protected\def\handlearrangedpageXandY#1#2#3#4#5%
456  {\global\setbox#5\hpack to \arrangedpageX\paperwidth
457     {\setbox\scratchbox\vpack to \arrangedpageY\paperheight
458        {\offinterlineskip
459         \vskip#4\paperheight
460         \hkern#3\paperwidth
461         \dorotatebox{\ifcase#2 0\else180\fi}\hpack{\box#1}%
462         \vfill}%
463      \wd\scratchbox\zeropoint
464      \box\scratchbox\box#5\hss}}
465
466\permanent\protected\def\gotonextarrangepage
467  {\global\advanceby\arrangeno\plusone}
468
469\permanent\protected\def\outputarrangedbox#1%
470  {\begingroup
471   \forgetall % somehow we're back and need to redo this
472   \dontcomplain
473   \gotonextarrangepage
474   \ifnum\arrangedrotationO\arrangedrotationE>\zerocount
475     \setbox#1\vpack
476       {\ifconditional\arrangeddoublestate
477          \ifodd\arrangeno
478            \dorotatebox\arrangedrotationO\hpack{\box#1}%
479          \else
480            \dorotatebox\arrangedrotationE\hpack{\box#1}%
481          \fi
482        \else
483          \dorotatebox\arrangedrotationO\hpack{\box#1}%
484        \fi}%
485   \fi
486   \ifconditional\arrangedmirrorstate
487     \page_boxes_apply_mirror{#1}%
488   \fi
489   \ifconditional\arrangednegatestate
490     \page_boxes_apply_negate{#1}%
491   \fi
492   \page_marks_add_more             #1%
493   \page_boxes_apply_center         #1%
494   \page_boxes_apply_mirror_print   #1%
495   \page_boxes_apply_orientate_print#1%
496   \page_boxes_apply_offset         #1%
497   \page_boxes_apply_negate_print   #1%
498   %
499   \ifconditional\arrangedbackgroundstate
500     \page_backgrounds_add_to_print#1%
501   \fi
502   %
503   \page_shipouts_normal{\box#1}%
504   \endgroup}
505
506%D The format file can be 16K smaller when we postpone the
507%D real arrangments. Some day ...
508
509\permanent\protected\def\reportarrangedpage#1%
510  {\showmessage\m!system{23}{\the\realpageno.\the\pageno\ifnum\subpageno>0 .\the\subpageno\fi,\number#1}}
511
512\permanent\protected\def\advancearrangedpageN
513  {\global\advanceby\arrangedpageN\plusone}
514
515% TOP
516
517% 32/16/8/4/SIDE
518
519\permanent\protected\def\poparrangedpagesAB
520  {\ifnum\arrangedpageN>\zerocount
521     \paperwidth\arrangedpageX\paperwidth
522     \paperheight\arrangedpageY\paperheight
523     \outputarrangedbox\arrangedpageA
524     \outputarrangedbox\arrangedpageB
525     \global\arrangedpageN\zerocount
526   \fi}
527
528\permanent\protected\def\pusharrangedpageTHIRTYTWO#1% taco's challenge
529  {\advancearrangedpageN
530   \reportarrangedpage\arrangedpageN
531   \ifcase\arrangedpageN
532   \or \handlearrangedpageXandY{#1}033\arrangedpageA %  1
533   \or \handlearrangedpageXandY{#1}003\arrangedpageB %  2
534   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
535   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  4
536   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
537   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
538   \or \handlearrangedpageXandY{#1}033\arrangedpageB %  7
539   \or \handlearrangedpageXandY{#1}003\arrangedpageA %  8
540   \or \handlearrangedpageXandY{#1}102\arrangedpageA %  9
541   \or \handlearrangedpageXandY{#1}132\arrangedpageB % 10
542   \or \handlearrangedpageXandY{#1}031\arrangedpageB % 11
543   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 12
544   \or \handlearrangedpageXandY{#1}031\arrangedpageA % 13
545   \or \handlearrangedpageXandY{#1}001\arrangedpageB % 14
546   \or \handlearrangedpageXandY{#1}102\arrangedpageB % 15
547   \or \handlearrangedpageXandY{#1}132\arrangedpageA % 16
548   \or \handlearrangedpageXandY{#1}122\arrangedpageA % 17
549   \or \handlearrangedpageXandY{#1}112\arrangedpageB % 18
550   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 19
551   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 20
552   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 21
553   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 22
554   \or \handlearrangedpageXandY{#1}122\arrangedpageB % 23
555   \or \handlearrangedpageXandY{#1}112\arrangedpageA % 24
556   \or \handlearrangedpageXandY{#1}013\arrangedpageA % 25
557   \or \handlearrangedpageXandY{#1}023\arrangedpageB % 26
558   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 27
559   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 28
560   \or \handlearrangedpageXandY{#1}120\arrangedpageA % 29
561   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 30
562   \or \handlearrangedpageXandY{#1}013\arrangedpageB % 31
563   \or \handlearrangedpageXandY{#1}023\arrangedpageA % 32
564     \poparrangedpages
565   \fi}
566
567\permanent\protected\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
568  {\advancearrangedpageN
569   \reportarrangedpage\arrangedpageN
570   \ifcase\arrangedpageN
571   \or \handlearrangedpageXandY{#1}031\arrangedpageA %  1
572   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
573   \or \handlearrangedpageXandY{#1}031\arrangedpageB %  3
574   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  4
575   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
576   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
577   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
578   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  8
579   \or \handlearrangedpageXandY{#1}120\arrangedpageA %  9
580   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
581   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 11
582   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 12
583   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 13
584   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 14
585   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
586   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 16
587     \poparrangedpages
588   \fi}
589
590\permanent\protected\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
591  {\advancearrangedpageN
592   \reportarrangedpage\arrangedpageN
593   \ifcase\arrangedpageN
594   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
595   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
596   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
597   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  4
598   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
599   \or \handlearrangedpageXandY{#1}110\arrangedpageB %  6
600   \or \handlearrangedpageXandY{#1}011\arrangedpageB %  7
601   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  8
602     \poparrangedpages
603   \fi}
604
605\permanent\protected\def\pusharrangedpageFOURA{\pusharrangedpageFOURdo01}
606\permanent\protected\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10}
607
608\permanent\protected\def\pusharrangedpageFOURdo#1#2#3%
609  {\advancearrangedpageN
610   \reportarrangedpage\arrangedpageN
611   \ifcase\arrangedpageN
612   \or \handlearrangedpageXandY{#3}010\arrangedpageA    %  1
613   \or \handlearrangedpageXandY{#3}0{#1}0\arrangedpageB %  2/3 not {1}
614   \or \handlearrangedpageXandY{#3}0{#2}0\arrangedpageB %  3/2 not {1}
615   \or \handlearrangedpageXandY{#3}000\arrangedpageA    %  4
616     \poparrangedpages
617   \fi}
618
619\permanent\protected\def\pusharrangedpageSIDETOP#1%
620  {\advancearrangedpageN
621   \reportarrangedpage\arrangedpageN
622   \ifcase\arrangedpageN
623   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
624   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
625     \poparrangedpages
626   \fi}
627
628\permanent\protected\def\handlearrangedpageSIDE
629  {\wd\arrangedpageA\paperwidth
630   \wd\arrangedpageB\paperwidth
631   \global\setbox\arrangedpageA\hpack
632     {\box\arrangedpageA\box\arrangedpageB}%
633   \ht\arrangedpageA\paperheight}
634
635\permanent\protected\def\handlearrangedpageTOP
636  {\ht\arrangedpageA\paperheight
637   \ht\arrangedpageB\paperheight
638   \global\setbox\arrangedpageA\vpack
639     {\offinterlineskip\vskip\paperheight
640      \box\arrangedpageA\box\arrangedpageB}%
641   \global\setbox\arrangedpageB\box\scratchbox} % ?
642
643% 2UP/2DOWN / 1pt prevents overflow
644
645\permanent\protected\def\splitoffarrangedpagesTWO
646  {\splittopskip\zeroskip
647   \global\setbox\arrangedpageA\vsplit\arrangedpageB to \onepoint
648   \scratchdimen\dimexpr\ht\arrangedpageB-\onepoint\relax
649   \ifdim\scratchdimen>\onepoint
650     \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen
651   \fi}
652
653\permanent\protected\def\handlearrangedpageTWOUP
654  {\splitoffarrangedpagesTWO
655   \ht\arrangedpageA\paperheight
656   \ht\arrangedpageB\paperheight
657   \ifconditional\arrangedswapstate
658     \global\setbox\arrangedpageA\hpack
659       {\page_boxes_apply_clip_print_left \arrangedpageA
660        \box\arrangedpageA
661        \page_boxes_apply_clip_print_right\arrangedpageB
662        \box\arrangedpageB}%
663     \arrangedswapstate\conditionalfalse
664   \else
665     \global\setbox\arrangedpageA\hpack
666       {\page_boxes_apply_clip_print_left \arrangedpageB
667        \box\arrangedpageB
668        \page_boxes_apply_clip_print_right\arrangedpageA
669        \box\arrangedpageA}%
670     \arrangedswapstate\conditionaltrue
671   \fi
672   \global\setbox\arrangedpageB\box\scratchbox}
673
674\permanent\protected\def\handlearrangedpageTWODOWN
675  {\splitoffarrangedpagesTWO
676   \ht\arrangedpageA\paperheight
677   \ht\arrangedpageB\paperheight
678   \ifconditional\arrangedswapstate
679     \global\setbox\arrangedpageA\vpack
680       {\offinterlineskip
681        \vskip\paperheight
682        \box\arrangedpageA
683        \box\arrangedpageB}%
684     \arrangedswapstate\conditionalfalse
685   \else
686     \global\setbox\arrangedpageA\vpack
687       {\offinterlineskip
688        \vskip\paperheight
689        \box\arrangedpageB
690        \box\arrangedpageA}%
691     \arrangedswapstate\conditionaltrue
692   \fi
693   \global\setbox\arrangedpageB\box\scratchbox}
694
695\permanent\protected\def\poparrangedpagesTWO
696  {\ifnum\arrangedpageN>\zerocount
697     \arrangedswapstate\conditionalfalse
698     \doloop
699       {\handlearrangedpage
700        \bgroup
701        \paperwidth \arrangedpageX\paperwidth
702        \paperheight\arrangedpageY\paperheight
703        \ht\arrangedpageA\paperheight
704        \wd\arrangedpageA\paperwidth
705        \outputarrangedbox\arrangedpageA
706        \egroup
707        \ifzeropt\ht\arrangedpageB
708          \exitloop
709        \fi}%
710     \global\arrangedpageN\zerocount
711   \fi}
712
713\permanent\protected\def\pusharrangedpageTWO#1%
714  {\advancearrangedpageN
715   \reportarrangedpage\arrangedpageN
716   \global\setbox\arrangedpageB\vpack
717     {\offinterlineskip
718      \unvbox\arrangedpageB
719      \allowbreak
720      \setbox#1\vpack{\box#1}% really needed in order to keep real dimensions
721      \ht#1\onepoint
722      \dp#1\zeropoint
723      \vpack{\box#1}}}
724
725\permanent\protected\def\poparrangedpagesTWOTOPSIDE
726  {\ifnum\arrangedpageN>\zerocount
727     \bgroup
728     \global\arrangedpageN\plustwo
729     \poparrangedpagesTWO
730     \let\arrangedpageA\arrangedpageC
731     \let\arrangedpageB\arrangedpageD
732     \global\arrangedpageN\plustwo
733     \poparrangedpagesTWO
734     \global\arrangedpageN\zerocount
735     \egroup
736  \fi}
737
738\permanent\protected\def\pusharrangedpageTWOTOPSIDE#1%
739  {\advancearrangedpageN
740   \reportarrangedpage\arrangedpageN
741   \ifcase\arrangedpageN
742   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
743   \or \handlearrangedpageXandY{#1}000\arrangedpageC %  2
744   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  1
745   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  2
746     \poparrangedpages
747   \fi}
748
749%D Willy Egger's sheet simulations:
750
751\permanent\protected\def\poparrangedpagesAtoH
752  {\ifnum\arrangedpageN>\zerocount
753     \paperwidth \arrangedpageX\paperwidth
754     \paperheight\arrangedpageY\paperheight
755     \outputarrangedbox\arrangedpageA
756     \outputarrangedbox\arrangedpageB
757     \outputarrangedbox\arrangedpageC
758     \outputarrangedbox\arrangedpageD
759     \outputarrangedbox\arrangedpageE
760     \outputarrangedbox\arrangedpageF
761     \outputarrangedbox\arrangedpageG
762     \outputarrangedbox\arrangedpageH
763     \global\arrangedpageN\zerocount
764   \fi}
765
766% to arrange 16 pages on 2 sheets to form one booklet
767
768\permanent\protected\def\poparrangedpagesAtoD
769  {\ifnum\arrangedpageN>\zerocount
770     \paperwidth\arrangedpageX\paperwidth
771     \paperheight\arrangedpageY\paperheight
772     \outputarrangedbox\arrangedpageA
773     \outputarrangedbox\arrangedpageB
774     \outputarrangedbox\arrangedpageC
775     \outputarrangedbox\arrangedpageD
776     \global\arrangedpageN\zerocount
777   \fi}
778
779% to arrange 16 pages on 4 sheets to form one booklet
780
781\permanent\protected\def\pusharrangedpageSIXTEENFOUR#1%
782  {\advancearrangedpageN
783   \reportarrangedpage\arrangedpageN
784   \ifcase\arrangedpageN
785   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1
786   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
787   \or \handlearrangedpageXandY{#1}010\arrangedpageC %  3
788   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  4
789   \or \handlearrangedpageXandY{#1}010\arrangedpageE %  5
790   \or \handlearrangedpageXandY{#1}000\arrangedpageF %  6
791   \or \handlearrangedpageXandY{#1}010\arrangedpageG %  7
792   \or \handlearrangedpageXandY{#1}000\arrangedpageH %  8
793   \or \handlearrangedpageXandY{#1}010\arrangedpageH %  9
794   \or \handlearrangedpageXandY{#1}000\arrangedpageG % 10
795   \or \handlearrangedpageXandY{#1}010\arrangedpageF % 11
796   \or \handlearrangedpageXandY{#1}000\arrangedpageE % 12
797   \or \handlearrangedpageXandY{#1}010\arrangedpageD % 13
798   \or \handlearrangedpageXandY{#1}000\arrangedpageC % 14
799   \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
800   \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
801     \poparrangedpages
802   \fi}
803
804% to arrange 16 pages on 2 sheets to form one booklet
805
806\permanent\protected\def\pusharrangedpageSIXTEENTWO#1%
807  {\advancearrangedpageN
808   \reportarrangedpage\arrangedpageN
809   \ifcase\arrangedpageN
810   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
811   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
812   \or \handlearrangedpageXandY{#1}011\arrangedpageC %  3
813   \or \handlearrangedpageXandY{#1}001\arrangedpageD %  4
814   \or \handlearrangedpageXandY{#1}100\arrangedpageD %  5
815   \or \handlearrangedpageXandY{#1}110\arrangedpageC %  6
816   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
817   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  8
818   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  9
819   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
820   \or \handlearrangedpageXandY{#1}100\arrangedpageC % 11
821   \or \handlearrangedpageXandY{#1}110\arrangedpageD % 12
822   \or \handlearrangedpageXandY{#1}011\arrangedpageD % 13
823   \or \handlearrangedpageXandY{#1}001\arrangedpageC % 14
824   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
825   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 16
826     \poparrangedpages
827   \fi}
828
829%D Might be used if a printer is printing from a roll or creating mini-books from A4:
830%D This section has 16 pages. The folding scheme is first a Z-fold and at the end
831%D a final fold in the spine.
832%D Coding: [2*8*Z]
833
834\installpagearrangement 2*8*Z
835   {\dosetuparrangement{2}{4}{8}{3}{5}% X,Y,Total,hcutmarks,vcutmarks
836        \pusharrangedpageSIXTEENZ\poparrangedpagesAB\relax}
837
838\permanent\protected\def\pusharrangedpageSIXTEENZ#1%
839  {\advancearrangedpageN
840   \reportarrangedpage\arrangedpageN
841   \ifcase\arrangedpageN
842   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1
843   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
844   \or \handlearrangedpageXandY{#1}101\arrangedpageB %  3
845   \or \handlearrangedpageXandY{#1}111\arrangedpageA %  4
846   \or \handlearrangedpageXandY{#1}012\arrangedpageA %  5
847   \or \handlearrangedpageXandY{#1}002\arrangedpageB %  6
848   \or \handlearrangedpageXandY{#1}103\arrangedpageB %  7
849   \or \handlearrangedpageXandY{#1}113\arrangedpageA %  8
850   \or \handlearrangedpageXandY{#1}103\arrangedpageA %  9
851   \or \handlearrangedpageXandY{#1}113\arrangedpageB % 10
852   \or \handlearrangedpageXandY{#1}012\arrangedpageB % 11
853   \or \handlearrangedpageXandY{#1}002\arrangedpageA % 12
854   \or \handlearrangedpageXandY{#1}101\arrangedpageA % 13
855   \or \handlearrangedpageXandY{#1}111\arrangedpageB % 14
856   \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
857   \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
858     \poparrangedpages
859   \fi}
860
861%D Another Z-folded section with 12 pages
862%D Coding: [2*6*Z]
863
864\installpagearrangement 2*6*Z
865   {\dosetuparrangement{2}{3}{6}{3}{4}% X,Y,Total,hcutmarks,vcutmarks
866        \pusharrangedpageTWELVEZ\poparrangedpagesAB\relax}
867
868\permanent\protected\def\pusharrangedpageTWELVEZ#1%
869  {\advancearrangedpageN
870   \reportarrangedpage\arrangedpageN
871   \ifcase\arrangedpageN
872   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1: rotation (0=upright),x (0=first column),y (0=first row)
873   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
874   \or \handlearrangedpageXandY{#1}101\arrangedpageB %  3
875   \or \handlearrangedpageXandY{#1}111\arrangedpageA %  4
876   \or \handlearrangedpageXandY{#1}012\arrangedpageA %  5
877   \or \handlearrangedpageXandY{#1}002\arrangedpageB %  6
878   \or \handlearrangedpageXandY{#1}012\arrangedpageB %  7
879   \or \handlearrangedpageXandY{#1}002\arrangedpageA %  8
880   \or \handlearrangedpageXandY{#1}101\arrangedpageA %  9
881   \or \handlearrangedpageXandY{#1}111\arrangedpageB % 10
882   \or \handlearrangedpageXandY{#1}010\arrangedpageB % 11
883   \or \handlearrangedpageXandY{#1}000\arrangedpageA % 12
884     \poparrangedpages
885   \fi}
886
887%D For Heinz' special greeting cards folding. This scheme is also used for the PocketDiary (module):
888%D Coding: [1*8]
889
890\installpagearrangement 1*8
891   {\dosetuparrangement{4}{2}{8}{5}{3}% X,Y,Total,hcutmarks,vcutmarks
892        \pusharrangedpageEIGHTSINGLESIDEDFOLDED\poparrangedpagesTWO\relax}
893
894\permanent\protected\def\pusharrangedpageEIGHTSINGLESIDEDFOLDED#1%
895  {\advancearrangedpageN
896   \reportarrangedpage\arrangedpageN
897   \ifcase\arrangedpageN
898   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1 rot,hskip,vskip
899   \or \handlearrangedpageXandY{#1}020\arrangedpageA %  2
900   \or \handlearrangedpageXandY{#1}030\arrangedpageA %  3
901   \or \handlearrangedpageXandY{#1}131\arrangedpageA %  4
902   \or \handlearrangedpageXandY{#1}121\arrangedpageA %  5
903   \or \handlearrangedpageXandY{#1}111\arrangedpageA %  6
904   \or \handlearrangedpageXandY{#1}101\arrangedpageA %  7
905   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  8
906     \poparrangedpages
907   \fi}
908
909%D This is not a section. \CONTEXT\ places 4 pages on a sheet of paper, singlesided
910%D Coding: [1*4]
911
912\installpagearrangement 1*4
913   {\dosetuparrangement{2}{2}{4}{3}{3}% X,Y,Total,hcutmarks,vcutmarks
914        \pusharrangedpageFOURSINGLESIDEDFOLDED\poparrangedpagesTWO\relax}
915
916\permanent\protected\def\pusharrangedpageFOURSINGLESIDEDFOLDED#1%
917  {\advancearrangedpageN
918   \reportarrangedpage\arrangedpageN
919   \ifcase\arrangedpageN
920   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  1 rot,hskip,vskip
921   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  2
922   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  3
923   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  4
924     \poparrangedpages
925   \fi}
926
927%D This imposition scheme was requested by Hraban Ramm, by Willi Egger 21-07-2003
928%D Coding: [3SIDE]
929
930\installpagearrangement 3SIDE
931   {\dosetuparrangement{3}{1}{3}{4}{2}% X,Y,Total,hcutmarks,vcutmarks
932        \pusharrangedpageTHREESIDE\poparrangedpagesAB\relax}
933
934\permanent\protected\def\pusharrangedpageTHREESIDE#1% Willi's approach
935  {\advancearrangedpageN
936   \reportarrangedpage\arrangedpageN
937   \ifcase\arrangedpageN
938   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1  rot,hskip,vskip
939   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  2
940   \or \handlearrangedpageXandY{#1}020\arrangedpageA %  3
941   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  4
942   \or \handlearrangedpageXandY{#1}010\arrangedpageB %  5
943   \or \handlearrangedpageXandY{#1}020\arrangedpageB %  6
944       \poparrangedpages
945   \fi}
946
947%D FLYER in three parts and 6 pages 22-10-2010
948%D Coding: [TRYPTICHON]
949
950\installpagearrangement TRYPTICHON
951   {\dosetuparrangement{3}{1}{3}{4}{2}% X,Y,Total,hcutmarks,vcutmarks
952        \pusharrangedpageFLYERSIX\poparrangedpagesAB\relax}
953
954\permanent\protected\def\pusharrangedpageFLYERSIX#1% Willi's approach
955  {\advancearrangedpageN
956   \reportarrangedpage\arrangedpageN
957   \ifcase\arrangedpageN
958   \or \handlearrangedpageXandY{#1}020\arrangedpageA %  1  rot,hskip,vskip
959   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
960   \or \handlearrangedpageXandY{#1}010\arrangedpageB %  3
961   \or \handlearrangedpageXandY{#1}020\arrangedpageB %  4
962   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  5
963   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  6
964       \poparrangedpages
965   \fi}
966
967%D FLYER in Z-fold with 8 pages 22-01-2010
968%D Coding: [ZFLYER-8]
969
970\installpagearrangement ZFLYER-8
971   {\dosetuparrangement{4}{1}{4}{5}{2}% X,Y,Total,hcutmarks,vcutmarks
972        \pusharrangedpageZFLYEREIGHT\poparrangedpagesAB\relax}
973
974\permanent\protected\def\pusharrangedpageZFLYEREIGHT#1% Willi's approach
975  {\advancearrangedpageN
976   \reportarrangedpage\arrangedpageN
977   \ifcase\arrangedpageN
978   \or \handlearrangedpageXandY{#1}030\arrangedpageA %  1  rot,hskip,vskip
979   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
980   \or \handlearrangedpageXandY{#1}010\arrangedpageB %  3
981   \or \handlearrangedpageXandY{#1}020\arrangedpageB %  4
982   \or \handlearrangedpageXandY{#1}030\arrangedpageB %  5
983   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  6
984   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  7
985   \or \handlearrangedpageXandY{#1}020\arrangedpageA %  8
986       \poparrangedpages
987   \fi}
988
989%D FLYER in Z-fold with 10 pages 04-08-2010
990%D Coding: [ZFLYER-10]
991
992\installpagearrangement ZFLYER-10
993   {\dosetuparrangement{5}{1}{5}{6}{2}% X,Y,Total,hcutmarks,vcutmarks
994        \pusharrangedpageZFLYERTEN\poparrangedpagesAB\relax}
995
996\permanent\protected\def\pusharrangedpageZFLYERTEN#1% Willi's approach
997  {\advancearrangedpageN
998   \reportarrangedpage\arrangedpageN
999   \ifcase\arrangedpageN
1000   \or \handlearrangedpageXandY{#1}040\arrangedpageA %  1  rot,hskip,vskip
1001   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
1002   \or \handlearrangedpageXandY{#1}010\arrangedpageB %  3
1003   \or \handlearrangedpageXandY{#1}020\arrangedpageB %  4
1004   \or \handlearrangedpageXandY{#1}030\arrangedpageB %  5
1005   \or \handlearrangedpageXandY{#1}040\arrangedpageB %  6
1006   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  7
1007   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  8
1008   \or \handlearrangedpageXandY{#1}020\arrangedpageA %  9
1009   \or \handlearrangedpageXandY{#1}030\arrangedpageA %  10
1010       \poparrangedpages
1011   \fi}
1012
1013%D FLYER in Z-fold with 12 pages 04-08-2010
1014%D Coding: [ZFLYER-12]
1015
1016\installpagearrangement ZFLYER-12
1017   {\dosetuparrangement{6}{1}{6}{7}{2}% X,Y,Total,hcutmarks,vcutmarks
1018        \pusharrangedpageZFLYERTWELVE\poparrangedpagesAB\relax}
1019
1020\permanent\protected\def\pusharrangedpageZFLYERTWELVE#1% Willi's approach
1021  {\advancearrangedpageN
1022   \reportarrangedpage\arrangedpageN
1023   \ifcase\arrangedpageN
1024   \or \handlearrangedpageXandY{#1}050\arrangedpageA %  1  rot,hskip,vskip
1025   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
1026   \or \handlearrangedpageXandY{#1}010\arrangedpageB %  3
1027   \or \handlearrangedpageXandY{#1}020\arrangedpageB %  4
1028   \or \handlearrangedpageXandY{#1}030\arrangedpageB %  5
1029   \or \handlearrangedpageXandY{#1}040\arrangedpageB %  6
1030   \or \handlearrangedpageXandY{#1}050\arrangedpageB %  7
1031   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  8
1032   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  9
1033   \or \handlearrangedpageXandY{#1}020\arrangedpageA %  10
1034   \or \handlearrangedpageXandY{#1}030\arrangedpageA %  11
1035   \or \handlearrangedpageXandY{#1}040\arrangedpageA %  12
1036       \poparrangedpages
1037   \fi}
1038
1039%D FLYER folded as a map with 6 pages per side.
1040%D Coding: [MAPFLYER-12]
1041
1042\installpagearrangement MAPFLYER-12
1043   {\dosetuparrangement{3}{2}{6}{4}{3}% X,Y,Total,hcutmarks,vcutmarks
1044        \pusharrangedpageMFLYERTWELVE\poparrangedpagesAB\relax}
1045
1046\permanent\protected\def\pusharrangedpageMFLYERTWELVE#1% Willi's approach
1047  {\advancearrangedpageN
1048   \reportarrangedpage\arrangedpageN
1049   \ifcase\arrangedpageN
1050   \or \handlearrangedpageXandY{#1}020\arrangedpageA %  1  rot,hskip,vskip
1051   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
1052   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  3
1053   \or \handlearrangedpageXandY{#1}010\arrangedpageB %  4
1054   \or \handlearrangedpageXandY{#1}011\arrangedpageB %  5
1055   \or \handlearrangedpageXandY{#1}020\arrangedpageB %  6
1056   \or \handlearrangedpageXandY{#1}021\arrangedpageB %  7
1057   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  8
1058   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  9
1059   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  10
1060   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  11
1061   \or \handlearrangedpageXandY{#1}021\arrangedpageA %  12
1062       \poparrangedpages
1063   \fi}
1064
1065%D FLYER folded as double window with 4 pages per side.
1066%D Coding: [DOUBLEWINDOW]
1067
1068\installpagearrangement DOUBLEWINDOW
1069   {\dosetuparrangement{4}{1}{4}{5}{2}% X,Y,Total,hcutmarks,vcutmarks
1070        \pusharrangedpageDOUBLEWINDOWEIGHT\poparrangedpagesAB\relax}
1071
1072\permanent\protected\def\pusharrangedpageDOUBLEWINDOWEIGHT#1% Willi's approach
1073  {\advancearrangedpageN
1074   \reportarrangedpage\arrangedpageN
1075   \ifcase\arrangedpageN
1076   \or \handlearrangedpageXandY{#1}020\arrangedpageA %  1  rot,hskip,vskip
1077   \or \handlearrangedpageXandY{#1}030\arrangedpageA %  2
1078   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  3
1079   \or \handlearrangedpageXandY{#1}010\arrangedpageB %  4
1080   \or \handlearrangedpageXandY{#1}020\arrangedpageB %  5
1081   \or \handlearrangedpageXandY{#1}030\arrangedpageB %  6
1082   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  7
1083   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  8
1084       \poparrangedpages
1085   \fi}
1086
1087%D Imposition as requested by Jan Pohanka 26-08-2010, 4 pages, two verso, two recto,
1088%D uneven pages upright and down, even pages top and rotated 180.
1089%D Implementation with 2 pages for conference-name-display
1090%D Coding: [1*2-Conference]
1091
1092\installpagearrangement 1*2-Conference
1093   {\dosetuparrangement{1}{2}{4}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
1094        \pusharrangedpageCONFERENCETWO\poparrangedpagesAB\relax}
1095
1096\permanent\protected\def\pusharrangedpageCONFERENCETWO#1%
1097  {\advancearrangedpageN
1098   \reportarrangedpage\arrangedpageN
1099   \ifcase\arrangedpageN
1100   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  1  rot,hskip,vskip
1101   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  2
1102       \poparrangedpages
1103   \fi}
1104
1105%D Implementation with 4 pages for conference-name-display
1106%D Coding: [1*4-Conference]
1107
1108\installpagearrangement 1*4-Conference
1109   {\dosetuparrangement{1}{2}{4}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
1110        \pusharrangedpageCONFERENCEFOUR\poparrangedpagesAB\relax}
1111
1112\permanent\protected\def\pusharrangedpageCONFERENCEFOUR#1%
1113  {\advancearrangedpageN
1114   \reportarrangedpage\arrangedpageN
1115   \ifcase\arrangedpageN
1116   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  1  rot,hskip,vskip
1117   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  2
1118   \or \handlearrangedpageXandY{#1}011\arrangedpageB %  3
1119   \or \handlearrangedpageXandY{#1}110\arrangedpageB %  4
1120       \poparrangedpages
1121   \fi}
1122
1123%D There should be arrangements for sections made of heavy and thick paper. i.e. the heavier the paper
1124%D the fewer pages per section:
1125%D Section with 8 pages put on two sheets of paper. Each sheet carries recto 2 and verso 2 pages.
1126%D Coding: [2*2*2]
1127
1128\installpagearrangement 2*2*2
1129  {\dosetuparrangement{2}{1}{2}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
1130     \pusharrangedpageEIGHTTWO\poparrangedpagesAtoD\relax}
1131
1132\permanent\protected\def\pusharrangedpageEIGHTTWO#1%
1133  {\advancearrangedpageN
1134   \reportarrangedpage\arrangedpageN
1135   \ifcase\arrangedpageN
1136   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1 rot,hskip,vskip
1137   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
1138   \or \handlearrangedpageXandY{#1}010\arrangedpageC %  3
1139   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  4
1140   \or \handlearrangedpageXandY{#1}010\arrangedpageD %  5
1141   \or \handlearrangedpageXandY{#1}000\arrangedpageC %  6
1142   \or \handlearrangedpageXandY{#1}010\arrangedpageB %  7
1143   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  8
1144       \poparrangedpages
1145   \fi}
1146
1147%D Section with 12 pages, built from three sheets of paper.
1148%D Each sheet carries 2 pages recto and verso.
1149%D Coding: [2*2*3]
1150
1151\permanent\protected\def\poparrangedpagesAtoF
1152  {\ifnum\arrangedpageN>\zerocount
1153     \paperwidth \arrangedpageX\paperwidth
1154     \paperheight\arrangedpageY\paperheight
1155     \outputarrangedbox\arrangedpageA
1156     \outputarrangedbox\arrangedpageB
1157     \outputarrangedbox\arrangedpageC
1158     \outputarrangedbox\arrangedpageD
1159     \outputarrangedbox\arrangedpageE
1160     \outputarrangedbox\arrangedpageF
1161     \global\arrangedpageN\zerocount
1162   \fi}
1163
1164\installpagearrangement 2*2*3
1165  {\dosetuparrangement{2}{1}{2}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
1166     \pusharrangedpageTWELVETWO\poparrangedpagesAtoF\relax}
1167
1168\permanent\protected\def\pusharrangedpageTWELVETWO#1%
1169  {\advancearrangedpageN
1170   \reportarrangedpage\arrangedpageN
1171   \ifcase\arrangedpageN
1172   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1 rot,hskip,vskip
1173   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
1174   \or \handlearrangedpageXandY{#1}010\arrangedpageC %  3
1175   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  4
1176   \or \handlearrangedpageXandY{#1}010\arrangedpageE %  5
1177   \or \handlearrangedpageXandY{#1}000\arrangedpageF %  6
1178   \or \handlearrangedpageXandY{#1}010\arrangedpageF %  7
1179   \or \handlearrangedpageXandY{#1}000\arrangedpageE %  8
1180   \or \handlearrangedpageXandY{#1}010\arrangedpageD %  9
1181   \or \handlearrangedpageXandY{#1}000\arrangedpageC % 10
1182   \or \handlearrangedpageXandY{#1}010\arrangedpageB % 11
1183   \or \handlearrangedpageXandY{#1}000\arrangedpageA % 12
1184       \poparrangedpages
1185   \fi}
1186
1187% % From Wolfgang for Mari (mail on list) ... yes or no in core .. time for
1188% % delayed loading ...
1189% %
1190% % http://stamphenge.wordpress.com/minibooks/meander-accordion-folded-book/
1191%
1192% \installpagearrangement MEANDER16
1193%   {\dosetuparrangement{4}{4}{16}{5}{5}%
1194%      \pusharrangedpageMEANDERSIXTEEN\poparrangedpagesXY\relax}
1195%
1196% \permanent\protected\def\pusharrangedpageMEANDERSIXTEEN#1%
1197%   {\advancearrangedpageN
1198%    \reportarrangedpage\arrangedpageN
1199%    \ifcase\arrangedpageN
1200%    \or \handlearrangedpageXandY{#1}000\arrangedpageA
1201%    \or \handlearrangedpageXandY{#1}010\arrangedpageA
1202%    \or \handlearrangedpageXandY{#1}020\arrangedpageA
1203%    \or \handlearrangedpageXandY{#1}030\arrangedpageA
1204%    \or \handlearrangedpageXandY{#1}131\arrangedpageA
1205%    \or \handlearrangedpageXandY{#1}121\arrangedpageA
1206%    \or \handlearrangedpageXandY{#1}111\arrangedpageA
1207%    \or \handlearrangedpageXandY{#1}101\arrangedpageA
1208%    \or \handlearrangedpageXandY{#1}002\arrangedpageA
1209%    \or \handlearrangedpageXandY{#1}012\arrangedpageA
1210%    \or \handlearrangedpageXandY{#1}022\arrangedpageA
1211%    \or \handlearrangedpageXandY{#1}032\arrangedpageA
1212%    \or \handlearrangedpageXandY{#1}133\arrangedpageA
1213%    \or \handlearrangedpageXandY{#1}123\arrangedpageA
1214%    \or \handlearrangedpageXandY{#1}113\arrangedpageA
1215%    \or \handlearrangedpageXandY{#1}103\arrangedpageA
1216%      \poparrangedpages
1217%    \fi}
1218%
1219% % \definepapersize[small][width=6cm,height=6cm]
1220% % \definepapersize[big][width=30cm,height=30cm]
1221% % \setuppapersize[small][big]
1222% % \setuppagenumbering[location=]
1223% % \setuparranging[MEANDER16]
1224% % \setuplayout
1225% %   [location=middle,
1226% %    marking=on]
1227% % \starttext
1228% % \dorecurse{32}{\centerbox{\ssd\recurselevel}}
1229% % \stoptext
1230%
1231% % By Willi:
1232%
1233% \installpagearrangement MEANDER9
1234%   {\dosetuparrangement{3}{3}{9}{4}{4}%
1235%      \pusharrangedpageMEANDERNINE\poparrangedpagesXY\relax}
1236%
1237% \permanent\protected\def\pusharrangedpageMEANDERNINE#1%
1238%   {\advancearrangedpageN
1239%    \reportarrangedpage\arrangedpageN
1240%    \ifcase\arrangedpageN
1241%    \or \handlearrangedpageXandY{#1}000\arrangedpageA
1242%    \or \handlearrangedpageXandY{#1}010\arrangedpageA
1243%    \or \handlearrangedpageXandY{#1}020\arrangedpageA
1244%    \or \handlearrangedpageXandY{#1}121\arrangedpageA
1245%    \or \handlearrangedpageXandY{#1}111\arrangedpageA
1246%    \or \handlearrangedpageXandY{#1}101\arrangedpageA
1247%    \or \handlearrangedpageXandY{#1}002\arrangedpageA
1248%    \or \handlearrangedpageXandY{#1}012\arrangedpageA
1249%    \or \handlearrangedpageXandY{#1}022\arrangedpageA
1250%    \poparrangedpages
1251%    \fi}
1252
1253% % handy for stickers etc, this way we can treat them as page
1254%
1255% \setuppapersize [XY][A4]
1256% \setuppaper     [topspace=5mm,backspace=5mm,dx=1mm,dy=1mm,nx=2,ny=6]
1257% \setuplayout    [page] [topspace=5mm,backspace=5mm]
1258% \setuplayout    [page]
1259% \setuplayout    [location=middle]
1260% \setuparranging [XY]
1261% \showframe
1262%
1263% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext
1264
1265\permanent\protected\def\pusharrangedpageXY#1%
1266  {\advancearrangedpageN
1267   \global\advanceby\arrangedpageM\plusone
1268   \reportarrangedpage\arrangedpageN
1269   \global\setbox\arrangedpageB\hpack \ifdim\v_page_target_width>\zeropoint to \v_page_target_width \fi
1270      {\ifvoid\arrangedpageB\else
1271         \unhbox\arrangedpageB
1272         \ifdim\v_page_target_dx>\zeropoint
1273           \hkern\v_page_target_dx
1274         \else
1275           \hss
1276           \hkern\v_page_target_dx
1277           \hss
1278         \fi
1279       \fi
1280       \box#1}%
1281    \ifnum\arrangedpageM<\arrangedpageX\else
1282      \global\setbox\arrangedpageA\vpack \ifdim\v_page_target_height>\zeropoint to \v_page_target_height \fi
1283        {\offinterlineskip
1284         \ifvoid\arrangedpageA\else
1285           \unvbox\arrangedpageA
1286           \ifdim\v_page_target_dy>\zeropoint
1287             \vskip\v_page_target_dy
1288           \else
1289             \vss
1290             \vskip\v_page_target_dy
1291             \vss
1292           \fi
1293         \fi
1294         \box\arrangedpageB}%
1295      \global\arrangedpageM\zerocount
1296    \fi
1297    \ifnum\arrangedpageN<\arrangedpageT\else
1298      \poparrangedpages
1299    \fi}
1300
1301\permanent\protected\def\poparrangedpagesXY
1302  {\ifnum\arrangedpageN>\zerocount
1303     \paperwidth \arrangedpageX\paperwidth
1304     \paperheight\arrangedpageY\paperheight
1305     \outputarrangedbox\arrangedpageA
1306     \global\arrangedpageN\zerocount
1307     \global\arrangedpageM\zerocount
1308   \fi}
1309
1310\installpagearrangement XY
1311  {\dosetuparrangement
1312     \v_page_target_nx
1313     \v_page_target_ny
1314     \v_page_target_xy
1315     \zerocount
1316     \zerocount
1317     \pusharrangedpageXY\poparrangedpagesXY\relax}
1318
1319%D A crazy definition, don't guess who pushed me for the landscape option.
1320
1321\def\page_imposition_xy_height
1322  {\dimexpr
1323     \dimexpr
1324       \v_page_target_height
1325      -\numexpr\v_page_target_ny-1\relax\v_page_target_dy
1326     \relax
1327    /\v_page_target_ny
1328   \relax}
1329
1330\def\page_imposition_xy_width
1331  {\dimexpr
1332     \dimexpr
1333       \v_page_target_width
1334      -\numexpr\v_page_target_nx-1\relax\v_page_target_dx
1335     \relax
1336    /\v_page_target_nx
1337   \relax}
1338
1339\definepapersize
1340  [XY]
1341  [\c!height=\page_imposition_xy_height,
1342   \c!width =\page_imposition_xy_width]
1343
1344\setuppaper
1345  [\c!width =\dimexpr\printpaperwidth -2\v_page_target_backspace\relax,
1346   \c!height=\dimexpr\printpaperheight-2\v_page_target_topspace \relax]
1347
1348% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt]
1349% \definepageshift[test][vertical]  [10pt,20pt,30pt,40pt,50pt]
1350%
1351% \setuppageshift[test]
1352% \setuppageshift[test][test]
1353% \setuppageshift[test][none]
1354% \setuppageshift[none][test]
1355% \setuppageshift[paper][test][test] % arrange only
1356% \setuppageshift[paper][test]       % arrange only
1357% \setuppageshift[print][test][test]
1358%
1359% \showframe \dorecurse{100}{\input tufte \par}
1360
1361% #1=name #2=horizontal|vertical #3=shiftlist
1362
1363% this will move to lua
1364
1365\installcorenamespace {pageshift}
1366
1367\permanent\protected\tolerant\def\definepageshift[#1]#*[#2]#*[#3]%
1368  {\defcsname\??pageshift#2:#1\endcsname{#3}}
1369
1370\lettonothing\page_boxes_h_shifts
1371\lettonothing\page_boxes_v_shifts
1372
1373\newinteger  \c_page_boxes_h_shifts
1374\newinteger  \c_page_boxes_v_shifts
1375\newdimension\d_page_boxes_h_shifts
1376\newdimension\d_page_boxes_v_shifts
1377
1378\let\page_boxes_apply_shift_print\gobbleoneargument
1379\let\page_boxes_apply_shift_paper\gobbleoneargument
1380
1381\def\page_boxes_filter_shift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts
1382  {#1\zeropoint
1383   \ifempty#2\else
1384     \global\advanceby#3\plusone
1385     \getfromcommacommand[#2][#3]%
1386     \ifempty\commalistelement
1387       \global#3\plusone % we cycle
1388       \getfromcommacommand[#2][#3]%
1389     \fi
1390     \ifempty\commalistelement \else
1391       #1\commalistelement\relax % the relax is really needed as there is an \if later on
1392     \fi
1393   \fi}
1394
1395\def\page_boxes_apply_shift#1%
1396  {\page_boxes_filter_shift\d_page_boxes_h_shifts\page_boxes_h_shifts\c_page_boxes_h_shifts
1397   \page_boxes_filter_shift\d_page_boxes_v_shifts\page_boxes_v_shifts\c_page_boxes_v_shifts
1398   \ifzeropt\d_page_boxes_h_shifts
1399     \ifzeropt\d_page_boxes_v_shifts
1400       % nothing to shift
1401     \else
1402       \page_boxes_apply_shift_indeed#1%
1403     \fi
1404   \else
1405     \page_boxes_apply_shift_indeed#1%
1406   \fi}
1407
1408\def\page_boxes_apply_shift_indeed#1%
1409  {\edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
1410   \setbox#1\vpack
1411     {\offinterlineskip
1412      \vskip\d_page_boxes_v_shifts
1413      \hkern\d_page_boxes_h_shifts
1414      \box#1}%
1415   \next}
1416
1417\permanent\tolerant\protected\def\setuppageshift[#1]#*[#2]#*[#3]% page|paper horizontal vertical
1418  {\ifarguments\or
1419     \setuppageshift[\v!page][#1][#1]%
1420   \or
1421     \ifcommon{#1}{\v!page,\v!paper}%
1422       \setuppageshift[#1][#2][#2]%
1423     \else
1424       \setuppageshift[\v!page][#1][#2]%
1425     \fi
1426   \or
1427     %edef\page_boxes_h_shifts{\ifcsname\??pageshift\v!horizontal:#2\endcsname\csname\??pageshift\v!horizontal:#2\endcsname\fi}%
1428     %edef\page_boxes_v_shifts{\ifcsname\??pageshift\v!vertical  :#3\endcsname\csname\??pageshift\v!vertical  :#3\endcsname\fi}%
1429     \edef\page_boxes_h_shifts{\begincsname\??pageshift\v!horizontal:#2\endcsname}%
1430     \edef\page_boxes_v_shifts{\begincsname\??pageshift\v!vertical  :#3\endcsname}%
1431     \ifcstok{#1}\v!page \let\page_boxes_apply_shift_print\page_boxes_apply_shift\else\let\page_boxes_apply_shift_print\gobbleoneargument\fi
1432     \ifcstok{#1}\v!paper\let\page_boxes_apply_shift_paper\page_boxes_apply_shift\else\let\page_boxes_apply_shift_paper\gobbleoneargument\fi
1433   \fi}
1434
1435\protect \endinput
1436