%D \module
%D   [       file=page-imp, % was: core-pag,
%D        version=1998.01.15,
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=Pagebody Building (Imposition),
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

% much of this can more to run time loading !

\writestatus{loading}{Context Core Macros / Pagebody Building}

\unprotect

% sizing bug:
%
% \setuppapersize[A4][A4,landscape] \setuparranging[2UP] \showframe
%
% \starttext \dorecurse{10}{\input tufte \par} \stoptext

% to be moved code:

\newif\ifclipprintbox \clipprintboxtrue
%newif\ifclippagebox  \clippageboxtrue

\def\clippedprintbox#1#2% can be made more efficient, see other clipper
  {\ifclipprintbox
     \!!widthc\pagebackgroundoffset
     \!!widtha \papierbreedte
     \advance\!!widtha \!!widthc
     \!!heighta\papierhoogte
     \advance\!!heighta\!!widthc
     \advance\!!heighta\!!widthc
     \setbox#2\vbox to \papierhoogte{\vfill\box#2}%
     \ht#2\papierhoogte
     \wd#2\papierbreedte
     \setbox#2\vbox
       {\framed
          [\c!offset=\!!widthc,\c!strut=\v!nee,\c!kader=\v!uit]
          {\box#2}}%
     \setbox#2\hbox to \papierbreedte
       {\ifcase#1\relax
          \!!widthb\zeropoint
          \hskip-\!!widthc
        \else
          \!!widthb\!!widthc
        \fi
        \lower\!!widthc\hbox
          {\clip
             [\c!breedte=\!!widtha,\c!hoogte=\!!heighta,
              \c!hoffset=\!!widthb,\c!voffset=\zeropoint]
             {\box#2}}}%
     \wd#2\papierbreedte
     \ht#2\papierhoogte
   \fi
   \box#2\relax}

\let\clippagebox \gobbleoneargument
\let\clipprintbox\gobbleoneargument

% \setuppagenumbering[alternative=doublesided]
% \setupcolors[state=start]
% \setuppapersize[A4][A4,oversized]
% \setuplayout[location=middle,clipoffset=5mm]
% \setupbackgrounds
%   [page]
%   [frame=on,rulethickness=1mm,
%    backgroundoffset=10mm,background=color,backgroundcolor=red]
% \starttext \dorecurse{10}{\input tufte \par} \stoptext

\def\clippagebox#1%
  {\ifdim\@@lyclipoffset>\zeropoint
     \!!widtha \wd#1%
     \!!heighta\ht#1%
     \!!deptha \dp#1%
     \setbox#1\hbox
       {\!!widthb \@@lyclipoffset
        \advance\!!heighta\!!deptha
        \advance\!!heighta2\!!widthb
        \advance\!!widtha  \!!widthb
        \doifbothsides
          \advance\!!widtha\!!widthb
          \!!widthc-\!!widthb
          \hskip\!!widthc
        \orsideone
          \!!widthc\zeropoint
        \orsidetwo
          \!!widthc-\!!widthb
          \hskip\!!widthc
        \od
        \lower\!!widthb\hbox
          {\clip
             [\c!hoffset=\!!widthc,
              \c!voffset=-\!!widthb,
              \c!breedte=\!!widtha,
              \c!hoogte=\!!heighta]%
             {\box#1}}}%
     \wd#1\!!widtha
     \ht#1\!!heighta
     \dp#1\!!deptha
   \fi}

% moved code:

\def\myshipout#1%
  {\voorpagina % voor de pagebody dus !
   \dontshowcomposition
   \ifarrangingpages\@EA\actualarrange\else\@EA\actualshipout\fi
     {\thisisrealpage\realfolio#1}%
   \gotonextrealpage
   \napagina}

\newbox\postponedcontent

\def\flushatshipout
  {\dowithnextbox
     {\global\setbox\postponedcontent\hbox to \zeropoint
        {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
         \box\postponedcontent\flushnextbox}%
      \global\ht\postponedcontent\zeropoint
      \global\dp\postponedcontent\zeropoint
      \global\wd\postponedcontent\zeropoint}%
   \hbox}

% \starttypen
% \def\pagestoshipout{1,3,5}
% \stoptypen

\newcount\shippedoutpages

\let\pagestoshipout\empty      % {1,3,6}
\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even

\def\actualshipout#1%
  {\global\advance\shippedoutpages\plusone
   \ifx\pagestoshipout\empty
     \ifcase\whichpagetoshipout\relax
       \donetrue
     \or % 1
       \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi
     \or % 2
       \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi
     \else
       \donetrue
     \fi
   \else % testen, aangepast / expanded nodig ?
     \expanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}%
       \donetrue\donefalse
   \fi
   \ifdone
     \shipout\vbox
       {\forgetall
        \offinterlineskip
        \mindermeldingen
        \vskip-1in
        \hskip-1in
        \hbox % \setbox0=\box.. is nicer
          {\setbox0\hbox{#1}% just in case there are objects there
           \setbox\scratchbox\hbox
             {\the\everyshipout\relax
              \ifnum\realpageno=\lastpage\relax
                \flushtextdata
                \the\everylastshipout
                \global\everylastshipout\emptytoks
              \fi}%
           \smashbox\scratchbox
           \box\scratchbox
           \box\postponedcontent % evt ver naar links !
           \box0}}%
   \else
     \message
       {[\ifarrangingpages arranged \fi page
         \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
         not flushed]}%
     \setbox0\hbox{#1}%
     \deadcycles\zerocount
   \fi}

\def\actualarrange#1%
  {\setbox0\hbox{\thisisrealpage{\realfolio}#1}%
   \pusharrangedpage0%
   \deadcycles\zerocount}

%D We need a couple of boxes for duplex printing \unknown

\newbox\arrangedpageA \newbox\arrangedpageB

%D \unknown\ and some for simulating big sheets.

\newbox\arrangedpageC \newbox\arrangedpageD
\newbox\arrangedpageE \newbox\arrangedpageF
\newbox\arrangedpageG \newbox\arrangedpageH

\newif\ifswaparranged
\newif\ifnegatearranged
\newif\ifmirrorarranged
\newif\ifdoublearranged

\newif\ifarrangingdisabled

\def\arrangedrotationO{0}
\def\arrangedrotationE{0}

\newcounter\arrangedpageN
\newcounter\arrangedpageM

\chardef\arrangedpageT=1
\chardef\arrangedpageX=1
\chardef\arrangedpageY=1

\def\calculatepaperoffsets#1%
  {\scratchdimen\getvalue{\??pp#1\c!offset}%
   \divide\scratchdimen \arrangedpageX
   \global\advance\papierbreedte -2\scratchdimen
   \scratchdimen\getvalue{\??pp#1\c!offset}%
   \divide\scratchdimen \arrangedpageY
   \global\advance\papierhoogte -2\scratchdimen}

\def\setuparranging[#1]%
  {\ifarrangingdisabled \else
     \doifelse{#1}\v!blokkeer
       {\global\arrangingdisabledtrue}
       {\global\arrangingdisabledfalse}%
     \global\arrangingpagestrue
     \global\negatearrangedfalse
     \global\mirrorarrangedfalse
     \global\doublearrangedfalse
     \gdef\arrangedrotationO{0}%
     \gdef\arrangedrotationE{180}%
     \processallactionsinset
       [#1]
       [  \v!gespiegeld=>\global\mirrorarrangedtrue,
        \v!dubbelzijdig=>\global\doublearrangedtrue,
            \v!negatief=>\global\negatearrangedtrue,
           \v!geroteerd=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
                     90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
                    180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
                    270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
               \s!reset=>\global\arrangingpagesfalse,
             \s!unknown=>\checkinstalledpagearrangement\commalistelement]%
        % no \s!default=> we can have aaa,,bbb
     \doifcommonelse{#1}{90,270,\v!geroteerd}
       {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
     \setuppapersize
     \ifarrangingpages
       \abortutilitygeneration
     \fi
   \fi}

\def\installpagearrangement #1 %
  {\setgvalue{\??pp\??pp#1}}

\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb
  {\executeifdefined{\??pp\??pp#1}\donothing}

\def\dosetuparrangement#1#2#3#4#5#6#7#8%
  {\global\chardef\arrangedpageX     #1%
   \global\chardef\arrangedpageY     #2%
   \global\chardef\arrangedpageT     #3%
   \global\chardef\horizontalcutmarks#4%
   \global\chardef\verticalcutmarks  #5%
   \global\let    \pusharrangedpage  #6%
   \global\let    \poparrangedpages  #7%
   \global\let    \handlearrangedpage#8}

\installpagearrangement {\v!normaal}
  {\global\arrangingpagesfalse}

\installpagearrangement 2*16
  {\dosetuparrangement{4}{4}{16}{5}{5}%
     \pusharrangedpageTHIRTYTWO\poparrangedpagesAB\relax}

\installpagearrangement 2*8
  {\dosetuparrangement{4}{2}{8}{5}{3}%
     \pusharrangedpageSIXTEEN\poparrangedpagesAB\relax}

\installpagearrangement 2*4
  {\dosetuparrangement{2}{2}{4}{3}{3}%
     \pusharrangedpageEIGHT\poparrangedpagesAB\relax}

\installpagearrangement 2*2
  {\dosetuparrangement{2}{1}{2}{3}{2}%
     \pusharrangedpageFOURA\poparrangedpagesAB\relax}

\installpagearrangement 2**2
  {\dosetuparrangement{2}{1}{2}{3}{2}%
     \pusharrangedpageFOURB\poparrangedpagesAB\relax}

\installpagearrangement 2SIDE
  {\dosetuparrangement{2}{1}{2}{3}{2}%
     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageSIDE}

\installpagearrangement 2TOP
  {\dosetuparrangement{1}{2}{2}{2}{3}%
     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageTOP}

\installpagearrangement 2UP
  {\dosetuparrangement{2}{1}{4}{3}{2}%
     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWOUP}

\installpagearrangement 2DOWN
  {\dosetuparrangement{1}{2}{4}{2}{3}%
     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}

\installpagearrangement 2*4*2 % one defined by Willy Egger:
  {\dosetuparrangement{2}{2}{4}{3}{2}%
     \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}

\installpagearrangement 2*2*4 % onother one of Willy Egger
  {\dosetuparrangement{2}{1}{8}{3}{2}%
     \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax}

\installpagearrangement 4SIDE
  {\dosetuparrangement{1}{2}{4}{2}{3}%
     \pusharrangedpageFOURSIDE\poparrangedpagesFOURSIDE\handlearrangedpageTOP}

% \def\filluparrangedpages % beware: \realpageno is 1 ahead
%   {\ifarrangingpages
%      \scratchcounter-\realpageno
%      \divide\scratchcounter \arrangedpageT
%      \multiply\scratchcounter \arrangedpageT
%      \advance\scratchcounter \realpageno
%      \advance\scratchcounter \minusone
%      \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}%
%    \fi}

\def\filluparrangedpages % beware: \realpageno is 1 ahead
  {\ifarrangingpages
     \scratchcounter\realpageno
     \advance\scratchcounter \minusone
     \dosetmodulo\scratchcounter\arrangedpageT\scratchcounter
     \ifcase\scratchcounter\else
       \advance\scratchcounter \plusone
       \dostepwiserecurse\scratchcounter\arrangedpageT\plusone
         {\noheaderandfooterlines\ejectdummypage}%
     \fi
   \fi}

\def\handlearrangedpageXandY#1#2#3#4#5%
  {\global\setbox#5\hbox to \arrangedpageX\papierbreedte
     {\setbox\scratchbox\vbox to \arrangedpageY\papierhoogte
        {\forgetall
         \offinterlineskip
         \mindermeldingen
         \vskip#4\papierhoogte
         \hskip#3\papierbreedte
         \dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}%
         \vfill}%
      \wd\scratchbox\zeropoint
      \box\scratchbox\box#5\hss}}

\def\gotonextarrangepage
  {\global\advance\arrangeno \plusone
   \def\pagecutmarksymbol{\the\arrangeno}}

\def\outputarrangedbox#1%
  {\bgroup
   \gotonextarrangepage
   \ifnum\arrangedrotationO\arrangedrotationE>\zerocount
     \setbox#1\vbox
       {\ifdoublearranged
          \ifodd\arrangeno
            \dorotatebox\arrangedrotationO\hbox{\box#1}%
          \else
            \dorotatebox\arrangedrotationE\hbox{\box#1}%
          \fi
        \else
          \dorotatebox\arrangedrotationO\hbox{\box#1}%
        \fi}%
   \fi
   \ifmirrorarranged
     \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
   \fi
   \ifnegatearranged
     \negatecolorbox{#1}%
   \fi
   \finishpagebox#1
   \actualshipout{\box#1}%
   \egroup}

%D The format file can be 16K smaller when we postpone the
%D real arrangments. Some day ...

% TOP

% 32/16/8/4/SIDE

\def\poparrangedpagesAB
  {\ifnum\arrangedpageN>\zerocount
     \mindermeldingen
     \papierbreedte\arrangedpageX\papierbreedte
     \papierhoogte\arrangedpageY\papierhoogte
     \outputarrangedbox\arrangedpageA
     \outputarrangedbox\arrangedpageB
     \doglobal\newcounter\arrangedpageN
   \fi}

\def\pusharrangedpageTHIRTYTWO#1% taco's challenge
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \ifcase\arrangedpageN
   \or \handlearrangedpageXandY{#1}033\arrangedpageA %  1
   \or \handlearrangedpageXandY{#1}003\arrangedpageB %  2
   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  4
   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
   \or \handlearrangedpageXandY{#1}033\arrangedpageB %  7
   \or \handlearrangedpageXandY{#1}003\arrangedpageA %  8
   \or \handlearrangedpageXandY{#1}102\arrangedpageA %  9
   \or \handlearrangedpageXandY{#1}132\arrangedpageB % 10
   \or \handlearrangedpageXandY{#1}031\arrangedpageB % 11
   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 12
   \or \handlearrangedpageXandY{#1}031\arrangedpageA % 13
   \or \handlearrangedpageXandY{#1}001\arrangedpageB % 14
   \or \handlearrangedpageXandY{#1}102\arrangedpageB % 15
   \or \handlearrangedpageXandY{#1}132\arrangedpageA % 16
   \or \handlearrangedpageXandY{#1}122\arrangedpageA % 17
   \or \handlearrangedpageXandY{#1}112\arrangedpageB % 18
   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 19
   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 20
   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 21
   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 22
   \or \handlearrangedpageXandY{#1}122\arrangedpageB % 23
   \or \handlearrangedpageXandY{#1}112\arrangedpageA % 24
   \or \handlearrangedpageXandY{#1}013\arrangedpageA % 25
   \or \handlearrangedpageXandY{#1}023\arrangedpageB % 26
   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 27
   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 28
   \or \handlearrangedpageXandY{#1}120\arrangedpageA % 29
   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 30
   \or \handlearrangedpageXandY{#1}013\arrangedpageB % 31
   \or \handlearrangedpageXandY{#1}023\arrangedpageA % 32
     \poparrangedpages
   \fi}

\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \ifcase\arrangedpageN
   \or \handlearrangedpageXandY{#1}031\arrangedpageA %  1
   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
   \or \handlearrangedpageXandY{#1}031\arrangedpageB %  3
   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  4
   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  8
   \or \handlearrangedpageXandY{#1}120\arrangedpageA %  9
   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 11
   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 12
   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 13
   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 14
   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 16
     \poparrangedpages
   \fi}

\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \ifcase\arrangedpageN
   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  4
   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
   \or \handlearrangedpageXandY{#1}110\arrangedpageB %  6
   \or \handlearrangedpageXandY{#1}011\arrangedpageB %  7
   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  8
     \poparrangedpages
   \fi}

\def\pusharrangedpageFOURA{\pusharrangedpageFOURdo01}
\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10}

\def\pusharrangedpageFOURdo#1#2#3%
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \ifcase\arrangedpageN
   \or \handlearrangedpageXandY{#3}010\arrangedpageA    %  1
   \or \handlearrangedpageXandY{#3}0{#1}0\arrangedpageB %  2/3 not {1}
   \or \handlearrangedpageXandY{#3}0{#2}0\arrangedpageB %  3/2 not {1}
   \or \handlearrangedpageXandY{#3}000\arrangedpageA    %  4
     \poparrangedpages
   \fi}

\def\pusharrangedpageSIDETOP#1%
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \ifcase\arrangedpageN
   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
     \poparrangedpages
   \fi}

\def\handlearrangedpageSIDE
  {\global\wd\arrangedpageA\papierbreedte
   \global\wd\arrangedpageB\papierbreedte
   \global\setbox\arrangedpageA\hbox
     {\box\arrangedpageA\box\arrangedpageB}%
   \global\ht\arrangedpageA\papierhoogte
   \global\setbox\arrangedpageB\box\scratchbox} % ?

\def\handlearrangedpageTOP
  {\global\ht\arrangedpageA\papierhoogte
   \global\ht\arrangedpageB\papierhoogte
   \global\setbox\arrangedpageA\vbox
     {\forgetall\offinterlineskip\vskip\papierhoogte
      \box\arrangedpageA\box\arrangedpageB}%
   \global\setbox\arrangedpageB\box\scratchbox} % ?

% 2UP/2DOWN / 1pt prevents overflow

\def\splitoffarrangedpagesTWO
  {\splittopskip\zeropoint
   \global\setbox\arrangedpageA\vsplit\arrangedpageB to \onepoint
   \scratchdimen\ht\arrangedpageB
   \advance\scratchdimen -\onepoint
   \ifdim\scratchdimen>\onepoint
     \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen
   \fi}

% \def\handlearrangedpageTWOUP
%   {\splitoffarrangedpagesTWO
%    \ifswaparranged
%      \global\setbox\arrangedpageA\hbox
%        {\box\arrangedpageA\box\arrangedpageB}%
%      \swaparrangedfalse
%    \else
%      \global\setbox\arrangedpageA\hbox
%        {\box\arrangedpageB\box\arrangedpageA}%
%      \swaparrangedtrue
%    \fi
%    \global\ht\arrangedpageA\papierhoogte
%    \global\setbox\arrangedpageB\box\scratchbox}

\def\handlearrangedpageTWOUP
  {\splitoffarrangedpagesTWO
   \ifswaparranged
     \global\setbox\arrangedpageA\hbox
       {\clippedprintbox0\arrangedpageA
        \clippedprintbox1\arrangedpageB}%
     \swaparrangedfalse
   \else
     \global\setbox\arrangedpageA\hbox
       {\clippedprintbox0\arrangedpageB
        \clippedprintbox1\arrangedpageA}%
     \swaparrangedtrue
   \fi
   \global\ht\arrangedpageA\papierhoogte
   \global\setbox\arrangedpageB\box\scratchbox}

\def\handlearrangedpageTWODOWN
  {\splitoffarrangedpagesTWO
   \global\ht\arrangedpageA\papierhoogte
   \global\ht\arrangedpageB\papierhoogte
   \ifswaparranged
     \global\setbox\arrangedpageA\vbox
       {\forgetall\offinterlineskip\vskip\papierhoogte
        \box\arrangedpageA\box\arrangedpageB}%
     \swaparrangedfalse
   \else
     \global\setbox\arrangedpageA\vbox
       {\forgetall\offinterlineskip\vskip\papierhoogte
        \box\arrangedpageB\box\arrangedpageA}%
     \swaparrangedtrue
   \fi
   \global\setbox\arrangedpageB\box\scratchbox}

\def\poparrangedpagesTWO
  {\ifnum\arrangedpageN>\zerocount
     \mindermeldingen
     \swaparrangedfalse
     \doloop
       {\handlearrangedpage
        \bgroup
        \papierbreedte\arrangedpageX\papierbreedte
        \papierhoogte\arrangedpageY\papierhoogte
        \ht\arrangedpageA\papierhoogte
        \wd\arrangedpageA\papierbreedte
        \outputarrangedbox\arrangedpageA
        \egroup
        \ifdim\ht\arrangedpageB=\zeropoint
          \exitloop
        \fi}%
     \doglobal\newcounter\arrangedpageN
   \fi}

\def\pusharrangedpageTWO#1%
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \global\setbox\arrangedpageB\vbox
     {\forgetall
      \offinterlineskip
      \unvbox\arrangedpageB
      \allowbreak
      \ht#1\onepoint
      \dp#1\zeropoint
      \vbox{\box#1}}}

\def\poparrangedpagesFOURSIDE
  {\bgroup
   \gdef\arrangedpageN{2}%
   \poparrangedpagesTWO
   \let\arrangedpageA\arrangedpageC
   \let\arrangedpageB\arrangedpageD
   \gdef\arrangedpageN{2}%
   \poparrangedpagesTWO
   \egroup}

\def\pusharrangedpageFOURSIDE#1%
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \ifcase\arrangedpageN
   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
   \or \handlearrangedpageXandY{#1}000\arrangedpageC %  2
   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  1
   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  2
     \poparrangedpages
   \fi}

%D Willy Egger's sheet simulations:

\def\poparrangedpagesAtoH
  {\ifnum\arrangedpageN>\zerocount
     \mindermeldingen
     \papierbreedte\arrangedpageX\papierbreedte
     \papierhoogte\arrangedpageY\papierhoogte
     \outputarrangedbox\arrangedpageA
     \outputarrangedbox\arrangedpageB
     \outputarrangedbox\arrangedpageC
     \outputarrangedbox\arrangedpageD
     \outputarrangedbox\arrangedpageE
     \outputarrangedbox\arrangedpageF
     \outputarrangedbox\arrangedpageG
     \outputarrangedbox\arrangedpageH
     \doglobal\newcounter\arrangedpageN
   \fi}

% to arrange 16 pages on 2 sheets to form one booklet

\def\poparrangedpagesAtoD
  {\ifnum\arrangedpageN>\zerocount
     \mindermeldingen
     \papierbreedte\arrangedpageX\papierbreedte
     \papierhoogte\arrangedpageY\papierhoogte
     \outputarrangedbox\arrangedpageA
     \outputarrangedbox\arrangedpageB
     \outputarrangedbox\arrangedpageC
     \outputarrangedbox\arrangedpageD
     \doglobal\newcounter\arrangedpageN
   \fi}

% to arrange 16 pages on 4 sheets to form one booklet

\def\pusharrangedpageSIXTEENFOUR#1%
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \ifcase\arrangedpageN
   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1
   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
   \or \handlearrangedpageXandY{#1}010\arrangedpageC %  3
   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  4
   \or \handlearrangedpageXandY{#1}010\arrangedpageE %  5
   \or \handlearrangedpageXandY{#1}000\arrangedpageF %  6
   \or \handlearrangedpageXandY{#1}010\arrangedpageG %  7
   \or \handlearrangedpageXandY{#1}000\arrangedpageH %  8
   \or \handlearrangedpageXandY{#1}010\arrangedpageH %  9
   \or \handlearrangedpageXandY{#1}000\arrangedpageG % 10
   \or \handlearrangedpageXandY{#1}010\arrangedpageF % 11
   \or \handlearrangedpageXandY{#1}000\arrangedpageE % 12
   \or \handlearrangedpageXandY{#1}010\arrangedpageD % 13
   \or \handlearrangedpageXandY{#1}000\arrangedpageC % 14
   \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
   \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
     \poparrangedpages
   \fi}

% to arrange 16 pages on 2 sheets to form one booklet

\def\pusharrangedpageSIXTEENTWO#1%
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \ifcase\arrangedpageN
   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
   \or \handlearrangedpageXandY{#1}011\arrangedpageC %  3
   \or \handlearrangedpageXandY{#1}001\arrangedpageD %  4
   \or \handlearrangedpageXandY{#1}100\arrangedpageD %  5
   \or \handlearrangedpageXandY{#1}110\arrangedpageC %  6
   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  8
   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  9
   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
   \or \handlearrangedpageXandY{#1}100\arrangedpageC % 11
   \or \handlearrangedpageXandY{#1}110\arrangedpageD % 12
   \or \handlearrangedpageXandY{#1}011\arrangedpageD % 13
   \or \handlearrangedpageXandY{#1}001\arrangedpageC % 14
   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 16
     \poparrangedpages
   \fi}

% % handy for stickers etc, this way we can treat them as page
%
% \setuppapersize [XY][A4]
% \setuppaper     [topspace=5mm,backspace=5mm,dx=1mm,dy=1mm,nx=2,ny=6]
% \setuplayout    [page] [topspace=5mm,backspace=5mm]
% \setuplayout    [page]
% \setuplayout    [location=middle]
% \setuparranging [XY]
% \showframe
%
% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext

\def\pusharrangedpageXY#1%
  {\doglobal\increment\arrangedpageN
   \reportarrangedpage\arrangedpageN
   \doglobal\increment\arrangedpageM
   \global\setbox\arrangedpageB\hbox
     \ifdim\@@ppbreedte>\zeropoint to \@@ppbreedte \fi
     {\ifvoid\arrangedpageB\else
        \unhbox\arrangedpageB\hss\hskip\@@ppdx\hss
      \fi
      \box#1}%
   \ifnum\arrangedpageM<\arrangedpageX\else
     \global\setbox\arrangedpageA\vbox
          \ifdim\@@pphoogte>\zeropoint to \@@pphoogte \fi
       {\offinterlineskip
        \ifvoid\arrangedpageA\else
          \unvbox\arrangedpageA\vss\vskip\@@ppdy\vss
        \fi
        \box\arrangedpageB}%
     \doglobal\newcounter\arrangedpageM
   \fi
   \ifnum\arrangedpageN<\arrangedpageT\else
     \poparrangedpages
   \fi}

\def\poparrangedpagesXY
  {\ifnum\arrangedpageN>\zerocount
     \mindermeldingen
     \papierbreedte\arrangedpageX\papierbreedte
     \papierhoogte \arrangedpageY\papierhoogte
     \outputarrangedbox\arrangedpageA
     \doglobal\newcounter\arrangedpageN
     \doglobal\newcounter\arrangedpageM
   \fi}

\installpagearrangement XY
  {\dosetuparrangement\@@ppnx\@@ppny\@@ppxy\!!zerocount\!!zerocount
     \pusharrangedpageXY\poparrangedpagesXY\relax}

\beginETEX \dimexpr

\definepapersize
  [XY]
  [\c!breedte=\dimexpr(\dimexpr(\@@ppbreedte-\numexpr(\@@ppnx-1)\dimexpr(\@@ppdx))/\@@ppnx),
   \c!hoogte =\dimexpr(\dimexpr(\@@pphoogte -\numexpr(\@@ppny-1)\dimexpr(\@@ppdy))/\@@ppny)]

\setuppaper
  [\c!breedte=\dimexpr(\printpapierbreedte-2\dimexpr(\@@pprugwit)),
   \c!hoogte =\dimexpr(\printpapierhoogte -2\dimexpr(\@@ppkopwit))]

\endETEX

% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt]
% \definepageshift[test][vertical]  [10pt,20pt,30pt,40pt,50pt]
%
% \setuppageshift[test]
% \setuppageshift[test][test]
% \setuppageshift[test][none]
% \setuppageshift[none][test]
% \setuppageshift[paper][test][test] % arrange only
% \setuppageshift[paper][test]       % arrange only
% \setuppageshift[print][test][test]
%
% \showframe \dorecurse{100}{\input tufte \par}

% #1=name #2=horizontal|vertical #3=shiftlist

\def\definepageshift
  {\dotripleargument\dodefinepageshift}

\def\dodefinepageshift[#1][#2][#3]%
  {\setvalue{\??pt#2:#1}{#3}}

\letempty \hpageshifts \newcounter\nofhpageshifts
\letempty \vpageshifts \newcounter\nofvpageshifts

% \let\shiftprintpagebox\gobbleoneargument
% \let\shiftpaperpagebox\gobbleoneargument

\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts
  {\ifx#2\empty
     #1\zeropoint
   \else
     \doglobal\increment#3%
     \getfromcommacommand[#2][#3]%
     \ifx\commalistelement\empty
       \globallet#3\!!plusone
       \getfromcommacommand[#2][#3]%
     \fi
     \ifx\commalistelement\empty
       #1\zeropoint
     \else
       #1=\commalistelement
       \donetrue
     \fi
   \fi}

\def\shiftpagebox#1%
  {\donefalse
   \dogetpageshift{\dimen0}\hpageshifts\nofhpageshifts
   \dogetpageshift{\dimen2}\vpageshifts\nofvpageshifts
   \ifdone % see also layout offsets, maybe \movebox
     \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
     \setbox#1\vbox % \forgetall already done
       {\offinterlineskip\vskip\dimen2\hskip\dimen0\box#1}%
     \next
   \fi}

\def\setuppageshift
  {\dotripleempty\dosetuppageshift}

\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical
  {\ifthirdargument              % paper=arrange
     \let\hpageshifts\empty
     \let\vpageshifts\empty
     \let\shiftprintpagebox\gobbleoneargument
     \let\shiftpaperpagebox\gobbleoneargument
     \doifdefined{\??pt\v!horizontaal:#2}
       {\edef\hpageshifts{\getvalue{\??pt\v!horizontaal:#2}}}%
     \doifdefined{\??pt\v!vertikaal  :#3}
       {\edef\vpageshifts{\getvalue{\??pt\v!vertikaal  :#3}}}%
     \doif{#1}\v!pagina{\let\shiftprintpagebox\shiftpagebox}%
     \doif{#1}\v!papier{\let\shiftpaperpagebox\shiftpagebox}%
   \else\ifsecondargument
     \doifinsetelse{#1}{\v!pagina,\v!papier}
       {\setuppageshift[#1][#2][#2]}
       {\setuppageshift[\v!pagina][#1][#2]}%
   \else\iffirstargument
     \setuppageshift[\v!pagina][#1][#1]%
   \fi\fi}

%D One can (mis)use this mechanism, in close cooperation
%D with \PDFTEX\ to arrange pages of already produced files.
%D
%D \starttypen
%D \insertpages[file.pdf][1,3][n=30,width=18cm]
%D \stoptypen
%D
%D The pages are inserted in the text area, and even pages
%D are repositioned according to the width. In this example
%D empty pages are added after page 1 and 3.
%D
%D Selecting pages can be accomplished by:
%D
%D \starttypen
%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
%D \stoptypen
%D
%D One may pass \type {odd} or \type {even} instead of a
%D comma separated list. A third alternative is:
%D
%D \starttypen
%D \copypages[file.pdf][n=30,scale=950]
%D \stoptypen
%D
%D This macros inserts the page, according to the settings
%D provided.

\def\insertpages
  {\dotripleempty\doinsertpages}

\def\doinsertpages[#1][#2][#3]%
  {\doifassignmentelse{#2}
     {\dodoinsertpages[#1][][#2]}
     {\dodoinsertpages[#1][#2][#3]}}

\def\dodoinsertpages[#1][#2][#3]%
  {\bgroup
   \mindermeldingen
   \getfiguredimensions[#1]%
   \getparameters[\??ip][\c!n=\noffigurepages,\c!breedte=\!!zeropoint,#3]%
   \doifinset0{#2}{\null\pagina}%
   \dorecurse\@@ipn
     {\dofilterpage{#1}\recurselevel
      \doifinset\recurselevel{#2}{\null\pagina}}%
   \egroup}

\def\filterpages
  {\dotripleempty\dofilterpages}

\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported
  {\bgroup
   \mindermeldingen
   \getfiguredimensions[#1]%
   \getparameters[\??ip][\c!n=\noffigurepages,\c!breedte=\!!zeropoint,#3]%
   \doifelse{#2}\v!even
     {\dorecurse\@@ipn
        {\ifodd\recurselevel\relax\else\dofilterpage{#1}\recurselevel\fi}}
     {\doifelse{#2}\v!oneven
        {\dorecurse\@@ipn
           {\ifodd\recurselevel\relax\dofilterpage{#1}\recurselevel\fi}}
        {\def\dodocommando##1%
           {\ifnum##1>\@@ipn\else\dofilterpage{#1}{##1}\fi}%
         \def\docommando##1%
           {\dowithrange{##1}\dodocommando}%
         \processcommalist[#2]\docommando}}%
   \egroup}

\def\dowithrange#1#2% #2 takes number
  {\beforesplitstring#1\at:\to\fromrange
   \aftersplitstring #1\at:\to\torange
   \ifx\torange\empty\let\torange\fromrange\fi
   \dostepwiserecurse\fromrange\torange1{#2{\recurselevel}}}

\def\dofilterpage#1#2%
  {\hbox to \tekstbreedte
     {\ifdubbelzijdig\ifdim\@@ipbreedte>\zeropoint\relax\ifodd\realpageno\else
        \hfill
        \def\dowithfigure{\hskip-\@@ipbreedte}%
      \fi\fi\fi
      \setbox0\hbox
        {\externalfigure[#1][\c!pagina=#2,\c!hoogte=\teksthoogte]}%
      \wd0\zeropoint
      \box0}
   \pagina}

\def\copypages
  {\dodoubleempty\docopypages}

\def\docopypages[#1][#2]%
  {\bgroup
   \getfiguredimensions[#1]%
   \getparameters[\??ip]
     [\c!n=\noffigurepages,
      \c!markering=\v!uit,
      \c!schaal=\!!thousand,
      \c!offset=\!!zeropoint,
      #2]%
   \dorecurse\@@ipn
     {\vbox to \teksthoogte
        {\hsize\tekstbreedte
         \scratchdimen\@@ipoffset
         \centeredbox
           {\doifelse\@@ipmarkering\v!aan\cuthbox\hbox
              {\ifdim\scratchdimen>\zeropoint\relax
                 \advance\vsize -2\scratchdimen
                 \advance\hsize -2\scratchdimen
                 \externalfigure[#1][\c!pagina=\recurselevel,#2,\c!schaal=,\c!factor=\v!max,\c!offset=\v!overlay]%
               \else
                 \externalfigure[#1][\c!pagina=\recurselevel,#2,\c!offset=\v!overlay]%
               \fi}}}
      \pagina}
   \egroup}

%D \macros
%D   {combinepages}
%D
%D Yet another way of postprocessing is handles by \type
%D {\combinepages}. This macro builds a matrix of pages from a
%D file, for example:
%D
%D \starttypen
%D \setuppapersize
%D   [A4][A4] % or [A4,landscape][A4,landscape]
%D
%D \setuplayout
%D   [header=0pt,footer=1cm,
%D    backspace=1cm,topspace=1cm,
%D    width=middle,height=middle]
%D
%D \setupfootertexts
%D   [presentation---\currentdate\space---\space\pagenumber]
%D
%D \starttext
%D   \combinepages[slides][nx=2,ny=3,frame=on]
%D \stoptext
%D \starttypen
%D
%D One can influence the way the pages are combined. (This
%D will be explained some time.)

\def\combinepages
  {\dodoubleempty\docombinepages}

\def\docombinepages[#1][#2]% a=perpag b=free
  {\bgroup
   \mindermeldingen
   \getfiguredimensions[#1]%
   \getparameters
     [\??ip]
     [\c!variant=\v!a,
      \c!n=\noffigurepages,\c!nx=2,\c!ny=2,\c!start=1,\c!stop=\!!maxcard,
      \c!afstand=\bodyfontsize,
      \c!onder=\vfill,\c!boven=\vss,
      \c!links=\hss,\c!rechts=\hss,
      \c!voor=\pagina,\c!na=\pagina,\c!tussen=\blanko,
      \c!kader=,\c!achtergrond=,\c!achtergrondkleur=,
      #2]%
   \@@ipvoor
  %\doglobal\newcounter\combinedpagescounter
   \globallet\combinedpagescounter\@@ipstart
   \doifelse\@@ipvariant\v!b\!!doneafalse\!!doneatrue
   \if!!donea
     \doloop
       {\vbox to \teksthoogte
           {\hsize\tekstbreedte % ? ?
            \scratchdimen\@@ipafstand
            \!!widtha\hsize
            \advance\!!widtha  -\@@ipnx\scratchdimen
            \advance\!!widtha  \scratchdimen
            \divide \!!widtha  \@@ipnx
            \!!heighta\vsize
            \advance\!!heighta -\@@ipny\scratchdimen
            \advance\!!heighta         \scratchdimen
            \divide \!!heighta  \@@ipny
            \dorecurse\@@ipny
              {\hbox to \hsize
                 {\dorecurse\@@ipnx
                    {\vbox to \!!heighta
                       {\hsize\!!widtha
                        \vsize\!!heighta
                        \@@ipboven
                        \hbox to \hsize
                          {\@@iplinks
\ifnum\combinedpagescounter>\@@ipstop\relax
  \globallet\@@ipn\!!zerocount
\else
                           \ifnum\combinedpagescounter>\@@ipn \else
                             \externalfigure[#1]
                               [\c!object=\v!nee,
                                \c!pagina=\combinedpagescounter,
                                \c!factor=\v!max,
                                \c!achtergrond=\@@ipachtergrond,
                                \c!achtergrondkleur=\@@ipachtergrondkleur,
                                \c!kader=\@@ipkader]%
                           \fi
\fi
                           \@@iprechts}
                        \@@iponder}%
                     \doglobal\increment\combinedpagescounter
                     \hfil}%
                  \hfilneg}
               \vfil}%
           \vfilneg}%
           \pagina
        \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}
   \else
     \doloop
       {\startbaselinecorrection
          \scratchdimen\@@ipafstand
          \!!widtha\hsize
          \advance\!!widtha -\@@ipnx\scratchdimen
          \advance\!!widtha         \scratchdimen
          \divide \!!widtha  \@@ipnx
          \hbox to \hsize
            {\dorecurse\@@ipnx
               {\doglobal\increment\combinedpagescounter
                \ifnum\combinedpagescounter>\@@ipn \else
                   \externalfigure[#1]
                     [\c!pagina=\combinedpagescounter,
                      \c!breedte=\!!widtha,
                      \c!achtergrond=\@@ipachtergrond,
                      \c!achtergrondkleur=\@@ipachtergrondkleur,
                      \c!kader=\@@ipkader]%
                \fi}}%
        \stopbaselinecorrection
        \ifnum\combinedpagescounter<\@@ipn\relax
          \@@iptussen
        \else
          \exitloop
        \fi}
   \fi
   \@@ipna
   \egroup}

%D \macros
%D   {setuppagecomment,startpagecomment}
%D
%D This command is not yet documented. Usage:
%D
%D \starttypen
%D \setuppagecomment[state=start,location=right]
%D
%D \startpagecomment
%D \input knuth
%D \stoppagecomment
%D \stoptypen

\def\setuppagecomment
  {\dosingleempty\dosetuppagecomment}

\def\dosetuppagecomment[#1]%
  {\getparameters[\??pc][#1]%
   \doifelse\@@pcstatus\v!start
     {\doifinsetelse\@@pcplaats{\v!onder,\v!boven}
        {\setuppapersize[\c!links=\hskip\@@pcoffset]%
         \adddimenmacro\papierhoogte\@@pcoffset\@@pcoffset\@@pcafstand\@@pchoogte\to\@@pcpaperheight
         \adddimenmacro\papierbreedte\@@pcoffset\@@pcoffset\to\@@pcpaperwidth
         \defineoverlay[\v!pagecomment][\placepagecommentTB]}
        {\setuppapersize[\c!boven=\vskip\@@pcoffset]%
         \adddimenmacro\papierhoogte\@@pcoffset\@@pcoffset\to\@@pcpaperheight
         \adddimenmacro\papierbreedte\@@pcoffset\@@pcoffset\@@pcafstand\@@pcbreedte\to\@@pcpaperwidth
         \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
      \processaction
        [\@@pcplaats]
        [ \v!onder=>{\setuppapersize[\c!onder =\vss,\c!boven =\vskip\@@pcoffset]},
          \v!boven=>{\setuppapersize[\c!boven =\vss,\c!onder =\vskip\@@pcoffset]},
          \v!links=>{\setuppapersize[\c!links =\hss,\c!rechts=\hskip\@@pcoffset]},
         \v!rechts=>{\setuppapersize[\c!rechts=\hss,\c!links =\hskip\@@pcoffset]}]%
      \definepapersize
        [\v!pagecomment]
        [\c!hoogte=\@@pcpaperheight,
         \c!breedte=\@@pcpaperwidth]%
      \let\@@pcprintpapersize\printpapersize
      \setuppapersize[\papersize][\v!pagecomment]%
      \setupbackgrounds[\v!papier][\c!achtergrond=\v!pagecomment]}
    {\doif\@@pcstatus\v!stop % else initialization  invokes backgrounds
       {% this should be tested first
        % \expanded{\setuppapersize[\papersize][\@@pcprintpapersize]}%
        \setupbackgrounds[\v!papier][\c!achtergrond=]}}}

\def\@@pcprintpapersize{\printpapersize}

\def\placepagecommentTB
  {\vbox to \printpapierhoogte
     {\forgetall
      \hsize\printpapierbreedte
      \vskip\@@pcoffset
      \doifelse\@@pcplaats\v!onder{\vskip\papierhoogte\vskip\@@pcafstand}\vss
      \hskip\@@pcoffset
      \vbox to \@@pchoogte
        {\forgetall
         \hsize\papierbreedte
         \ifpagecomment
           \getbuffer[\v!pagecomment]%
           \global\pagecommentfalse
         \fi}%
      \hfill
      \doifelse\@@pcplaats\v!onder\vss{\vskip\papierhoogte\vskip\@@pcafstand}
      \vskip\@@pcoffset}}

\def\placepagecommentLR
  {\hbox to \printpapierbreedte
     {\hskip\@@pcoffset
      \doifelse\@@pcplaats\v!rechts{\hskip\papierbreedte\hskip\@@pcafstand}\hss
      \vbox to \printpapierhoogte
        {\forgetall
         \vskip\@@pcoffset
         \hsize\@@pcbreedte
         \ifpagecomment
           \getbuffer[\v!pagecomment]%
           \global\pagecommentfalse
         \fi
         \vss}%
      \doifelse\@@pcplaats\v!rechts\hss{\hskip\papierbreedte\hskip\@@pcafstand}%
      \hskip\@@pcoffset}}

\newif\ifpagecomment

\setvalue{\e!start\v!pagecomment}%
  {\global\pagecommenttrue
   \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]}

\setuppagecomment
  [\c!status=, % \v!stop would invoke background calculation
   \c!plaats=\v!onder,
   \c!offset=.5cm,
   \c!afstand=.5cm,
   \c!hoogte=5cm,
   \c!breedte=10cm]

% This macro cuts a page into n parts that can be pasted
% together.

\def\slicepages
  {\dotripleempty\doslicepages}

\def\doslicepages[#1][#2][#3]%
  {\ifthirdargument
     \dodoslicepages[#1][#2][#3]%
   \else
     \dodoslicepages[#1][#2][#2]%
   \fi}

\newcounter\slicedpagenumber

\def\dodoslicepages[#1][#2][#3]%
  {\bgroup
   \dontcomplain
   \globallet\slicedpagenumber\!!zerocount
   \getfiguredimensions[#1]
   \getparameters
     [\??ip]
     [\c!n=1,
      \c!offset=\!!zeropoint,
      \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
      \c!breedte=\figurewidth,\c!hoogte=\figureheight,#2]
   \ifnum\@@ipn>\zerocount
     \definepapersize
       [\s!dummy][\c!hoogte=\@@iphoogte,\c!breedte=\@@ipbreedte]
     \setuppapersize
       [\s!dummy][\s!dummy]
     \setuplayout
       [\c!rugwit=\!!zeropoint,\c!kopwit=\!!zeropoint,
        \c!hoogte=\v!midden,\c!breedte=\v!midden,
        \c!tekstafstand=\!!zeropoint,
        \c!hoofd=\!!zeropoint,\c!voet=\!!zeropoint]
   \fi
   \dorecurse\noffigurepages
     {\global\let\slicedpagenumber\recurselevel
      \ifnum\@@ipn>\plusone
        \dorecurse\@@ipn
          {\let\xslice\recurselevel
           \dorecurse\@@ipn
             {\let\yslice\recurselevel
              \clip
                [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice]
                {\schaal
                   [\c!schaal=\@@ipn000]
                   {\externalfigure[#1][\c!pagina=\slicedpagenumber]}}
              \pagina}}
      \else
        \ifodd\slicedpagenumber\relax
          \getparameters[\??ip][#2]
        \else
          \getparameters[\??ip][#3]
        \fi
        \hskip\@@ipoffset
        \clip
          [\c!hoffset=\@@iphoffset,\c!voffset=\@@ipvoffset,
           \c!hoogte=\@@iphoogte,\c!breedte=\@@ipbreedte]
          {\externalfigure[#1][\c!pagina=\slicedpagenumber]}
        \pagina
      \fi}
   \egroup}

% \starttext \slicepages[slice1.pdf][n=3] \stoptext

\protect \endinput