%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% This file is a copy of some part of PGF/Tikz. %%% It has been copied here to provide : %%% - compatibility with older PGF versions %%% - availability of PGF contributions by Christian Feuersaenger %%% which are necessary or helpful for pgfplots. %%% %%% For reasons of simplicity, I have copied the whole file, including own contributions AND %%% PGF parts. The copyrights are as they appear in PGF. %%% %%% Note that pgfplots has compatible licenses. %%% %%% This copy has been modified in the following ways: %%% - nested \input commands have been updated %%% % % Support for the contents of this file will NOT be done by the PGF/TikZ team. % Please contact the author and/or maintainer of pgfplots (Christian Feuersaenger) if you need assistance in conjunction % with the deployment of this patch or partial content of PGF. Note that the author and/or maintainer of pgfplots has no obligation to fix anything: % This file comes without any warranty as the rest of pgfplots; there is no obligation for help. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Date of this copy: Di 25. Dez 18:14:20 CET 2012 %%% % Copyright 2006 by Till Tantau % % This file may be distributed and/or modified % % 1. under the LaTeX Project Public License and/or % 2. under the GNU Public License. % % See the file doc/generic/pgf/licenses/LICENSE for more details. \ProvidesFileRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/libraries/pgflibraryplothandlers.code.tex,v 1.17 2012/09/11 20:03:46 ludewich Exp $ \newif\ifpgf@plot@started % This handler converts each plot stream command into a curveto % command, except for the first, which is converted to the previously % specified action. % % Example: % % \pgfpathmoveto{\pgfpointorigin} % \pgfsetlinetofirstplotpoint % \pgfplothandlercurveto % \pgfplotxyfile{mytable} \def\pgfplothandlercurveto{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@initial% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgf@plot@curveto@handler@finish% \global\pgf@plot@startedfalse% }% } \def\pgf@plot@curveto@handler@initial#1{% \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \pgf@plot@first@action{\pgfqpoint{\pgf@xa}{\pgf@ya}}% \xdef\pgf@plot@curveto@first{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}% \global\let\pgf@plot@curveto@first@support=\pgf@plot@curveto@first% \global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@second% } \def\pgf@plot@curveto@handler@second#1{% \pgf@process{#1}% \xdef\pgf@plot@curveto@second{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% \global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@third% \global\pgf@plot@startedtrue% } \def\pgf@plot@curveto@handler@third#1{% \pgf@process{#1}% \xdef\pgf@plot@curveto@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% % compute difference vector: \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \pgf@process{\pgf@plot@curveto@first} \advance\pgf@xa by-\pgf@x% \advance\pgf@ya by-\pgf@y% % compute support directions: \pgf@xa=\pgf@plottension\pgf@xa% \pgf@ya=\pgf@plottension\pgf@ya% % first marshal: \pgf@process{\pgf@plot@curveto@second}% \pgf@xb=\pgf@x% \pgf@yb=\pgf@y% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \advance\pgf@xb by-\pgf@xa% \advance\pgf@yb by-\pgf@ya% \advance\pgf@xc by\pgf@xa% \advance\pgf@yc by\pgf@ya% \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@curveto@first@support}% {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@curveto@second}}% {\pgf@marshal}% % Prepare next: \global\let\pgf@plot@curveto@first=\pgf@plot@curveto@second% \global\let\pgf@plot@curveto@second=\pgf@plot@curveto@current% \xdef\pgf@plot@curveto@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}% } \def\pgf@plot@curveto@handler@finish{% \ifpgf@plot@started% \pgfpathcurveto{\pgf@plot@curveto@first@support}{\pgf@plot@curveto@second}{\pgf@plot@curveto@second}% \fi% } % This commands sets the tension for smoothing of plots. % % #1 = tension of curves. A value of 1 will yield a circle when the % control points are at quarters of a circle. A smaller value % will result in a tighter curve. Default is 0.5. % % Example: % % \pgfsetplottension{0.2} \def\pgfsetplottension#1{% \pgf@x=#1pt\relax% \pgf@x=0.2775\pgf@x\relax% \edef\pgf@plottension{\pgf@sys@tonumber\pgf@x}} \pgfsetplottension{0.5} % This handler converts the plot stream command into a curveto % command that is closed using a closepath. % % Example: % % \pgfpathmoveto{\pgfpointorigin} % \pgfplothandlerclosedcurve % \pgfplotxyfile{mytable} \def\pgfplothandlerclosedcurve{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@initial% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgf@plot@closedcurve@handler@finish% }% } \def\pgf@plot@closedcurve@handler@initial#1{% \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \xdef\pgf@plot@closedcurve@initial{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}% \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@second% \global\pgf@plot@startedfalse% } \def\pgf@plot@closedcurve@handler@second#1{% \pgf@process{#1}% \xdef\pgf@plot@closedcurve@after@initial{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% {\pgfpathmoveto{}}% \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@third% } \def\pgf@plot@closedcurve@handler@third#1{% \global\pgf@plot@startedtrue% \pgf@process{#1}% \xdef\pgf@plot@closedcurve@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% % compute difference vector: \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \pgf@process{\pgf@plot@closedcurve@initial} \advance\pgf@xa by-\pgf@x% \advance\pgf@ya by-\pgf@y% % compute support directions: \pgf@xa=\pgf@plottension\pgf@xa% \pgf@ya=\pgf@plottension\pgf@ya% % first marshal: \pgf@process{\pgf@plot@closedcurve@after@initial}% \pgf@xb=\pgf@x% \pgf@yb=\pgf@y% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \advance\pgf@xb by-\pgf@xa% \advance\pgf@yb by-\pgf@ya% \advance\pgf@xc by\pgf@xa% \advance\pgf@yc by\pgf@ya% \global\let\pgf@plot@closedcurve@first=\pgf@plot@closedcurve@after@initial% \global\let\pgf@plot@closedcurve@second=\pgf@plot@closedcurve@current% \xdef\pgf@plot@closedcurve@after@initial@presupport{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}% \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}% \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@fourth% } \def\pgf@plot@closedcurve@handler@fourth#1{% \pgf@process{#1}% \xdef\pgf@plot@closedcurve@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% % compute difference vector: \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \pgf@process{\pgf@plot@closedcurve@first} \advance\pgf@xa by-\pgf@x% \advance\pgf@ya by-\pgf@y% % compute support directions: \pgf@xa=\pgf@plottension\pgf@xa% \pgf@ya=\pgf@plottension\pgf@ya% % first marshal: \pgf@process{\pgf@plot@closedcurve@second}% \pgf@xb=\pgf@x% \pgf@yb=\pgf@y% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \advance\pgf@xb by-\pgf@xa% \advance\pgf@yb by-\pgf@ya% \advance\pgf@xc by\pgf@xa% \advance\pgf@yc by\pgf@ya% \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}% {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@second}}% {\pgf@marshal}% % Prepare next: \global\let\pgf@plot@closedcurve@first=\pgf@plot@closedcurve@second% \global\let\pgf@plot@closedcurve@second=\pgf@plot@closedcurve@current% \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}% } \def\pgf@plot@closedcurve@handler@finish{% \ifpgf@plot@started % % first, draw line from 2nd last to last: % \pgf@process{\pgf@plot@closedcurve@initial}% % compute difference vector: \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \pgf@process{\pgf@plot@closedcurve@first}% \advance\pgf@xa by-\pgf@x% \advance\pgf@ya by-\pgf@y% % compute support directions: \pgf@xa=\pgf@plottension\pgf@xa% \pgf@ya=\pgf@plottension\pgf@ya% % first marshal: \pgf@process{\pgf@plot@closedcurve@second}% \pgf@xb=\pgf@x% \pgf@yb=\pgf@y% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \advance\pgf@xb by-\pgf@xa% \advance\pgf@yb by-\pgf@ya% \advance\pgf@xc by\pgf@xa% \advance\pgf@yc by\pgf@ya% \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}% {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@second}}% {\pgf@marshal}% \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}% % % second, draw line from last point to start: % \pgf@process{\pgf@plot@closedcurve@after@initial}% % compute difference vector: \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \pgf@process{\pgf@plot@closedcurve@second}% \advance\pgf@xa by-\pgf@x% \advance\pgf@ya by-\pgf@y% % compute support directions: \pgf@xa=\pgf@plottension\pgf@xa% \pgf@ya=\pgf@plottension\pgf@ya% % first marshal: \pgf@process{\pgf@plot@closedcurve@initial}% \pgf@xb=\pgf@x% \pgf@yb=\pgf@y% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \advance\pgf@xb by-\pgf@xa% \advance\pgf@yb by-\pgf@ya% \advance\pgf@xc by\pgf@xa% \advance\pgf@yc by\pgf@ya% \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}% {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@initial}}% {\pgf@marshal}% % % third, draw line from first to second point: % \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}% {\noexpand\pgf@plot@closedcurve@after@initial@presupport}{\noexpand\pgf@plot@closedcurve@after@initial}}% {\pgf@marshal}% \pgfpathclose% \fi% } % This handler converts each point in a stream into a line from the % $y$-axis to the given points coordinate, resulting in a % ``comb.'' % % Example: % % \pgfplothandlerxcomb % \pgfplotxyfile{mytable} \def\pgfplothandlerxcomb{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@xcomb@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgfplotxzerolevelstreamend% \pgfplotxzerolevelstreamstart }% } \def\pgf@plot@xcomb@handler#1{% \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \begingroup \pgfplotxzerolevelstreamnext \endgroup \pgf@yb=\pgf@x \pgfpathmoveto{\pgfqpoint{\pgf@yb}{\pgf@ya}}% \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% } % This handler converts each point in a stream into a line from the % $x$-axis straight up to the given points coordinate, resulting in a % ``comb.'' % % Example: % % \pgfplothandlerycomb % \pgfplotxyfile{mytable} \def\pgfplothandlerycomb{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@ycomb@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgfplotyzerolevelstreamend% \pgfplotyzerolevelstreamstart }% } \def\pgf@plot@ycomb@handler#1{% \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \begingroup \pgfplotyzerolevelstreamnext \endgroup \pgf@yb=\pgf@x \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}% \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% } % PGF Bar or comb plots usually draw something from zero to the current plot's coordinate. % % The 'zero' offset can be changed using an input stream. % % There are two such streams which can be configured independently. % The first one returns "zeros" for coordinate x, the second one % returns "zeros" for coordinate y. % % \pgfplotxzerolevelstreamstart % \pgfplotxzerolevelstreamnext % assigns \pgf@x globally % \pgfplotxzerolevelstreamnext % \pgfplotxzerolevelstreamnext % \pgfplotxzerolevelstreamend % % and % \pgfplotyzerolevelstreamstart % \pgfplotyzerolevelstreamnext % assigns \pgf@x globally % \pgfplotyzerolevelstreamend % \def\pgfplotxzerolevelstreamstart{\pgf@plotxzerolevelstreamstart}% \def\pgfplotxzerolevelstreamend{\pgf@plotxzerolevelstreamend}% \def\pgfplotxzerolevelstreamnext{\pgf@plotxzerolevelstreamnext} \def\pgfplotyzerolevelstreamstart{\pgf@plotyzerolevelstreamstart}% \def\pgfplotyzerolevelstreamend{\pgf@plotyzerolevelstreamend}% \def\pgfplotyzerolevelstreamnext{\pgf@plotyzerolevelstreamnext} % This zero level stream always returns '#1' (a dimension). \def\pgfplotxzerolevelstreamconstant#1{% \edef\pgfplotxzerolevelstreamconstant@val{#1}% \def\pgf@plotxzerolevelstreamstart{% \global\let\pgf@plotxzerolevelstreamend=\relax \gdef\pgf@plotxzerolevelstreamnext{\global\pgf@x=\pgfplotxzerolevelstreamconstant@val\relax}% }% }% \pgfplotxzerolevelstreamconstant{0pt}% % This zero level stream always returns '#1'. \def\pgfplotyzerolevelstreamconstant#1{% \edef\pgfplotyzerolevelstreamconstant@val{#1}% \def\pgf@plotyzerolevelstreamstart{% \global\let\pgf@plotyzerolevelstreamend=\relax \gdef\pgf@plotyzerolevelstreamnext{\global\pgf@x=\pgfplotyzerolevelstreamconstant@val\relax}% }% }% \pgfplotyzerolevelstreamconstant{0pt}% \def\pgfplotbarwidth{\pgfkeysvalueof{/pgf/bar width}} \def\pgfplotbarshift{\pgfkeysvalueof{/pgf/bar shift}} \pgfqkeys{/pgf}{% bar width/.initial=10pt, bar shift/.initial=0pt, bar interval width/.initial=1, bar interval shift/.initial=0.5, % % hook which is executed right before a new bar is begun. at begin bar/.initial=, % hook which is executed right after a bar path has been finished. % In this context, the bar's path has not been used. at end bar/.initial=, } % This handler places a rectangle at each point in the plot stream, a % rectangle which touches the x-axis at one end and the current point % at the other end: % --(X)-- % | | % | | % | | % --(0)-- % Example: % % \pgfplothandlerybar % \pgfplotxyfile{mytable} \def\pgfplothandlerybar{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@ybar@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgfplotyzerolevelstreamend% \pgfmathparse{\pgfplotbarwidth}% \xdef\pgfplotbarwidth@{\pgfmathresult pt}% \pgfmathparse{\pgfplotbarshift}% \xdef\pgfplotbarshift@{\pgfmathresult pt}% \pgfplotyzerolevelstreamstart }% } \def\pgf@plot@ybar@handler#1{% \pgfkeysvalueof{/pgf/at begin bar}% \pgf@process{#1}% \pgf@ya=\pgf@y \expandafter\pgf@xb\pgfplotbarwidth@\relax \pgf@xc=\pgf@x \advance\pgf@xc by-.5\pgf@xb \advance\pgf@xc by\pgfplotbarshift@\relax \begingroup \pgfplotyzerolevelstreamnext \endgroup \pgf@yb=\pgf@x \advance\pgf@ya by-\pgf@yb \pgfpathrectangle {\pgfqpoint{\pgf@xc}{\pgf@yb}}% {\pgfqpoint{\pgf@xb}{\pgf@ya}}% \pgfkeysvalueof{/pgf/at end bar}% } % This handler places a rectangle at each point in the plot stream, a % rectangle which touches the y-axis at one end and the current point % at the other end: % --------- % | | % (0) (X) % | | % --------- % Example: % % \pgfplothandlerxbar % \pgfplotxyfile{mytable} \def\pgfplothandlerxbar{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@xbar@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgfplotxzerolevelstreamend% \pgfmathparse{\pgfplotbarwidth}% \xdef\pgfplotbarwidth@{\pgfmathresult pt}% \pgfmathparse{\pgfplotbarshift}% \xdef\pgfplotbarshift@{\pgfmathresult pt}% \pgfplotxzerolevelstreamstart }% } \def\pgf@plot@xbar@handler#1{% \pgfkeysvalueof{/pgf/at begin bar}% \pgf@process{#1}% \pgf@ya=\pgf@x \expandafter\pgf@xb\pgfplotbarwidth@\relax \pgf@xc=\pgf@y \advance\pgf@xc by-.5\pgf@xb \advance\pgf@xc by\pgfplotbarshift@\relax \begingroup \pgfplotxzerolevelstreamnext \endgroup \pgf@yb=\pgf@x \advance\pgf@ya by-\pgf@yb \pgfpathrectangle {\pgfqpoint{\pgf@yb}{\pgf@xc}}% {\pgfqpoint{\pgf@ya}{\pgf@xb}}% \pgfkeysvalueof{/pgf/at end bar}% } % This handler is a variant of \pgfplothandlerybar which works with % intervals instead of points. % % Bars are drawn between successive input coordinates and the width is % determined relatively to the interval length. % % It looks like this: % % |---| |-----| % | | | | % | | | | % | | | | % (X)------(X)-----------(X) % % where (X) denotes the x-axis offsets of input coordinates. % % In more detail, if (x_i,y_i) and (x_{i+1},y_{i+1}) denote successive % input coordinates, the bar will be placed above the % interval [x_i,x_{i+1}], centered at % % x_i + \pgfkeysvalueof{/pgf/bar interval shift} * (x_{i+1} - x_i) % % with width % % \pgfkeysvalueof{/pgf/bar interval width} * (x_{i+1} - x_i). % % If you have N+1 input points, you will get N bars (one for each % interval). The y_i value of the last bar will be ignored. % % Example: % % \pgfplothandlerybarinterval % \pgfplotxyfile{mytable} \def\pgfplothandlerybarinterval{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@ybarinterval@handler@first% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgfplotyzerolevelstreamend% \pgfmathparse{\pgfkeysvalueof{/pgf/bar interval width}}% \xdef\pgfplotbarintervalwidth@{\pgfmathresult}% \pgfmathparse{\pgfkeysvalueof{/pgf/bar interval shift}}% \xdef\pgfplotbarintervalshift@{\pgfmathresult}% \pgfplotyzerolevelstreamstart }% } \def\pgf@plot@ybarinterval@handler@first#1{% \pgf@process{#1}% \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@x}% \xdef\pgf@plot@barinterval@bar{\the\pgf@y}% \global\let\pgf@plotstreampoint=\pgf@plot@ybarinterval@handler% } \def\pgf@plot@ybarinterval@handler#1{% \pgfkeysvalueof{/pgf/at begin bar}% \pgf@process{#1}% \pgf@ya=\pgf@plot@barinterval@bar \xdef\pgf@plot@barinterval@bar{\the\pgf@y}% \pgf@xc=\pgf@plot@barinterval@intervalstart\relax \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@x}% \pgf@xb=\pgf@x \advance\pgf@xb by-\pgf@xc \advance\pgf@xc by\pgfplotbarintervalshift@\pgf@xb \pgf@xb=\pgfplotbarintervalwidth@\pgf@xb \advance\pgf@xc by-.5\pgf@xb% center \begingroup \pgfplotyzerolevelstreamnext \endgroup \pgf@yb=\pgf@x \advance\pgf@ya by-\pgf@yb \pgfpathrectangle {\pgfqpoint{\pgf@xc}{\pgf@yb}}% {\pgfqpoint{\pgf@xb}{\pgf@ya}}% \pgfkeysvalueof{/pgf/at end bar}% } % Like \pgfplothandlerybarinterval but for xbar. \def\pgfplothandlerxbarinterval{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@xbarinterval@handler@first% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgfplotxzerolevelstreamend% \pgfmathparse{\pgfkeysvalueof{/pgf/bar interval width}}% \xdef\pgfplotbarintervalwidth@{\pgfmathresult}% \pgfmathparse{\pgfkeysvalueof{/pgf/bar interval shift}}% \xdef\pgfplotbarintervalshift@{\pgfmathresult}% \pgfplotxzerolevelstreamstart }% } \def\pgf@plot@xbarinterval@handler@first#1{% \pgf@process{#1}% \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@y}% \xdef\pgf@plot@barinterval@bar{\the\pgf@x}% \global\let\pgf@plotstreampoint=\pgf@plot@xbarinterval@handler% } \def\pgf@plot@xbarinterval@handler#1{% \pgfkeysvalueof{/pgf/at begin bar}% \pgf@process{#1}% \pgf@ya=\pgf@plot@barinterval@bar \xdef\pgf@plot@barinterval@bar{\the\pgf@x}% \pgf@xc=\pgf@plot@barinterval@intervalstart\relax \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@y}% \pgf@xb=\pgf@y \advance\pgf@xb by-\pgf@xc \advance\pgf@xc by\pgfplotbarintervalshift@\pgf@xb \pgf@xb=\pgfplotbarintervalwidth@\pgf@xb \advance\pgf@xc by-.5\pgf@xb% center \begingroup \pgfplotxzerolevelstreamnext \endgroup \pgf@yb=\pgf@x \advance\pgf@ya by-\pgf@yb \pgfpathrectangle {\pgfqpoint{\pgf@yb}{\pgf@xc}}% {\pgfqpoint{\pgf@ya}{\pgf@xb}}% \pgfkeysvalueof{/pgf/at end bar}% } % This handler is very similar to \pgfplothandlerlineto, but it % produces CONSTANT connected pieces of the form % % x % | % x--- | % | x---- % x-| % % Example: % % \pgfplothandlerconstantlineto % \pgfplotxyfile{mytable} \def\pgfplothandlerconstantlineto{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@const@line@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@const@line@handler#1{% \pgf@process{#1}% \xdef\pgf@plot@const@line@handler@last{\the\pgf@y}% \pgf@plot@first@action{}% \global\let\pgf@plotstreampoint=\pgf@plot@const@line@handler@@% } \def\pgf@plot@const@line@handler@@#1{% \pgf@process{#1}% \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgf@yb\pgf@plot@const@line@handler@last\relax \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}% \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% \xdef\pgf@plot@const@line@handler@last{\the\pgf@ya}% } % A variant of \pgfplothandlerconstantlineto which places its mark on % the right line ends. % % |---x % ---x | % |--x % x % % Example: % % \pgfplothandlerconstantlinetomarkright % \pgfplotxyfile{mytable} \def\pgfplothandlerconstantlinetomarkright{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@right@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@const@line@mark@right@handler#1{% \pgf@process{#1}% \xdef\pgf@plot@const@line@handler@last{\the\pgf@x}% \pgf@plot@first@action{}% \global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@right@handler@@% } \def\pgf@plot@const@line@mark@right@handler@@#1{% \pgf@process{#1}% \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgf@yb\pgf@plot@const@line@handler@last\relax \pgfpathlineto{\pgfqpoint{\pgf@yb}{\pgf@ya}}% \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% \xdef\pgf@plot@const@line@handler@last{\the\pgf@xa}% } % A variant of \pgfplothandlerconstantlineto which places its mark on % the middle of the line segment. % % ----x % | % --x--- | % | |--x---- % x-- % % Example: % % \pgfplothandlerconstantlinetomarkmid % \pgfplotxyfile{mytable} \def\pgfplothandlerconstantlinetomarkmid{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@mid@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@const@line@mark@mid@handler#1{% \pgf@process{#1}% \xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% \pgf@plot@first@action{}% \global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@mid@handler@@% } \def\pgf@plot@const@line@mark@mid@handler@@#1{% \pgf@process{#1}% \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgf@plot@const@line@handler@last \pgf@xc=.5\pgf@xa \advance\pgf@xc by.5\pgf@x \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@y}}% \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@ya}}% \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% \xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% } % This handler is in fact a variant of \pgfplothandlerconstantlineto, % but it does not draw vertical lines. It produces a sequence of % line-to and move-to operations such that plot marks are placed at % each right end: % % ---x % ---x % ---x % --x % % Example: % % \pgfplothandlerjumpmarkright % \pgfplotxyfile{mytable} \def\pgfplothandlerjumpmarkright{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkright@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@jumpmarkright@handler#1{% \pgf@process{#1}% \xdef\pgf@plot@const@line@handler@last{\the\pgf@x}% \pgf@plot@first@action{}% \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkright@handler@@% } \def\pgf@plot@jumpmarkright@handler@@#1{% \pgf@process{#1}% \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgf@yb\pgf@plot@const@line@handler@last\relax \pgfpathmoveto{\pgfqpoint{\pgf@yb}{\pgf@ya}}% \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% \xdef\pgf@plot@const@line@handler@last{\the\pgf@xa}% } % This handler is in fact a variant of \pgfplothandlerconstantlineto, % but it does not draw vertical lines. It produces a sequence of % line-to and move-to operations such that plot marks are placed at % each left end: % % x--- % x--- % x--- % x-- % % Example: % % \pgfplothandlerjumpmarkleft % \pgfplotxyfile{mytable} \def\pgfplothandlerjumpmarkleft{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkleft@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@jumpmarkleft@handler#1{% \pgf@process{#1}% \xdef\pgf@plot@const@line@handler@last{\the\pgf@y}% \pgf@plot@first@action{}% \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkleft@handler@@% } \def\pgf@plot@jumpmarkleft@handler@@#1{% \pgf@process{#1}% \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgf@yb\pgf@plot@const@line@handler@last\relax \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}% \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% \xdef\pgf@plot@const@line@handler@last{\the\pgf@ya}% } % This handler is in fact a variant of % \pgfplothandlerconstantlinetomarkmid, % but it does not draw vertical lines. It produces a sequence of % line-to and move-to operations such that plot marks are placed like % % ----x % % --x-- % --x---- % x-- % % Example: % % \pgfplothandlerjumpmarkmid % \pgfplotxyfile{mytable} \def\pgfplothandlerjumpmarkmid{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@jump@mark@mid@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@jump@mark@mid@handler#1{% \pgf@process{#1}% \xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% \pgf@plot@first@action{}% \global\let\pgf@plotstreampoint=\pgf@plot@jump@mark@mid@handler@@% } \def\pgf@plot@jump@mark@mid@handler@@#1{% \pgf@process{#1}% \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgf@plot@const@line@handler@last \pgf@xc=.5\pgf@xa \advance\pgf@xc by.5\pgf@x \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@y}}% \pgfpathmoveto{\pgfqpoint{\pgf@xc}{\pgf@ya}}% \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% \xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% } % This handler converts each point in a stream into a line from the % origin to the point's coordinate, resulting in a ``star''. % % Example: % % \pgfplothandlerpolarcomb % \pgfplotxyfile{mytable} \def\pgfplothandlerpolarcomb{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@polarcomb@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@polarcomb@handler#1{% \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \pgfpathmoveto{\pgfpointorigin}% \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}% } % This handler draws a given mark at each point. % % #1 = some code to be executed at each point (with the coordinate % system translated to that point). % Typically, this code will be \pgfuseplotmark{whatever}. % % Example: % % \pgfplothandlermark{\pgfuseplotmark{*}} % \pgfplotxyfile{mytable} \def\pgfplothandlermark#1{% \pgf@plothandlermark{% \ifnum\pgf@plot@mark@count<\pgf@plot@mark@repeat\relax% \else% \global\pgf@plot@mark@count=0\relax% #1% \fi% }% } \newcount\pgf@plot@mark@count \def\pgf@plot@mark@phase{0} \def\pgf@plothandlermark#1{% \def\pgf@plot@mark{#1}% \def\pgf@plotstreamstart{% \global\pgf@plot@mark@count=\pgf@plot@mark@repeat\relax% \global\advance\pgf@plot@mark@count by-\pgf@plot@mark@phase\relax% \global\let\pgf@plotstreampoint=\pgf@plot@mark@handler% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@mark@handler#1{% \global\advance\pgf@plot@mark@count by1\relax% {\pgftransformshift{#1}\pgf@plot@mark}% } % Set the repeat count for marks. For example, if 3 is given as a % value, only every third point will get a mark. % % #1 = repeat count % % Example: % % \pgfsetplotmarkrepeat{2} \def\pgfsetplotmarkrepeat#1{\def\pgf@plot@mark@repeat{#1}} \pgfsetplotmarkrepeat{1} % Set the phase for marks. For example, if 3 is the repeat and 3 is % the phase, already the first point will be marked. % % #1 = the index of the first point that should be marked. % % Example: % % \pgfsetplotmarkphase{3} \def\pgfsetplotmarkphase#1{\def\pgf@plot@mark@phase{#1}} \pgfsetplotmarkphase{1} % This handler draws a given mark at those points whose number is % given in the (pgffor-like) list. % % #1 = some code to be executed at each point (with the coordinate % system translated to that point). % Typically, this code will be \pgfuseplotmark{whatever}. % #2 = list of positions like "1,2,4,...,9,10" % % Example: % % \pgfplothandlermarklisted{\pgfuseplotmark{*}}{1,2,4,...,9} % \pgfplotxyfile{mytable} \def\pgfplothandlermarklisted#1#2{% \let\pgf@plot@mark@list=\pgfutil@empty% \edef\pgf@marshal{\noexpand\foreach\noexpand\pgf@temp in{#2}} \pgf@marshal{\xdef\pgf@plot@mark@list{\pgf@plot@mark@list(\pgf@temp)}}% \pgf@plothandlermark{% \edef\pgf@marshal{\noexpand\pgfutil@in@{(\the\pgf@plot@mark@count)}{\pgf@plot@mark@list}}% \pgf@marshal% \ifpgfutil@in@#1\fi}% } % Define a new plot mark for use with \pgfplotmark. % % #1 = a plot mark mnemonic % #2 = code for drawing the mark % % Example: % % \pgfdeclareplotmark{*}{\pgfpathcircle{\pgfpointorigin}{2pt}\pgfusepathqfill} \def\pgfdeclareplotmark#1#2{\expandafter\def\csname pgf@plot@mark@#1\endcsname{#2}} % Set the size of plot marks. For circles, this will be the radius, % for other shapes it should be about half the width/height. % % Example: % % \pgfsetplotmarksize{1pt} \def\pgfsetplotmarksize#1{\pgfmathsetlength\pgfplotmarksize{#1}} \newdimen\pgfplotmarksize \pgfplotmarksize=2pt % Insert a plot mark's code at the origin. % % #1 = plot mark mnemonic % % Example: % % \pgfuseplotmark{*} \def\pgfuseplotmark#1{\csname pgf@plot@mark@#1\endcsname} % A stroke-filled circle mark \pgfdeclareplotmark{*} {% \pgfpathcircle{\pgfpointorigin}{\pgfplotmarksize} \pgfusepathqfillstroke } % A plus-sign like mark \pgfdeclareplotmark{+} {% \pgfpathmoveto{\pgfqpoint{-\pgfplotmarksize}{0pt}} \pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}} \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}} \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}} \pgfusepathqstroke } % An x-shaped mark \pgfdeclareplotmark{x} {% \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}} \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}} \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}} \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}} \pgfusepathqstroke } % See pgflibraryplotmarks for more plot marks % This handler turns creates a series of straight line segements % between consecutive points, but leaving /pgf/gap around stream point % space. % % Example: % % \pgfplothandlergaplineto % \pgfplotxyfile{mytable} \pgfkeys{/pgf/gap around stream point/.initial=1.5pt} \def\pgfplothandlergaplineto{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@gap@lineto@handler@initial% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\relax% }% } \def\pgf@plot@gap@lineto@handler@initial#1{% \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \xdef\pgf@plot@gap@lineto@last{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}% \global\let\pgf@plotstreampoint=\pgf@plot@gap@lineto@handler% } \def\pgf@plot@gap@lineto@handler#1{% % Ok, compute normalized line vector \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \xdef\pgf@plot@gap@lineto@next{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}% \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@plot@gap@lineto@last}{\pgf@plot@gap@lineto@next}}}% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \pgfpathmoveto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap around stream point}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgf@plot@gap@lineto@last}}% \pgfpathlineto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap around stream point}}{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}}{\pgf@plot@gap@lineto@next}}% \global\let\pgf@plot@gap@lineto@last=\pgf@plot@gap@lineto@next% } % This handler works like \pgfplothandlergaplineto, only the last % point is connected to the first point, creating a closed curve % space. % % Example: % % \pgfplothandlergapcycle % \pgfplotxyfile{mytable} \def\pgfplothandlergapcycle{% \def\pgf@plotstreamstart{% \global\let\pgf@plotstreampoint=\pgf@plot@gap@cycle@handler@initial% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgf@plot@gap@cycle@handler@finish% \global\let\pgf@plot@gap@cycle@first=\relax% }% } \def\pgf@plot@gap@cycle@handler@initial#1{% \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \xdef\pgf@plot@gap@cycle@last{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}% \global\let\pgf@plot@gap@cycle@first=\pgf@plot@gap@cycle@last% \global\let\pgf@plotstreampoint=\pgf@plot@gap@cycle@handler% } \def\pgf@plot@gap@cycle@handler#1{% % Ok, compute normalized line vector \pgf@process{#1}% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% \xdef\pgf@plot@gap@cycle@next{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}% \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@plot@gap@cycle@last}{\pgf@plot@gap@cycle@next}}}% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \pgfpathmoveto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap around stream point}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgf@plot@gap@cycle@last}}% \pgfpathlineto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap around stream point}}{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}}{\pgf@plot@gap@cycle@next}}% \global\let\pgf@plot@gap@cycle@last=\pgf@plot@gap@cycle@next% } \def\pgf@plot@gap@cycle@handler@finish{% \ifx\pgf@plot@gap@cycle@first\relax% \else \pgf@plot@gap@cycle@handler{\pgf@plot@gap@cycle@first}% \fi } \endinput