summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex591
1 files changed, 281 insertions, 310 deletions
diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex
index 6c89ab7016a..8118ad2ef16 100644
--- a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex
+++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex
@@ -7,7 +7,7 @@
%
% It is based on Till Tantau's PGF package.
%
-% Copyright 2007/2008 by Christian Feuersänger.
+% Copyright 2007-2013 by Christian Feuersänger.
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
@@ -43,7 +43,7 @@
%
% The second one will be used to form zero levels for the next plot.
%
-% 2. At the beginning and end of each plot, the lists in 1.) are
+% 2. At the beginning and end of the survey phase of each plot, the lists in 1.) are
% initialised properly.
%
% 3.1 While plot coordinates are processed during the survey phase, the following methods
@@ -57,7 +57,7 @@
%
%
% 3.2 during the final visualization phase, we have
-% \pgfplots@stacked@finishpoint
+% \pgfplots@stacked@visphasepreparedatapoint
% -> takes coordinates as they will be given to Tikz. This method is
% used to
% - communicate zero level coordinates to Tikz
@@ -72,6 +72,10 @@
\let\pgfplots@stacked@zerolevelpoint@x=\pgfutil@empty
\let\pgfplots@stacked@zerolevelpoint@y=\pgfutil@empty
+
+% this value is populated during the survey phase. It will be copied
+% to the visualization phase, i.e. it will be serialized along with
+% the survey'ed state:
\newif\ifpgfplots@stacked@isfirstplot
\newif\ifpgfplots@stacked@isinitialised
@@ -100,15 +104,18 @@
%
% ATTENTION: call \pgfplots@stacked@initialise before the first call
% of beginplot!
+%
+% ATTENTION: install this before 'visualization depends on' - it
+% modifies \pgfplotsaxisserializedatapoint@private
\def\pgfplots@stacked@beginplot{%
%\message{pgfplots@stacked@beginplot: PLOT STARTED.}%
\ifpgfplots@stacked@isinitialised
\else
\pgfplots@error{LOGIC ERROR: please call \string\pgfplots@stacked@initialise.}%
\fi
- \global\pgfplotslistnewempty\pgfplots@stacked@PGFzerolevels
+ \def\pgfplots@stacked@zerolevel@current{}%
+ \pgfplots@stacked@prepare@value@serialization
% accumulate this command here for \closedcycle:
- \let\pgfplots@stacked@closedcycle@impl=\pgfutil@empty
\ifpgfplots@stacked@isfirstplot
\global\pgfplotslistnewempty\pgfplots@stacked@zerolevellist
% only work with float if its really necessary - for
@@ -137,58 +144,130 @@
{\globaldefs=1
\pgfplotslistcopy\pgfplots@stacked@nextzerolevellist\to\pgfplots@stacked@zerolevellist
}%
- \ifpgfplots@threedim
- \def\pgfplots@stacked@getnextzerolevelpoint{%
- \pgfplotslistcheckempty\pgfplots@stacked@zerolevellist
- \ifpgfplotslistempty
- \pgfplots@stacked@wrong@count@error
- \else
- {\globaldefs=1
- \pgfplotslistpopfront\pgfplots@stacked@zerolevellist\to\pgfmathresult
- }%
- \expandafter\pgfplots@stacked@parsezerolevelpoint@threedim\pgfmathresult\relax
- \fi
- }%
- \else
- \def\pgfplots@stacked@getnextzerolevelpoint{%
- \pgfplotslistcheckempty\pgfplots@stacked@zerolevellist
- \ifpgfplotslistempty
- \pgfplots@stacked@wrong@count@error
- \else
- {\globaldefs=1
- \pgfplotslistpopfront\pgfplots@stacked@zerolevellist\to\pgfmathresult
- }%
- \expandafter\pgfplots@stacked@parsezerolevelpoint\pgfmathresult\relax
- \fi
- }%
- \fi
+ \def\pgfplots@stacked@getnextzerolevelpoint{%
+ \pgfplotslistcheckempty\pgfplots@stacked@zerolevellist
+ \ifpgfplotslistempty
+ \pgfplots@stacked@wrong@count@error
+ \else
+ {\globaldefs=1
+ \pgfplotslistpopfront\pgfplots@stacked@zerolevellist\to\pgfmathresult
+ }%
+ \expandafter\pgfplots@stacked@parsezerolevelpoint\expandafter{\pgfmathresult}%
+ \fi
+ }%
\fi
\global\pgfplotslistnewempty\pgfplots@stacked@nextzerolevellist
}%
-\def\pgfplots@stacked@parsezerolevelpoint(#1,#2)\relax{%
- \def\pgfplots@stacked@zerolevelpoint@x{#1}%
- \def\pgfplots@stacked@zerolevelpoint@y{#2}%
-}
-\def\pgfplots@stacked@parsezerolevelpoint@threedim(#1,#2,#3)\relax{%
- \def\pgfplots@stacked@zerolevelpoint@x{#1}%
- \def\pgfplots@stacked@zerolevelpoint@y{#2}%
- \def\pgfplots@stacked@zerolevelpoint@z{#3}%
+% ATTENTION: install this before 'visualization depends on' - it
+% modifies \pgfplotsaxisserializedatapoint@private
+\def\pgfplots@stacked@visphase@beginplot{%
+%\message{pgfplots@stacked@beginplot: VISUALIZATION OF PLOT STARTED (phase = \pgfplots@visphase@name).^^J}%
+ \let\pgfplots@stacked@closedcycle@impl=\pgfutil@empty
+ \pgfplots@stacked@prepare@value@serialization
+}%
+
+\def\pgfplots@stacked@prepare@value@serialization{%
+ % This here is SIMILAR to 'visualization depends on'.
+ %
+ % The only difference is that 'visualization depends on' expands
+ % its arguments whereas this one here does not.
+ %
+ \pgfplotsset{%
+ visualization depends on=value \pgfplots@stacked@diff\as\pgfplots@stacked@diff
+ }%
+ %
+ %
+ % Modify the axis private parts such that a data point is
+ % serialized to the form
+ % {Z{<stacked zerolevel value>}{<point meta>};<x coordinate>,<y coordinate>,<z coordinate>}
+ %
+ % for example, a 2d data pont (0,1) without point meta is serialized to
+ % {Z{}{};0Y0.0e0],1Y1.0e0],}
+ %
+ % The deserialization looks for the magic token 'Z'. The next
+ % parameter is the zero level of the data point, the following one
+ % the "old" private serialization stuff (typically just point
+ % meta).
+ %
+ % Note that the zero level of a data point might have its own zero
+ % level (grand father) ... this would be part here as well, even
+ % if it is useless (?). This causes recursive references to all
+ % zero levels... and more memory for stacked plots.
+ %
+ % The zero'th level has an empty zero level point.
+ \expandafter\def\expandafter\pgfplotsaxisserializedatapoint@private\expandafter{%
+ \pgfplotsaxisserializedatapoint@private
+ \t@pgfplots@toka=\expandafter{\pgfplots@stacked@zerolevel@current}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotsretval}%
+ \edef\pgfplotsretval{%
+ Z{\the\t@pgfplots@toka}%
+ {\the\t@pgfplots@tokb}%
+ }%
+ }%
+ %
+ \pgfutil@ifundefined{pgfplotsaxisdeserializedatapointfrom@private@backup@}{}{%
+ \pgfplots@error{Illegal internal state encountered: the stacked plots serialization preparation has been invoked twice}%
+ }%
+ \let\pgfplotsaxisdeserializedatapointfrom@private@backup@=\pgfplotsaxisdeserializedatapointfrom@private
+ \def\pgfplotsaxisdeserializedatapointfrom@private##1{%
+ \pgfplotsaxisdeserializedatapointfrom@private@stacked@##1%
+ }%
+}%
+
+\def\pgfplotsaxisdeserializedatapointfrom@private@stacked@ Z#1#2{%
+ \def\pgfplots@stacked@zerolevel{#1}%
+ \pgfplotsaxisdeserializedatapointfrom@private@backup@{#2}%
+}%
+
+\def\pgfplots@stacked@parsezerolevelpoint#1{%
+ \begingroup
+ \pgfplotsaxisdeserializedatapointfrom#1% no braces here!
+% \pgfplotsplothandlerdeserializepointfrom{#1}%
+ \pgfplots@stacked@smuggle
+ \endgroup
+ % the value of \pgfplots@stacked@zerolevel@current will be configured as
+ % "visualization depends on".
+ % In other words: it is available later-on.
+ \def\pgfplots@stacked@zerolevel@current{#1}%
}
+\def\pgfplots@stacked@smuggle\endgroup{%
+ \xdef\pgfplots@glob@TMPb{%
+ \noexpand\def\noexpand\pgfplots@stacked@zerolevelpoint@x{\pgfplots@current@point@x}%
+ \noexpand\def\noexpand\pgfplots@stacked@zerolevelpoint@y{\pgfplots@current@point@y}%
+ \noexpand\def\noexpand\pgfplots@stacked@zerolevelpoint@z{\pgfplots@current@point@z}%
+ }%
+ \endgroup
+ \pgfplots@glob@TMPb
+}%
+
\def\pgfplots@stacked@wrong@count@error{%
\pgfplots@error{Sorry, pgfplots expects stacked plots to have exactly the same number of coordinates. Unfortunately, I encountered at plot with DIFFERENT NUMBERS OF COORDINATES. Please verify that 1. no point has been dropped by coordinate filters (for example log(0) or so) and 2. all plots have the same number of coordinates.}%
}%
-\def\pgfplots@stacked@endplot{%
+\def\pgfplots@stacked@survey@endplot{%
+%\message{Stacked plot survey phase end: isfirst = \ifpgfplots@stacked@isfirstplot true \else false\fi^^J}%
\ifpgfplots@stacked@isfirstplot
- \let\pgfplots@stacked@closedcycle@impl=\pgfplots@path@closed@cycle@std
- \else
\pgfplotslistcheckempty\pgfplots@stacked@zerolevellist
\ifpgfplotslistempty
\else
\pgfplots@stacked@wrong@count@error
\fi
+ \fi
+ \ifpgfplots@stacked@isfirstplot
+ \def\pgfplots@stacked@serialized@commands{\noexpand\pgfplots@stacked@isfirstplottrue}%
+ \else
+ \def\pgfplots@stacked@serialized@commands{\noexpand\pgfplots@stacked@isfirstplotfalse}%
+ \fi
+ \global\pgfplots@stacked@isfirstplotfalse
+}%
+
+\def\pgfplots@stacked@visphase@endplot{%
+%\message{Stacked plot vis phase end: isfirst = \ifpgfplots@stacked@isfirstplot true \else false\fi^^J}%
+ \ifpgfplots@stacked@isfirstplot
+ \let\pgfplots@stacked@closedcycle@impl=\pgfplots@path@closed@cycle@std
+ \else
\t@pgfplots@tokc=\expandafter{\pgfplots@stacked@closedcycle@impl}%
\edef\pgfplots@stacked@closedcycle@impl{%
[mark=none,/utils/exec=\noexpand\pgfplots@try@mirror@plot@handler]
@@ -197,7 +276,6 @@
}%
\fi
\global\pgfplots@stacked@isfirstplotfalse
-%\message{pgfplots@stacked@endplot: PLOT ENDED}%
}%
% WARNING: when this method is called, NEITHER
@@ -215,28 +293,116 @@
% #1: a point as (x,y) (or (x,y,z) )
\def\pgfplots@stacked@rememberzerolevelpoint@for@next@plot#1{%
- \edef\pgfplots@loc@TMPa{#1}%
- \expandafter\pgfplotslistpushbackglobal\pgfplots@loc@TMPa\to\pgfplots@stacked@nextzerolevellist
+ \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.
+%
+% The values can be used in 'axis cs'.
+\def\pgfplotspointgetzerolevelcoordinates{%
+ \pgfplotspointgetnormalizedzerolevelcoordinates
+ \pgfplotspointgetcoordinatesfromnormalized[path=/data point/zero]%
+ \pgfplotspointgetcoordinatesfromnormalized[path=/data point/diff]%
+}
+
+% Same as \pgfplotsgetzerolevelcoordinates, but the resulting values
+% are for use in 'normalized axis cs'.
+%
+% This works for both stacked plots and normal plots.
+\def\pgfplotspointgetnormalizedzerolevelcoordinates{%
+ \begingroup
+ \ifpgfplots@stackedmode
+ \ifx\pgfplots@stacked@zerolevel\pgfutil@empty
+ \pgfplotspointgetnormalizedcoordinates%
+ \pgfplotsutilforeachcommasep{x,y,z}\as\pgfplots@loc@TMPa{%
+ \pgfkeysgetvalue{/data point/\pgfplots@loc@TMPa}\pgfplots@loc@TMPb
+ \expandafter\let\csname pgfplots@current@point@\pgfplots@loc@TMPa\endcsname=\pgfplots@loc@TMPb
+ }%
+ \pgfplotscoordmath{\pgfplots@stacked@dir}{zero}%
+ \expandafter\let\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname\pgfmathresult%
+ %
+ \let\pgfplots@current@point@meta=\pgfutil@empty
+ \pgfkeyssetvalue{/data point/zero/auto}{1}%
+ \else
+ %
+ \expandafter\pgfplotsaxisdeserializedatapointfrom\pgfplots@stacked@zerolevel%
+ \pgfkeyssetvalue{/data point/zero/auto}{0}%
+ \fi
+ %
+ \pgfplotscoordmath{x}{zero}\let\pgfplots@stacked@diff@x=\pgfmathresult%
+ \pgfplotscoordmath{y}{zero}\let\pgfplots@stacked@diff@y=\pgfmathresult%
+ \pgfplotscoordmath{z}{zero}\let\pgfplots@stacked@diff@z=\pgfmathresult%
+ \pgfutil@namelet{pgfplots@stacked@diff@\pgfplots@stacked@dir}{pgfplots@stacked@diff}%
+ \else
+ % Ah - no stacked plot!? Well, than do "something useful":
+ \pgfplotscoordmath{x}{zero}\let\pgfplots@current@point@x=\pgfmathresult%
+ \pgfplotscoordmath{y}{zero}\let\pgfplots@current@point@y=\pgfmathresult%
+ \pgfplotscoordmath{z}{zero}\let\pgfplots@current@point@z=\pgfmathresult%
+ %
+ \pgfplotspointgetnormalizedcoordinates%
+ \pgfplotsutilforeachcommasep{x,y,z}\as\pgfplots@loc@TMPa{%
+ \pgfkeysgetvalue{/data point/\pgfplots@loc@TMPa}\pgfplots@loc@TMPb
+ \expandafter\let\csname pgfplots@stacked@diff@\pgfplots@loc@TMPa\endcsname=\pgfplots@loc@TMPb
+ }%
+ \pgfkeyssetvalue{/data point/zero/auto}{1}%
+ \fi
+ %
+ \xdef\pgfplots@glob@TMPd{%
+ \noexpand\pgfkeyssetvalue{/data point/zero/x}{\pgfplots@current@point@x}%
+ \noexpand\pgfkeyssetvalue{/data point/zero/y}{\pgfplots@current@point@y}%
+ \noexpand\pgfkeyssetvalue{/data point/zero/z}{\pgfplots@current@point@z}%
+ \noexpand\pgfkeyssetvalue{/data point/zero/meta}{\pgfplots@current@point@meta}%
+ \noexpand\pgfkeyssetvalue{/data point/zero/auto}{\pgfkeysvalueof{/data point/zero/auto}}%
+ \noexpand\pgfkeyssetvalue{/data point/diff/x}{\pgfplots@stacked@diff@x}%
+ \noexpand\pgfkeyssetvalue{/data point/diff/y}{\pgfplots@stacked@diff@y}%
+ \noexpand\pgfkeyssetvalue{/data point/diff/z}{\pgfplots@stacked@diff@z}%
+ }%
+ \endgroup
+ \pgfplots@glob@TMPd
+%
+%\message{pgfplotsgetzerolevelcoordinates returned x=\pgfkeysvalueof{/data point/zero/x}, y=\pgfkeysvalueof{/data point/zero/y}, diffx=\pgfkeysvalueof{/data point/diff/x}; diffy=\pgfkeysvalueof{/data point/diff/y}, diff=\pgfkeysvalueof{/data point/diff}^^J}%
+}%
+
% PRECONDITION:
% Is in invoked inside of a coord preparation routine, that means
% - \pgfplots@current@point@[xyz]
% - \ifpgfplots@curplot@threedim
% are all set properly.
-\def\pgfplots@stacked@finishpoint{%
- \ifpgfplots@stacked@isfirstplot
+\def\pgfplots@stacked@visphasepreparedatapoint{%
+ \ifx\pgfplots@stacked@zerolevel\pgfutil@empty
+ % this here is the case if we have the first encountered plot,
+ % i.e. the one on which others are stacked.
+ %
+ % Note that it is not necessarily the first one which is
+ % processed (compare reverse stacked plots).
+ \if\pgfplots@stacked@dir x
+ \edef\pgfplots@loc@TMPa{\pgfplots@logical@ZERO@x pt}%
+ \else
+ \edef\pgfplots@loc@TMPa{\pgfplots@logical@ZERO@y pt}%
+ \fi
+ \let\pgfplots@stacked@PGF@zerolevel\pgfplots@loc@TMPa
+ %
\else
- % FIXME : This needs to be converted to logical coords.
+ \begingroup
+ %\expandafter\pgfplotsplothandlerdeserializepointfrom\expandafter{\pgfplots@stacked@zerolevel}%
+ \expandafter\pgfplotsaxisdeserializedatapointfrom\pgfplots@stacked@zerolevel%
+ %
+ \pgfplots@stacked@logarithm@if@needed
+ %
+ % avoid endless recursion:
+ \let\pgfplots@stacked@visphasepreparedatapoint=\relax
+ \pgfplotsaxisvisphasegetpoint
+ \edef\pgfplots@current@point@x{\the\pgf@x}%
+ \edef\pgfplots@current@point@y{\the\pgf@y}%
+ \pgfplots@stacked@smuggle
+ \endgroup
%
- % FIXME : 3D is not supported by the low level plot interface (yet).
- \pgfpointxy{\pgfplots@stacked@zerolevelpoint@x}{\pgfplots@stacked@zerolevelpoint@y}%
\if\pgfplots@stacked@dir x
- \edef\pgfplots@loc@TMPa{\the\pgf@x}%
+ \let\pgfplots@stacked@PGF@zerolevel=\pgfplots@stacked@zerolevelpoint@x%
\else
- \edef\pgfplots@loc@TMPa{\the\pgf@y}%
+ \let\pgfplots@stacked@PGF@zerolevel=\pgfplots@stacked@zerolevelpoint@y%
\fi
- \expandafter\pgfplotslistpushbackglobal\pgfplots@loc@TMPa\to\pgfplots@stacked@PGFzerolevels
\t@pgfplots@toka=\expandafter{\pgfplots@stacked@closedcycle@impl}%
\edef\pgfplots@stacked@closedcycle@impl{%
(\pgfplots@stacked@zerolevelpoint@x,\pgfplots@stacked@zerolevelpoint@y)%
@@ -244,6 +410,26 @@
\fi
}%
+% A special hook which is executed early in the visualization phase.
+% It will be invoked *before*
+% \pgfplots@stacked@visphasepreparedatapoint!
+%
+% Its purpose is to clear the data if necessary, i.e. it implements
+% /pgfplots/stacked ignores zero
+\def\pgfplots@stacked@visphase@stream@coord@{%
+ \ifpgfplots@stacked@ignores@zero
+ \ifx\pgfplots@current@point@x\pgfutil@empty% this implements `unbounded coords=jump', for example
+ \else
+ \pgfplotscoordmath{\pgfplots@stacked@dir}{if is}{\pgfplots@stacked@diff}{0}{%
+ \let\pgfplots@current@point@x=\pgfutil@empty
+ \let\pgfplots@current@point@y=\pgfutil@empty
+ \let\pgfplots@current@point@z=\pgfutil@empty
+ }{%
+ }%
+ \fi
+ \fi
+}%
+
% PRECONDITION:
% Is in invoked inside of a coord preparation routine, that means
% - \pgfplots@current@point@[xyz]
@@ -260,6 +446,9 @@
\else
\def\pgfplots@stacked@op{subtract}%
\fi
+ %
+ \pgfutil@namelet{pgfplots@stacked@diff}{pgfplots@current@point@\pgfplots@stacked@dir}%
+ %
\pgfplots@if{pgfplots@\pgfplots@stacked@dir islinear}{%
\pgfplotscoordmath{\pgfplots@stacked@dir}{op}{\pgfplots@stacked@op}{%
{\csname pgfplots@stacked@zerolevelpoint@\pgfplots@stacked@dir\endcsname}%
@@ -281,21 +470,44 @@
%
% for logs, I remember just zerolevel+current; not its log.
\expandafter\let\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname=\pgfmathresult
- \ifpgfplots@threedim
- \ifpgfplots@curplot@threedim
- \pgfplots@stacked@rememberzerolevelpoint@for@next@plot{(\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z)}%
- \else
- \pgfplots@stacked@rememberzerolevelpoint@for@next@plot{(\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@logical@ZERO@z)}%
- \fi
- \else
- \pgfplots@stacked@rememberzerolevelpoint@for@next@plot{(\pgfplots@current@point@x,\pgfplots@current@point@y)}%
- \fi
%
+ % 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
+ %
+ % without this line, the "zerolevel" would also know all its zero
+ % levels recursively:
+ \pgfplots@stacked@strip@parents@zerolevel
+ %
+ \pgfplotsaxisserializedatapointtostring
+ \pgfplots@stacked@rememberzerolevelpoint@for@next@plot{\pgfplotsretval}%
+ \endgroup
+ %
+ %
+ %
+ \pgfplots@stacked@logarithm@if@needed
+}
+
+%
+% We store the normal values for zero levels. Consequently, we may
+% need to (re)apply the log if we have a log axis.
+%
+% I am unsure of whether log+stacked is useful at all.
+\def\pgfplots@stacked@logarithm@if@needed{%
\pgfplots@if{pgfplots@\pgfplots@stacked@dir islinear}{%
}{%
\pgfplotscoordmath{\pgfplots@stacked@dir}{log}{\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname}%
\expandafter\let\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname=\pgfmathresult
}%
+}%
+
+% you can \let this here to \relax if you want to gain access to all
+% zero levels recursively:
+\def\pgfplots@stacked@strip@parents@zerolevel{%
+ \def\pgfplots@stacked@zerolevel@current{}%
}
% This here is a re-implementation of the stored plot processing.
@@ -311,48 +523,11 @@
% whatever must not be affected, only the sequence of drawing commands
% shall change.
%
-% So, this command here does all numerics which is to be done and
-% assembles a NEW, REVERSED STORED PLOT LIST.
-%
-% FIXME : this routine is a mess. It is largely out-of-sync with the
-% remaining implementation of pgfplots and has way too many
-% responsabilities. I suppose it should be rewritten from scratch.
-% From what I see, it is more complicated than simply reversing the
-% list of stored plots and their legends: one needs to postprocess the
-% stacking order as it seems (?).
-%
-%
+% So, this command here reverses the list.
\def\pgfplots@stacked@finalize@stored@plots{%
\pgfplotslistnewempty\pgfplots@stored@plotlist@reversed
\begingroup
\pgfplotslistforeachungrouped\pgfplots@stored@plotlist\as\pgfplots@loc@TMPa{%
- \expandafter\pgfplots@stored@plotlist@EXTRACTENTRY\pgfplots@loc@TMPa
- \ifx\pgfplots@stored@current@cmd\pgfutil@empty
- \else
- % Apply the data scaling transformation and compute
- % stacked coordinates, but do NOT
- % issue any drawing commands:
- \expandafter\pgfplots@stacked@finalize@stored@coords@START\pgfplots@stored@current@data
- \to
- {\pgfplots@stored@current@data}%
- {\pgfplots@stored@current@precmdappend}%
- % store preparation commands into "precmd":
- \t@pgfplots@tokb=\expandafter{\pgfplots@stored@current@precmd}%
- \t@pgfplots@toka=\expandafter{\pgfplots@stored@current@precmdappend}%
- \edef\pgfplots@stored@current@precmd{\the\t@pgfplots@tokb\the\t@pgfplots@toka}%
- \fi
- % Now, we need to insert all stored entities into the new,
- % reversed list. We only expand them ONCE.
- \t@pgfplots@toka=\expandafter{\pgfplots@stored@current@precmd}%
- \t@pgfplots@tokb=\expandafter{\pgfplots@stored@current@cmd}%
- \edef\pgfplots@loc@TMPa{%
- {\the\t@pgfplots@toka}{\the\t@pgfplots@tokb}}%
- \t@pgfplots@tokc=\expandafter{\pgfplots@loc@TMPa}%
- \t@pgfplots@toka=\expandafter{\pgfplots@stored@current@data}%
- \t@pgfplots@tokb=\expandafter{\pgfplots@stored@current@postcmd}%
- \edef\pgfplots@loc@TMPa{%
- \the\t@pgfplots@tokc
- {\the\t@pgfplots@toka}{\the\t@pgfplots@tokb}}%
% Reverse sequence:
\expandafter\pgfplotslistpushfront\pgfplots@loc@TMPa\to\pgfplots@stored@plotlist@reversed
}%
@@ -362,236 +537,32 @@
\endgroup
}%
-% This command finalizes the stored plot data. It records a coordinate
-% stream into '#3' and assembles a macro '#4' which contains all
-% preparation commands to ensure the functionality of
-% \pgfplots@stacked@finalize@stored@plots
-%
-% The macro #4 will - if used as "precommand"
-% befor a draw operation - restore all required options and performs
-% pre-drawing.
-\long\def\pgfplots@stacked@finalize@stored@coords@START normalized coordinates #1#2;\to#3#4{%
- \pgfplots@stacked@beginplot
- \pgfplots@coord@stream@INIT@finalize@stackedcoords@recordto{#3}{\pgfplots@recorded@marker@stream}%
- \pgfplots@coord@stream@foreach@NORMALIZED{#1}%
- \pgfplots@stacked@endplot
- \pgfplots@stacked@savestateto\pgfplots@loc@TMPa
- \t@pgfplots@toka=\expandafter{\pgfplots@loc@TMPa\def\pgfplots@stacked@stored@postpath{#2}}%
- \pgfplots@addplot@get@named@startendpoints@command\pgfplots@loc@TMPa
- \t@pgfplots@tokc=\expandafter{\pgfplots@loc@TMPa}%
- \ifpgfplots@record@marker@stream
- \t@pgfplots@tokb=\expandafter{\pgfplots@recorded@marker@stream}%
- \else
- \t@pgfplots@tokb={}%
- \fi
- \edef#4{%
- \the\t@pgfplots@tokc
- \noexpand\gdef\noexpand\pgfplots@recorded@marker@stream{\the\t@pgfplots@tokb}%
- \the\t@pgfplots@toka
- }%
-}%
-
-% #1: for coordinates
-% #2: for markers
-\def\pgfplots@coord@stream@INIT@finalize@stackedcoords@recordto#1#2{%
- \pgfplots@record@marker@streamtrue
- %
- \def\pgfplots@coord@stream@start@{%
- \gdef#1{\pgfplotstreamstart}%
- \ifpgfplots@record@marker@stream
- \pgfplotsapplistXnewempty\pgfplots@stacked@record@mark@cmds
- \pgfplotsapplistXpushback\pgfplotstreamstart\to\pgfplots@stacked@record@mark@cmds
- \fi
- }%
- \def\pgfplots@coord@stream@end@{%
- \expandafter\gdef\expandafter#1\expandafter{#1\pgfplotstreamend}%
- \ifpgfplots@record@marker@stream
- \pgfplotsapplistXpushback\pgfplotstreamend\to\pgfplots@stacked@record@mark@cmds
- \pgfplotsapplistXlet\pgfplots@loc@TMPa=\pgfplots@stacked@record@mark@cmds
- \global\let#2=\pgfplots@loc@TMPa
- \fi
- }%
- %
- \begingroup
- \let\E=\noexpand
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \pgfplots@coord@stream@INIT@finalize@storedcoords@prepare@scaletrafomacro
- % Will be inserted in one of two possible places below:
- \def\pgfplots@loc@TMPa{%
- \ifx\pgfplotspointmetainputhandler\pgfutil@empty
- % we don't have per-point meta data. Nothing special to
- % do:
- \E\edef\E\pgfmathresult{\E\noexpand\E\pgfplots@stream@{\E\the\E\c@pgfplots@coordindex}{\E\the\E\pgf@x}{\E\the\E\pgf@y}}%
- \E\expandafter\E\pgfplotsapplistXpushback\E\expandafter{\E\pgfmathresult}\E\to\E\pgfplots@stacked@record@mark@cmds%
- \else
- % Ok, then we need to process the meta data as well:
- \E\edef\E\pgfmathresult{\E\noexpand\E\pgfplots@stream@withmeta@{\E\the\E\c@pgfplots@coordindex}{\E\the\E\pgf@x}{\E\the\E\pgf@y}{\E\pgfplots@current@point@meta}}%
- \E\expandafter\E\pgfplotsapplistXpushback\E\expandafter{\E\pgfmathresult}\E\to\E\pgfplots@stacked@record@mark@cmds%
- \fi
- }%
- % This finalize command maps the logical coordinate into PGF's
- % point space. Furthermore, it collects marker coordinates
- % (properly clipped by position) if markers are required (see
- % above).
- %
- % It is prepared here to eliminate if's.
- \xdef\pgfplots@coord@stream@finalize@currentpt{%
- \ifpgfplots@curplot@threedim
- \E\pgfplotsqpointxyz{\E\pgfplots@current@point@x}{\E\pgfplots@current@point@y}{\E\pgfplots@current@point@z}%
- \else
- \ifpgfplots@threedim
- \E\pgfplotsqpointxyz{\E\pgfplots@current@point@x}{\E\pgfplots@current@point@y}{0.0}%
- \else
- \E\pgfplotsqpointxy{\E\pgfplots@current@point@x}{\E\pgfplots@current@point@y}%
- \fi
- \fi
- \E\edef\E\pgfmathresult{{\E\the\E\pgf@x}{\E\the\E\pgf@y}}%
- \E\t@pgfplots@toka=\E\expandafter{\E#1}%
- \E\t@pgfplots@tokb=\E\expandafter{\E\pgfmathresult}%
- \E\xdef\E#1{\E\the\E\t@pgfplots@toka
- \E\noexpand\E\pgfplots@stream\E\the\E\t@pgfplots@tokb}%
- %
- \ifpgfplots@record@marker@stream
- \E\pgf@xa=\E\pgfplots@current@point@x pt % FIXME : SCOPE REGISTERS!?
- \E\pgf@ya=\E\pgfplots@current@point@y pt %
- \ifpgfplots@curplot@threedim
- \E\pgf@yb=\E\pgfplots@current@point@z pt %
- \fi
- \E\ifdim\E\pgf@xa<\E\pgfplots@xmin@reg
- \E\else
- \E\ifdim\E\pgf@xa>\E\pgfplots@xmax@reg
- \E\else
- \E\ifdim\E\pgf@ya<\E\pgfplots@ymin@reg
- \E\else
- \E\ifdim\E\pgf@ya>\E\pgfplots@ymax@reg
- \E\else
- \ifpgfplots@curplot@threedim
- \E\ifdim\E\pgf@yb<\E\pgfplots@zmin@reg
- \E\else
- \E\ifdim\E\pgf@yb>\E\pgfplots@zmax@reg
- \E\else
- \pgfplots@loc@TMPa
- \E\fi
- \E\fi
- \else
- \pgfplots@loc@TMPa
- \fi
- \E\fi
- \E\fi
- \E\fi
- \E\fi
- \fi
- }%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \endgroup
- %
- \def\pgfplots@coord@stream@coord@{%
- \pgfplotsaxisvisphasetransformcoordinate\pgfplots@current@point@x\pgfplots@current@point@y\pgfplots@current@point@z%
- \pgfplotsaxisvisphasepreparedatapoint
- \pgfplots@coord@stream@finalize@currentpt
- }%
-}
-
-% This command gets called after the sequence reversal has been done.
-% It unpacks everything prepared by
-% \pgfplots@stacked@finalize@stored@coords@START
-% and draws the plot (and markers).
-\def\pgfplots@stacked@draw@reversed@plot{%
- \pgfplots@stored@current@cmd% [current plot style] <---- keys are already set
- \pgfextra
- \tikzset{every plot/.try}%
- \pgfplots@getcurrent@plothandler\pgfplots@basiclevel@plothandler
- \pgfplots@basiclevel@plothandler
- % this here contains a recorded plot stream, see above.
- \pgfplots@stored@current@data
- %
- \pgfplots@assert@tikzinternal@exists{tikz@make@last@position}%
- \tikz@make@last@position{\pgfplotlastpoint}%
- \expandafter
- \endpgfextra
- \pgfplots@stacked@stored@postpath
- ;
- % this here has been assigned by the precommand as well.
- \ifx\pgfplots@recorded@marker@stream\pgfutil@empty
- \else
- \ifpgfplots@clip@marker@paths
- \scope% make sure that 'fill opacity' and 'dotted' styles remain local!
- \pgfplots@stored@current@cmd%[current plot style] <---- keys are already set
- \pgfextra
- \pgfplots@install@plotmark@handler
- \pgfplots@recorded@marker@stream
- \endpgfextra
- ;
- \endscope
- \else
- \pgfplots@stored@REMEMBER@MARK@COMMAND
- \fi
- \fi
- \gdef\pgfplots@recorded@marker@stream{}% clear
-}%
-
-
\def\pgfplots@stacked@path@closed@cycle{%
\pgfplots@stacked@closedcycle@impl
}
-% Saves the finalized variables into macro #1 such that a call to #1
-% restores them.
-%
-% This affects pgf zero level handlers and whether this here is the
-% first plot or not..
-\def\pgfplots@stacked@savestateto#1{%
- \t@pgfplots@toka=\expandafter{\pgfplots@stacked@PGFzerolevels}%
- \ifpgfplots@stacked@isfirstplot
- \t@pgfplots@tokb={\pgfplots@stacked@isfirstplottrue}%
- \else
- \t@pgfplots@tokb={\pgfplots@stacked@isfirstplotfalse}%
- \fi
- \t@pgfplots@tokc=\expandafter{\pgfplots@stacked@closedcycle@impl}%
- \edef#1{%
- \noexpand\gdef\noexpand\pgfplots@stacked@PGFzerolevels{\the\t@pgfplots@toka}%
- \the\t@pgfplots@tokb
- \noexpand\def\noexpand\pgfplots@stacked@closedcycle@impl{\the\t@pgfplots@tokc}%
- }%
-}
-
% PGF interfaces:
+%
+% these are relatively simple right now: assuming that the zero-level
+% streams are advanced if and only if the coordinate streams are
+% advanced, we can simply inject the *currect* zero level rather than
+% providing all at once.
\def\pgfplotxzerolevelstream@@list{%
\def\pgf@plotxzerolevelstreamstart{%
- \global\let\pgfplotxzerolevelstream@@list@@backup=\pgfplots@stacked@PGFzerolevels
\gdef\pgf@plotxzerolevelstreamnext{%
- \pgfplotslistcheckempty\pgfplots@stacked@PGFzerolevels
- \ifpgfplotslistempty
- \global\pgf@x=\pgfplots@ZERO@x\relax
- \else
- {\globaldefs=1\relax
- \pgfplotslistpopfront\pgfplots@stacked@PGFzerolevels\to\pgfmathresult
- }%
- \global\pgf@x=\pgfmathresult\relax
- \fi
+ \global\pgf@x=\pgfplots@stacked@PGF@zerolevel\relax
}%
}%
\def\pgf@plotxzerolevelstreamend{%
- \global\let\pgfplots@stacked@PGFzerolevels=\pgfplotxzerolevelstream@@list@@backup
}%
}%
\def\pgfplotyzerolevelstream@@list{%
\def\pgf@plotyzerolevelstreamstart{%
- \global\let\pgfplotyzerolevelstream@@list@@backup=\pgfplots@stacked@PGFzerolevels
\gdef\pgf@plotyzerolevelstreamnext{%
- \pgfplotslistcheckempty\pgfplots@stacked@PGFzerolevels
- \ifpgfplotslistempty
- \global\pgf@x=\pgfplots@ZERO@y\relax
- \else
- {\globaldefs=1\relax
- \pgfplotslistpopfront\pgfplots@stacked@PGFzerolevels\to\pgfmathresult
- }%
- \global\pgf@x=\pgfmathresult\relax
- \fi
+ \global\pgf@x=\pgfplots@stacked@PGF@zerolevel\relax
}%
}%
\def\pgf@plotyzerolevelstreamend{%
- \global\let\pgfplots@stacked@PGFzerolevels=\pgfplotyzerolevelstream@@list@@backup
}%
}%