summaryrefslogtreecommitdiff
path: root/tex/context/base/pack-lyr.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/pack-lyr.mkiv')
-rw-r--r--tex/context/base/pack-lyr.mkiv733
1 files changed, 395 insertions, 338 deletions
diff --git a/tex/context/base/pack-lyr.mkiv b/tex/context/base/pack-lyr.mkiv
index 2bba60df7..461edaefe 100644
--- a/tex/context/base/pack-lyr.mkiv
+++ b/tex/context/base/pack-lyr.mkiv
@@ -23,92 +23,165 @@
% displacement. Should be an option, on by default
% (compatibility).
-% positie=forceer == ja maar dan ook in status=herhaal
-
%D The layering mechanism implemented here is independent of
%D the output routine, but future extensions may depend on a
%D more close cooperation.
-%D First we overload a macro from \type {core-rul}. From now on
+%D First we overload a macro from \type {pack-rul}. From now on
%D we accept a (optional) argument: the specific layer it
%D will go in. This means that we can move an overlay from one
%D background to the other using the dimensions of the parent.
-\ifx\undefined\defineoverlay \message{loaded to early} \wait \fi
+\ifdefined\defineoverlay \else \message{loaded to early} \wait \fi
\unexpanded\def\defineoverlay
- {\dotripleempty\dodefineoverlay}
+ {\dotripleempty\framed_define_overlay}
-\def\dodefineoverlay[#1][#2][#3]% overlay [layer] content
+\def\framed_define_overlay[#1][#2][#3]% overlay [layer] content
{\ifthirdargument
%\writestatus{BEWARE}{This (overlay definition) has changed!}% temp
- \def\docommand##1{\setvalue{\??ov##1}{\setlayer[#2]{\executedefinedoverlay{##1}{#3}}}}
+ \def\framed_define_overlay_indeed##1{\setvalue{\??overlay##1}{\setlayer[#2]{\executedefinedoverlay{##1}{#3}}}}
\else
- \def\docommand##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}%
+ \def\framed_define_overlay_indeed##1{\setvalue{\??overlay##1}{\executedefinedoverlay{##1}{#2}}}%
\fi
- \processcommalist[#1]\docommand}
-
-%D When tracing is turned on, a couple of boxes will
-%D show up as well as the reference point.
-
-\newif\iftracelayers % \tracelayerstrue
+ \processcommalist[#1]\framed_define_overlay_indeed}
-%D This handy constant saved some string memory.
+%D We use the command handler code. The previous, more direct parameter
+%D handling was 25\% faster when no parameters were passed when adding
+%D content to a layer. However, when we pass for instance a preset, the
+%D new methos is some 10\% faster and it happens that in most cases we
+%D do pass some parameters. It would be interesting to see if we can push
+%D the preset in between the regular chain but it could also lead to
+%D unwanted side effects when nesting layer placement.
-\def\@@layerbox{@@layerbox}
+\installcorenamespace{layer}
+\installcorenamespace{layerbox}
+\installcorenamespace{layerpreset}
+\installcorenamespace{layerposition}
%D \macros
-%D {definelayer}
+%D {definelayer,setuplayer}
%D
%D Each layer gets its own (global) box. This also means that
%D the data that goes into a layer, is typeset immediately.
%D Each layer automatically gets an associated overlay,
%D which can be used in any background assignment.
+%D
+%D After a layer is defined, you can change its
+%D characteristics.
+
+\installcommandhandler \??layer {layer} \??layer
-% todo : links/rechts
-
-\unexpanded\def\definelayer
- {\dodoubleargument\dodefinelayer}
-
-\def\dodefinelayer[#1][#2]% \zeropoint ipv \!!zeropoint
- {\setuplayer
- [#1]
- [\c!doublesided=,\c!preset=,
- \c!state=\v!start,\c!direction=\v!normal,\c!option=,
- \c!x=\zeropoint,\c!y=\zeropoint,\c!position=\v!no,
- \c!line=0,\c!column=0,
- \c!width=\nextboxwd,\c!height=\nextboxht,
- \c!offset=\zeropoint,\c!rotation=, % geen 0 !
- \c!hoffset=\zeropoint,\c!voffset=\zeropoint,
- \c!dx=\zeropoint,\c!dy=\zeropoint,
- \c!location=rb,\c!position=\v!no,\c!page=,
- \c!method=\v!overlay,
- \c!sx=1,\c!sy=1,\c!corner=,#2]%
- \doifvalue{\??ll#1\c!doublesided}\v!yes
- {\dopresetlayerbox{\v!left #1}%
- \dopresetlayerbox{\v!right#1}}%
- \dopresetlayerbox{#1}%
- \defineoverlay[#1][\composedlayer{#1}]}
-
-\def\dopresetlayerbox#1%
- {\ifcsname\@@layerbox#1\endcsname
+\setuplayer
+ [\c!state=\v!start,
+ %\c!doublesided=,
+ %\c!preset=,
+ %\c!option=,
+ %\c!corner=,
+ %\c!page=,
+ %\c!rotation=, % geen 0 !
+ \c!direction=\v!normal,
+ \c!position=\v!no,
+ \c!method=\v!overlay,
+ \c!x=\zeropoint,
+ \c!y=\zeropoint,
+ \c!line=0,
+ \c!column=0,
+ \c!width=\wd\nextbox, % don't change this globally
+ \c!height=\ht\nextbox, % don't change this globally
+ \c!offset=\zeropoint,
+ \c!hoffset=\zeropoint,
+ \c!voffset=\zeropoint,
+ \c!dx=\zeropoint,
+ \c!dy=\zeropoint,
+ \c!location=rb,
+ \c!sx=1,
+ \c!sy=1]
+
+\let\p_layers_doublesided\empty
+\let\p_layers_state \empty
+\let\p_layers_option \empty
+\let\p_layers_method \empty
+\let\p_layers_preset \empty
+\let\p_layers_rotation \empty
+\let\p_layers_position \empty
+\let\p_layers_hoffset \empty
+\let\p_layers_voffset \empty
+\let\p_layers_offset \empty
+\let\p_layers_dx \empty
+\let\p_layers_dy \empty
+\let\p_layers_sx \empty
+\let\p_layers_sy \empty
+\let\p_layers_x \empty
+\let\p_layers_y \empty
+\let\p_layers_corner \empty
+\let\p_layers_location \empty
+\let\p_layers_line \empty
+\let\p_layers_column \empty
+\let\p_layers_width \empty
+\let\p_layers_height \empty
+\let\p_layers_direction \empty
+
+\let\m_layers_page \empty
+\let\m_layers_target \empty
+
+\newconditional\c_layers_repeated
+\newconditional\c_layers_trace
+\newcount \c_layers_current_data
+
+\newbox\b_layers
+
+\newdimen\d_layers_x_size
+\newdimen\d_layers_y_size
+\newdimen\d_layers_x_offset
+\newdimen\d_layers_y_offset
+\newdimen\d_layers_x_position
+\newdimen\d_layers_y_position
+
+\newdimen\layerwidth
+\newdimen\layerheight
+
+\let\lastlayerxpos\!!zeropoint
+\let\lastlayerypos\!!zeropoint
+\let\lastlayerwd \!!zeropoint
+\let\lastlayerht \!!zeropoint
+\let\lastlayerdp \!!zeropoint
+
+\appendtoks
+ \edef\p_layers_doublesided{\layerparameter\c!doublesided}%
+ \ifx\p_layers_doublesided\v!yes
+ \relateparameterhandlers{layer}{\v!left \currentlayer}{layer}\currentlayer % permits left*
+ \relateparameterhandlers{layer}{\v!right\currentlayer}{layer}\currentlayer % permits right*
+ \layers_preset_box{\v!left \currentlayer}%
+ \layers_preset_box{\v!right\currentlayer}%
+ \fi
+ \layers_preset_box\currentlayer
+ \normalexpanded{\defineoverlay[\currentlayer][\noexpand\composedlayer{\currentlayer}]}%
+\to \everydefinelayer
+
+\def\layers_preset_box#1%
+ {\ifcsname\??layerbox#1\endcsname
\resetlayer[#1]%
\else
- \expandafter\newbox\csname\@@layerbox#1\endcsname
+ \expandafter\newbox\csname\??layerbox#1\endcsname
\fi}
%D \macros
-%D {setuplayer}
+%D {resetlayer}
%D
-%D After a layer is defined, you can change its
-%D characteristics.
+%D This macro hardly needs an explanation (but is seldom
+%D needed anyway).
-\unexpanded\def\setuplayer
- {\dodoubleargument\dosetuplayer}
+\def\layers_reset_box#1%
+ {\ifcsname\??layerbox#1\endcsname
+ \global\setbox\csname\??layerbox#1\endcsname\emptybox
+ \fi}
-\def\dosetuplayer[#1][#2]%
- {\def\docommand##1{\getparameters[\??ll##1][#2]}%
- \processcommalist[#1]\docommand}
+\def\resetlayer[#1]%
+ {\layers_reset_box{#1}%
+ \layers_reset_box{\v!left #1}%
+ \layers_reset_box{\v!right#1}%
+ \layers_reset_box{#1:\realfolio}}
%D \macros
%D {setlayer}
@@ -122,178 +195,174 @@
%D \setlayer [identifier] [optional parameters] {data}
%D \stoptyping
-\newcount\currentlayerdata
-
-\let\currentlayerwidth \!!zeropoint
-\let\currentlayerheight\!!zeropoint
-
\def\setcurrentlayerdimensions
- {\dodoubleempty\dosetcurrentlayerdimensions}
+ {\dodoubleempty\layers_set_current_dimensions}
-\def\dosetcurrentlayerdimensions[#1][#2]% name left|right
+\def\layers_set_current_dimensions[#1][#2]% name left|right
{\edef\currentlayerwidth {\thelayerwidth {#2#1}}%
\edef\currentlayerheight{\thelayerheight{#2#1}}}
-\def\thelayerwidth #1{\the\wd\executeifdefined{\@@layerbox#1}\emptybox}
-\def\thelayerheight#1{\the\ht\executeifdefined{\@@layerbox#1}\emptybox}
+% \def\thelayerwidth #1{\the\wd\executeifdefined{\??layerbox#1}\emptybox}
+% \def\thelayerheight#1{\the\ht\executeifdefined{\??layerbox#1}\emptybox}
-\def\setlayer
- {\dotripleempty\dosetlayer}
+\def\thelayerwidth #1{\the\ifcsname\??layerbox#1\endcsname\wd\csname\??layerbox#1\endcsname\else\zeropoint\fi}
+\def\thelayerheight#1{\the\ifcsname\??layerbox#1\endcsname\ht\csname\??layerbox#1\endcsname\else\zeropoint\fi}
-\def\dosetlayer[#1][#2][#3]% #4 == box do \fi is ok
- {\doifelsevalue{\??ll#1\c!state}\v!stop
- {\dowithnextboxcs\donothing\hbox}
- {\ifthirdargument
- \dodosetlayer[#1][#2][#3]%
- \else
- \doifassignmentelse{#2}
- {\dodosetlayer[#1][][#2]}%
- {\dodosetlayer[#1][#2][]}%
- \fi}}
+\unexpanded\def\setlayer
+ {\dotripleempty\layers_set}
-\def\dodosetlayer[#1][#2][#3]% #2 = links/rechts
+\def\layers_set[#1][#2][#3]% #4 == box do \fi is ok
{\bgroup
- \recalculatebackgrounds % brrr
- \global\advance\currentlayerdata\plusone
+ \edef\currentlayer{#1}%
+ \edef\p_layers_state{\layerparameter{#1}\c!state}
+ \ifx\p_layers_state\v!stop
+ \dowithnextboxcs\egroup\hbox
+ \else\ifthirdargument
+ \layers_set_indeed[#1][#2][#3]%
+ \else
+ \doifassignmentelse{#2}
+ {\layers_set_indeed[#1][][#2]}%
+ {\layers_set_indeed[#1][#2][]}%
+ \fi\fi}
+
+\def\layers_set_indeed[#1][#2][#3]% #2 = links/rechts
+ {\page_backgrounds_recalculate % brrr
+ \global\advance\c_layers_current_data\plusone
\forgetall
\dontcomplain
- \doifvalue{\??ll#1\c!option}\v!test\tracelayerstrue
- \iftracelayers\traceboxplacementtrue\fi
- \dowithnextbox{\dodosetlayerindeed{#1}{#2}{#3}\egroup}\hbox}
-
-\def\dodosetlayerindeed#1#2#3% #2 = links/rechts
- {\ifcsname\@@layerbox#1\endcsname % nb: odd/even discard, left/right not
- \edef\@@layerloc{#2}%
- \ifx\@@layerloc\v!even
+ \edef\p_layers_option{\layerparameter\c!option}%
+ \ifx\p_layers_option\v!test
+ \traceboxplacementtrue
+ \fi
+ \edef\m_layers_target{#2}%
+ \dowithnextbox{\layers_set_finish{#3}}\hbox}
+
+\def\layers_set_finish#1%
+ {\ifcsname\??layerbox\currentlayer\endcsname % can move up
+ \ifx\m_layers_target\v!even
\ifodd\realpageno
- % discard nextbox
+ % discard nextbox
\else
- \dododosetlayer[#1][\v!left][#3]%
+ \let\m_layers_target\v!left
+ \layers_set_content{#1}%
\fi
- \else\ifx\@@layerloc\v!odd
+ \else\ifx\m_layers_target\v!odd
\ifodd\realpageno
- \dododosetlayer[#1][\v!right][#3]%
- %\else
- % discard nextbox
+ \let\m_layers_target\v!right
+ \layers_set_content{#1}%
+ \else
+ % discard nextbox
\fi
\else
- \dododosetlayer[#1][#2][#3]%
+ \layers_set_content{#1}%
\fi\fi
\else
- \writestatus{layer}{unknown layer #1}%
- \fi}
-
-\newbox\layerbox
-
-\newdimen\@@layerxsiz
-\newdimen\@@layerysiz
-\newdimen\@@layerxoff
-\newdimen\@@layeryoff
-\newdimen\@@layerxpos
-\newdimen\@@layerypos
-
-\let\lastlayerxpos\!!zeropoint
-\let\lastlayerypos\!!zeropoint
-\let\lastlayerwd \!!zeropoint
-\let\lastlayerht \!!zeropoint
-\let\lastlayerdp \!!zeropoint
+ \writestatus{layer}{unknown layer \currentlayer}%
+ \fi
+ \egroup}
% todo left/right
-\def\setlastlayerpos#1%
- {\edef\layerpage{\MPp{lyr:\the\currentlayerdata}}%
- \xdef\lastlayerxpos{\the\dimexpr-\MPx{lyr:#1:\layerpage}+\MPx{lyr:\the\currentlayerdata}\relax}%
- \xdef\lastlayerypos{\the\dimexpr \MPy{lyr:#1:\layerpage}-\MPy{lyr:\the\currentlayerdata}\relax}}
+\def\layers_set_last_position_yes
+ {\edef\m_layers_page{\MPp{\??layerposition\the\c_layers_current_data}}%
+ \xdef\lastlayerxpos{\the\dimexpr-\MPx{\??layerposition\m_layers_target\currentlayer:\m_layers_page}+\MPx{\??layerposition\the\c_layers_current_data}\relax}%
+ \xdef\lastlayerypos{\the\dimexpr \MPy{\??layerposition\m_layers_target\currentlayer:\m_layers_page}-\MPy{\??layerposition\the\c_layers_current_data}\relax}%}
+ \d_layers_x_position\lastlayerxpos
+ \d_layers_y_position\lastlayerypos
+ \begingroup
+ \edef\currentlayer{\currentlayer\m_layers_page}%
+ \global\letlayerparameter\c!position\v!yes
+ \endgroup
+ \global\letlayerparameter\c!state\v!start % needed ?
+ \setbox\b_layers\vbox to \d_layers_y_size{\hbox to \d_layers_x_size{\xypos{\??layerposition\the\c_layers_current_data}\hss}\vss}}
+
+\def\layers_set_last_position_nop
+ {\setbox\b_layers\emptybox
+ \globallet\lastlayerxpos\!!zeropoint
+ \globallet\lastlayerypos\!!zeropoint
+ \doifinset\v!bottom\p_layers_corner\layers_set_bottom_positions
+ \doifinset\v!right \p_layers_corner\layers_set_right_positions
+ \doifinset\v!middle\p_layers_corner\layers_set_middle_positions
+ \edef\m_layers_page{\layerparameter\c!page}}
\unexpanded\def\definelayerpreset
- {\dodoubleargument\dodefinelayerpreset}
-
-% \def\dodefinelayerpreset[#1][#2]%
-% {\setvalue{\??ll\??ll#1}{\dopresetlayer{#2}}}
-%
-% more fun: \definelayerpreset[whatever][lefttop]
+ {\dodoubleargument\layers_define_preset}
-\def\dodefinelayerpreset[#1][#2]%
+\def\layers_define_preset[#1][#2]%
{\doifassignmentelse{#2}
- {\setvalue{\??ll\??ll#1}{\dopresetlayer{#2}}}
- {\setvalue{\??ll\??ll#1}{\csname\??ll\??ll#2\endcsname}}}
-
-\def\dopresetlayer#1#2#3% #1=list #2=tag #3=list
- {\getparameters[\??ll#2][#1,#3]}
-
-\letempty\currentlayer
-
-\def\layerparameter#1{\csname\??ll\currentlayer#1\endcsname}
-
-\newdimen\layerwidth
-\newdimen\layerheight
-
-\def\dododosetlayer[#1][#2][#3]% will be sped up
- {% we use the global width, never change this
- \def\currentlayer{#1}%
- \@@layerxsiz\layerparameter\c!width
- \@@layerysiz\layerparameter\c!height
- \layerwidth \@@layerxsiz
- \layerheight\@@layerysiz
- % preroll
- \getparameters[\??ll\currentlayer][#3]%
+ {\setvalue{\??layerpreset#1}{\setupcurrentlayer[#2]}}
+ {\setvalue{\??layerpreset#1}{\csname\??layerpreset#2\endcsname}}}
+
+\def\layers_set_content#1%
+ {\layerwidth \layerparameter\c!width % global (local later)
+ \layerheight\layerparameter\c!height % global (local later)
+ \d_layers_x_size\layerwidth
+ \d_layers_y_size\layerheight
%
- % \executeifdefined{\??ll\??ll\layerparameter\c!preset}\gobbletwoarguments\currentlayer{#3}%
+ \setupcurrentlayer[#1]% preroll
%
- \edef\@@currentlayerpreset{\layerparameter\c!preset}%
- \ifcsname\??ll\??ll\@@currentlayerpreset\endcsname\csname\??ll\??ll\@@currentlayerpreset\endcsname\currentlayer{#3}\fi
+ \edef\p_layers_preset {\layerparameter\c!preset }%
+ %
+ \ifcsname\??layerpreset\p_layers_preset\endcsname
+ \csname\??layerpreset\p_layers_preset\endcsname
+ \setupcurrentlayer[#1]% postroll
+ \fi
%
- \doif{\layerparameter\c!position}\v!overlay % slow, use \dosetvalue instead
- {\getparameters[\??ll\currentlayer][\c!width=\zeropoint,\c!height=\zeropoint,\c!position=\v!yes]}%
- \doifsomething{\layerparameter\c!rotation}% todo: use direct lowlevel call
- {\setbox\nextbox\hbox{\rotate[\c!location=\v!high,\c!rotation=\layerparameter\c!rotation]{\flushnextbox}}}%
- % no, not local
- % \@@layerxsiz\layerparameter\c!width
- % \@@layerysiz\layerparameter\c!height
- % never change that
- \@@layerxpos\layerparameter\c!x
- \@@layerypos\layerparameter\c!y
- \doifelse{\layerparameter\c!hoffset}\v!max{\@@layerxoff\@@layerxsiz}{\@@layerxoff\layerparameter\c!hoffset}%
- \doifelse{\layerparameter\c!voffset}\v!max{\@@layeryoff\@@layerysiz}{\@@layeryoff\layerparameter\c!voffset}%
- % dx/dy are internal context ones and can be used in preset
- \advance\@@layerxoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dx\relax
- \advance\@@layeryoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dy\relax
- \@@layerxpos\layerparameter\c!sx\@@layerxpos
- \@@layerypos\layerparameter\c!sy\@@layerypos
- \@@layerxoff\layerparameter\c!sx\@@layerxoff
- \@@layeryoff\layerparameter\c!sy\@@layeryoff
- \edef\@@currentlayerposition{\layerparameter\c!position}%
- \ifx\@@currentlayerposition\v!yes % combine ^
- \setlastlayerpos{#2\currentlayer}% sets \layerpage; todo l/r %%%%%%%%%%%%
- \@@layerxpos\lastlayerxpos
- \@@layerypos\lastlayerypos
- \letgvalue{\??ll\currentlayer\layerpage\c!position}\v!yes
- \letgvalue{\??ll\currentlayer\c!state}\v!start % needed ?
- \setbox\layerbox\vbox to \@@layerysiz{\hbox to \@@layerxsiz{\xypos{lyr:\the\currentlayerdata}\hss}\vss}%
+ \edef\p_layers_rotation {\layerparameter\c!rotation }%
+ \edef\p_layers_position {\layerparameter\c!position }%
+ \edef\p_layers_hoffset {\layerparameter\c!hoffset }%
+ \edef\p_layers_voffset {\layerparameter\c!voffset }%
+ \edef\p_layers_offset {\layerparameter\c!offset }%
+ \edef\p_layers_dx {\layerparameter\c!dx }%
+ \edef\p_layers_dy {\layerparameter\c!dy }%
+ \edef\p_layers_sx {\layerparameter\c!sx }%
+ \edef\p_layers_sy {\layerparameter\c!sy }%
+ \edef\p_layers_x {\layerparameter\c!x }%
+ \edef\p_layers_y {\layerparameter\c!y }%
+ \edef\p_layers_corner {\layerparameter\c!corner }%
+ \edef\p_layers_location {\layerparameter\c!location }%
+ \edef\p_layers_line {\layerparameter\c!line }%
+ \edef\p_layers_column {\layerparameter\c!column }%
+ \edef\p_layers_width {\layerparameter\c!width }% local ones
+ \edef\p_layers_height {\layerparameter\c!height }% local ones
+ \edef\p_layers_direction{\layerparameter\c!direction}%
+ %
+ \ifx\p_layers_position\v!overlay
+ \let\p_layers_width \zeropoint
+ \let\p_layers_height \zeropoint
+ \let\p_layers_position\v!yes
+ \fi
+ \ifx\p_layers_rotation\empty \else
+ % use direct call
+ \setbox\nextbox\hbox{\rotate[\c!location=\v!high,\c!rotation=\layerparameter\c!rotation]{\box\nextbox}}%
+ \fi
+ \d_layers_x_offset\p_layers_sx\dimexpr
+ \ifx\p_layers_hoffset\v!max\d_layers_x_size\else\p_layers_hoffset\fi+\p_layers_offset+\p_layers_dx
+ \relax
+ \d_layers_y_offset\p_layers_sy\dimexpr
+ \ifx\p_layers_voffset\v!max\d_layers_y_size\else\p_layers_voffset\fi+\p_layers_offset+\p_layers_dy
+ \relax
+ \d_layers_x_position\p_layers_sx\dimexpr\p_layers_x\relax
+ \d_layers_y_position\p_layers_sy\dimexpr\p_layers_y\relax
+ \ifx\p_layers_position\v!yes
+ \layers_set_last_position_yes
\else
- \setbox\layerbox\emptybox
- \globallet\lastlayerxpos\!!zeropoint
- \globallet\lastlayerypos\!!zeropoint
- \normalexpanded{\doifinset{\v!bottom}{\layerparameter\c!corner}}\dosetlayerbottompositions
- \normalexpanded{\doifinset{\v!right }{\layerparameter\c!corner}}\dosetlayerrightpositions
- \normalexpanded{\doifinset{\v!middle}{\layerparameter\c!corner}}\dosetlayermiddlepositions
- \edef\layerpage{\layerparameter\c!page}%
+ \layers_set_last_position_nop
\fi
- \ifx\layerpage\empty \else % is expanded
- \edef\layerpage{:\layerpage}%
- \ifcsname\@@layerbox#2\currentlayer\layerpage\endcsname \else
- \expandafter\newbox\csname\@@layerbox#2\currentlayer\layerpage\endcsname
+ %
+ \ifx\m_layers_page\empty \else % is expanded
+ \edef\m_layers_page{:\m_layers_page}%
+ \ifcsname\??layerbox\m_layers_target\currentlayer\m_layers_page\endcsname \else
+ \expandafter\newbox\csname\??layerbox\m_layers_target\currentlayer\m_layers_page\endcsname
\fi
\fi
- \chardef\layerpagebox\csname\@@layerbox#2\currentlayer\layerpage\endcsname
+ \chardef\layerpagebox\csname\??layerbox\m_layers_target\currentlayer\m_layers_page\endcsname
\ifvoid\layerpagebox
\gsetboxllx\layerpagebox\zeropoint
\gsetboxlly\layerpagebox\zeropoint
\fi
\global\setbox\layerpagebox\vbox %to \layerparameter\c!height % new, otherwise no negative y possible
{\offinterlineskip
- %postpone, to after nextboxwd correction % \hsize\layerparameter\c!width % new, keep box small
- %\ifvoid\csname\@@layerbox\currentlayer\layerpage\endcsname\else % why not #2#1
\ifvoid\layerpagebox
\let\lastlayerwidth \zeropoint
\let\lastlayerheight\zeropoint
@@ -303,87 +372,89 @@
\ht\layerpagebox\zeropoint
\dp\layerpagebox\zeropoint
\wd\layerpagebox\zeropoint
- \doifnot{\layerparameter\c!direction}\v!reverse{\box\layerpagebox}%
+ \ifx\p_layers_direction\v!reverse\else
+ \box\layerpagebox
+ \fi
\fi
% don't move
- \xdef\lastlayerwd{\the\nextboxwd}%
- \xdef\lastlayerht{\the\nextboxht}% % not entirely ok when grid !
- \xdef\lastlayerdp{\the\nextboxdp}% % not entirely ok when grid !
+ \xdef\lastlayerwd{\the\wd\nextbox}%
+ \xdef\lastlayerht{\the\ht\nextbox}% % not entirely ok when grid !
+ \xdef\lastlayerdp{\the\dp\nextbox}% % not entirely ok when grid !
% this code
- \doifelse{\layerparameter\c!location}\v!grid\donetrue\donefalse
- \ifdone
- \nextboxht\strutheight
- \nextboxdp\strutdepth
+ \ifx\p_layers_location\v!grid
+ \ht\nextbox\strutheight
+ \dp\nextbox\strutdepth
\else
- \setbox\nextbox\hbox{\alignedbox[\layerparameter\c!location]\vbox{\flushnextbox}}%
+ \setbox\nextbox\hbox{\alignedbox[\p_layers_location]\vbox{\box\nextbox}}%
\fi
- \ifnum\layerparameter\c!line=\zerocount\else % no \ifcase, can be negative
- \advance\@@layerypos\dimexpr\layerparameter\c!line\lineheight+\topskip-\lineheight-\nextboxht\relax
+ \ifnum\p_layers_line=\zerocount\else % no \ifcase, can be negative
+ \advance\d_layers_y_position\dimexpr\p_layers_line\lineheight+\topskip-\lineheight-\ht\nextbox\relax
\fi
- \ifnum\layerparameter\c!column=\zerocount\else % no \ifcase, can be negative
- \advance\@@layerxpos\layoutcolumnoffset{\layerparameter\c!column}%
+ \ifnum\p_layers_column=\zerocount\else % no \ifcase, can be negative
+ \advance\d_layers_x_position\layoutcolumnoffset\p_layers_column\relax
\fi
- \ifdone
- \setbox\nextbox\hbox{\alignedbox[rb]\vbox{\flushnextbox}}%
+ \ifx\p_layers_location\v!grid
+ \setbox\nextbox\hbox{\alignedbox[rb]\vbox{\box\nextbox}}%
\fi
% ll registration
- \scratchdimen\@@layerxpos
- \advance\scratchdimen\@@layerxoff
+ \scratchdimen\dimexpr\d_layers_x_position+\d_layers_x_offset\relax
\ifdim\scratchdimen<\getboxllx\layerpagebox
\gsetboxllx\layerpagebox\scratchdimen
\fi
- \advance\scratchdimen\nextboxwd
- \nextboxwd\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi
- \scratchdimen\dimexpr\@@layerypos+\@@layeryoff\relax
+ \advance\scratchdimen\wd\nextbox
+ \wd\nextbox\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi
+ \scratchdimen\dimexpr\d_layers_y_position+\d_layers_y_offset\relax
\ifdim\scratchdimen<\getboxlly\layerpagebox
\gsetboxlly\layerpagebox\scratchdimen
\fi
% ll compensation
- \advance\scratchdimen\dimexpr\nextboxht+\nextboxdp\relax
- \nextboxht\ifdim\scratchdimen>\lastlayerheight \scratchdimen \else \lastlayerheight \fi
- \nextboxdp\zeropoint
+ \advance\scratchdimen\dimexpr\ht\nextbox+\dp\nextbox\relax
+ \ht\nextbox\ifdim\scratchdimen>\lastlayerheight \scratchdimen \else \lastlayerheight \fi
+ \dp\nextbox\zeropoint
% placement
- \hsize\layerparameter\c!width % new, keep box small
- \vbox to \layerparameter\c!height \bgroup
+ \hsize\p_layers_width
+ \vbox to \p_layers_height \bgroup
\smashbox\nextbox
- \vskip\dimexpr\@@layerypos+\@@layeryoff\relax
- \hskip\dimexpr\@@layerxpos+\@@layerxoff\relax
- \flushnextbox
+ \vskip\dimexpr\d_layers_y_position+\d_layers_y_offset\relax
+ \hskip\dimexpr\d_layers_x_position+\d_layers_x_offset\relax
+ \box\nextbox
\ifvoid\layerpagebox
% already flushed
\else
% the reverse case % check !
- \vskip-\dimexpr\@@layerypos+\@@layeryoff\relax
+ \vskip-\dimexpr\d_layers_y_position+\d_layers_y_offset\relax
\box\layerpagebox
\fi
\egroup}%
% when position is true, the layerbox holds the compensation and needs
% to be placed; never change this !
- \ifvoid\layerbox\else\box\layerbox\fi}
+ \ifvoid\b_layers \else
+ \box\b_layers
+ \fi}
-\def\dosetlayerbottompositions
- {\ifnum\layerparameter\c!line=\zerocount\else % can be < 0
- \setevalue{\??ll\currentlayer\c!line}{\the\numexpr-\layerparameter\c!line+\layoutlines+\plusone\relax}%
+\def\layers_set_bottom_positions
+ {\ifnum\p_layers_line=\zerocount\else % can be < 0
+ \edef\p_layers_line{\the\numexpr-\p_layers_line+\layoutlines+\plusone\relax}% use counter instead ?
\fi
- \ifdim\@@layerysiz>\zeropoint
- \advance\@@layerypos-\@@layerysiz
- \@@layerypos-\@@layerypos
- \@@layeryoff-\@@layeryoff
+ \ifdim\d_layers_y_size>\zeropoint
+ \advance\d_layers_y_position-\d_layers_y_size
+ \d_layers_y_position-\d_layers_y_position
+ \d_layers_y_offset-\d_layers_y_offset
\fi}
-\def\dosetlayerrightpositions
- {\ifnum\layerparameter\c!column=\zerocount\else % can be < 0
- \setevalue{\??ll\currentlayer\c!column}{\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}%
+\def\layers_set_right_positions
+ {\ifnum\p_layers_column=\zerocount\else % can be < 0
+ \edef\p_layers_column{\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}% use counter instead ?
\fi
- \ifdim\@@layerxsiz>\zeropoint
- \advance\@@layerxpos-\@@layerxsiz
- \@@layerxpos-\@@layerxpos
- \@@layerxoff-\@@layerxoff
+ \ifdim\d_layers_x_size>\zeropoint
+ \advance\d_layers_x_position-\d_layers_x_size
+ \d_layers_x_position-\d_layers_x_position
+ \d_layers_x_offset-\d_layers_x_offset
\fi}
-\def\dosetlayermiddlepositions
- {\ifdim\@@layerxsiz>\zeropoint \advance\@@layerxpos.5\@@layerxsiz \fi
- \ifdim\@@layerysiz>\zeropoint \advance\@@layerypos.5\@@layerysiz \fi}
+\def\layers_set_middle_positions
+ {\ifdim\d_layers_x_size>\zeropoint \advance\d_layers_x_position.5\d_layers_x_size \fi
+ \ifdim\d_layers_y_size>\zeropoint \advance\d_layers_y_position.5\d_layers_y_size \fi}
%D Given the task to be accomplished, the previous macro is
%D not even that complicated. It mainly comes down to skipping
@@ -395,14 +466,14 @@
%D {doifelselayerdata}
\def\doifelselayerdata#1%
- {\ifcsname\@@layerbox#1\endcsname
- \ifvoid\csname\@@layerbox#1\endcsname
- \@EAEAEA\secondoftwoarguments
+ {\ifcsname\??layerbox#1\endcsname
+ \ifvoid\csname\??layerbox#1\endcsname
+ \doubleexpandafter\secondoftwoarguments
\else
- \@EAEAEA\firstoftwoarguments
+ \doubleexpandafter\firstoftwoarguments
\fi
\else
- \@EA\secondoftwoarguments
+ \expandafter\secondoftwoarguments
\fi}
%D \macros
@@ -415,114 +486,121 @@
% todo: setups before flush, handy hook
-\unexpanded\def\flushlayer[#1]% quite core, so optimized
+\unexpanded\def\flushlayer[#1]% quite core, so optimized (todo: check for void)
{\begingroup
\forgetall
\edef\currentlayer{#1}%
- \edef\@@currentlayerstate{\csname\??ll\currentlayer\c!state\endcsname}%
- \ifx\@@currentlayerstate\v!stop
+ \edef\p_layers_state{\layerparameter\c!state}%
+ \ifx\p_layers_state\v!stop
% nothing
- \else\ifx\@@currentlayerstate\v!next
- \global\expandafter\let\csname\??ll\currentlayer\c!state\endcsname\v!start % dangerous, stack-built-up
- \else\ifx\@@currentlayerstate\v!continue
- \global\expandafter\let\csname\??ll\currentlayer\c!state\endcsname\v!repeat % dangerous, stack-built-up
+ \else\ifx\p_layers_state\v!next
+ \global\letlayerparameter\c!state\v!start % dangerous, stack-built-up
+ \else\ifx\p_layers_state\v!continue
+ \global\letlayerparameter\c!state\v!repeat % dangerous, stack-built-up
\else
- \edef\@@currentlayerdoublesided{\csname\??ll\currentlayer\c!doublesided\endcsname}%
- \ifx\@@currentlayerdoublesided\v!yes
- \ifcsname\@@layerbox#1\endcsname
+ \edef\p_layers_doublesided{\layerparameter\c!doublesided}%
+ \ifx\p_layers_doublesided\v!yes
+ \ifcsname\??layerbox#1\endcsname
% we can make a dedicated one for this
- \doifbothsidesoverruled{\dodoflushlayerB\v!left}{\dodoflushlayerB\v!right}{\dodoflushlayerB\v!left}%
+ \doifbothsidesoverruled
+ {\layers_flush_double\v!left }%
+ {\layers_flush_double\v!right}%
+ {\layers_flush_double\v!left }%
\else
- \dodoflushlayerA
+ \layers_flush_single
\fi
\else
- \dodoflushlayerA
+ \layers_flush_single
\fi
\fi\fi\fi
\endgroup}
% \ifcase#1\else\writestatus{layer}{unknown layer #3}\fi
-\def\dodoflushlayerA
+\def\layers_flush_single
{\startoverlay
- {\ifcsname\@@layerbox\currentlayer \endcsname\dodoflushlayer\plusone \currentlayer \fi}%
- {\ifcsname\@@layerbox\currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount{\currentlayer:\realfolio}\fi}%
+ {\ifcsname\??layerbox \currentlayer \endcsname\layers_flush_indeed\plusone \currentlayer \fi}%
+ {\ifcsname\??layerbox \currentlayer:\realfolio\endcsname\layers_flush_indeed\zerocount{\currentlayer:\realfolio}\fi}%
\stopoverlay}
-\def\dodoflushlayerB#1%
+\def\layers_flush_double#1%
{\startoverlay
- {\ifcsname\@@layerbox \currentlayer \endcsname\dodoflushlayer\plusone \currentlayer \fi}%
- {\ifcsname\@@layerbox \currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount {\currentlayer:\realfolio}\fi}%
- {\ifcsname\@@layerbox#1\currentlayer \endcsname\dodoflushlayer\plusone {#1\currentlayer }\fi}%
- {\ifcsname\@@layerbox#1\currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount{#1\currentlayer:\realfolio}\fi}%
+ {\ifcsname\??layerbox \currentlayer \endcsname\layers_flush_indeed\plusone \currentlayer \fi}%
+ {\ifcsname\??layerbox \currentlayer:\realfolio\endcsname\layers_flush_indeed\zerocount {\currentlayer:\realfolio}\fi}%
+ {\ifcsname\??layerbox#1\currentlayer \endcsname\layers_flush_indeed\plusone {#1\currentlayer }\fi}%
+ {\ifcsname\??layerbox#1\currentlayer:\realfolio\endcsname\layers_flush_indeed\zerocount{#1\currentlayer:\realfolio}\fi}%
\stopoverlay}
-\def\dodoflushlayer#1#2% quite core, so optimized
+\def\layers_flush_indeed#1#2% quite core, so optimized
{\begingroup % already grouped
\offinterlineskip
- \edef\@@currentlayermethod{\csname\??ll\currentlayer\c!method\endcsname}%
- \edef\@@currentlayeroption{\csname\??ll\currentlayer\c!option\endcsname}%
- % needed because we need to handle method but we should find a way to
- % speed this up
- \edef\@@currentlayerpreset{\csname\??ll\currentlayer\c!preset\endcsname}%
- \ifcsname\??ll\??ll\@@currentlayerpreset\endcsname\csname\??ll\??ll\@@currentlayerpreset\endcsname\currentlayer{}\fi
- %
- \ifx\@@currentlayeroption\v!test
- \tracelayerstrue
+ \edef\p_layers_preset{\layerparameter\c!preset}%
+ \ifcsname\??layerpreset\p_layers_preset\endcsname
+ \csname\??layerpreset\p_layers_preset\endcsname
\fi
- \iftracelayers
+ \edef\p_layers_method{\layerparameter\c!method}%
+ \edef\p_layers_option{\layerparameter\c!option}%
+ \ifx\p_layers_option\v!test
\traceboxplacementtrue
\fi
- \!!doneafalse
- \!!donebfalse
- \ifx\@@currentlayermethod\v!overlay\!!doneatrue\fi
- \ifx\@@currentlayermethod\v!fit \!!donebtrue\fi
- \!!donectrue
- \ifcase#1\else
- \edef\@@currentlayerposition{\csname\??ll\currentlayer\c!position\endcsname}%
- \ifx\@@currentlayerposition\v!yes \else
- \edef\@@currentlayerrepeat{\csname\??ll\currentlayer\c!repeat\endcsname}%
- % \edef\@@currentlayerstate {\csname\??ll\currentlayer\c!state\endcsname}% actually this is already set
- \ifx\@@currentlayerrepeat\v!yes
- \!!donecfalse
- \else\ifx\@@currentlayerstate\v!repeat
- \!!donecfalse
+ \ifcase#1\relax
+ \setfalse\c_layers_repeated
+ \else
+ \edef\p_layers_position{\layerparameter\c!position}%
+ \ifx\p_layers_position\v!yes
+ \setfalse\c_layers_repeated
+ \else
+ \edef\p_layers_repeat{\layerparameter\c!repeat}%
+ \ifx\p_layers_repeat\v!yes
+ \settrue\c_layers_repeated
+ \else\ifx\p_layers_state\v!repeat
+ \settrue\c_layers_repeated
+ \else
+ \setfalse\c_layers_repeated
\fi\fi
\fi
\fi
- \chardef\layerbox\csname\@@layerbox#2\endcsname % \@@layerbox\currentlayer
+ \chardef\b_layers\csname\??layerbox#2\endcsname % trick
% we need to copy in order to retain the negative offsets for a next
% stage of additions, i.e. llx/lly accumulate in repeat mode and the
% compensation may differ each flush depending on added content
\setbox\nextbox
- \if!!doneb
- \therepositionededlayerbox
+ \ifx\p_layers_method\v!fit
+ \layers_positioned_box_yes
\else
- \if!!donec\box\else\copy\fi\layerbox % sorry for the delay due to copying
+ \layers_positioned_box_nop
\fi
% todo: method=offset => overlayoffset right/down (handy for backgrounds with offset)
- \doifoverlayelse{#2}{\setlayoutcomponentattribute{\v!layer:#2}}\resetlayoutcomponentattribute
- \iftracelayers \ruledvbox \else \vbox \fi \if!!donea to \overlayheight \fi \layoutcomponentboxattribute
- {\hbox \if!!donea to \overlaywidth \fi
- {\edef\@@currentlayerpageposition{\csname\??ll#2\realfolio\c!position\endcsname}%
- \ifx\@@currentlayerpageposition\v!yes\xypos{lyr:#2:\realfolio}\fi
+ \doifoverlayelse{#2}%
+ {\setlayoutcomponentattribute{\v!layer:#2}}%
+ \resetlayoutcomponentattribute
+ \ifx\p_layers_option\v!test \ruledvbox \else \vbox \fi \ifx\p_layers_method\v!overlay to \overlayheight \fi \layoutcomponentboxattribute
+ {\hbox \ifx\p_layers_method\v!overlay to \overlaywidth \fi
+ {\edef\currentlayer{#2\realfolio}% local
+ \edef\p_layers_position{\layerparameter\c!position}% local
+ \ifx\p_layers_position\v!yes
+ \xypos{\??layerposition#2:\realfolio}%
+ \fi
\box\nextbox
\hss}%
\vss}%
- \if!!donec
- \gsetboxllx\layerbox\zeropoint
- \gsetboxlly\layerbox\zeropoint
+ \ifconditional\c_layers_repeated\else
+ \gsetboxllx\b_layers\zeropoint
+ \gsetboxlly\b_layers\zeropoint
\fi
\endgroup}
-\def\therepositionededlayerbox % assumes that \if!!donec is set (todo: use dedicated flags)
+\def\layers_positioned_box_yes
{\vbox
- {\vskip-\getboxlly\layerbox
- \hskip-\getboxllx\layerbox
- \hsize-\dimexpr\getboxllx\layerbox-\wd\layerbox\relax
- \if!!donec\box\else\copy\fi\layerbox}}
+ {\vskip-\getboxlly\b_layers
+ \hskip-\getboxllx\b_layers
+ \hsize-\dimexpr\getboxllx\b_layers-\wd\b_layers\relax
+ \ifconditional\c_layers_repeated\copy\else\box\fi\b_layers}}
+
+\def\layers_positioned_box_nop
+ {\ifconditional\c_layers_repeated\copy\else\box\fi\b_layers}
-% \definelayer[test][method=fit] \setupcolors[state=start] \tracelayerstrue
+% \definelayer[test][method=fit] \setupcolors[state=start,option=test]
%
% \framed[framecolor=red,offset=overlay]{\setlayer[test]{aa}\setlayer[test][x=10pt]{g}\flushlayer[test]}
% \framed[framecolor=red,offset=overlay]{\setlayer[test]{aa}\setlayer[test][x=-10pt]{bb}\flushlayer[test]}
@@ -536,11 +614,9 @@
%D when we use it as parameter. This name also suits better
%D to other layering commands.
-\def\composedlayer#1{\flushlayer[#1]}
-
-\let\placelayer\flushlayer
+\unexpanded\def\composedlayer#1{\flushlayer[#1]}
-\def\tightlayer[#1]%
+\unexpanded\def\tightlayer[#1]%
{\hbox
{\def\currentlayer{#1}% todo: left/right
\setbox\nextbox\emptybox % hoogte/breedte are \wd\nextbox/\ht\nextbox
@@ -548,23 +624,7 @@
\vsize\layerparameter\c!height % \overlaywheight = \vsize
\composedlayer{#1}}}
-%D \macros
-%D {resetlayer}
-%D
-%D This macro hardly needs an explanation (and is seldom
-%D needed as well).
-
-\def\doresetlayer#1%
- {\ifcsname\@@layerbox#1\endcsname
- \global\setbox\csname\@@layerbox#1\endcsname\emptybox
- \fi}
-
-\def\resetlayer[#1]%
- {\doresetlayer{#1}%
- \doifvalue{\??ll#1\c!doublesided}\v!yes % kind of redundant test
- {\doresetlayer{\v!left #1}%
- \doresetlayer{\v!right#1}}%
- \doresetlayer{#1:\realfolio}}
+\let\placelayer\flushlayer
%D \macros
%D {setMPlayer}
@@ -597,31 +657,28 @@
%D {\useMPgraphic{oeps}}
%D \stoptyping
-\def\setMPlayer
- {\dotripleempty\dosetMPlayer}
+\unexpanded\def\setMPlayer
+ {\dotripleempty\layers_set_MP}
\def\MPlayerwidth {\hsize}
\def\MPlayerheight{\vsize}
-\def\dosetMPlayer[#1][#2][#3]%
+\def\layers_set_MP[#1][#2][#3]%
{\edef\MPlayerwidth {\MPw{#2}}%
\edef\MPlayerheight{\MPh{#2}}%
\setlayer[#1][\c!x=\MPx{#2},\c!y=\MPy{#2},\c!position=\v!no,#3]}
-\def\getMPlayer
- {\dodoubleempty\dogetMPlayer}
+\unexpanded\def\getMPlayer
+ {\dodoubleempty\layers_get_MP}
-\def\dogetMPlayer[#1][#2]%
- {\framed
- [\c!background={\v!foreground,#1},
- \c!frame=\v!off,
- \c!offset=\v!overlay,#2]}
+\def\layers_get_MP[#1][#2]%
+ {\framed[\c!background={\v!foreground,#1},\c!frame=\v!off,\c!offset=\v!overlay,#2]} % takes argument
%D Watch out, a redefinition:
-\ifx\settextpagecontent\undefined \writestatus\m!system{error in page-lyr.tex} \wait \fi
-
-\let\normalsettextpagecontent\settextpagecontent
+\ifdefined\settextpagecontent \else
+ \writestatus\m!system{error in page-lyr.tex} \wait
+\fi
\definelayer
[OTRTEXT]
@@ -631,9 +688,9 @@
[\c!width=\innermakeupwidth,
\c!height=\textheight]
-% will be overloaded in page-spr
+\let\normalsettextpagecontent\settextpagecontent % will be overloaded in page-spr
-\def\settextpagecontent#1#2#3% #2 and #3 will disappear
+\unexpanded\def\settextpagecontent#1#2#3% #2 and #3 will disappear
{\doifelselayerdata{OTRTEXT}
{\setbox#1\hbox to \makeupwidth
{\startoverlay