%D \module %D [ file=pack-box, %D version=2002.04.12, %D title=\CONTEXT\ Packaging Macros, %D subtitle=Boxes, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %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 Packaging Macros / Boxes} % to be cleaned up (boring ... so when on long trip or so) % to be documented (up to users) % some code can be sped up %D This module contains all kind of macros for moving content %D around. Many macros here come from other modules, but %D depencies made it more clear to isolate them. % \placeornament \unprotect % we need to set the size, else we get dimensions depending % on the content, which in itself is ok, but can lead to loops % due to rounding errors (happened in demo-obv) \definelayer[\v!text-2][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight] \definelayer[\v!text-1][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight] \definelayer[\v!text+1][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight] \definelayer[\v!text+2][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight] \unexpanded\def\internaltextoverlay#1% will become more generic and installable {\startoverlay % i.e. probably an overlay by itself {\positionregionoverlay\textanchor{\v!text#1}}% see later {\composedlayer {\v!text#1}}% \stopoverlay} \defineoverlay[\v!text-2][\internaltextoverlay{-2}] \defineoverlay[\v!text-1][\internaltextoverlay{-1}] \defineoverlay[\v!text+1][\internaltextoverlay{+1}] \defineoverlay[\v!text+2][\internaltextoverlay{+2}] \installcorenamespace {anchor} \unexpanded\def\defineanchor {\doquadrupleempty\pack_anchors_define} \def\pack_anchors_define[#1][#2][#3][#4]% name targetlayer layersetting framedsetting {\setvalue{\??anchor#1}{\pack_anchors_process_defined{#2}{#3}{#4}}} \def\pack_anchors_process_defined#1#2#3% {\def\pack_anchors_process_defined_indeed[##1][##2]% {\ifsecondargument \def\next{\pack_anchors_process_indeed{#1}{#2,##1}{#3,##2}}% \else\iffirstargument \def\next{\pack_anchors_process_indeed{#1}{#2,##1}{#2,##1}}% \else \def\next{\pack_anchors_process_indeed{#1}{#2}{#3}}% \fi\fi \next}% \dodoubleempty\pack_anchors_process_defined_indeed} \unexpanded\def\anchor[#1]% {\begingroup \edef\currentanchor{#1}% \ifcsname\??anchor\currentanchor\endcsname \expandafter\pack_anchor_predefined \else \expandafter\pack_anchor_notdefined \fi} \def\pack_anchor_predefined {\csname\??anchor\currentanchor\endcsname} \def\pack_anchor_notdefined {\dodoubleempty\pack_anchor_notdefined_indeed} \def\pack_anchor_notdefined_indeed {\ifsecondargument \expandafter\pack_anchor_notdefined_two \else \expandafter\pack_anchor_notdefined_one \fi} \def\pack_anchor_notdefined_one[#1][#2]{\pack_anchors_process_indeed\currentanchor{#1}{#1}} \def\pack_anchor_notdefined_two[#1][#2]{\pack_anchors_process_indeed\currentanchor{#1}{#2}} \def\pack_anchors_process_indeed#1#2#3% {\dowithnextbox{\pack_anchors_process_finish{#1}{#2}{#3}}\vbox} \newbox \b_pack_anchors \newdimen\d_pack_anchors_width \newdimen\d_pack_anchors_height \newdimen\d_pack_anchors_depth \definelayer[anchor] % \defineoverlay[anchor][\ruledhbox{\flushlayer[anchor]}] \def\pack_anchors_process_finish#1#2#3% brrr: we need to apply offset only once .. a bit messy {\checkpositionoverlays % for the moment we ignore the depth \setbox\b_pack_anchors\box\nextbox \d_pack_anchors_width \wd\b_pack_anchors \d_pack_anchors_height\ht\b_pack_anchors \d_pack_anchors_depth \dp\b_pack_anchors \setbox\scratchbox\emptyhbox \wd\scratchbox\d_pack_anchors_width \ht\scratchbox\d_pack_anchors_height \dp\scratchbox\d_pack_anchors_depth \setlayer [anchor] [\c!width=\d_pack_anchors_width, \c!height=\d_pack_anchors_height, \c!offset=\zeropoint, #2,#3] {\setlayer[#1]{\box\b_pack_anchors}}% % #1 uses ovelaywidth/height \framed [\c!background=anchor, \c!offset=\v!overlay, \c!frame=\v!off, #3] {\box\scratchbox}% \endgroup} % collectors \installcorenamespace{collectorbox} \unexpanded\def\definecollector {\dodoubleargument\dodefinecollector} \def\dodefinecollector[#1][#2]% {\ifcsname\??collectorbox#1\endcsname \else \expandafter\newbox\csname\??collectorbox#1\endcsname \fi \resetcollector[#1]% \setupcollector [#1] [\c!state=\v!start, \c!x=\zeropoint,\c!y=\zeropoint, \c!offset=\zeropoint,\c!rotation=, % geen 0 ! \c!hoffset=\zeropoint,\c!voffset=\zeropoint, \c!location=rb,\c!corner=,#2]} \unexpanded\def\setupcollector {\dodoubleargument\dosetupcollector} \def\dosetupcollector[#1][#2]% {\def\docommand##1{\getparameters[\??cb##1][#2]}% \processcommalist[#1]\docommand} \def\setcollector {\dodoubleargument\dosetcollector} \def\dosetcollector[#1][#2]% {\bgroup \forgetall \dontcomplain \dowithnextbox {\ifcsname\??collectorbox#1\endcsname \dodosetcollector[#1][#2]% \else \writestatus{collector}{unknown layer #1}% \fi \egroup} \hbox} \def\collectorparameter#1{\csname\??cb\currentcollector#1\endcsname} \def\dodosetcollector[#1][#2]% todo: keep reference point {\def\currentcollector{#1}% \chardef\collectorbox\csname\??collectorbox#1\endcsname \getparameters[\??cb#1][#2]% \d_pack_layers_x_size\wd\collectorbox \d_pack_layers_y_size\ht\collectorbox \doifvaluesomething{\??cb#1\c!rotation} {\setbox\nextbox\hbox {\rotate [\c!location=\v!high, \c!rotation=\collectorparameter\c!rotation] {\flushnextbox}}}% \advance\d_pack_layers_y_size\dp\collectorbox \d_pack_layers_x_position\collectorparameter\c!x \advance\d_pack_layers_x_position\collectorparameter\c!hoffset \d_pack_layers_y_position\collectorparameter\c!y \advance\d_pack_layers_y_position\collectorparameter\c!voffset \doifelse\v!middle{\collectorparameter\c!corner} {\ifdim\d_pack_layers_x_size>\zeropoint \advance\d_pack_layers_x_position.5\d_pack_layers_x_size \fi \ifdim\d_pack_layers_y_size>\zeropoint \advance\d_pack_layers_y_position.5\d_pack_layers_y_size \fi}% {\normalexpanded{\noexpand\doifinset{\v!bottom}{\collectorparameter\c!corner}} {\ifdim\d_pack_layers_y_size>\zeropoint \advance\d_pack_layers_y_position-\d_pack_layers_y_size \d_pack_layers_y_position-\d_pack_layers_y_position \fi}% \normalexpanded{\noexpand\doifinset{\v!right}{\collectorparameter\c!corner}} {\ifdim\d_pack_layers_x_size>\zeropoint \advance\d_pack_layers_x_position-\d_pack_layers_x_size \d_pack_layers_x_position-\d_pack_layers_x_position \fi}}% \setbox\nextbox\hbox {\alignedbox[\collectorparameter\c!location]\vbox{\flushnextbox}}% \boxmaxdepth\zeropoint % really needed, nice example \global\advance\boxhdisplacement\d_pack_layers_x_position \ifdim\boxhdisplacement<\zeropoint \global\setbox\collectorbox\hbox {\hskip-\boxhdisplacement \box\collectorbox}% \fi \global\advance\boxvdisplacement\d_pack_layers_y_position \ifdim\boxvdisplacement<\zeropoint \global\setbox\collectorbox\hbox {\lower-\boxvdisplacement \box\collectorbox}% \fi \d_pack_layers_x_size\wd\collectorbox \d_pack_layers_y_size\ht\collectorbox \advance\d_pack_layers_y_size\dp\collectorbox \global\setbox\collectorbox\hbox {\box\collectorbox \hskip-\d_pack_layers_x_size \hskip\d_pack_layers_x_position\relax \ifdim\boxhdisplacement<\zeropoint \hskip-\boxhdisplacement \fi \lower\d_pack_layers_y_position\hbox {\ifdim\boxvdisplacement<\zeropoint \lower-\boxvdisplacement\flushnextbox \else \flushnextbox \fi}}% % combine height and depth into depth only (later flushed as height) \global\setbox\collectorbox\hbox {\lower\ht\collectorbox\box\collectorbox}% % just to be sure \ifdim\wd\collectorbox<\d_pack_layers_x_size \wd\collectorbox\d_pack_layers_x_size \fi} \def\flushcollector[#1]% {\ifcsname\??collectorbox#1\endcsname \doifnotvalue{\??cb#1\c!state}\v!stop {\vbox {\hbox {\doifelsevalue{\??cb#1\c!state}\v!repeat {\let\next\copy}{\let\next\box}% \raise\dp\csname\??collectorbox#1\endcsname \next\csname\??collectorbox#1\endcsname}}}% \else \writestatus{collector}{unknown collector #1}% \fi} \def\composedcollector#1{\flushcollector[#1]} \def\resetcollector[#1]% {\ifcsname\??collectorbox#1\endcsname \global\setbox\csname\??collectorbox#1\endcsname\emptybox \fi} \def\adaptcollector {\dodoubleargument\doadaptcollector} \def\doadaptcollector[#1][#2]% % a typical case where \global\wd looks better in the code {\bgroup \def\currentcollector{#1}% \chardef\collectorbox\csname\??collectorbox#1\endcsname \getparameters[\??cb#1][\c!voffset=\zeropoint,\c!hoffset=\zeropoint,#2]% \scratchdimen\wd\collectorbox \advance\scratchdimen\collectorparameter\c!hoffset \global\wd\collectorbox\scratchdimen \scratchdimen\ht\collectorbox \advance\scratchdimen\collectorparameter\c!voffset \global\ht\collectorbox\scratchdimen \egroup} %\definecollector[test] %\setcollector[test] % [location=rb] % {\externalfigure[koe][frame=on,width=3cm]} %\setcollector[test] % [corner={right,bottom},location={left,top}] % {\framed{gans}} %\composedcollector{test} \definecollector [caption] \def\collectedtext {\dodoubleempty\docollectedtext} \def\docollectedtext[#1][#2]#3% {\bgroup \dowithnextbox {\setcollector [caption] {\flushnextbox}% \setcollector [caption][#1] {\getparameters[\??du][\c!style=,\c!color=,#2]% \dousestyleparameter\@@dustyle \setupinterlinespace \framed % watch the special setting of kader/overlay [\c!frame=\v!overlay,\c!foregroundcolor=\@@ducolor,\c!foregroundstyle=\@@dustyle,#2] {#3}}% \composedcollector{caption}% \egroup}% \hbox} % \collectedtext % [corner={right,bottom},location={left,top}] % [background=color,backgroundcolor=white,offset=0pt] % {gans} % {\externalfigure[koe][width=3cm]} % % \collectedtext % [rotation=90,corner={right,bottom},location={right,top}] % [frame=on,offset=0pt] % {gans} % {\externalfigure[koe][width=3cm]} % % \collectedtext % [rotation=90,corner={left,bottom},location={left,top}] % [frame=on,offset=0pt] % {gans} % {\externalfigure[koe][width=3cm]} \installcorenamespace {layeredtext} \installcorenamespace {layeredtextlayer} \installcorenamespace {layeredtextframed} \installsimpleframedcommandhandler \??layeredtext {layeredtext} \??layeredtext \newdimen\d_pack_layeredtexts_width \newdimen\d_pack_layeredtexts_height \definelayer % private [\??layeredtextlayer] \setuplayer % private [\??layeredtextlayer] [\c!width=\d_pack_layeredtexts_width, \c!height=\d_pack_layeredtexts_height] \defineframed % private [\??layeredtextframed] [\c!offset=\v!overlay, \c!frame=\v!off, \c!background={\v!foreground,\??layeredtextlayer}, \c!width=\d_pack_layeredtexts_width, \c!height=\d_pack_layeredtexts_height] \setuplayeredtext % public (the attached data, usually small stuff, not the main thing) [\c!frame=\v!overlay, \c!color=, \c!style=, \c!foregroundcolor=\layeredtextparameter\c!color, \c!foregroundstyle=\layeredtextparameter\c!style] \unexpanded\def\layeredtext {\bgroup \let\currentlayeredtext\empty \dodoubleempty\pack_layeredtexts_place} \unexpanded\def\placelayeredtext[#1]% {\bgroup \edef\currentlayeredtext{#1}% \dodoubleempty\pack_layeredtexts_place} \def\pack_layeredtexts_place[#1][#2]#3% layersettings content(framed)settings content {\setupcurrentlayeredtext[#2]% \dowithnextbox {\d_pack_layeredtexts_width \wd\nextbox \d_pack_layeredtexts_height\ht\nextbox \begingroup % preserve \nextbox \setlayer [\??layeredtextlayer]% [#1]% {\setfalse\fontattributeisset \uselayeredtextstyleparameter\c!style \ifconditional\fontattributeisset \setupinterlinespace \fi \inheritedlayeredtextframed{#3}}% \endgroup \placeframed[\??layeredtextframed]{\flushnextbox}% \egroup}% \hbox} % \layeredtext % [corner={right,bottom},location={left,top}] % [background=color,backgroundcolor=white,offset=0pt] % {gans} % {\externalfigure[koe][width=3cm]} % % \layeredtext % [rotation=90,corner={right,bottom},location={right,top}] % [frame=on,offset=0pt] % {gans} % {\externalfigure[koe][width=3cm]} % % \layeredtext % [rotation=90,corner={left,bottom},location={left,top}] % [frame=on,offset=0pt] % {gans} % {\externalfigure[koe][width=3cm]} \unexpanded\def\ornamenttext {\dodoubleempty\pack_ornament_text} \def\pack_ornament_text[#1][#2]% {\bgroup \doifassignmentelse{#1} {\getdummyparameters[\c!alternative=\v!a,#1]% \doifelse{\directdummyparameter\c!alternative}\v!a {\egroup\collectedtext}% {\egroup\layeredtext }% [#1][#2]}% {\egroup\getvalue{#1}}} \unexpanded\def\defineornament {\dotripleempty\dodefineornament} \def\dodefineornament[#1][#2][#3]% {\setuvalue{#1}{\pack_ornament_text[#2][#3]}} % \defineornament % [affiliation] % [rotation=90,corner={right,bottom},location={right,top}, % hoffset=-.25ex] % [frame=on,background=color,backgroundcolor=red,offset=0pt] % % \ruledhbox{\affiliation{gans}{\externalfigure[koe][width=3cm]}} % % \defineornament % [affiliation] % [rotation=90,corner={right,bottom},location={right,top}, % hoffset=-.25ex,alternative=b] % [frame=on,background=color,backgroundcolor=red,offset=0pt] % % \ruledhbox{\affiliation{gans}{\externalfigure[koe][width=3cm]}} % % \defineornament % [affiliation] % [rotation=90,corner={right,bottom},location={left,top}, % hoffset=.25ex,voffset=.25ex,alternative=a] % [background=color,style=\ss\tfxx,backgroundcolor=white,offset=0pt] % % \affiliation{photo}{\externalfigure[molen][width=3cm]} % % \defineornament % [affiliation] % [rotation=90,corner={right,bottom},location={left,top}, % hoffset=.25ex,voffset=.25ex,alternative=b] % [background=color,style=\ss\tfxx,backgroundcolor=white,offset=0pt] % % \affiliation{drawing}{\externalfigure[hakker][width=3cm]} % pas op: aanpassen aan nieuwe layer hoek ankers en columnset \newcount\nofbleeds % per pag \unexpanded\def\setupbleeding {\dodoubleempty\getparameters[\??bg]} \setupbleeding [\c!location=l, \c!stretch=\v!yes, \c!width=3cm, \c!height=3cm, \c!offset=2mm, \c!page=\v!no, \c!voffset=\@@bgoffset, \c!hoffset=\@@bgoffset] \unexpanded\def\bleed {\dosingleempty\pack_boxes_bleed} \def\bleedwidth {\the\hsize}% \def\bleedheight{\the\vsize}% \def\pack_boxes_bleed[#1]#2% {\hbox\bgroup \xdef\bleedwidth {\the\hsize}% \xdef\bleedheight{\the\vsize}% \global\advance\nofbleeds\plusone \getparameters[\??bg][#1]% \!!doneafalse % left \!!donebfalse % right \!!donecfalse % top \!!donedfalse % bottom % replace this part ! todo: default location \processaction [\@@bglocation] [ t=>\!!donectrue\let\@@bghoffset\!!zeropoint, b=>\!!donedtrue\let\@@bghoffset\!!zeropoint, l=>\!!doneatrue\let\@@bgvoffset\!!zeropoint, r=>\!!donebtrue\let\@@bgvoffset\!!zeropoint, bl=>\!!doneatrue\!!donedtrue, lb=>\!!doneatrue\!!donedtrue, br=>\!!donebtrue\!!donedtrue, rb=>\!!donebtrue\!!donedtrue, tl=>\!!doneatrue\!!donectrue, lt=>\!!doneatrue\!!donectrue, tr=>\!!donebtrue\!!donectrue, rt=>\!!donebtrue\!!donectrue]% \doifelse\@@bgstretch\v!yes\donetrue\donefalse \scratchdimen\@@bgwidth \edef\currentbgposition {\??bg:\number\nofbleeds}% \edef\currentpageposition{page:0}% todo: per page \ifdone \if!!donea \advance\scratchdimen\dimexpr \MPx\currentbgposition-\MPx\currentpageposition\relax \else\if!!doneb \scratchdimen\dimexpr\paperwidth-\MPx\currentbgposition+\MPx\currentpageposition\relax % not checked \fi\fi \fi \advance\scratchdimen\@@bghoffset \xdef\bleedwidth{\the\scratchdimen}% \scratchdimen\@@bgheight \ifdone \if!!donec \scratchdimen\dimexpr\paperheight-\MPy\currentbgposition+\MPy\currentpageposition\relax % not checked \else\if!!doned \advance\scratchdimen\dimexpr \MPy\currentbgposition-\MPy\currentpageposition\relax % not checked \fi\fi \fi \advance\scratchdimen\@@bgvoffset \xdef\bleedheight{\the\scratchdimen}% % \bgroup \hsize\bleedwidth \vsize\bleedheight \global\setbox\globalscratchbox\hbox{#2}% \egroup \setbox\scratchbox\box\globalscratchbox % \doif\@@bgpage\v!yes {\setbox\scratchbox\topskippedbox{\box\scratchbox}}% \setbox\scratchbox\hbox to \@@bgwidth {\if!!donea\hss\fi\box\scratchbox\if!!doneb\hss\fi}% \if!!doned \setbox\scratchbox\hbox {\lower\bleedheight\hbox{\raise\@@bgheight\box\scratchbox}}% \fi \wd\scratchbox\@@bgwidth \ht\scratchbox\@@bgheight \dp\scratchbox\zeropoint \ifdone \hpos\currentbgposition{\box\scratchbox}% \else \box\scratchbox \fi \egroup} \setupbleeding [\c!stretch=\v!yes] \defineexternalfigure [bleed] % should be \v!bleed [\c!width=\bleedwidth, \c!height=\bleedheight] % \placefigure[left]{none} % {\bleed[width=5cm,height=3cm,location=lt]{\externalfigure[koe][bleed]}} % % \input tufte % % \placefigure[left]{none} % {\bleed[width=5cm,height=3cm,location=l]{\externalfigure[koe][bleed]}} % % \input tufte % % \placefigure[right]{none} % {\bleed[width=5cm,height=3cm,location=r]{\externalfigure[koe][bleed]}} % % \input tufte % % \placefigure % [top,none] % {} % no caption % {\bleed % [hoffset=-\backspace, % voffset=3mm, % width=0cm, % height=6\lineheight, % page=yes, % correct for topskip % location=lt] % {\externalfigure[koe][bleed][frame=on]}} % \setlayerframed[layer id][layer settings][framed setting]{data} % \setlayerframed[layer id][combined settings]{data} % tricky: offsets apply to both the layer and the framed; it makes sense to % only apply the offset to ... \def\setlayerframed {\dotripleempty\pack_layers_set_framed} \def\pack_layers_set_framed {\ifthirdargument \singleexpandafter\pack_layers_set_framed_t \else\ifsecondargument \doubleexpandafter\pack_layers_set_framed_d \else \doubleexpandafter\pack_layers_set_framed_s \fi\fi} \def\pack_layers_set_framed_s[#1][#2][#3]% {\setlayer[#1][\c!width=\wd\nextbox,\c!height=\ht\nextbox,\c!offset=\zeropoint]% \normalframedwithsettings[\c!location=\v!normal]} % diffrent kind of location \def\pack_layers_set_framed_d[#1][#2][#3]% {\setlayer[#1][\c!width=\wd\nextbox,\c!height=\ht\nextbox,#2,\c!offset=\zeropoint]% \normalframedwithsettings[\c!location=\v!normal,#2]} % diffrent kind of location \def\pack_layers_set_framed_t[#1][#2][#3]% {\setlayer[#1][#2]% \normalframedwithsettings[#3]} \def\setlayertext {\dotripleempty\pack_layers_set_text} \def\pack_layers_set_text[#1][#2][#3]% {\bgroup \getparameters [\??lx] [\c!align=, \c!width=\hsize, \c!color=, \c!style=, #3]% \dowithnextboxcontent {\forgetall \hsize\@@lxwidth \normalexpanded{\setupalign[\@@lxalign]}% \dousestyleparameter\@@lxstyle} {\setlayer[#1][#2]{\strut\dousecolorparameter\@@lxcolor\flushnextbox}% \egroup}% \vtop} % \setupbackgrounds % [page] % [background=pagefigures] % % \definelayer % [pagefigures] % [x=-2mm, % y=-2mm, % width=\paperwidth, % height=\paperheight] % % \definelayerpreset [lefttop] [corner={left,top},location={right,bottom}] % \definelayerpreset [righttop] [corner={right,top},location={left,bottom}] % \definelayerpreset [leftbottom] [corner={left,bottom},location={right,top}] % \definelayerpreset [rightbottom] [corner={right,bottom},location={left,top}] % \definelayerpreset [middle] [corner=middle,location=middle] % % \setlayer[pagefigures][preset=lefttop] % \setlayer[pagefigures][preset=righttop] % \setlayer[pagefigures][preset=leftbottom] % \setlayer[pagefigures][preset=rightbottom] \definelayerpreset [\v!left\v!top] [\c!corner={\v!left,\v!top},\c!location={\v!right,\v!bottom}] \definelayerpreset [\v!right\v!top] [\c!corner={\v!right,\v!top},\c!location={\v!left,\v!bottom}] \definelayerpreset [\v!left\v!bottom] [\c!corner={\v!left,\v!bottom},\c!location={\v!right,\v!top}] \definelayerpreset [\v!right\v!bottom] [\c!corner={\v!right,\v!bottom},\c!location={\v!left,\v!top}] \definelayerpreset [\v!middle] [\c!corner=\v!middle,\c!location=\v!middle] \definelayerpreset [\v!middle\v!top] [\c!location=\v!bottom,\c!corner=\v!top,\c!dx=.5\layerwidth] \definelayerpreset [\v!middle\v!bottom] [\c!location=\v!top,\c!corner=\v!bottom,\c!dx=.5\layerwidth] \definelayerpreset [\v!middle\v!left] [\c!location=\v!right,\c!corner=\v!left,\c!dy=.5\layerheight] \definelayerpreset [\v!middle\v!right] [\c!location=\v!left,\c!corner=\v!right,\c!dy=.5\layerheight] % left and right hanging: \definelayerpreset [\v!left\v!top\v!left] [\c!location={\v!left,\v!bottom},\c!corner={\v!left,\v!top}] \definelayerpreset [\v!right\v!top\v!right] [\c!location={\v!right,\v!bottom},\c!corner={\v!right,\v!top}] \installcorenamespace{alignedboxes} \unexpanded\def\alignedbox{\dosingleempty\pack_boxes_aligned_box} \unexpanded\def\aligned {\dosingleempty\pack_boxes_aligned} \def\pack_boxes_aligned_box[#1]{\bgroup\serializecommalist[#1]\dowithnextboxcs\pack_boxes_aligned_finish} \def\pack_boxes_aligned [#1]{\bgroup\serializecommalist[#1]\dowithnextboxcs\pack_boxes_aligned_finish\hbox} \def\pack_boxes_aligned_finish {\csname\??alignedboxes \ifcsname\??alignedboxes\serializedcommalist\endcsname\serializedcommalist\else\v!middle\fi \endcsname{\flushnextbox}% \egroup} \letvalue{\??alignedboxes }\middlebox \letvalue{\??alignedboxes\v!middle }\middlebox \letvalue{\??alignedboxes\v!middle\v!middle}\middlebox \letvalue{\??alignedboxes\v!left }\leftbox \letvalue{\??alignedboxes\v!left \v!top }\lefttopbox \letvalue{\??alignedboxes\v!left \v!bottom}\leftbottombox \letvalue{\??alignedboxes\v!right }\rightbox \letvalue{\??alignedboxes\v!right \v!top }\righttopbox \letvalue{\??alignedboxes\v!right \v!bottom}\rightbottombox \letvalue{\??alignedboxes\v!bottom }\bottombox \letvalue{\??alignedboxes\v!bottom\v!left }\bottomleftbox \letvalue{\??alignedboxes\v!bottom\v!right }\bottomrightbox \letvalue{\??alignedboxes\v!top }\topbox \letvalue{\??alignedboxes\v!top \v!left }\topleftbox \letvalue{\??alignedboxes\v!top \v!right }\toprightbox \letvalue{\??alignedboxes\v!line }\baselinemiddlebox % \v!grid is taken \letvalue{\??alignedboxes\v!line \v!left }\baselineleftbox \letvalue{\??alignedboxes\v!line \v!middle}\baselinemiddlebox \letvalue{\??alignedboxes\v!line \v!right }\baselinerightbox \letvalue{\??alignedboxes c}\middlebox \letvalue{\??alignedboxes l}\leftbox \letvalue{\??alignedboxes r}\rightbox \letvalue{\??alignedboxes b}\bottombox \letvalue{\??alignedboxes t}\topbox \letvalue{\??alignedboxes lt}\lefttopbox \letvalue{\??alignedboxes lb}\leftbottombox \letvalue{\??alignedboxes rt}\righttopbox \letvalue{\??alignedboxes rb}\rightbottombox \letvalue{\??alignedboxes tl}\topleftbox \letvalue{\??alignedboxes bl}\bottomleftbox \letvalue{\??alignedboxes tr}\toprightbox \letvalue{\??alignedboxes br}\bottomrightbox \letvalue{\??alignedboxes m}\middlebox \letvalue{\??alignedboxes g}\baselinemiddlebox \letvalue{\??alignedboxes gl}\baselineleftbox \letvalue{\??alignedboxes gc}\baselinemiddlebox \letvalue{\??alignedboxes gr}\baselinerightbox % left/right/top/bottomoffset -> dimensions change % x/y | method=fixed -> dimensions don't change \unexpanded\def\offsetbox{\dosingleempty\pack_boxes_offset_box} \unexpanded\def\offset {\dosingleempty\pack_boxes_offset} \def\pack_boxes_offset_box[#1]{\bgroup\dowithnextbox{\pack_boxes_offsetfinish{#1}}} \def\pack_boxes_offset [#1]{\bgroup\dowithnextbox{\pack_boxes_offsetfinish{#1}}\hbox} \def\pack_boxes_offsetfinish#1% {\getparameters[\??ox] [\c!x=\zeropoint, \c!y=\zeropoint, \c!width=\wd\nextbox, \c!height=\ht\nextbox, \c!depth=\dp\nextbox, \c!location=, \c!leftoffset=\zeropoint, \c!rightoffset=\zeropoint, \c!topoffset=\zeropoint, \c!bottomoffset=\zeropoint, \c!method=, #1]% \donefalse \ifdim\@@oxleftoffset =\zeropoint\else\donetrue\fi \ifdim\@@oxrightoffset =\zeropoint\else\donetrue\fi \ifdim\@@oxtopoffset =\zeropoint\else\donetrue\fi \ifdim\@@oxbottomoffset=\zeropoint\else\donetrue\fi \ifdone \doif\@@oxmethod\v!fixed % new {\ifdim\@@oxleftoffset=\zeropoint \ifdim\@@oxrightoffset=\zeropoint \else \edef\@@oxx{\the\dimexpr-\@@oxrightoffset}% \let\@@oxrightoffset\zeropoint \fi \else \let\@@oxx\@@oxleftoffset \let\@@oxleftoffset\zeropoint \fi \ifdim\@@oxtopoffset=\zeropoint \ifdim\@@oxbottomoffset=\zeropoint \else \edef\@@oxy{\the\dimexpr-\@@oxbottomoffset}% \let\@@oxbottomoffset\zeropoint \fi \else \let\@@oxy\@@oxtopoffset \let\@@oxtopoffset\zeropoint \fi \donefalse}% \fi \ifdone \setbox\nextbox\vbox {\forgetall % already done \offinterlineskip \vskip\@@oxtopoffset \hbox {\hskip\@@oxleftoffset \box\nextbox \hskip\@@oxrightoffset}% \vskip\@@oxbottomoffset}% \ht\nextbox\htdp\nextbox \dp\nextbox\zeropoint \fi \freezedimenmacro\@@oxwidth \freezedimenmacro\@@oxheight \freezedimenmacro\@@oxdepth \setbox\nextbox\hbox {\hskip\@@oxx\lower\@@oxy\hbox {\doifelsenothing\@@oxlocation {\box\nextbox} {\alignedbox[\@@oxlocation]\hbox{\box\nextbox}}}}% \wd\nextbox\@@oxwidth \ht\nextbox\@@oxheight \dp\nextbox\@@oxdepth \box\nextbox \egroup} % \useMPlibrary[pre] \setupbackgrounds[page][background=pagegrid] % % \placefigure[left,none]{}{\offset[leftoffset=1cm]{\externalfigure[koe][breedte=3cm]}} % \input tufte % \placefigure[left,none]{}{\offset[rightoffset=1cm]{\externalfigure[koe][breedte=3cm]}} % \input tufte % \placefigure[left,none]{}{\offset[topoffset=1cm]{\externalfigure[koe][breedte=3cm]}} % \input tufte % \placefigure[left,none]{}{\offset[bottomoffset=1cm]{\externalfigure[koe][breedte=3cm]}} % \input tufte %\ruledhbox{\offsetbox[x=-1cm,y=-1cm,location=c] % {\framed[width=4cm,height=4cm]{x}}} % Some old code: % % \ltabbed{\romannumerals{3}}{\romannumerals{1}} test \endgraf % \ltabbed{\romannumerals{3}}{\romannumerals{2}} test \endgraf % \ltabbed{\romannumerals{3}}{\romannumerals{3}} test \endgraf % % \rtabbed{\romannumerals{3}}{\romannumerals{1}} test \endgraf % \rtabbed{\romannumerals{3}}{\romannumerals{2}} test \endgraf % \rtabbed{\romannumerals{3}}{\romannumerals{3}} test \endgraf % % \ctabbed{\romannumerals{3}}{\romannumerals{1}} test \endgraf % \ctabbed{\romannumerals{3}}{\romannumerals{2}} test \endgraf % \ctabbed{\romannumerals{3}}{\romannumerals{3}} test \endgraf \def\pack_boxes_tabbed#1#2#3#4% {\dontleavehmode \begingroup \setbox\scratchbox\hbox{#3}% \hbox to \wd\scratchbox{#1#4#2}% \endgroup} \unexpanded\def\ltabbed{\pack_boxes_tabbed\relax\hss} \unexpanded\def\rtabbed{\pack_boxes_tabbed\hss \relax} \unexpanded\def\ctabbed{\pack_boxes_tabbed\hss \hss} \let\mtabbed\ctabbed % to be documented \unexpanded\def\phantombox[#1]% == \framed[\c!empty=\v!yes,\c!offset=\v!overlay,#1]{} {\hbox\bgroup \getdummyparameters [\c!width=\zeropoint,% \c!height=\zeropoint,% \c!depth=\zeropoint,#1]% \setbox\scratchbox\emptyhbox \wd\scratchbox\directdummyparameter\c!width \ht\scratchbox\directdummyparameter\c!height \dp\scratchbox\directdummyparameter\c!depth \box\scratchbox \egroup} % \backgroundimage{1}{\hsize}{\vsize}{\externalfigure[cow][\c!width=3cm]} \unexpanded\def\backgroundimage#1#2#3% repeat hsize vsize {\bgroup \forgetall \dowithnextbox{\pack_boxes_background_image{#1}{#2}{#3}}\hbox} \def\pack_boxes_background_image#1#2#3% {\offinterlineskip \ifcase#1\relax % just one \else \scratchdimen#2\divide\scratchdimen\wd\nextbox\count0\scratchdimen\advance\count0\plusone \scratchdimen#3\divide\scratchdimen\ht\nextbox\count2\scratchdimen\advance\count2\plusone % to be considered: methods \ifcase#1% \or % x and y \setbox\nextbox\hbox{\dorecurse{\count0}{\copy\nextbox}}% \setbox\nextbox\vbox{\dorecurse{\count2}{\copy\nextbox\endgraf}}% \or % x \setbox\nextbox\hbox{\dorecurse{\count0}{\copy\nextbox}}% \or % y \setbox\nextbox\vbox{\dorecurse{\count2}{\copy\nextbox\endgraf}}% \fi \fi \ifdim\wd\nextbox>#2\relax \setbox\nextbox\hbox to #2{\hss\box\nextbox\hss}% \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=#2,\c!height=\the\ht\nextbox]{\box\nextbox}}}% \fi \ifdim\ht\nextbox>#3\relax \setbox\nextbox\vbox to #3{\vss\box\nextbox\vss}% \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\wd\nextbox,\c!height=#3]{\box\nextbox}}}% \fi \box\nextbox \egroup} \protect \endinput