summaryrefslogtreecommitdiff
path: root/tex/context/base/page-imp.tex
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2001-07-02 00:00:00 +0200
committerHans Hagen <pragma@wxs.nl>2001-07-02 00:00:00 +0200
commitab399f7f60b937f771dd33f9b826d83dab3e84e2 (patch)
treedfb3b001d6c0ee78967f6849168d41614b06fc2c /tex/context/base/page-imp.tex
parent661f9f4a789474b20056f6bd4855c66d9791b301 (diff)
downloadcontext-ab399f7f60b937f771dd33f9b826d83dab3e84e2.tar.gz
stable 2001.07.02
Diffstat (limited to 'tex/context/base/page-imp.tex')
-rw-r--r--tex/context/base/page-imp.tex850
1 files changed, 850 insertions, 0 deletions
diff --git a/tex/context/base/page-imp.tex b/tex/context/base/page-imp.tex
new file mode 100644
index 000000000..2225e31f9
--- /dev/null
+++ b/tex/context/base/page-imp.tex
@@ -0,0 +1,850 @@
+%D \module
+%D [ file=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.
+
+\writestatus{loading}{Context Core Macros / Pagebody Building}
+
+\unprotect
+
+% moved code:
+
+\def\myshipout#1%
+ {\voorpagina % voor de pagebody dus !
+ \dontshowcomposition
+ \ifarrangingpages
+ \actualarrange
+ {\thisisrealpage{\realfolio}#1}%
+ \else
+ \actualshipout
+ {\thisisrealpage{\realfolio}#1}%
+ \fi
+ \gotonextrealpage
+ \napagina}
+
+\newbox\postponedcontent
+
+\def\flushatshipout%
+ {\dowithnextbox
+ {\global\setbox\postponedcontent=\hbox to \!!zeropoint
+ {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
+ \box\postponedcontent\box\nextbox}%
+ \global\ht\postponedcontent=\!!zeropoint
+ \global\dp\postponedcontent=\!!zeropoint
+ \global\wd\postponedcontent=\!!zeropoint}%
+ \hbox}
+
+% \starttypen
+% \def\pagestoshipout{1,3,5}
+% \stoptypen
+
+\newcounter\shippedoutpages
+\let\pagestoshipout\empty % {1,3,6}
+\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even
+
+\def\actualshipout#1%
+ {\doglobal\increment\shippedoutpages
+ \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
+ \ExpandBothAfter\doifinsetelse{\shippedoutpages}{\pagestoshipout}
+ \donetrue\donefalse
+ \fi
+ \ifdone
+ \shipout\vbox
+ {\forgetall
+ \offinterlineskip
+ \mindermeldingen
+ \vskip-1in
+ \hskip-1in
+ \hbox
+ {\setbox0=\hbox{#1}% just in case there are objects there
+ \setbox\scratchbox=\hbox
+ {\the\everyshipout
+ \ifnum\realpageno=\lastpage\relax
+ \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=0
+ \fi}
+
+\def\actualarrange#1%
+ {\setbox0=\hbox{\thisisrealpage{\realfolio}#1}%
+ \pusharrangedpage0
+ \deadcycles=0 }
+
+% so far for the moved code
+
+\newbox\arrangedpageA
+\newbox\arrangedpageB
+
+\newif\ifswaparranged
+\newif\ifnegatearranged
+\newif\ifmirrorarranged
+\newif\ifdoublearranged
+
+\newif\ifarrangingdisabled
+
+\def\arrangedrotationO{0}
+\def\arrangedrotationE{0}
+
+\newcounter\arrangedpageN
+
+\chardef\arrangedpageT=1
+\chardef\arrangedpageX=1
+\chardef\arrangedpageY=1
+
+\def\calculatepaperoffsets#1%
+ {\scratchdimen=\getvalue{\??pp#1\c!offset}%
+ \divide\scratchdimen by \arrangedpageX
+ \global\advance\papierbreedte by -2\scratchdimen
+ \scratchdimen=\getvalue{\??pp#1\c!offset}%
+ \divide\scratchdimen by \arrangedpageY
+ \global\advance\papierhoogte by -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},
+ 2*16=>\global\chardef\arrangedpageX=8
+ \global\chardef\arrangedpageY=4
+ \global\chardef\arrangedpageT=16
+ \global\chardef\horizontalcutmarks=5
+ \global\chardef\verticalcutmarks=5
+ \global\let\pusharrangedpage=\pusharrangedpageTHIRTYTWO
+ \global\let\poparrangedpages=\poparrangedpagesAB,
+ 2*8=>\global\chardef\arrangedpageX=4
+ \global\chardef\arrangedpageY=2
+ \global\chardef\arrangedpageT=8
+ \global\chardef\horizontalcutmarks=5
+ \global\chardef\verticalcutmarks=3
+ \global\let\pusharrangedpage=\pusharrangedpageSIXTEEN
+ \global\let\poparrangedpages=\poparrangedpagesAB,
+ 2*4=>\global\chardef\arrangedpageX=2
+ \global\chardef\arrangedpageY=2
+ \global\chardef\arrangedpageT=4
+ \global\chardef\horizontalcutmarks=3
+ \global\chardef\verticalcutmarks=3
+ \global\let\pusharrangedpage=\pusharrangedpageEIGHT
+ \global\let\poparrangedpages=\poparrangedpagesAB,
+ 2*2=>\global\chardef\arrangedpageX=2
+ \global\chardef\arrangedpageY=1
+ \global\chardef\arrangedpageT=2
+ \global\chardef\horizontalcutmarks=3
+ \global\chardef\verticalcutmarks=2
+ \global\let\pusharrangedpage=\pusharrangedpageFOUR
+ \global\let\poparrangedpages=\poparrangedpagesAB,
+ 2SIDE=>\global\chardef\arrangedpageX=2
+ \global\chardef\arrangedpageY=1
+ \global\chardef\arrangedpageT=2
+ \global\chardef\horizontalcutmarks=3
+ \global\chardef\verticalcutmarks=2
+ \global\let\pusharrangedpage=\pusharrangedpageSIDE
+ \global\let\poparrangedpages=\poparrangedpagesAB,
+ 2UP=>\global\chardef\arrangedpageX=2
+ \global\chardef\arrangedpageY=1
+ \global\chardef\arrangedpageT=4
+ \global\chardef\horizontalcutmarks=3
+ \global\chardef\verticalcutmarks=2
+ \global\let\handlearrangedpage=\handlearrangedpageTWOUP
+ \global\let\pusharrangedpage=\pusharrangedpageTWO
+ \global\let\poparrangedpages=\poparrangedpagesTWO,
+ 2DOWN=>\global\chardef\arrangedpageX=1
+ \global\chardef\arrangedpageY=2
+ \global\chardef\arrangedpageT=4
+ \global\chardef\horizontalcutmarks=2
+ \global\chardef\verticalcutmarks=3
+ \global\let\handlearrangedpage=\handlearrangedpageTWODOWN
+ \global\let\pusharrangedpage=\pusharrangedpageTWO
+ \global\let\poparrangedpages=\poparrangedpagesTWO,
+ \s!reset=>\global\arrangingpagesfalse,
+ \s!unknown=>\global\arrangingpagesfalse,
+ \s!default=>\global\arrangingpagesfalse]%
+ \doifcommonelse{#1}{90,270,\v!geroteerd}
+ {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
+ \setuppapersize
+ \ifarrangingpages
+ \abortutilitygeneration
+ \fi
+ \fi}
+
+% cleaner, but unchecked, and incomplete
+%
+% \def\dosetuparrangingXY#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}
+%
+% \def\dosetuparrangingOE#1#2%
+% {\gdef\arrangedrotationO{#1}%
+% \gdef\arrangedrotationE{#2}}
+%
+% \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=>\dosetuparrangingOE{90}{270},
+% 90=>\dosetuparrangingOE{90}{270},
+% 180=>\dosetuparrangingOE{180}{0},
+% 270=>\dosetuparrangingOE{270}{90},
+% 2*16=>\dosetuparrangingXY{8}{4}{16}{5}{5}
+% \pusharrangedpageTHIRTYTWO
+% \poparrangedpagesAB
+% \relax,
+% 2*8=>\dosetuparrangingXY{4}{2}{8}{5}{3}
+% \pusharrangedpageSIXTEEN
+% \poparrangedpagesAB
+% \relax,
+% 2*4=>\dosetuparrangingXY{2}{2}{4}{3}{3}
+% \pusharrangedpageEIGHT
+% \poparrangedpagesAB
+% \relax,
+% 2*2=>\dosetuparrangingXY{2}{1}{2}{3}{2}
+% \pusharrangedpageFOUR
+% \poparrangedpagesAB
+% \relax,
+% 2SIDE=>\dosetuparrangingXY{2}{1}{2}{3}{2}
+% \pusharrangedpageSIDE
+% \poparrangedpagesAB
+% \relax,
+% 2UP=>\dosetuparrangingXY{2}{1}{4}{3}{2}
+% \pusharrangedpageTWO
+% \poparrangedpagesTWO,
+% \handlearrangedpageTWOUP,
+% 2DOWN=>\dosetuparrangingXY{1}{2}{4}{2}{3}
+% \pusharrangedpageTWO
+% \poparrangedpagesTWO
+% \handlearrangedpageTWODOWN,
+% \s!reset=>\global\arrangingpagesfalse,
+% \s!unknown=>\global\arrangingpagesfalse,
+% \s!default=>\global\arrangingpagesfalse]%
+% \doifcommonelse{#1}{90,270,\v!geroteerd}
+% {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
+% \setuppapersize
+% \ifarrangingpages
+% \abortutilitygeneration
+% \fi
+% \fi}
+
+\def\filluparrangedpages% beware: \realpageno is 1 ahead
+ {\ifarrangingpages
+ \scratchcounter=-\realpageno
+ \divide\scratchcounter by \arrangedpageT
+ \multiply\scratchcounter by \arrangedpageT
+ \advance\scratchcounter by \realpageno
+ \advance\scratchcounter by -1
+ \dorecurse{\scratchcounter}
+ {\noheaderandfooterlines
+ \ejectdummypage}
+ \fi}
+
+\def\handlearrangedpageXY#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{#2}\hbox{\box#1}%
+ \vfill}%
+ \wd\scratchbox=\!!zeropoint
+ \box\scratchbox\box#5\hss}}
+
+\def\gotonextarrangepage%
+ {\global\advance\arrangeno by 1
+ \def\pagecutmarksymbol%
+ {\the\arrangeno}}
+
+\def\outputarrangedbox#1%
+ {\bgroup
+ \gotonextarrangepage
+ \ifnum\arrangedrotationO\arrangedrotationE>0
+ \ifdoublearranged
+ \ifodd\arrangeno
+ \setbox#1=\vbox{\dorotatebox\arrangedrotationO\hbox{\box#1}}%
+ \else
+ \setbox#1=\vbox{\dorotatebox\arrangedrotationE\hbox{\box#1}}%
+ \fi
+ \else
+ \setbox#1=\vbox{\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}
+
+% 32/16/8/4/SIDE
+
+\def\poparrangedpagesAB%
+ {\ifnum\arrangedpageN>0
+ \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 \handlearrangedpageXY{#1} {0}{3}{3}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1} {0}{0}{3}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1}{180}{3}{0}\arrangedpageA % 4
+ \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageA % 5
+ \or \handlearrangedpageXY{#1}{180}{3}{0}\arrangedpageB % 6
+ \or \handlearrangedpageXY{#1} {0}{3}{3}\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1} {0}{0}{3}\arrangedpageA % 8
+ \or \handlearrangedpageXY{#1}{180}{0}{2}\arrangedpageA % 9
+ \or \handlearrangedpageXY{#1}{180}{3}{2}\arrangedpageB % 10
+ \or \handlearrangedpageXY{#1} {0}{3}{1}\arrangedpageB % 11
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageA % 12
+ \or \handlearrangedpageXY{#1} {0}{3}{1}\arrangedpageA % 13
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageB % 14
+ \or \handlearrangedpageXY{#1}{180}{0}{2}\arrangedpageB % 15
+ \or \handlearrangedpageXY{#1}{180}{3}{2}\arrangedpageA % 16
+ \or \handlearrangedpageXY{#1}{180}{2}{2}\arrangedpageA % 17
+ \or \handlearrangedpageXY{#1}{180}{1}{2}\arrangedpageB % 18
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageB % 19
+ \or \handlearrangedpageXY{#1} {0}{2}{1}\arrangedpageA % 20
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageA % 21
+ \or \handlearrangedpageXY{#1} {0}{2}{1}\arrangedpageB % 22
+ \or \handlearrangedpageXY{#1}{180}{2}{2}\arrangedpageB % 23
+ \or \handlearrangedpageXY{#1}{180}{1}{2}\arrangedpageA % 24
+ \or \handlearrangedpageXY{#1} {0}{1}{3}\arrangedpageA % 25
+ \or \handlearrangedpageXY{#1} {0}{2}{3}\arrangedpageB % 26
+ \or \handlearrangedpageXY{#1}{180}{2}{0}\arrangedpageB % 27
+ \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageA % 28
+ \or \handlearrangedpageXY{#1}{180}{2}{0}\arrangedpageA % 29
+ \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 30
+ \or \handlearrangedpageXY{#1} {0}{1}{3}\arrangedpageB % 31
+ \or \handlearrangedpageXY{#1} {0}{2}{3}\arrangedpageA % 32
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXY{#1} {0}{3}{1}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1} {0}{3}{1}\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageA % 4
+ \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageA % 5
+ \or \handlearrangedpageXY{#1}{180}{3}{0}\arrangedpageB % 6
+ \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1}{180}{3}{0}\arrangedpageA % 8
+ \or \handlearrangedpageXY{#1}{180}{2}{0}\arrangedpageA % 9
+ \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 10
+ \or \handlearrangedpageXY{#1}{180}{2}{0}\arrangedpageB % 11
+ \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageA % 12
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageA % 13
+ \or \handlearrangedpageXY{#1} {0}{2}{1}\arrangedpageB % 14
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageB % 15
+ \or \handlearrangedpageXY{#1} {0}{2}{1}\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageA % 4
+ \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageA % 5
+ \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 6
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageFOUR#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageA % 4
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageSIDE#1% not ok yet
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageA % 2
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageB % 4
+ \poparrangedpages
+ \fi}
+
+% 2UP/2DOWN / 1pt prevents overflow
+
+\def\splitoffarrangedpagesTWO%
+ {\splittopskip\!!zeropoint
+ \global\setbox\arrangedpageA=\vsplit\arrangedpageB to \!!onepoint
+ \scratchdimen=\ht\arrangedpageB
+ \advance\scratchdimen by -\!!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\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>0
+ \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}}}
+
+%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]%
+ \dorecurse{\@@ipn}
+ {\dofilterpage{#1}{\recurselevel}%
+ \doifinsetelse{\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}{\torange}{1}
+ {#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!schaal=\!!thousand,\c!offset=\!!zeropoint,#2]%
+ \dorecurse{\@@ipn}
+ {\vbox to \teksthoogte
+ {\hsize=\tekstbreedte
+ \scratchdimen=\@@ipoffset
+ \centeredbox
+ {\ifdim\scratchdimen>\!!zeropoint\relax
+ \advance\vsize by -2\scratchdimen
+ \advance\hsize by -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]%
+ {\bgroup
+ \getfiguredimensions[#1]%
+ \getparameters
+ [\??ip]
+ [\c!n=\noffigurepages,\c!nx=2,\c!ny=2,
+ \c!afstand=\bodyfontsize,
+ \c!onder=\vfill,\c!boven=\vss,
+ \c!links=\hss,\c!rechts=\hss,
+ \c!voor=\pagina,\c!na=\pagina,\c!kader=,
+ #2]%
+ \@@ipvoor
+ \doglobal\newcounter\combinedpagescounter
+ \doloop
+ {\vbox to \teksthoogte
+ {\mindermeldingen
+ \hsize=\tekstbreedte
+ \scratchdimen=\@@ipafstand
+ \!!widtha=\hsize
+ \advance\!!widtha by -\@@ipnx\scratchdimen
+ \advance\!!widtha by \scratchdimen
+ \divide \!!widtha by \@@ipnx
+ \!!heighta=\vsize
+ \advance\!!heighta by -\@@ipny\scratchdimen
+ \advance\!!heighta by \scratchdimen
+ \divide \!!heighta by \@@ipny
+ \dorecurse{\@@ipny}
+ {\hbox to \hsize
+ {\dorecurse{\@@ipnx}
+ {\doglobal\increment\combinedpagescounter
+ \vbox to \!!heighta
+ {\hsize=\!!widtha
+ \vsize=\!!heighta
+ \@@ipboven
+ \hbox to \hsize
+ {\@@iplinks
+ \ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[#1]
+ [\c!pagina=\combinedpagescounter,
+ \c!factor=\v!max,
+ \c!kader=\@@ipkader]%
+ \fi
+ \@@iprechts}
+ \@@iponder}%
+ \hfil}%
+ \hfilneg}
+ \vfil}
+ \vfilneg}
+ \pagina
+ \ifnum\combinedpagescounter<\@@ipn \else\exitloop\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[pagecomment][\placepagecommentTB]}
+ {\setuppapersize[\c!boven=\vskip\@@pcoffset]%
+ \adddimenmacro\papierhoogte\@@pcoffset\@@pcoffset\to\@@pcpaperheight
+ \adddimenmacro\papierbreedte\@@pcoffset\@@pcoffset\@@pcafstand\@@pcbreedte\to\@@pcpaperwidth
+ \defineoverlay[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
+ [commentedpage]
+ [\c!hoogte=\@@pcpaperheight,
+ \c!breedte=\@@pcpaperwidth]%
+ \let\@@pcprintpapersize\printpapersize
+ \setuppapersize[\papersize][commentedpage]%
+ \setupbackgrounds[\v!papier][\c!achtergrond=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
+ \haalbuffer[pagecomm]
+ \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
+ \haalbuffer[pagecomm]
+ \global\pagecommentfalse
+ \fi
+ \vss}%
+ \doifelse{\@@pcplaats}{\v!rechts}{\hss}{\hskip\papierbreedte\hskip\@@pcafstand}%
+ \hskip\@@pcoffset}}
+
+\newif\ifpagecomment
+
+\setvalue{\e!start\e!pagecomment}%
+ {\global\pagecommenttrue
+ \dostartbuffer[pagecomm][\e!start\e!pagecomment][\e!stop\e!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]
+
+\protect \endinput
+
+% This macro cuts a page into n parts that can be pasted
+% together.
+%
+% \def\slicepages%
+% {\dodoubleempty\doslicepages}
+%
+% \def\doslicepages[#1][#2]%
+% {\bgroup
+% \getfiguredimensions[#1]
+% \getparameters[\??ip][\c!n=1,#2]
+% \definepapersize
+% [\s!dummy][\c!hoogte=\figureheight,\c!breedte=\figurewidth]
+% \setuppapersize
+% [\s!dummy][\s!dummy]
+% \setuplayout
+% [\c!rugwit=\!!zeropoint,\c!kopwit=\!!zeropoint,
+% \c!hoogte=\v!midden,\c!breedte=\v!midden,
+% \c!hoofd=\!!zeropoint,\c!voet=\!!zeropoint]
+% \dorecurse{\noffigurepages}
+% {\let\pslice=\recurselevel
+% \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=\pslice]}}
+% \pagina}}}
+% \egroup}
+%
+% \starttext
+%
+% \slicepages[slice1.pdf][n=3]
+%
+% \stoptext