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