diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex | 177 |
1 files changed, 137 insertions, 40 deletions
diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex index 7f6cda54930..b063bf72a55 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex @@ -92,7 +92,9 @@ % space. \def\pgfplots@stacked@finalize{% \global\pgfplotslistnewempty\pgfplots@stacked@zerolevellist - \global\pgfplotslistnewempty\pgfplots@stacked@nextzerolevellist + \global\pgfplotslistnewempty\pgfplots@stacked@zerolevellist@neg + \global\pgfplotslistnewempty\pgfplots@stacked@nextzerolevellist@pos + \global\pgfplotslistnewempty\pgfplots@stacked@nextzerolevellist@neg \pgfplots@stacked@isinitialisedfalse }% @@ -114,49 +116,94 @@ \pgfplots@error{LOGIC ERROR: please call \string\pgfplots@stacked@initialise.}% \fi \def\pgfplots@stacked@zerolevel@current{}% + \def\pgfplots@stacked@zerolevel@current@pos{}% + \def\pgfplots@stacked@zerolevel@current@neg{}% \pgfplots@stacked@prepare@value@serialization % accumulate this command here for \closedcycle: \ifpgfplots@stacked@isfirstplot \global\pgfplotslistnewempty\pgfplots@stacked@zerolevellist + \global\pgfplotslistnewempty\pgfplots@stacked@zerolevellist@neg % only work with float if its really necessary - for % example if the scaling trafo which maps to pgfmath is % not yet initialised. - \ifpgfplots@datascaletrafo@initialised % FIXME : should be '!ifsurvey' - \def\pgfplots@stacked@zerolevelpoint@x{0}% - \def\pgfplots@stacked@zerolevelpoint@y{0}% - \def\pgfplots@stacked@zerolevelpoint@z{0}% - \else - % note that log plots are special: their "stacked zero" is - % computed with \pgfplotscoordmath{default} - % - \pgfplots@if{pgfplots@xislinear}{\pgfplotscoordmath{x}{zero}}{\pgfplotscoordmath{default}{zero}}% - \let\pgfplots@stacked@zerolevelpoint@x=\pgfmathresult - % - \pgfplots@if{pgfplots@yislinear}{\pgfplotscoordmath{y}{zero}}{\pgfplotscoordmath{default}{zero}}% - \let\pgfplots@stacked@zerolevelpoint@y=\pgfmathresult - % - \pgfplots@if{pgfplots@xislinear}{\pgfplotscoordmath{z}{zero}}{\pgfplotscoordmath{default}{zero}}% - \let\pgfplots@stacked@zerolevelpoint@z=\pgfmathresult - \fi + \pgfplots@stacked@zerolevel@fallback x% + \pgfplots@stacked@zerolevel@fallback y% + \pgfplots@stacked@zerolevel@fallback z% % - \def\pgfplots@stacked@getnextzerolevelpoint{}% will remain constant anyway. + \def\pgfplots@stacked@getnextzerolevelpoint{% + % keep \pgfplots@stacked@zerolevel@current = {} + % there is special handling in place which will use the + % '0' level in this case + % + % omit this: + %\pgfplots@stacked@ensure{}% + %\let\pgfplots@stacked@zerolevel@current=\pgfplotsretval + }% \else {\globaldefs=1 - \pgfplotslistcopy\pgfplots@stacked@nextzerolevellist\to\pgfplots@stacked@zerolevellist + \pgfplotslistcopy\pgfplots@stacked@nextzerolevellist@pos\to\pgfplots@stacked@zerolevellist + \pgfplotslistcopy\pgfplots@stacked@nextzerolevellist@neg\to\pgfplots@stacked@zerolevellist@neg }% \def\pgfplots@stacked@getnextzerolevelpoint{% - \pgfplotslistcheckempty\pgfplots@stacked@zerolevellist - \ifpgfplotslistempty - \pgfplots@stacked@wrong@count@error + % + \pgfplots@stacked@getnextzerolevelpoint@pos + % + \if P\pgfplots@stacked@negative@mode + % stack negative=on previous: + % just use one list in order to remember the + % zerolevel: + \expandafter\pgfplots@stacked@parsezerolevelpoint\expandafter{\pgfplots@stacked@zerolevel@current@pos}% \else - {\globaldefs=1 - \pgfplotslistpopfront\pgfplots@stacked@zerolevellist\to\pgfmathresult - }% - \expandafter\pgfplots@stacked@parsezerolevelpoint\expandafter{\pgfmathresult}% + % stack negative=separate: + % use two levels, one for '+' and one for '-': + \pgfplots@stacked@getnextzerolevelpoint@neg + % + \if+\pgfplots@stacked@sign + \expandafter\pgfplots@stacked@parsezerolevelpoint\expandafter{\pgfplots@stacked@zerolevel@current@pos}% + \else + \expandafter\pgfplots@stacked@parsezerolevelpoint\expandafter{\pgfplots@stacked@zerolevel@current@neg}% + \fi \fi }% \fi - \global\pgfplotslistnewempty\pgfplots@stacked@nextzerolevellist + \global\pgfplotslistnewempty\pgfplots@stacked@nextzerolevellist@pos + \global\pgfplotslistnewempty\pgfplots@stacked@nextzerolevellist@neg +}% + +\def\pgfplots@stacked@getnextzerolevelpoint@pos{% + \pgfplotslistcheckempty\pgfplots@stacked@zerolevellist + \ifpgfplotslistempty + \pgfplots@stacked@wrong@count@error + \else + {\globaldefs=1 + \pgfplotslistpopfront\pgfplots@stacked@zerolevellist\to\pgfplots@stacked@zerolevel@current@pos + }% + \fi +}% +\def\pgfplots@stacked@getnextzerolevelpoint@neg{% + \pgfplotslistcheckempty\pgfplots@stacked@zerolevellist@neg + \ifpgfplotslistempty + \pgfplots@stacked@wrong@count@error + \else + {\globaldefs=1 + \pgfplotslistpopfront\pgfplots@stacked@zerolevellist@neg\to\pgfplots@stacked@zerolevel@current@neg + }% + \fi +} + +\def\pgfplots@stacked@zerolevel@fallback#1{% + \pgfplots@stacked@zerolevel@fallback@{#1}% + \expandafter\let\csname pgfplots@stacked@zerolevelpoint@#1\endcsname=\pgfmathresult% +}% +\def\pgfplots@stacked@zerolevel@fallback@#1{% + \ifpgfplots@datascaletrafo@initialised % FIXME : should be '!ifsurvey' + \def\pgfmathresult{0}% + \else + % note that log plots are special: their "stacked zero" is + % computed with \pgfplotscoordmath{default} + % + \pgfplots@if{pgfplots@#1islinear}{\pgfplotscoordmath{#1}{zero}}{\pgfplotscoordmath{default}{zero}}% + \fi }% % ATTENTION: install this before 'visualization depends on' - it @@ -198,6 +245,7 @@ % The zero'th level has an empty zero level point. \expandafter\def\expandafter\pgfplotsaxisserializedatapoint@private\expandafter{% \pgfplotsaxisserializedatapoint@private + % at deserialization time, this will become \pgfplots@stacked@zerolevel : \t@pgfplots@toka=\expandafter{\pgfplots@stacked@zerolevel@current}% \t@pgfplots@tokb=\expandafter{\pgfplotsretval}% \edef\pgfplotsretval{% @@ -254,6 +302,16 @@ \else \pgfplots@stacked@wrong@count@error \fi + \if P\pgfplots@stacked@negative@mode + % stack negative=on previous: + \else + % stack negative=separate: + \pgfplotslistcheckempty\pgfplots@stacked@zerolevellist@neg + \ifpgfplotslistempty + \else + \pgfplots@stacked@wrong@count@error + \fi + \fi \fi \ifpgfplots@stacked@isfirstplot \def\pgfplots@stacked@serialized@commands{\noexpand\pgfplots@stacked@isfirstplottrue}% @@ -291,11 +349,6 @@ \fi }% -% #1: a point as (x,y) (or (x,y,z) ) -\def\pgfplots@stacked@rememberzerolevelpoint@for@next@plot#1{% - \expandafter\pgfplotslistpushbackglobal\expandafter{#1}\to\pgfplots@stacked@nextzerolevellist -} - % Provides public access to zero levels into some key-value pairs. % Returns the values into a set of keys in the /data point/ prefix. % @@ -383,12 +436,18 @@ % % Note that it is not necessarily the first one which is % processed (compare reverse stacked plots). + \begingroup + % FIXME : eliminate this special handling by recording the + % correct '0' values during the survey phase! + \pgfutil@namelet{pgfplots@current@point@\pgfplots@stacked@dir}{pgfplots@logical@ZERO@\pgfplots@stacked@dir}% + \pgfplotsaxis@toPGF@coords \if\pgfplots@stacked@dir x - \edef\pgfplots@loc@TMPa{\pgfplots@logical@ZERO@x pt}% + \edef\pgfplots@stacked@PGF@zerolevel{\the\pgf@x}% \else - \edef\pgfplots@loc@TMPa{\pgfplots@logical@ZERO@y pt}% + \edef\pgfplots@stacked@PGF@zerolevel{\the\pgf@y}% \fi - \let\pgfplots@stacked@PGF@zerolevel\pgfplots@loc@TMPa + \pgfmath@smuggleone\pgfplots@stacked@PGF@zerolevel + \endgroup % \else \begingroup @@ -455,8 +514,6 @@ % POSTCONDITION: % - \pgfplots@current@point@[xyz] are adjusted. \def\pgfplots@stacked@preparepoint@inmacro{% - \pgfplots@stacked@getnextzerolevelpoint - % \ifpgfplots@stacked@plus \def\pgfplots@stacked@op{add}% \else @@ -465,6 +522,15 @@ % \pgfutil@namelet{pgfplots@stacked@diff}{pgfplots@current@point@\pgfplots@stacked@dir}% % + \pgfmathfloatparsenumber{\pgfplots@stacked@diff}% + \expandafter\pgfmathfloatifflags\expandafter{\pgfmathresult}{2}{% + \def\pgfplots@stacked@sign{-}% + }{% + \def\pgfplots@stacked@sign{+}% + }% + \pgfplots@stacked@getnextzerolevelpoint + % + % \pgfplots@if{pgfplots@\pgfplots@stacked@dir islinear}{% \pgfplotscoordmath{\pgfplots@stacked@dir}{op}{\pgfplots@stacked@op}{% {\csname pgfplots@stacked@zerolevelpoint@\pgfplots@stacked@dir\endcsname}% @@ -490,7 +556,6 @@ % this here would also be ok, but it would only store the coords % of the zero level... %\pgfplotsplothandlerserializepointto\pgfplotsretval -%\message{serializing current value current value to \meaning\pgfplotsretval^^J}% % \begingroup % @@ -499,7 +564,28 @@ \pgfplots@stacked@strip@parents@zerolevel % \pgfplotsaxisserializedatapointtostring - \pgfplots@stacked@rememberzerolevelpoint@for@next@plot{\pgfplotsretval}% + % +%\message{Current value is '\pgfplots@stacked@sign'. Serializing: \meaning\pgfplotsretval^^J}% + \if P\pgfplots@stacked@negative@mode + % stack negative=on previous: + % just track one list + \expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplotsretval}\to\pgfplots@stacked@nextzerolevellist@pos + \else + % stack negative=separate: + % keep track of both separate zerolevel lists: + \if+\pgfplots@stacked@sign + \expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplotsretval}\to\pgfplots@stacked@nextzerolevellist@pos + % + \pgfplots@stacked@ensure\pgfplots@stacked@zerolevel@current@neg + \expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplotsretval}\to\pgfplots@stacked@nextzerolevellist@neg + \else + \expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplotsretval}\to\pgfplots@stacked@nextzerolevellist@neg + % + \pgfplots@stacked@ensure\pgfplots@stacked@zerolevel@current@pos + \expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplotsretval}\to\pgfplots@stacked@nextzerolevellist@pos + \fi + \fi + % \endgroup % % @@ -507,6 +593,17 @@ \pgfplots@stacked@logarithm@if@needed } +\def\pgfplots@stacked@ensure#1{% + \ifx#1\pgfutil@empty + \pgfplots@stacked@zerolevel@fallback@{\pgfplots@stacked@dir}% + \expandafter\let\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname=\pgfmathresult + \else + \expandafter\pgfplotsaxisdeserializedatapointfrom#1% no braces + \fi + \pgfplotsaxisserializedatapointtostring +%\message{UNUSED value serialized as \meaning\pgfplotsretval^^J}% +}% + % % We store the normal values for zero levels. Consequently, we may % need to (re)apply the log if we have a log axis. |