summaryrefslogtreecommitdiff
path: root/tex/context/base/pack-box.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/pack-box.mkiv')
-rw-r--r--tex/context/base/pack-box.mkiv881
1 files changed, 468 insertions, 413 deletions
diff --git a/tex/context/base/pack-box.mkiv b/tex/context/base/pack-box.mkiv
index bcdb93875..41a17953b 100644
--- a/tex/context/base/pack-box.mkiv
+++ b/tex/context/base/pack-box.mkiv
@@ -13,24 +13,36 @@
\writestatus{loading}{ConTeXt Packaging Macros / Boxes}
-%D This module contains all kind of macros for moving content around. Many
-%D macros here come from other modules, but depencies made it more clear
-%D to isolate them. We invite users to document the macros. They can be
-%D handy shortcuts for otherwise complex tasks.
+% 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.
+
+% \placeornament
\unprotect
-%D We need to set the size, else we get dimensions depending on the content,
-%D which in itself is ok, but can lead to loops due to rounding errors (happened
-%D in demo-obv).
+% 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
+% \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
{\positionregionoverlay\textanchor{\v!text#1}}% see later
{\composedlayer {\v!text#1}}%
\stopoverlay}
@@ -40,6 +52,75 @@
\defineoverlay[\v!text+1][\internaltextoverlay{+1}]
\defineoverlay[\v!text+2][\internaltextoverlay{+2}]
+% to be documented
+
+% \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
@@ -113,7 +194,7 @@
\c!offset=\zeropoint,
#2,#3]
{\setlayer[#1]{\box\b_pack_anchors}}% % #1 uses ovelaywidth/height
- \framed % could be a predefined framed
+ \framed
[\c!background=anchor,
\c!offset=\v!overlay,
\c!frame=\v!off,
@@ -123,182 +204,157 @@
% collectors
-\installcorenamespace{collectorbox}
-\installcorenamespace{collector}
-
-\installcommandhandler \??collector {collector} \??collector
-
-\setupcollector
- [\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=]
-
-\appendtoks
- \ifcsname\??collectorbox\currentcollector\endcsname \else
- \expandafter\newbox\csname\??collectorbox\currentcollector\endcsname
- \fi
-\to \everydefinecollector
-
-\unexpanded\def\resetcollector[#1]%
- {\ifcsname\??collectorbox#1\endcsname
- \global\setbox\csname\??collectorbox#1\endcsname\emptybox
- \fi}
+\def\@@collectorbox{@@collectorbox}
-\newconditional\c_pack_boxes_collector_valid_box
-
-\let\b_pack_boxes_collector\scratchbox
-
-\def\pack_boxes_collector_check_box#1%
- {\edef\currentcollector{#1}%
- \ifcsname\??collectorbox\currentcollector\endcsname
- \settrue\c_pack_boxes_collector_valid_box
- \expandafter\let\expandafter\b_pack_boxes_collector\csname\??collectorbox\currentcollector\endcsname
- \else
- \setfalse\c_pack_boxes_collector_valid_box
- \writestatus{collector}{unknown collector \currentcollector}%
- \fi}
+\unexpanded\def\definecollector
+ {\dodoubleargument\dodefinecollector}
-\unexpanded\def\setcollector
+\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
- \dodoubleargument\pack_boxes_collector}
-
-\def\pack_boxes_collector[#1][#2]% todo: keep reference point
- {\pack_boxes_collector_check_box{#1}%
- \ifconditional\c_pack_boxes_collector_valid_box
- \setupcurrentcollector[#2]
- \expandafter\pack_boxes_collector_yes
- \else
- \expandafter\pack_boxes_collector_nop
- \fi}
-
-\def\pack_boxes_collector_yes
- {\forgetall
+ \forgetall
\dontcomplain
- \dowithnextboxcs\pack_boxes_collector_finish\hbox}
-
-\def\pack_boxes_collector_nop
- {\egroup}
-
-\installcorenamespace{collectorcorners}
-
-\setvalue{\??collectorcorners\v!middle}%
- {\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}
-
-\setvalue{\??collectorcorners\v!bottom}%
- {\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}
-
-\setvalue{\??collectorcorners\v!right}%
- {\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}
-
-\def\pack_boxes_collector_check_corner#1%
- {\ifcsname\??collectorcorners#1\endcsname
- \csname\??collectorcorners#1\endcsname
- \fi}
+ \dowithnextbox
+ {\ifcsname\@@collectorbox#1\endcsname
+ \dodosetcollector[#1][#2]%
+ \else
+ \writestatus{collector}{unknown layer #1}%
+ \fi
+ \egroup}
+ \hbox}
-\def\pack_boxes_collector_finish
- {\edef\p_collector_rotation{\collectorparameter\c!rotation}%
- \edef\p_collector_corner {\collectorparameter\c!corner}%
- \ifx\p_collector_rotation\empty \else
- \setbox\nextbox\hbox
- {\rotate
- [\c!location=\v!high,
- \c!rotation=\p_collector_rotation]
- {\box\nextbox}}%
- \fi
- \d_pack_layers_x_size\wd\b_pack_boxes_collector
- \d_pack_layers_y_size\htdp\b_pack_boxes_collector
- \d_pack_layers_x_position\dimexpr\collectorparameter\c!x+\collectorparameter\c!hoffset\relax
- \d_pack_layers_y_position\dimexpr\collectorparameter\c!y+\collectorparameter\c!voffset\relax
- \rawprocesscommacommand[\p_collector_corner]\pack_boxes_collector_check_corner
+\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{\box\nextbox}}%
+ {\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\b_pack_boxes_collector\hbox
+ \global\setbox\collectorbox\hbox
{\hskip-\boxhdisplacement
- \box\b_pack_boxes_collector}%
+ \box\collectorbox}%
\fi
\global\advance\boxvdisplacement\d_pack_layers_y_position
\ifdim\boxvdisplacement<\zeropoint
- \global\setbox\b_pack_boxes_collector\hbox
+ \global\setbox\collectorbox\hbox
{\lower-\boxvdisplacement
- \box\b_pack_boxes_collector}%
+ \box\collectorbox}%
\fi
- \d_pack_layers_x_size\wd\b_pack_boxes_collector
- \d_pack_layers_y_size\htdp\b_pack_boxes_collector
- \global\setbox\b_pack_boxes_collector\hbox
- {\box\b_pack_boxes_collector
- \hskip\dimexpr
- -\d_pack_layers_x_size
- +\d_pack_layers_x_position
- \ifdim\boxhdisplacement<\zeropoint
- -\boxhdisplacement
- \fi
- \relax
+ \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
- \fi
- \box\nextbox}}%
+ \lower-\boxvdisplacement\flushnextbox
+ \else
+ \flushnextbox
+ \fi}}%
% combine height and depth into depth only (later flushed as height)
- \global\setbox\b_pack_boxes_collector\hbox
- {\lower\ht\b_pack_boxes_collector\box\b_pack_boxes_collector}%
+ \global\setbox\collectorbox\hbox
+ {\lower\ht\collectorbox\box\collectorbox}%
% just to be sure
- \ifdim\wd\b_pack_boxes_collector<\d_pack_layers_x_size
- \wd\b_pack_boxes_collector\d_pack_layers_x_size
- \fi
- \egroup}
+ \ifdim\wd\collectorbox<\d_pack_layers_x_size
+ \wd\collectorbox\d_pack_layers_x_size
+ \fi}
-\unexpanded\def\flushcollector[#1]%
- {\bgroup
- \pack_boxes_collector_check_box{#1}%
- \ifconditional\c_pack_boxes_collector_valid_box
- \edef\p_collector_state{\collectorparameter\c!state}%
- \ifx\p_collector_state\v!stop \else
- \vbox{\hbox{\raise
- \dp\b_pack_boxes_collector
- \ifx\p_collector_state\v!repeat\copy\else\box\fi\b_pack_boxes_collector}}%
- \fi
- \fi
- \egroup}
+\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}
-\unexpanded\def\composedcollector#1% no [], handy as argument
- {\flushcollector[#1]}
+\def\composedcollector#1{\flushcollector[#1]}
-\unexpanded\def\adaptcollector
- {\dodoubleargument\pack_boxes_collector_adapt}
+\def\resetcollector[#1]%
+ {\ifcsname\@@collectorbox#1\endcsname
+ \global\setbox\csname\@@collectorbox#1\endcsname\emptybox
+ \fi}
-\def\pack_boxes_collector_adapt[#1][#2]% % a typical case where \global\wd looks better in the code
- {\begingroup
- \pack_boxes_collector_check_box{#1}%
- \ifconditional\c_pack_boxes_collector_valid_box
- \letcollectorparameter\c!voffset\zeropoint
- \letcollectorparameter\h!voffset\zeropoint
- \ifsecondargument
- \setupcurrentcollector[#2]%
- \fi
- \global\wd\b_pack_boxes_collector\dimexpr\wd\b_pack_boxes_collector+\collectorparameter\c!hoffset\relax
- \global\ht\b_pack_boxes_collector\dimexpr\ht\b_pack_boxes_collector+\collectorparameter\c!voffset\relax
- \fi
- \endgroup}
+\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]
@@ -312,23 +368,23 @@
\definecollector
[caption]
-\unexpanded\def\collectedtext % for captions
- {\bgroup
- \dodoubleempty\pack_boxes_collector_text}
+\def\collectedtext
+ {\dodoubleempty\docollectedtext}
-\def\pack_boxes_collector_text[#1][#2]#3%
- {\dowithnextbox
+\def\docollectedtext[#1][#2]#3%
+ {\bgroup
+ \dowithnextbox
{\setcollector
[caption]
- {\box\nextbox}%
+ {\flushnextbox}%
\setcollector
[caption][#1]
- {\letdummyparameter\c!style\empty
- \letdummyparameter\c!color\empty
- \getdummyparameters[#2]%
- \dousestyleparameter{\directdummyparameter\c!style}%
+ {\getparameters[\??du][\c!style=,\c!color=,#2]%
+ \dousestyleparameter\@@dustyle
\setupinterlinespace
- \normalexpanded{\framed[\c!foregroundcolor=\directdummyparameter\c!color,\c!foregroundstyle=\directdummyparameter\c!style},\c!frame=\v!overlay,#2]{#3}}%
+ \framed % watch the special setting of kader/overlay
+ [\c!frame=\v!overlay,\c!foregroundcolor=\@@ducolor,\c!foregroundstyle=\@@dustyle,#2]
+ {#3}}%
\composedcollector{caption}%
\egroup}%
\hbox}
@@ -350,6 +406,51 @@
% [frame=on,offset=0pt]
% {gans}
% {\externalfigure[koe][width=3cm]}
+
+% 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}
@@ -430,16 +531,15 @@
% [frame=on,offset=0pt]
% {gans}
% {\externalfigure[koe][width=3cm]}
+
+\def\ornamenttext
+ {\dodoubleempty\doornamenttext}
-\unexpanded\def\ornamenttext
- {\dodoubleempty\pack_ornament_text}
-
-\def\pack_ornament_text[#1][#2]%
+\def\doornamenttext[#1][#2]%
{\bgroup
\doifassignmentelse{#1}
- {\letdummyparameter\c!alternative\v!a
- \getdummyparameters[#1]%
- \doifelse{\directdummyparameter\c!alternative}\v!a
+ {\getparameters[\s!dummy][\c!alternative=\v!a,#1]%
+ \doifelse\dummyalternative\v!a
{\egroup\collectedtext}%
{\egroup\layeredtext }%
[#1][#2]}%
@@ -449,7 +549,7 @@
{\dotripleempty\dodefineornament}
\def\dodefineornament[#1][#2][#3]%
- {\setuvalue{#1}{\pack_ornament_text[#2][#3]}}
+ {\setvalue{#1}{\doornamenttext[#2][#3]}}
% \defineornament
% [affiliation]
@@ -482,12 +582,13 @@
% [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\c_pack_boxes_bleeds
-
-\installcorenamespace {bleeding}
+\newcount\nofbleeds % per pag
-\installdirectcommandhandler \??bleeding {bleeding} % \??bleeding
+\unexpanded\def\setupbleeding
+ {\dodoubleempty\getparameters[\??bg]}
\setupbleeding
[\c!location=l,
@@ -496,117 +597,92 @@
\c!height=3cm,
\c!offset=2mm,
\c!page=\v!no,
- \c!voffset=\scratchoffset, % is set to \bleedingparameter\c!offset
- \c!hoffset=\scratchoffset] % which often saves one resolve
+ \c!voffset=\@@bgoffset,
+ \c!hoffset=\@@bgoffset]
-\def\bleedwidth {\the\hsize} % these are global !
-\def\bleedheight{\the\vsize} % these are global !
+\unexpanded\def\bleed
+ {\dosingleempty\pack_boxes_bleed}
-\newconditional\c_pack_boxes_l
-\newconditional\c_pack_boxes_r
-\newconditional\c_pack_boxes_t
-\newconditional\c_pack_boxes_b
+\def\bleedwidth {\the\hsize}%
+\def\bleedheight{\the\vsize}%
-\unexpanded\def\bleed
+\def\pack_boxes_bleed[#1]#2%
{\hbox\bgroup
- \dosingleempty\pack_boxes_bleed}
-
-\installcorenamespace{bleedinglocation}
-
-\setvalue{\??bleedinglocation t}{\settrue\c_pack_boxes_t\scratchhoffset\zeropoint}
-\setvalue{\??bleedinglocation b}{\settrue\c_pack_boxes_b\scratchhoffset\zeropoint}
-\setvalue{\??bleedinglocation l}{\settrue\c_pack_boxes_l\scratchvoffset\zeropoint}
-\setvalue{\??bleedinglocation r}{\settrue\c_pack_boxes_r\scratchvoffset\zeropoint}
-\setvalue{\??bleedinglocation bl}{\settrue\c_pack_boxes_l\settrue\c_pack_boxes_b}
-\setvalue{\??bleedinglocation lb}{\settrue\c_pack_boxes_l\settrue\c_pack_boxes_b}
-\setvalue{\??bleedinglocation br}{\settrue\c_pack_boxes_r\settrue\c_pack_boxes_b}
-\setvalue{\??bleedinglocation rb}{\settrue\c_pack_boxes_r\settrue\c_pack_boxes_b}
-\setvalue{\??bleedinglocation tl}{\settrue\c_pack_boxes_l\settrue\c_pack_boxes_t}
-\setvalue{\??bleedinglocation lt}{\settrue\c_pack_boxes_l\settrue\c_pack_boxes_t}
-\setvalue{\??bleedinglocation tr}{\settrue\c_pack_boxes_r\settrue\c_pack_boxes_t}
-\setvalue{\??bleedinglocation rt}{\settrue\c_pack_boxes_r\settrue\c_pack_boxes_t}
-
-\def\pack_boxes_bleed[#1]%
- {\global\advance\c_pack_boxes_bleeds\plusone
- %
\xdef\bleedwidth {\the\hsize}%
\xdef\bleedheight{\the\vsize}%
- %
- \edef\currentbgposition {bleed:\number\c_pack_boxes_bleeds}%
+ \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}%
%
- \setupcurrentbleeding[#1]%
- %
- \scratchwidth \bleedingparameter\c!width
- \scratchheight \bleedingparameter\c!height
- \scratchoffset \bleedingparameter\c!offset
- \scratchhoffset\bleedingparameter\c!hoffset
- \scratchvoffset\bleedingparameter\c!voffset
- %
- \setfalse\c_pack_boxes_l % left
- \setfalse\c_pack_boxes_r % right
- \setfalse\c_pack_boxes_t % top
- \setfalse\c_pack_boxes_b % bottom
- %
- \csname\??bleedinglocation\bleedingparameter\c!location\endcsname
- %
- \doifelse{\bleedingparameter\c!stretch}\v!yes\donetrue\donefalse
+ \bgroup
+ \hsize\bleedwidth
+ \vsize\bleedheight
+ \global\setbox\globalscratchbox\hbox{#2}%
+ \egroup
+ \setbox\scratchbox\box\globalscratchbox
%
- \xdef\bleedwidth{\dimexpr
- \ifdone
- \ifconditional\c_pack_boxes_l
- \scratchwidth+\MPx\currentbgposition-\MPx\currentpageposition
- \else\ifconditional\c_pack_boxes_r
- \paperwidth -\MPx\currentbgposition+\MPx\currentpageposition % not checked
- \else
- \scratchwidth
- \fi\fi
- \else
- \scratchwidth
- \fi+\scratchhoffset}%
- \xdef\bleedheight{\dimexpr
- \ifdone
- \ifconditional\c_pack_boxes_t
- \paperheight -\MPy\currentbgposition+\MPy\currentpageposition % not checked
- \else\ifconditional\c_pack_boxes_b
- \scratchheight+\MPy\currentbgposition-\MPy\currentpageposition % not checked
- \else
- \scratchheight
- \fi\fi
- \else
- \scratchheight
- \fi+\scratchvoffset}%
- \dowithnextboxcontentcs\pack_boxes_bleed_settings\pack_boxes_bleed_finish\hbox}
-
-\def\pack_boxes_bleed_settings
- {\hsize\bleedwidth
- \vsize\bleedheight}
-
-\def\pack_boxes_bleed_finish
- {\doif{\bleedingparameter\c!page}\v!yes
- {\setbox\nextbox\topskippedbox{\box\nextbox}}%
- \setbox\nextbox\hbox to \scratchwidth
- {\ifconditional\c_pack_boxes_l\hss\fi
- \box\nextbox
- \ifconditional\c_pack_boxes_r\hss\fi}%
- \ifconditional\c_pack_boxes_b
- \setbox\nextbox\hbox
- {\lower\bleedheight\hbox{\raise\scratchheight\box\nextbox}}%
+ \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\nextbox\scratchwidth
- \ht\nextbox\scratchheight
- \dp\nextbox\zeropoint
+ \wd\scratchbox\@@bgwidth
+ \ht\scratchbox\@@bgheight
+ \dp\scratchbox\zeropoint
\ifdone
- \hpos\currentbgposition{\box\nextbox}%
+ \hpos\currentbgposition{\box\scratchbox}%
\else
- \box\nextbox
+ \box\scratchbox
\fi
\egroup}
-\defineexternalfigure
- [bleed] % should be \v!bleed
- [\c!width=\bleedwidth,
- \c!height=\bleedheight]
+\setupbleeding[\c!stretch=\v!yes]
+
+\defineexternalfigure[bleed][\c!width=\bleedwidth,\c!height=\bleedheight] % should be \v!bleed
% \placefigure[left]{none}
% {\bleed[width=5cm,height=3cm,location=lt]{\externalfigure[koe][bleed]}}
@@ -641,7 +717,7 @@
% tricky: offsets apply to both the layer and the framed; it makes sense to
% only apply the offset to ...
-\unexpanded\def\setlayerframed
+\def\setlayerframed
{\dotripleempty\pack_layers_set_framed}
\def\pack_layers_set_framed
@@ -665,22 +741,24 @@
{\setlayer[#1][#2]%
\normalframedwithsettings[#3]}
-\unexpanded\def\setlayertext
+\def\setlayertext
{\dotripleempty\pack_layers_set_text}
\def\pack_layers_set_text[#1][#2][#3]%
{\bgroup
- \letdummyparameter\c!align\empty
- \letdummyparameter\c!width\hsize
- \letdummyparameter\c!color\empty
- \letdummyparameter\c!style\empty
- \getdummyparameters[#3]%
+ \getparameters
+ [\??lx]
+ [\c!align=,
+ \c!width=\hsize,
+ \c!color=,
+ \c!style=,
+ #3]%
\dowithnextboxcontent
{\forgetall
- \hsize\directdummyparameter\c!width
- \normalexpanded{\setupalign[\directdummyparameter\c!align]}%
- \dousestyleparameter{\directdummyparameter\c!style}}
- {\setlayer[#1][#2]{\strut\dousecolorparameter{\directdummyparameter\c!color}\flushnextbox}% maybe expand the color
+ \hsize\@@lxwidth
+ \normalexpanded{\setupalign[\@@lxalign]}%
+ \dousestyleparameter\@@lxstyle}
+ {\setlayer[#1][#2]{\strut\dousecolorparameter\@@lxcolor\flushnextbox}%
\egroup}%
\vtop}
@@ -726,6 +804,22 @@
[\v!middle]
[\c!corner=\v!middle,\c!location=\v!middle]
+% \definelayerpreset
+% [\v!middle\v!top]
+% [\c!location=\v!bottom,\c!hoffset=.5\layerwidth]
+
+% \definelayerpreset
+% [\v!middle\v!bottom]
+% [\c!location=\v!top,\c!hoffset=.5\layerwidth,\c!voffset=\layerheight]
+
+% \definelayerpreset
+% [\v!middle\v!left]
+% [\c!location=\v!right,\c!voffset=.5\layerheight]
+
+% \definelayerpreset
+% [\v!middle\v!right]
+% [\c!location=\v!left,\c!hoffset=\layerwidth,\c!voffset=.5\layerheight]
+
\definelayerpreset
[\v!middle\v!top]
[\c!location=\v!bottom,\c!corner=\v!top,\c!dx=.5\layerwidth]
@@ -807,133 +901,93 @@
% left/right/top/bottomoffset -> dimensions change
% x/y | method=fixed -> dimensions don't change
-\installcorenamespace{offsetbox}
-
-\installautocommandhandler \??offsetbox {offsetbox} \??offsetbox
-
-\setupoffsetbox
- [\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=]
-
-\let\setupoffset\setupoffsetbox
-
\unexpanded\def\offsetbox{\dosingleempty\pack_boxes_offset_box}
\unexpanded\def\offset {\dosingleempty\pack_boxes_offset}
-\def\pack_boxes_offset_box[#1]%
- {\bgroup
- \pack_boxes_offset_check[#1]%
- \dowithnextboxcs\pack_boxes_offsetfinish}
-
-\def\pack_boxes_offset[#1]%
- {\bgroup
- \pack_boxes_offset_check[#1]%
- \dowithnextboxcs\pack_boxes_offsetfinish\hbox}
-
-\newcount\c_pack_boxes_offset_level
-
-\def\pack_boxes_offset_check
- {\advance\c_pack_boxes_offset_level\plusone
- \edef\currentoffsetbox{\the\c_pack_boxes_offset_level}%
- \checkoffsetboxparent
- \setupcurrentoffsetbox}
-
-\def\pack_boxes_offsetfinish
- {\donefalse
- \scratchxposition \offsetboxparameter\c!x
- \scratchyposition \offsetboxparameter\c!y
- \scratchleftoffset \offsetboxparameter\c!leftoffset
- \scratchrightoffset \offsetboxparameter\c!rightoffset
- \scratchtopoffset \offsetboxparameter\c!topoffset
- \scratchbottomoffset\offsetboxparameter\c!bottomoffset
- \relax % really needed
- \ifdim\scratchleftoffset =\zeropoint\else\donetrue\fi
- \ifdim\scratchrightoffset =\zeropoint\else\donetrue\fi
- \ifdim\scratchtopoffset =\zeropoint\else\donetrue\fi
- \ifdim\scratchbottomoffset=\zeropoint\else\donetrue\fi
+\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
- \edef\p_method{\offsetboxparameter\c!method}%
- \ifx\p_method\v!fixed % new
- \ifdim\scratchleftoffset=\zeropoint
- \ifdim\scratchrightoffset=\zeropoint \else
- \scratchxposition-\scratchrightoffset
- \scratchrightoffset\zeropoint
- \fi
- \else
- \scratchxposition\scratchleftoffset
- \scratchleftoffset\zeropoint
- \fi
- \ifdim\scratchtopoffset=\zeropoint
- \ifdim\scratchbottomoffset=\zeropoint \else
- \scratchyposition-\scratchbottomoffset
- \scratchbottomoffset\zeropoint
- \fi
- \else
- \scratchyposition\scratchtopoffset
- \scratchtopoffset\zeropoint
- \fi
- \donefalse
- \fi
+ \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\scratchtopoffset
+ \vskip\@@oxtopoffset
\hbox
- {\hskip\scratchleftoffset
+ {\hskip\@@oxleftoffset
\box\nextbox
- \hskip\scratchrightoffset}%
- \vskip\scratchbottomoffset}%
+ \hskip\@@oxrightoffset}%
+ \vskip\@@oxbottomoffset}%
\ht\nextbox\htdp\nextbox
\dp\nextbox\zeropoint
\fi
- \scratchwidth \offsetboxparameter\c!width
- \scratchheight\offsetboxparameter\c!height
- \scratchdepth \offsetboxparameter\c!depth
- \edef\p_location{\offsetboxparameter\c!location}%
+ \freezedimenmacro\@@oxwidth
+ \freezedimenmacro\@@oxheight
+ \freezedimenmacro\@@oxdepth
\setbox\nextbox\hbox
- {\hskip\scratchxposition
- \lower\scratchyposition\hbox
- {\ifx\p_location\empty
- \box\nextbox
- \else
- \alignedbox[\p_location]\hbox{\box\nextbox}%
- \fi}}%
- \wd\nextbox\scratchwidth
- \ht\nextbox\scratchheight
- \dp\nextbox\scratchdepth
+ {\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}
-%D \starttyping
-%D \framed[offset=overlay]{\offset[leftoffset=1cm]
-%D {\framed[offset=overlay]{\offset[rightoffset=1cm]
-%D {\externalfigure[koe][width=1cm]}}}}
-%D
-%D \blank
-%D
-%D \framed[offset=overlay]{\offset[leftoffset=1cm] {\externalfigure[koe][width=5cm]}} \blank
-%D \framed[offset=overlay]{\offset[rightoffset=1cm] {\externalfigure[koe][width=5cm]}} \blank
-%D \framed[offset=overlay]{\offset[topoffset=1cm] {\externalfigure[koe][width=5cm]}} \blank
-%D \framed[offset=overlay]{\offset[bottomoffset=1cm]{\externalfigure[koe][width=5cm]}} \blank
-%D \stoptyping
-
% \useMPlibrary[pre] \setupbackgrounds[page][background=pagegrid]
%
-% \placefigure[left,none]{}{\offset[leftoffset=1cm] {\externalfigure[cow][width=3cm]}} \input tufte
-% \placefigure[left,none]{}{\offset[rightoffset=1cm] {\externalfigure[cow][width=3cm]}} \input tufte
-% \placefigure[left,none]{}{\offset[topoffset=1cm] {\externalfigure[cow][width=3cm]}} \input tufte
-% \placefigure[left,none]{}{\offset[bottomoffset=1cm]{\externalfigure[cow][width=3cm]}} \input tufte
+% \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:
%
@@ -966,14 +1020,15 @@
\unexpanded\def\phantombox[#1]% == \framed[\c!empty=\v!yes,\c!offset=\v!overlay,#1]{}
{\hbox\bgroup
- \letdummyparameter\c!width \zeropoint
- \letdummyparameter\c!height\zeropoint
- \letdummyparameter\c!depth \zeropoint
- \getdummyparameters[#1]%
+ \getparameters
+ [\??ol] % brrr
+ [\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
+ \wd\scratchbox\@@olwidth
+ \ht\scratchbox\@@olheight
+ \dp\scratchbox\@@oldepth
\box\scratchbox
\egroup}
@@ -989,17 +1044,17 @@
\ifcase#1\relax
% just one
\else
- \scratchdimen#2\divide\scratchdimen\wd\nextbox\scratchnx\scratchdimen\advance\scratchnx\plusone\relax
- \scratchdimen#3\divide\scratchdimen\ht\nextbox\scratchny\scratchdimen\advance\scratchny\plusone\relax
+ \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\scratchnx{\copy\nextbox}}%
- \setbox\nextbox\vbox{\dorecurse\scratchny{\copy\nextbox\endgraf}}%
+ \setbox\nextbox\hbox{\dorecurse{\count0}{\copy\nextbox}}%
+ \setbox\nextbox\vbox{\dorecurse{\count2}{\copy\nextbox\endgraf}}%
\or % x
- \setbox\nextbox\hbox{\dorecurse\scratchnx{\copy\nextbox}}%
+ \setbox\nextbox\hbox{\dorecurse{\count0}{\copy\nextbox}}%
\or % y
- \setbox\nextbox\vbox{\dorecurse\scratchny{\copy\nextbox\endgraf}}%
+ \setbox\nextbox\vbox{\dorecurse{\count2}{\copy\nextbox\endgraf}}%
\fi
\fi
\ifdim\wd\nextbox>#2\relax