summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/pack-box.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/pack-box.mkiv')
-rw-r--r--Master/texmf-dist/tex/context/base/pack-box.mkiv905
1 files changed, 514 insertions, 391 deletions
diff --git a/Master/texmf-dist/tex/context/base/pack-box.mkiv b/Master/texmf-dist/tex/context/base/pack-box.mkiv
index fa771b4855a..41a17953bb1 100644
--- a/Master/texmf-dist/tex/context/base/pack-box.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-box.mkiv
@@ -5,7 +5,7 @@
%D subtitle=Boxes,
%D author=Hans Hagen,
%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
@@ -13,6 +13,8 @@
\writestatus{loading}{ConTeXt Packaging Macros / Boxes}
+% to be cleaned 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.
@@ -21,106 +23,187 @@
\unprotect
-% \definelayer[\v!tekst-2][\c!positie=\v!ja]
-% \definelayer[\v!tekst-1][\c!positie=\v!ja]
-% \definelayer[\v!tekst+1][\c!positie=\v!ja]
-% \definelayer[\v!tekst+2][\c!positie=\v!ja]
-
% we need to set the size, else we get dimensions depending
-% on the content, which in itsel fis ok, but can lead to loops
+% 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!width=\overlaywidth,\c!height=\overlayheight]
-\definelayer[\v!text-1][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
-\definelayer[\v!text+1][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
-\definelayer[\v!text+2][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+\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\positionregionlayer#1#2%
+% {\composedlayer{#2}}
+%
+% \def\internaltextoverlay#1% will become more generic and installable
+% {\startoverlay % i.e. probably an overlay by itself
+% {\positionregionoverlay\textanchor{\v!text#1}}% see later
+% {\positionregionlayer \textanchor{\v!text#1}}%
+% \stopoverlay}
\def\internaltextoverlay#1% will become more generic and installable
{\startoverlay % i.e. probably an overlay by itself
- {\positionoverlay{\v!text#1}} % see later
- {\composedlayer {\v!text#1}}
+ {\positionregionoverlay\textanchor{\v!text#1}}% see later
+ {\composedlayer {\v!text#1}}%
\stopoverlay}
-%\def\internaltextoverlay#1%
-% {\hbox to \zeropoint{\positionoverlay{\v!tekst#1}\hss}%
-% \composedlayer{\v!tekst#1}}
-
-% todo: share info, so that tuo will be smaller
-
\defineoverlay[\v!text-2][\internaltextoverlay{-2}]
\defineoverlay[\v!text-1][\internaltextoverlay{-1}]
\defineoverlay[\v!text+1][\internaltextoverlay{+1}]
\defineoverlay[\v!text+2][\internaltextoverlay{+2}]
-
+
% to be documented
-\definelayer[anchor]
+% \definelayer[anchor]
+%
+% \unexpanded\def\defineanchor
+% {\doquadrupleempty\dodefineanchor}
+%
+% \def\dodefineanchor[#1][#2][#3][#4]%
+% {\setvalue{\??an#1}{\dodefinedanchor[#2][#3][#4]}}
+%
+% \def\dodefinedanchor[#1][#2][#3]%
+% {\def\docommand[##1][##2]%
+% {\ifsecondargument
+% \def\next{\dodoanchorT[#1][#2,##1][#3,##2]}%
+% \else\iffirstargument
+% \def\next{\dodoanchorT[#1][#2,##1][#2,##1]}%
+% \else
+% \def\next{\dodoanchorT[#1][#2][#3]}%
+% \fi\fi
+% \next}%
+% \dodoubleempty\docommand}
+%
+% \unexpanded\def\anchor
+% {\dosingleargument\pack_anchor}
+%
+% \def\pack_anchor[#1]%
+% {\ifcsname\??an#1\endcsname\@EA\nonoanchor\else\@EA\dodoanchor\fi[#1]}
+%
+% \def\nonoanchor[#1]%
+% {\csname\??an#1\endcsname}
+%
+% \def\dodoanchor[#1]%
+% {\dotripleempty\dododoanchor[#1]}
+%
+% \def\dododoanchor
+% {\ifthirdargument
+% \expandafter\dodoanchorT
+% \else
+% \expandafter\dodoanchorS
+% \fi}
+%
+% \def\dodoanchorS[#1][#2][#3]%
+% {\dodoanchorT[#1][#2][#2]}
+%
+% \def\dodoanchorT[#1][#2][#3]% brrr: we need to apply offset only once .. a bit messy
+% {\dowithnextbox
+% {\bgroup
+% % \checktextbackgrounds
+% \setbox\scratchbox\emptyhbox
+% \wd\scratchbox\nextboxwd
+% \ht\scratchbox\nextboxht
+% \dp\scratchbox\nextboxdp
+% \setlayer
+% [anchor]
+% [\c!width=\wd\scratchbox,
+% \c!height=\ht\scratchbox,
+% \c!offset=\!!zeropoint,
+% #2,#3]
+% {\setlayer[#1]{\flushnextbox}}%
+% \framed
+% [#2,
+% \c!background=anchor,
+% \c!offset=\v!overlay,
+% \c!frame=\v!off,
+% #3]
+% {\box\scratchbox}%
+% \egroup}%
+% \vbox}
+
+\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\anchor
- {\dosingleargument\doanchor}
+\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}
-\def\doanchor[#1]%
- {\ifcsname\??an#1\endcsname\@EA\nonoanchor\else\@EA\dodoanchor\fi[#1]}
+\unexpanded\def\anchor[#1]%
+ {\begingroup
+ \edef\currentanchor{#1}%
+ \ifcsname\??anchor\currentanchor\endcsname
+ \expandafter\pack_anchor_predefined
+ \else
+ \expandafter\pack_anchor_notdefined
+ \fi}
-\def\nonoanchor[#1]%
- {}
+\def\pack_anchor_predefined
+ {\csname\??anchor\currentanchor\endcsname}
-\def\dodoanchor[#1]%
- {\dotripleempty\dododoanchor[#1]}
+\def\pack_anchor_notdefined
+ {\dodoubleempty\pack_anchor_notdefined_indeed}
-\def\dododoanchor
- {\ifthirdargument
- \expandafter\dodoanchorT
+\def\pack_anchor_notdefined_indeed
+ {\ifsecondargument
+ \expandafter\pack_anchor_notdefined_two
\else
- \expandafter\dodoanchorS
+ \expandafter\pack_anchor_notdefined_one
\fi}
-\def\dodoanchorS[#1][#2][#3]%
- {\dodoanchorT[#1][#2][#2]}
-
-\def\dodoanchorT[#1][#2][#3]%
- {\dowithnextbox
- {\bgroup
- \checktextbackgrounds
- \setbox\scratchbox\emptyhbox
- \wd\scratchbox\nextboxwd
- \ht\scratchbox\nextboxht
- \dp\scratchbox\nextboxdp
- \setlayer
- [anchor]
- [\c!width=\wd\scratchbox,
- \c!height=\ht\scratchbox,
- \c!offset=\!!zeropoint,
- #2,#3]
- {\setlayer[#1]{\flushnextbox}}%
- \framed
- [#2,
- \c!background=anchor,
- \c!offset=\v!overlay,
- \c!frame=\v!off,
- #3]
- {\box\scratchbox}%
- \egroup}%
- \vbox}
+\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}}
-\unexpanded\def\defineanchor
- {\doquadrupleempty\dodefineanchor}
+\def\pack_anchors_process_indeed#1#2#3%
+ {\dowithnextbox{\pack_anchors_process_finish{#1}{#2}{#3}}\vbox}
-\def\dodefineanchor[#1][#2][#3][#4]%
- {\setvalue{\??an#1}{\dodefinedanchor[#2][#3][#4]}}
+\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
-\def\dodefinedanchor[#1][#2][#3]%
- {\def\docommand[##1][##2]%
- {\ifsecondargument
- \def\next{\dodoanchorT[#1][#2,##1][#3,##2]}%
- \else\iffirstargument
- \def\next{\dodoanchorT[#1][#2,##1][#2,##1]}%
- \else
- \def\next{\dodoanchorT[#1][#2][#3]}%
- \fi\fi
- \next}%
- \dodoubleempty\docommand}
-
\def\@@collectorbox{@@collectorbox}
\unexpanded\def\definecollector
@@ -168,62 +251,62 @@
{\def\currentcollector{#1}%
\chardef\collectorbox\csname\@@collectorbox#1\endcsname
\getparameters[\??cb#1][#2]%
- \@@layerxsiz\wd\collectorbox
- \@@layerysiz\ht\collectorbox
+ \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\@@layerysiz\dp\collectorbox
- \@@layerxpos\collectorparameter\c!x
- \advance\@@layerxpos\collectorparameter\c!hoffset
- \@@layerypos\collectorparameter\c!y
- \advance\@@layerypos\collectorparameter\c!voffset
+ \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\@@layerxsiz>\zeropoint
- \advance\@@layerxpos.5\@@layerxsiz
+ {\ifdim\d_pack_layers_x_size>\zeropoint
+ \advance\d_pack_layers_x_position.5\d_pack_layers_x_size
\fi
- \ifdim\@@layerysiz>\zeropoint
- \advance\@@layerypos.5\@@layerysiz
+ \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\@@layerysiz>\zeropoint
- \advance\@@layerypos-\@@layerysiz
- \@@layerypos-\@@layerypos
+ {\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\@@layerxsiz>\zeropoint
- \advance\@@layerxpos-\@@layerxsiz
- \@@layerxpos-\@@layerxpos
+ {\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\@@layerxpos
+ \global\advance\boxhdisplacement\d_pack_layers_x_position
\ifdim\boxhdisplacement<\zeropoint
\global\setbox\collectorbox\hbox
{\hskip-\boxhdisplacement
\box\collectorbox}%
\fi
- \global\advance\boxvdisplacement\@@layerypos
+ \global\advance\boxvdisplacement\d_pack_layers_y_position
\ifdim\boxvdisplacement<\zeropoint
\global\setbox\collectorbox\hbox
{\lower-\boxvdisplacement
\box\collectorbox}%
\fi
- \@@layerxsiz\wd\collectorbox
- \@@layerysiz\ht\collectorbox
- \advance\@@layerysiz\dp\collectorbox
+ \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-\@@layerxsiz
- \hskip\@@layerxpos\relax
+ \hskip-\d_pack_layers_x_size
+ \hskip\d_pack_layers_x_position\relax
\ifdim\boxhdisplacement<\zeropoint
\hskip-\boxhdisplacement
\fi
- \lower\@@layerypos\hbox
+ \lower\d_pack_layers_y_position\hbox
{\ifdim\boxvdisplacement<\zeropoint
\lower-\boxvdisplacement\flushnextbox
\else
@@ -233,8 +316,8 @@
\global\setbox\collectorbox\hbox
{\lower\ht\collectorbox\box\collectorbox}%
% just to be sure
- \ifdim\wd\collectorbox<\@@layerxsiz
- \global\wd\collectorbox\@@layerxsiz
+ \ifdim\wd\collectorbox<\d_pack_layers_x_size
+ \wd\collectorbox\d_pack_layers_x_size
\fi}
\def\flushcollector[#1]%
@@ -260,7 +343,7 @@
\def\adaptcollector
{\dodoubleargument\doadaptcollector}
-\def\doadaptcollector[#1][#2]%
+\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
@@ -281,7 +364,7 @@
% [corner={right,bottom},location={left,top}]
% {\framed{gans}}
%\composedcollector{test}
-
+
\definecollector
[caption]
@@ -296,11 +379,12 @@
{\flushnextbox}%
\setcollector
[caption][#1]
- {\getparameters[\??du][#2]%
- \dosetfontattribute\??du\c!style\setupinterlinespace
+ {\getparameters[\??du][\c!style=,\c!color=,#2]%
+ \dousestyleparameter\@@dustyle
+ \setupinterlinespace
\framed % watch the special setting of kader/overlay
- [\c!frame=\v!overlay,#2]
- {\doattributes\??du\c!style\c!color{#3}}}%
+ [\c!frame=\v!overlay,\c!foregroundcolor=\@@ducolor,\c!foregroundstyle=\@@dustyle,#2]
+ {#3}}%
\composedcollector{caption}%
\egroup}%
\hbox}
@@ -323,37 +407,110 @@
% {gans}
% {\externalfigure[koe][width=3cm]}
-\definelayer
- [caption]
+% lean and mean:
+%
+% \installcorenamespace {layeredtext}
+%
+% \newdimen\d_pack_layeredtexts_width
+% \newdimen\d_pack_layeredtexts_height
+%
+% \definelayer
+% [\??layeredtextlayer]
+%
+% \setuplayer
+% [\??layeredtextlayer]%
+% [\c!width=\d_pack_layeredtexts_width,\c!height=\d_pack_layeredtexts_height]%
+%
+% \unexpanded\def\layeredtext
+% {\dodoubleempty\dolayeredtext}
+%
+% \def\dolayeredtext[#1][#2]#3%
+% {\bgroup
+% \dowithnextbox
+% {\d_pack_layeredtexts_width \wd\nextbox
+% \d_pack_layeredtexts_height\ht\nextbox
+% \begingroup % preserve \nextbox
+% \setlayer
+% [\??layeredtextlayer]%
+% [#1]%
+% {\getparameters[\??du][\c!style=,\c!color=,#2]%
+% \dousestyleparameter\@@dustyle
+% \setupinterlinespace
+% \framed
+% [\c!frame=\v!overlay,\c!foregroundcolor=\@@ducolor,\c!foregroundstyle=\@@dustyle,#2]%
+% {#3}}%
+% \endgroup
+% \framed
+% [\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]%
+% {\flushnextbox}%
+% \egroup}%
+% \hbox}
+%
+% maybe faster but more code:
+
+\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]
-\def\layeredtext
- {\dodoubleempty\dolayeredtext}
+\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]
-\def\dolayeredtext[#1][#2]#3%
+\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
- {\!!widtha \nextboxwd
- \!!heighta\nextboxht
- \bgroup % preserve \nextbox
- \setuplayer
- [caption]
- [\c!width=\!!widtha,\c!height=\!!heighta]%
+ {\d_pack_layeredtexts_width \wd\nextbox
+ \d_pack_layeredtexts_height\ht\nextbox
+ \begingroup % preserve \nextbox
\setlayer
- [caption]
- [#1]
- {\getparameters[\??du][#2]%
- \dosetfontattribute\??du\c!style\setupinterlinespace
- \framed
- [\c!frame=\v!overlay,,#2]
- {\doattributes\??du\c!style\c!color{#3}}}%
- \egroup
- \framed
- [\c!offset=\v!overlay,
- \c!frame=\v!off,
- \c!background={\v!foreground,caption},
- \c!width=\!!widtha,
- \c!height=\!!heighta]
- {\flushnextbox}%
+ [\??layeredtextlayer]%
+ [#1]%
+ {\setfalse\fontattributeisset
+ \uselayeredtextstyleparameter\c!style
+ \ifconditional\fontattributeisset
+ \setupinterlinespace
+ \fi
+ \inheritedlayeredtextframed{#3}}%
+ \endgroup
+ \placeframed[\??layeredtextframed]{\flushnextbox}%
\egroup}%
\hbox}
@@ -444,12 +601,12 @@
\c!hoffset=\@@bgoffset]
\unexpanded\def\bleed
- {\dosingleempty\dobleed}
+ {\dosingleempty\pack_boxes_bleed}
\def\bleedwidth {\the\hsize}%
\def\bleedheight{\the\vsize}%
-\def\dobleed[#1]#2%
+\def\pack_boxes_bleed[#1]#2%
{\hbox\bgroup
\xdef\bleedwidth {\the\hsize}%
\xdef\bleedheight{\the\vsize}%
@@ -553,33 +710,41 @@
% 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\dosetlayerframed}
+ {\dotripleempty\pack_layers_set_framed}
-\def\dosetlayerframed
+\def\pack_layers_set_framed
{\ifthirdargument
- \expandafter\dosetlayerframedT
+ \singleexpandafter\pack_layers_set_framed_t
+ \else\ifsecondargument
+ \doubleexpandafter\pack_layers_set_framed_d
\else
- \expandafter\dosetlayerframedS
- \fi}
+ \doubleexpandafter\pack_layers_set_framed_s
+ \fi\fi}
-\def\dosetlayerframedT[#1][#2][#3]%
- {\dowithnextbox{\setlayer[#1][#2]{\flushnextbox}}%
- \hbox\framed[#3]}
+\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\dosetlayerframedS[#1][#2][#3]%
- {\dowithnextbox % we could use a local setlayer command (no doif..empty) which also saves a nextbox
- {\setlayer[#1][\c!width=\nextboxwd,\c!height=\nextboxht,\c!offset=\!!zeropoint,#2]{\flushnextbox}}%
- \hbox\framed[\c!location=\v!normal,#2]}
-
\def\setlayertext
- {\dotripleempty\dosetlayertext}
+ {\dotripleempty\pack_layers_set_text}
-\def\dosetlayertext[#1][#2][#3]%
+\def\pack_layers_set_text[#1][#2][#3]%
{\bgroup
\getparameters
[\??lx]
@@ -591,12 +756,12 @@
\dowithnextboxcontent
{\forgetall
\hsize\@@lxwidth
- \expanded{\setupalign[\@@lxalign]}%
- \dosetfontattribute\??lx\c!style}
- {\setlayer[#1][#2]{\strut\color[\@@lxcolor]{\flushnextbox}}%
+ \normalexpanded{\setupalign[\@@lxalign]}%
+ \dousestyleparameter\@@lxstyle}
+ {\setlayer[#1][#2]{\strut\dousecolorparameter\@@lxcolor\flushnextbox}%
\egroup}%
\vtop}
-
+
% \setupbackgrounds
% [page]
% [background=pagefigures]
@@ -670,159 +835,145 @@
\definelayerpreset
[\v!middle\v!right]
[\c!location=\v!left,\c!corner=\v!right,\c!dy=.5\layerheight]
-
-\def\alignedbox
- {\dodoubleempty\doalignedbox[]}
-% \def\doalignedbox[#1][#2]%
-% {\bgroup
-% %\let\iftraceboxplacement\iftracelayers % ugly
-% \dowithnextbox
-% {\let\next\middlebox
-% \processaction
-% [#2]
-% [ t=>\let\next\topbox , b=>\let\next\bottombox ,
-% l=>\let\next\leftbox , r=>\let\next\rightbox ,
-% bl=>\let\next\bottomleftbox,br=>\let\next\bottomrightbox,
-% tl=>\let\next\topleftbox ,tr=>\let\next\toprightbox ,
-% lt=>\let\next\lefttopbox ,lb=>\let\next\leftbottombox ,
-% rt=>\let\next\righttopbox ,rb=>\let\next\rightbottombox]%
-% \next{\flushnextbox}%
-% \egroup}#1}
-
-\def\doalignedbox[#1][#2]%
- {\bgroup
- %\let\iftraceboxplacement\iftracelayers % ugly
- \dowithnextbox
- {\serializecommalist[#2]%
- \executeifdefined{\??ab\??ab\serializedcommalist}\middlebox{\flushnextbox}%
- \egroup}#1}
-
-\setvalue{\??ab\??ab }{\middlebox}
-\setvalue{\??ab\??ab\v!middle }{\middlebox}
-\setvalue{\??ab\??ab\v!left }{\leftbox }
-\setvalue{\??ab\??ab\v!right }{\rightbox }
-\setvalue{\??ab\??ab\v!bottom }{\bottombox}
-\setvalue{\??ab\??ab\v!top }{\topbox }
-
-\setvalue{\??ab\??ab\v!middle\v!middle}{\middlebox}
-\setvalue{\??ab\??ab\v!left \v!top }{\lefttopbox}
-\setvalue{\??ab\??ab\v!left \v!bottom}{\leftbottombox}
-\setvalue{\??ab\??ab\v!right \v!top }{\righttopbox}
-\setvalue{\??ab\??ab\v!right \v!bottom}{\rightbottombox}
-\setvalue{\??ab\??ab\v!top \v!left }{\topleftbox}
-\setvalue{\??ab\??ab\v!bottom\v!left }{\bottomleftbox}
-\setvalue{\??ab\??ab\v!top \v!right }{\toprightbox}
-\setvalue{\??ab\??ab\v!bottom\v!right }{\bottomrightbox}
-
-\setvalue{\??ab\??ab c}{\middlebox}
-\setvalue{\??ab\??ab l}{\leftbox}
-\setvalue{\??ab\??ab r}{\rightbox}
-\setvalue{\??ab\??ab b}{\bottombox}
-\setvalue{\??ab\??ab t}{\topbox}
-
-\setvalue{\??ab\??ab lt}{\lefttopbox}
-\setvalue{\??ab\??ab lb}{\leftbottombox}
-\setvalue{\??ab\??ab rt}{\righttopbox}
-\setvalue{\??ab\??ab rb}{\rightbottombox}
-\setvalue{\??ab\??ab tl}{\topleftbox}
-\setvalue{\??ab\??ab bl}{\bottomleftbox}
-\setvalue{\??ab\??ab tr}{\toprightbox}
-\setvalue{\??ab\??ab br}{\bottomrightbox}
-
-\setvalue{\??ab\??ab m}{\middlebox}
-
-% The next ones were desparately needed by Vit Zyka (see
-% \type {supp-box} for definitions).
-
-\setvalue{\??ab\??ab g}{\baselinemiddlebox}
-\setvalue{\??ab\??ab gl}{\baselineleftbox}
-\setvalue{\??ab\??ab gc}{\baselinemiddlebox}
-\setvalue{\??ab\??ab gr}{\baselinerightbox}
-
-\setvalue{\??ab\??ab \v!line }{\baselinemiddlebox} % \v!grid is taken
-\setvalue{\??ab\??ab \v!line\v!left }{\baselineleftbox}
-\setvalue{\??ab\??ab \v!line\v!middle}{\baselinemiddlebox}
-\setvalue{\??ab\??ab \v!line\v!right }{\baselinerightbox}
-
-\unexpanded\def\offsetbox
- {\dodoubleempty\dooffsetbox[]}
+% 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
-\def\dooffsetbox[#1][#2]%
- {\bgroup
- \dowithnextbox
- {\getparameters[\??ox]
- [\c!x=\zeropoint,
- \c!y=\zeropoint,
- \c!width=\nextboxwd,
- \c!height=\nextboxht,
- \c!depth=\nextboxdp,
- \c!location=,
- \c!leftoffset=\zeropoint,
- \c!rightoffset=\zeropoint,
- \c!topoffset=\zeropoint,
- \c!bottomoffset=\zeropoint,
- \c!method=,
- #2]%
- \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
- \scratchdimen-\@@oxrightoffset
- \edef\@@oxx{\the\scratchdimen}%
- \let\@@oxrightoffset\zeropoint
- \fi
- \else
- \let\@@oxx\@@oxleftoffset
- \let\@@oxleftoffset\zeropoint
- \fi
- \ifdim\@@oxtopoffset=\zeropoint
- \ifdim\@@oxbottomoffset=\zeropoint \else
- \scratchdimen-\@@oxbottomoffset
- \edef\@@oxy{\the\scratchdimen}%
- \let\@@oxbottomoffset\zeropoint
- \fi
- \else
- \let\@@oxy\@@oxtopoffset
- \let\@@oxtopoffset\zeropoint
- \fi
- \donefalse}%
- \fi
- \ifdone
- \setbox\nextbox\vbox
- {\forgetall\offinterlineskip
- \vskip\@@oxtopoffset
- \hbox
- {\hskip\@@oxleftoffset
- \flushnextbox
- \hskip\@@oxrightoffset}%
- \vskip\@@oxbottomoffset}%
- \scratchdimen\nextboxht
- \advance\scratchdimen\nextboxdp
- \nextboxht\scratchdimen
- \nextboxdp\zeropoint
- \fi
- \freezedimenmacro\@@oxwidth
- \freezedimenmacro\@@oxheight
- \freezedimenmacro\@@oxdepth
- \setbox\nextbox\hbox
- {\hskip\@@oxx\lower\@@oxy\hbox
- {\doifelsenothing\@@oxlocation
- {\flushnextbox}
- {\alignedbox[\@@oxlocation]\hbox{\flushnextbox}}}}%
- \nextboxwd\@@oxwidth
- \nextboxht\@@oxheight
- \nextboxdp\@@oxdepth
- \flushnextbox
- \egroup}#1}
+\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=\nextboxwd,
+ \c!height=\nextboxht,
+ \c!depth=\nextboxdp,
+ \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]
%
@@ -834,73 +985,43 @@
% \input tufte
% \placefigure[left,none]{}{\offset[bottomoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
% \input tufte
-
-\unexpanded\def\offset {\dodoubleempty\dooffsetbox [\hbox]} % yes or no
-\unexpanded\def\aligned{\dosingleempty\doalignedbox[\hbox]} % yes or no
%\ruledhbox{\offsetbox[x=-1cm,y=-1cm,location=c]
% {\framed[width=4cm,height=4cm]{x}}}
-
-\def\dotabbed#1#2#3#4%
+
+% 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
- \bgroup
+ \begingroup
\setbox\scratchbox\hbox{#3}%
\hbox to \wd\scratchbox{#1#4#2}%
- \egroup}
+ \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
-\unexpanded\def\ltabbed{\dotabbed\relax\hss}
-\unexpanded\def\rtabbed{\dotabbed\hss \relax}
-\unexpanded\def\ctabbed{\dotabbed\hss \hss} \let\mtabbed\ctabbed
-
-% \ltabbed{\romeins{3}}{\romeins{1}} test \endgraf
-% \ltabbed{\romeins{3}}{\romeins{2}} test \endgraf
-% \ltabbed{\romeins{3}}{\romeins{3}} test \endgraf
-%
-% \rtabbed{\romeins{3}}{\romeins{1}} test \endgraf
-% \rtabbed{\romeins{3}}{\romeins{2}} test \endgraf
-% \rtabbed{\romeins{3}}{\romeins{3}} test \endgraf
-%
-% \ctabbed{\romeins{3}}{\romeins{1}} test \endgraf
-% \ctabbed{\romeins{3}}{\romeins{2}} test \endgraf
-% \ctabbed{\romeins{3}}{\romeins{3}} test \endgraf
-
-% alternative, if done, then other name
-%
-% \def\dotabbed#1#2#3#4%
-% {\dontleavehmode
-% \bgroup
-% \scratchdimen\zeropoint
-% \def\docommand##1%
-% {\setbox\scratchbox\hbox{##1}%
-% \ifdim\wd\scratchbox>\scratchdimen
-% \scratchdimen\wd\scratchbox
-% \fi}%
-% \processcommalist[#3]\docommand
-% \hbox to \scratchdimen{#1#4#2}%
-% \egroup}
-%
-% \def\ltabbed{\dotabbed\relax\hss}
-% \def\rtabbed{\dotabbed\hss \relax}
-% \def\ctabbed{\dotabbed\hss \hss} \let\mtabbed\ctabbed
-%
-% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
-% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
-% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
-%
-% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
-% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
-% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
-%
-% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
-% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
-% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
-
% to be documented
-\unexpanded\def\phantombox[#1]%
+\unexpanded\def\phantombox[#1]% == \framed[\c!empty=\v!yes,\c!offset=\v!overlay,#1]{}
{\hbox\bgroup
\getparameters
- [\??ol]
+ [\??ol] % brrr
[\c!width=\zeropoint,%
\c!height=\zeropoint,%
\c!depth=\zeropoint,#1]%
@@ -910,39 +1031,41 @@
\dp\scratchbox\@@oldepth
\box\scratchbox
\egroup}
-
+
% \backgroundimage{1}{\hsize}{\vsize}{\externalfigure[cow][\c!width=3cm]}
\unexpanded\def\backgroundimage#1#2#3% repeat hsize vsize
{\bgroup
\forgetall
- \dowithnextbox
- {\offinterlineskip
- \ifcase#1\relax
- % just one
- \else
- \scratchdimen#2\divide\scratchdimen\nextboxwd\count0\scratchdimen\advance\count0\plusone
- \scratchdimen#3\divide\scratchdimen\nextboxht\count2\scratchdimen\advance\count2\plusone
- % to be considered, probably 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\nextboxwd>#2\relax
- \setbox\nextbox\hbox to #2{\hss\flushnextbox\hss}%
- \setbox\nextbox\hbox{\expanded{\clip[\c!width=#2,\c!height=\the\nextboxht]{\flushnextbox}}}%
- \fi
- \ifdim\nextboxht>#3\relax
- \setbox\nextbox\vbox to #3{\vss\flushnextbox\vss}%
- \setbox\nextbox\hbox{\expanded{\clip[\c!width=\the\nextboxwd,\c!height=#3]{\flushnextbox}}}%
- \fi
- \flushnextbox
- \egroup}%
- \hbox}
-
+ \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