diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/pack-box.mkiv')
-rw-r--r-- | Master/texmf-dist/tex/context/base/pack-box.mkiv | 905 |
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 |