summaryrefslogtreecommitdiff
path: root/tex/context/base/pack-pos.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/pack-pos.mkiv')
-rw-r--r--tex/context/base/pack-pos.mkiv189
1 files changed, 108 insertions, 81 deletions
diff --git a/tex/context/base/pack-pos.mkiv b/tex/context/base/pack-pos.mkiv
index fab73bc4a..ff8244f0a 100644
--- a/tex/context/base/pack-pos.mkiv
+++ b/tex/context/base/pack-pos.mkiv
@@ -23,114 +23,141 @@
% \position[ystep=relative](3,-1){test}
% \position(10,10){test}
% \stoppositioning}
+%
+% watch out: rather global
-\newdimen\positioningxposition \newdimen\positioningyposition
-\newdimen\positioningxdimension \newdimen\positioningydimension
-\newdimen\positioningxoffset \newdimen\positioningyoffset
+\installcorenamespace {positioning}
-\newbox\positioningbox
+\installcommandhandler \??positioning {positioning} \??positioning
-\unexpanded\def\startpositioning
- {\dosingleempty\dostartpositioning}
+\setuppositioning
+ [\c!state=\v!start,
+ \c!unit=\s!cm,
+ \c!factor=\plusone,
+ \c!scale =\plusone,
+ \c!xfactor=\positioningparameter\c!factor,
+ \c!yfactor=\positioningparameter\c!factor,
+ \c!xscale=\positioningparameter\c!scale,
+ \c!yscale=\positioningparameter\c!scale,
+ \c!xstep=\v!absolute,
+ \c!ystep=\v!absolute,
+ \c!xoffset=\zeropoint,
+ \c!yoffset=\zeropoint]
+
+\newdimen\d_pack_positioning_x_position
+\newdimen\d_pack_positioning_y_position
+\newdimen\d_pack_positioning_x_dimension
+\newdimen\d_pack_positioning_y_dimension
+\newdimen\d_pack_positioning_x_offset
+\newdimen\d_pack_positioning_y_offset
-\def\dostartpositioning[#1]%
+\newbox\b_pack_positioning
+
+\unexpanded\def\startpositioning
{\bgroup
- \getparameters[\??ps][#1]%
- \positioningxposition \zeropoint \positioningyposition \zeropoint
- \positioningxdimension\zeropoint \positioningydimension\zeropoint
- \positioningxoffset \zeropoint \positioningyoffset \zeropoint
- \hfuzz \paperwidth \vfuzz \paperheight
- \setbox\positioningbox\hbox\bgroup
+ \dodoubleempty\pack_positioning_start}
+
+\def\pack_positioning_start[#1][#2]%
+ {\ifsecondargument
+ \edef\currentpositioning{#1}%
+ \setupcurrentpositioning[#2]%
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\let\currentpositioning\empty
+ \setupcurrentpositioning[#1]}%
+ {\edef\currentpositioning{#1}}%
+ \else
+ \let\currentpositioning\empty
+ \fi\fi
+ \d_pack_positioning_x_position \zeropoint
+ \d_pack_positioning_y_position \zeropoint
+ \d_pack_positioning_x_dimension\zeropoint
+ \d_pack_positioning_y_dimension\zeropoint
+ \d_pack_positioning_x_offset \zeropoint
+ \d_pack_positioning_y_offset \zeropoint
+ \hfuzz\paperwidth
+ \vfuzz\paperheight
+ \setbox\b_pack_positioning\hbox\bgroup
\ignorespaces}
\unexpanded\def\stoppositioning
{\removeunwantedspaces
- \doifnot\@@psoffset\v!yes
- {\global\positioningxoffset\zeropoint
- \global\positioningyoffset\zeropoint}%
- \global\advance\positioningxdimension \positioningxoffset
- \global\advance\positioningydimension \positioningyoffset
+ \doifnot{\positioningparameter\c!offset}\v!yes
+ {\global\d_pack_positioning_x_offset\zeropoint
+ \global\d_pack_positioning_y_offset\zeropoint}%
+ \global\advance\d_pack_positioning_x_dimension\d_pack_positioning_x_offset
+ \global\advance\d_pack_positioning_y_dimension\d_pack_positioning_y_offset
\egroup
- \vbox to \positioningydimension
- {\vskip\positioningyoffset
- \hbox to \positioningxdimension
- {\hskip\positioningxoffset
- \box\positioningbox
+ \vbox to \d_pack_positioning_y_dimension
+ {\vskip\d_pack_positioning_y_offset
+ \hbox to \d_pack_positioning_x_dimension
+ {\hskip\d_pack_positioning_x_offset
+ \box\b_pack_positioning
\hfill}
\vfill}%
\egroup}
-\def\resetpositioning
- {\let\@@psstate \v!start
- \let\@@psunit \s!cm
- \let\@@psfactor \plusone
- \let\@@psscale \plusone
- \def\@@psxfactor{\@@psfactor}%
- \def\@@psyfactor{\@@psfactor}%
- \def\@@psxscale {\@@psscale}%
- \def\@@psyscale {\@@psscale}%
- \let\@@psxstep \v!absolute
- \let\@@psystep \v!absolute
- \let\@@psxoffset \zeropoint
- \let\@@psyoffset \zeropoint}
-
-\resetpositioning
-
-\unexpanded\def\setuppositioning
- {\resetpositioning
- \dodoubleargument\getparameters[\??ps]}
-
-\def\calculateposition#1#2#3#4#5#6#7#8#9%
- {\setdimensionwithunit\scratchdimen{#1}\@@psunit
- \scratchdimen#8\scratchdimen
- \scratchdimen#9\scratchdimen
- \advance\scratchdimen #4\relax
+\unexpanded\def\pack_positioning_calculate#1#2#3#4#5#6#7#8#9%
+ {\setdimensionwithunit\scratchdimen{#1}{\positioningparameter\c!unit}%
+ \scratchdimen\positioningparameter#8\scratchdimen
+ \scratchdimen\positioningparameter#9\scratchdimen
+ \advance\scratchdimen\positioningparameter#4\relax
% == \scratchdimen\dimexpr#8\dimexpr#9\scratchdimen\relax+#4\relax
- \doif{#2}\v!relative
+ \doif{\positioningparameter#2}\v!relative
{\advance\scratchdimen#3%
- \let#4\zeropoint}%
+ \letpositioningparameter#4\zeropoint}%
#3\scratchdimen
- \doifnot\@@psstate\v!overlay
- {\scratchdimen\dimexpr#5+#3\relax
+ \doifnot{\positioningparameter\c!state}\v!overlay
+ {\scratchdimen\dimexpr#5\nextbox+#3\relax
\ifdim #3<-#7\relax \global#7-#3\relax \fi
\ifdim\scratchdimen> #6\relax \global#6\scratchdimen\fi}}
-\def\position
- {\dosingleempty\doposition}
-
-\def\doposition[#1]#2(#3,#4)%
- {\removeunwantedspaces
- \dowithnextbox{\dodoposition{#1}{#2}{#3}{#4}}\hbox}
-
-\def\dodoposition#1#2#3#4%
+\unexpanded\def\position
{\bgroup
- \dontcomplain
- \getparameters[\??ps][#1]%
- \calculateposition{#3}\@@psxstep\positioningxposition\@@psxoffset\nextboxwd \positioningxdimension\positioningxoffset\@@psxscale\@@psxfactor
- \calculateposition{#4}\@@psystep\positioningyposition\@@psyoffset\nextboxhtdp\positioningydimension\positioningyoffset\@@psyscale\@@psyfactor
+ \dosingleempty\pack_positioning_position}
+
+\def\pack_positioning_position[#1]#2(#3,#4)%
+ {\iffirstargument
+ \setupcurrentpositioning[#1]%
+ \fi
+ \removeunwantedspaces
+ \dowithnextbox{\pack_positioning_position_indeed{#3}{#4}}\hbox}
+
+\def\pack_positioning_position_indeed#1#2%
+ {\dontcomplain
+ \pack_positioning_calculate
+ {#1}%
+ \c!xstep
+ \d_pack_positioning_x_position
+ \c!xoffset
+ \wd
+ \d_pack_positioning_x_dimension
+ \d_pack_positioning_x_offset
+ \c!xscale
+ \c!xfactor
+ \pack_positioning_calculate
+ {#2}%
+ \c!ystep
+ \d_pack_positioning_y_position
+ \c!yoffset
+ \htdp
+ \d_pack_positioning_y_dimension
+ \d_pack_positioning_y_offset
+ \c!yscale
+ \c!yfactor
\vbox to \zeropoint
- {\vskip\positioningyposition
+ {\vskip\d_pack_positioning_y_position
\hbox to \zeropoint
- {\hskip\positioningxposition
- \flushnextbox
+ {\hskip\d_pack_positioning_x_position
+ \box\nextbox
\hss}
\vss}%
\normalexpanded
{\egroup
- \positioningxposition\the\positioningxposition
- \positioningyposition\the\positioningyposition
- \def\noexpand\@@psxoffset{\the\dimexpr\@@psxoffset}%
- \def\noexpand\@@psyoffset{\the\dimexpr\@@psyoffset}}%
+ \d_pack_positioning_x_position\the\d_pack_positioning_x_position
+ \d_pack_positioning_y_position\the\d_pack_positioning_y_position
+ \setexpandedpositioningparameter\c!xoffset{\the\dimexpr\positioningparameter\c!xoffset}%
+ \setexpandedpositioningparameter\c!yoffset{\the\dimexpr\positioningparameter\c!yoffset}}%
\ignorespaces}
-\setuppositioning
- [\c!unit=\s!cm,
- \c!factor=\plusone,
- \c!scale=\plusone,
- \c!xstep=\v!absolute,
- \c!ystep=\v!absolute,
- \c!offset=\v!yes,
- \c!xoffset=\zeropoint,
- \c!yoffset=\zeropoint]
-
\protect \endinput