diff options
author | Karl Berry <karl@freefriends.org> | 2011-08-01 00:47:16 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-08-01 00:47:16 +0000 |
commit | aec2bbc3994991ebc6c5f4dbc90ad15c55f1a1fb (patch) | |
tree | 8940f33f6b173fb5cc630cc58ed4b791ad29e3fe /Master/texmf-dist/tex/generic | |
parent | 868233e6288b5e35a7d7aabd79bf8e56a802bc12 (diff) |
pgfplots 1.5 (29jul11)
git-svn-id: svn://tug.org/texlive/trunk@23292 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic')
44 files changed, 18167 insertions, 4183 deletions
diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex index 58664dc323d..c45b5a613f0 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex @@ -55,6 +55,7 @@ /pgfplots/surf shading/south west corner/.initial={\pgfpointorigin},% /pgfplots/surf shading/north east corner/.initial={\pgfqpoint{6cm}{6cm}},% /pgfplots/surf shading/anchor/.initial=\pgfpointorigin,% + /pgfplots/surf shading/shading type/.initial=5,% triangles in form of lattice /pgfplots/surf shading/precision/.is choice, /pgfplots/surf shading/precision/pdf/.code={% % Lossless coordinate output. @@ -77,6 +78,7 @@ /pgfplots/surf shading/precision/ps},% /pgfplots/surf shading/precision/ps,% /pgfplots/surf shading/cols/.initial=,% + /pgfplots/surf shading/colorspace/.initial=rgb,% rgb or cmyk /pgfplots/surf shading/colormap/.initial={% << /FunctionType 2 @@ -124,22 +126,57 @@ 0 \pgfplotscolormappdfmax % map [0,2^BitsPerComponent-1] linearly to [0 1] for parametric color data }% \def\pgfplotslibrarysurf@count{0}% +\newcount\c@pgfplotslibrarysurf@no % driver specific: \def\pgfplotslibrarysurf@initstream{} \def\pgfplotslibrarysurf@advancestreamlen#1{}% \def\pgfplotslibrarysurfstreamstart{% - \pgfplotsapplistXnewempty\pgfplotslibrarysurf@binarystream@accum + \pgfplotslibrarysurf@translate@colorspace + \let\pgfplotslibrarysurf@colorspace=\pgfplotsretval + \pgfkeysgetvalue{/pgfplots/surf shading/shading type}\pgfplotslibrarysurf@type + \pgfplotsapplistXglobalnewempty\pgfplotslibrarysurf@binarystream@accum \pgfplotslibrarysurf@initstream \ifx\pgfplotslibrarysurf@filter@encode\pgfutil@empty \else \pgfkeysalso{/pgfplots/bin/\pgfplotslibrarysurf@filter@encode}% \fi + \ifcase\pgfplotslibrarysurf@type\relax + % 0 + \pgfplotslibrarysurf@initstream@wrongtype + \or% 1 + \pgfplotslibrarysurf@initstream@wrongtype + \or% 2 + \pgfplotslibrarysurf@initstream@wrongtype + \or% 3 + \or% 4 + % ok, triangle meshes. + \def\pgfplotslibrarysurf@edgeflag{\pgfplotscharno{0}}% + \or% 5 triangles in lattice form. disable edge flag: + \let\pgfplotslibrarysurf@edgeflag=\pgfutil@empty + \or% 6 coons patches: + \global\let\pgfplotslibrarysurf@cubicpatch@cdata=\pgfutil@empty + \global\c@pgfplotslibrarysurf@no=0 + \def\pgfplotslibrarysurf@cubicpatch@numverts{12}% + \let\pgfplotslibrarysurfstreamcoord=\pgfplotslibrarysurfstreamcoord@cubicpatch + \def\pgfplotslibrarysurf@edgeflag{\pgfplotscharno{0}}% + \or% 7 full tensor product cubic bezier patches: + \global\let\pgfplotslibrarysurf@cubicpatch@cdata=\pgfutil@empty + \global\c@pgfplotslibrarysurf@no=0 + \def\pgfplotslibrarysurf@cubicpatch@numverts{16}% + \let\pgfplotslibrarysurfstreamcoord=\pgfplotslibrarysurfstreamcoord@cubicpatch + \def\pgfplotslibrarysurf@edgeflag{\pgfplotscharno{0}}% + \else + \pgfplotslibrarysurf@initstream@wrongtype + \fi +}% +\def\pgfplotslibrarysurf@initstream@wrongtype{% + \pgfplots@error{CRITICAL: shader=interp: got unsupported pdf shading type '\pgfplotslibrarysurf@type'. This may correct your pdf!}% }% \def\pgfplotslibrarysurfstreamend{% - \pgfplotsapplistXlet\pgfplotslibrarysurf@binarystream=\pgfplotslibrarysurf@binarystream@accum - \pgfplotsapplistXnewempty\pgfplotslibrarysurf@binarystream@accum + \pgfplotsapplistXgloballet\pgfplotslibrarysurf@binarystream=\pgfplotslibrarysurf@binarystream@accum + \pgfplotsapplistXglobalnewempty\pgfplotslibrarysurf@binarystream@accum }% % #1: a pgf point. @@ -195,11 +232,131 @@ \pgfplotsbinaryencodeunsigned\pgfplots@glob@TMPa %\message{\pgfplotsbinaryresult.}% \t@pgfplots@tokc=\expandafter{\pgfplotsbinaryresult}% - \edef\pgfplots@loc@TMPa{\the\t@pgfplots@toka\the\t@pgfplots@tokb\the\t@pgfplots@tokc}% - \expandafter\pgfplotsapplistXpushback\pgfplots@loc@TMPa\to\pgfplotslibrarysurf@binarystream@accum + \edef\pgfplots@loc@TMPa{\pgfplotslibrarysurf@edgeflag\the\t@pgfplots@toka\the\t@pgfplots@tokb\the\t@pgfplots@tokc}% + \expandafter\pgfplotsapplistXglobalpushback\pgfplots@loc@TMPa\to\pgfplotslibrarysurf@binarystream@accum \pgfplotslibrarysurf@advancestreamlen{10}% } +\def\pgfplotslibrarysurf@translate@colorspace{% + \pgfkeysgetvalue{/pgfplots/surf shading/colorspace}\pgfplots@loc@TMPd + \edef\pgfplots@loc@TMPd{\pgfplots@loc@TMPd}% + \def\pgfplots@loc@TMPa{rgb}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPd + \def\pgfplotsretval{RGB}% + \else + \def\pgfplots@loc@TMPa{cmyk}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPd + \def\pgfplotsretval{CMYK}% + \else + \def\pgfplots@loc@TMPa{cmy}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPd + \def\pgfplotsretval{CMY}% + \else + \pgfplots@error{Sorry, the 'surfshading' lib failed to recognise the '/pgfplots/surf shading=\pgfplots@loc@TMPd\space choice... maybe you misspelled it?}% + \def\pgfplotsretval{RGB}% + \fi + \fi + \fi +}% + +% special routine for coons type patches and cubic tensor product type +% patches. It has FIRST all vertices, +% THEN the cdata. Furthermore, it only has 4 CDATA points, but a total +% of 12 vertices. +% +% #1: a pgf point. +% #2: a color coordinate in the range [0,1000] +\def\pgfplotslibrarysurfstreamcoord@cubicpatch#1#2{% + \pgfplotsbinarysetbytes\pgfplotslibrarysurf@bytespercoordinate% + %\pgf@process{#1}% this here causes `{retaining \pgf@x}' messages and pollutes the save stack! Avoid it. See \tracingrestores=2 + #1% + % The idea is to map + % the low-level point coordinates LINEARLY into [0,2^{8*<bytes>}]. + % + % This is what the pdf standard expects for surface shadings. + % + % To do that, we simply map + % [-16384,16384] linearly into [0,2^{32}] + % and write the resulting integer in big endian binary format to + % the pdf low level stream. + % + % The decode procedure tells the pdf viewer how to invert that + % stuff. + % + \pgf@xa=\pgf@x + \pgf@sys@bp@correct\pgf@xa% + \pgfplotsbinaryencodedimenmaplinearly\pgf@xa +%\message{POINT \the\c@pgfplots@scanlineindex: ENCODING(x=\the\pgf@x)=\pgfplotsbinaryresult.}\advance\c@pgfplots@scanlineindex by1 + \t@pgfplots@toka=\expandafter{\pgfplotsbinaryresult}% + \pgf@ya=\pgf@y + \pgf@sys@bp@correct\pgf@ya% + \pgfplotsbinaryencodedimenmaplinearly\pgf@ya +%\message{ENCODING(y=\the\pgf@y)=\pgfplotsbinaryresult.}% + \t@pgfplots@tokb=\expandafter{\pgfplotsbinaryresult}% + \def\pgfplotslibrarysurf@cubicpatch@hascdata{0}% + \ifnum\c@pgfplotslibrarysurf@no=0 + \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}% + % prepend edge flag. it is a new patch. + \t@pgfplots@toka=\expandafter{\expandafter\pgfplotslibrarysurf@edgeflag\the\t@pgfplots@toka}% + \else + \ifnum\c@pgfplotslibrarysurf@no=3 + \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}% + \else + \ifnum\c@pgfplotslibrarysurf@no=6 + \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}% + \else + \ifnum\c@pgfplotslibrarysurf@no=9 + \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}% + \fi + \fi + \fi + \fi + \if1\pgfplotslibrarysurf@cubicpatch@hascdata + {% + % read fixed point input (in the range [0,1000]). + \pgf@xa=#2pt + % convert to integer (= *65536): + \c@pgf@counta=\pgf@xa + % provide map [0,1000] -> [0,2^16-1] + \divide\c@pgf@counta by1000 + % now, we have \c@pgf@counta in [0,2^16]. Simply strip it into + % the required range, that's ok. + \ifnum\c@pgf@counta<0 + \c@pgf@counta=0 + \else + \ifnum\c@pgf@counta>65535 + \c@pgf@counta=65535 + \fi + \fi + % Now, we have CDATA in the range [0,65535] + \xdef\pgfplots@glob@TMPa{\the\c@pgf@counta}% + %\message{ENCODING(C=\pgfplots@glob@TMPa\space for \the\pgf@xa)=}% + }% + \pgfplotsbinarysetbytes2% + \pgfplotsbinaryencodeunsigned\pgfplots@glob@TMPa + %\message{\pgfplotsbinaryresult.}% + \t@pgfplots@tokc=\expandafter{\pgfplotslibrarysurf@cubicpatch@cdata}% + \xdef\pgfplotslibrarysurf@cubicpatch@cdata{% + \the\t@pgfplots@tokc + \pgfplotsbinaryresult + }% + \fi + \global\advance\c@pgfplotslibrarysurf@no by1 + % + \ifnum\pgfplotslibrarysurf@cubicpatch@numverts=\c@pgfplotslibrarysurf@no %finalize patch. + \t@pgfplots@tokc=\expandafter{\pgfplotslibrarysurf@cubicpatch@cdata}% + \global\let\pgfplotslibrarysurf@cubicpatch@cdata=\pgfutil@empty + \global\c@pgfplotslibrarysurf@no=0 + \else + \t@pgfplots@tokc={}% + \fi + % edge flag is already in \t@pgfplots@toka (if this is the first + % vertex) + \edef\pgfplots@loc@TMPa{\the\t@pgfplots@toka\the\t@pgfplots@tokb\the\t@pgfplots@tokc}% + \expandafter\pgfplotsapplistXglobalpushback\pgfplots@loc@TMPa\to\pgfplotslibrarysurf@binarystream@accum + %\pgfplotslibrarysurf@advancestreamlen{10}% +} + \def\pgfplotslibrarysurfactivateshadefill{% \pgfplotssys@do@surfshading@fillpaths\pgfplots@loc@TMPa% \expandafter\pgfutil@addpdfresource@patterns\expandafter{\pgfplots@loc@TMPa}%% diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.code.tex index 06bade77b9e..4f414535eec 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.code.tex @@ -36,18 +36,22 @@ \def\use@@pgfplotslibrary#1{% \edef\pgf@list{#1}% \pgfutil@for\pgf@temp:=\pgf@list\do{% - \expandafter\ifx\csname pgfp@library@\pgf@temp @loaded\endcsname\relax% - \expandafter\global\expandafter\let\csname pgfp@library@\pgf@temp @loaded\endcsname=\pgfutil@empty% - \expandafter\edef\csname tikz@library@#1@atcode\endcsname{\the\catcode`\@} - \expandafter\edef\csname tikz@library@#1@barcode\endcsname{\the\catcode`\|} - \catcode`\@=11 - \catcode`\|=12 - \pgfplots@iffileexists{tikzlibrarypgfplots.\pgf@temp.code.tex}{% - \input tikzlibrarypgfplots.\pgf@temp.code.tex}{% - \input pgflibrarypgfplots.\pgf@temp.code.tex}% - \catcode`\@=\csname tikz@library@#1@atcode\endcsname - \catcode`\|=\csname tikz@library@#1@barcode\endcsname - \fi% + \expandafter\pgfkeys@spdef\expandafter\pgf@temp\expandafter{\pgf@temp}% + \ifx\pgf@temp\pgfutil@empty + \else + \expandafter\ifx\csname pgfp@library@\pgf@temp @loaded\endcsname\relax% + \expandafter\global\expandafter\let\csname pgfp@library@\pgf@temp @loaded\endcsname=\pgfutil@empty% + \expandafter\edef\csname tikz@library@#1@atcode\endcsname{\the\catcode`\@} + \expandafter\edef\csname tikz@library@#1@barcode\endcsname{\the\catcode`\|} + \catcode`\@=11 + \catcode`\|=12 + \pgfplots@iffileexists{tikzlibrarypgfplots.\pgf@temp.code.tex}{% + \input tikzlibrarypgfplots.\pgf@temp.code.tex}{% + \input pgflibrarypgfplots.\pgf@temp.code.tex}% + \catcode`\@=\csname tikz@library@#1@atcode\endcsname + \catcode`\|=\csname tikz@library@#1@barcode\endcsname + \fi% + \fi }% } diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.colormaps.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.colormaps.code.tex new file mode 100644 index 00000000000..d6060e15e2b --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.colormaps.code.tex @@ -0,0 +1,99 @@ +%-------------------------------------------- +% +% Package pgfplots, library for additional colormaps, especially those +% related to matlab (tm). +% +% Copyright 2011 by Christian Feuersänger and Patrick Häcker. +% +% 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +% + +\pgfplotsset{ + /pgfplots/colormap/autumn/.style={ + /pgfplots/colormap={autumn}{rgb255=(255,0,0) rgb255=(255,255,0)} + }, + /pgfplots/colormap/bled/.style={ + /pgfplots/colormap={bled}{rgb255=(0,0,0) rgb255=(43,43,0) rgb255=(0,85,0) rgb255=(0,128,128) rgb255=(0,0,170) rgb255=(213,0,213) rgb255=(255,0,0)} + }, + /pgfplots/colormap/bright/.style={ + /pgfplots/colormap={bright}{rgb255=(0,0,0) rgb255=(78,3,100) rgb255=(2,74,255) rgb255=(255,21,181) rgb255=(255,113,26) rgb255=(147,213,114) rgb255=(230,255,0) rgb255=(255,255,255)} + }, + /pgfplots/colormap/cold/.style={ + /pgfplots/colormap={cold}{rgb255=(0,0,0) rgb255=(0,0,255) rgb255=(0,255,255) rgb255=(255,255,255)} + }, + /pgfplots/colormap/copper/.style={ + /pgfplots/colormap={copper}{[1cm]rgb255(0cm)=(0,0,0) rgb255(4cm)=(255,159,101) rgb255(5cm)=(255,199,127)} + }, + /pgfplots/colormap/copper2/.style={ + /pgfplots/colormap={copper2}{rgb255=(0,0,0) rgb255=(68,62,63) rgb255=(170,112,95) rgb255=(207,194,138) rgb255=(255,255,255)} + }, + /pgfplots/colormap/earth/.style={ + /pgfplots/colormap={earth}{rgb255=(0,0,0) rgb255=(0,28,15) rgb255=(42,39,6) rgb255=(28,73,33) rgb255=(67,85,24) rgb255=(68,112,46) rgb255=(81,129,83) rgb255=(124,137,87) rgb255=(153,147,122) rgb255=(145,173,164) rgb255=(144,202,180) rgb255=(171,220,177) rgb255=(218,229,168) rgb255=(255,235,199) rgb255=(255,255,255)} + }, + /pgfplots/colormap/gray/.style={ + /pgfplots/colormap={gray}{rgb255=(0,0,0) rgb255=(255,255,255)} + }, + /pgfplots/colormap/hsv/.style={ + /pgfplots/colormap={hsv}{rgb255=(255,0,0) rgb255=(255,255,0) rgb255=(0,255,0) rgb255=(0,255,255) rgb255=(0,0,255) rgb255=(255,0,255) rgb255=(255,0,0)} + }, + /pgfplots/colormap/hsv2/.style={ + /pgfplots/colormap={hsv2}{rgb255=(0,0,0) rgb255=(128,0,128) rgb255=(0,0,230) rgb255=(0,255,255) rgb255=(0,255,0) rgb255=(255,255,0) rgb255=(255,0,0)} + }, + /pgfplots/colormap/pastel/.style={ + /pgfplots/colormap={pastel}{rgb255=(0,0,0) rgb255=(120,0,5) rgb255=(0,91,172) rgb255=(215,35,217) rgb255=(120,172,78) rgb255=(255,176,24) rgb255=(230,255,0) rgb255=(255,255,255)} + }, + /pgfplots/colormap/pink/.style={ + /pgfplots/colormap={pink}{rgb255=(0,0,0) rgb255=(12,16,46) rgb255=(62,22,43) rgb255=(53,53,65) rgb255=(79,72,58) rgb255=(122,80,67) rgb255=(147,91,102) rgb255=(147,115,140) rgb255=(144,145,154) rgb255=(173,163,146) rgb255=(216,171,149) rgb255=(250,179,179) rgb255=(255,198,227) rgb255=(246,229,255) rgb255=(255,255,255)} + }, + /pgfplots/colormap/sepia/.style={ + /pgfplots/colormap={sepia}{rgb255(0cm)=(0,0,0) rgb255(1cm)=(26,13,0) rgb255(18cm)=(255,230,204) rgb255(20cm)=(255,255,255)} + }, + /pgfplots/colormap/bone/.style={ + /pgfplots/colormap={bone}{[1cm]rgb255(0cm)=(0,0,0) rgb255(3cm)=(84,84,116) rgb255(6cm)=(167,199,199) rgb255(8cm)=(255,255,255)} +}, + %-------------------------------------------------- + % % mesh width is too fine for these: + % /pgfplots/colormap/dusk/.style={ + % /pgfplots/colormap={dusk}{ + % [1cm]rgb255(0cm)=(0,0,0) + % rgb255(114cm)=(0,0,128) rgb255(701cm)=(0,128,128) + % rgb255(1000cm)=(128,128,128) rgb255(1299cm)=(255,128,128) + % rgb255(1886cm)=(255,255,128) rgb255(2000cm)=(255,255,255)} + % }, + % /pgfplots/colormap/hicontrast/.style={ + % /pgfplots/colormap={hicontrast}{ + % [1cm]rgb255(0cm)=(0,0,0) rgb255(114cm)=(0,0,255) rgb255(299cm)=(255,0,0) rgb255(413cm)=(255,0,255) + % rgb255(587cm)=(0,255,0) rgb255(701cm)=(0,255,255) rgb255(886cm)=(255,255,0) + % rgb255(1000cm)=(255,255,255)} + % }, + %-------------------------------------------------- + /pgfplots/colormap/spring/.style={ + /pgfplots/colormap={spring}{rgb255=(255,0,255) rgb255=(255,255,0)} + }, + /pgfplots/colormap/summer/.style={ + /pgfplots/colormap={summer}{rgb255=(0,128,102) rgb255=(255,255,102)} + }, + /pgfplots/colormap/temp/.style={ + /pgfplots/colormap={temp}{rgb255=(36,0,217) rgb255=(25,29,247) rgb255=(41,87,255) rgb255=(61,135,255) rgb255=(87,176,255) rgb255=(117,211,255) rgb255=(153,235,255) rgb255=(189,249,255) rgb255=(235,255,255) rgb255=(255,255,235) rgb255=(255,242,189) rgb255=(255,214,153) rgb255=(255,172,117) rgb255=(255,120,87) rgb255=(255,61,61) rgb255=(247,40,54) rgb255=(217,22,48) rgb255=(166,0,33)} + }, + /pgfplots/colormap/thermal/.style={ + /pgfplots/colormap={thermal}{rgb255=(0,0,0) rgb255=(77,0,179) rgb255=(255,51,0) rgb255=(255,255,0) rgb255=(255,255,255)} + }, + /pgfplots/colormap/winter/.style={ + /pgfplots/colormap={winter}{rgb255=(0,0,255) rgb255=(0,255,128)} + }, +} + +\endinput diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.dateplot.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.dateplot.code.tex index 8ac9a7631c0..7e7e5232fc0 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.dateplot.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.dateplot.code.tex @@ -52,6 +52,12 @@ \advance\pgf@xa by-\the\c@pgf@countb pt \ifdim\pgf@xa>0.5pt \advance\c@pgf@countb by1 + \ifnum\c@pgf@countb=60 + \c@pgf@countb=#4 % + \advance\c@pgf@countb by1 + \edef#4{\the\c@pgf@countb}% + \c@pgf@countb=0 + \fi \fi \edef#5{\the\c@pgf@countb}% } @@ -94,8 +100,8 @@ \let\pgfplots@calender@ZEROSHIFT=\pgfmathresult }, date ZERO=2006-01-01, - /pgfplots/date coordinates in/.style={ - /pgfplots/#1 coord trafo/.code={% + /pgfplots/date coordinates in/.code={% + \pgfkeysdef{/pgfplots/#1 coord trafo}{% \begingroup \edef\pgfplotstempjuliandate{##1}% % check if we also have a TIME like '2006-01-01 11:21' @@ -126,8 +132,8 @@ \fi \pgfmath@smuggleone\pgfmathresult \endgroup - }, - /pgfplots/#1 coord inv trafo/.code={% + }% + \pgfkeysdef{/pgfplots/#1 coord inv trafo}{% \begingroup \pgfplotslibdateplot@number@to@julian@and@time##1\julianto{\c@pgf@counta}\hourto\Hour\minuteto\Minute% \advance\c@pgf@counta by\pgfplots@calender@ZEROSHIFT\relax @@ -152,12 +158,43 @@ \def\Second{0}% \def\second{00}% \edef\lowlevel{##1}% - \edef\pgfmathresult{\year-\month-\day}% - }, - /pgfplots/#1ticklabel={\tick},% - /pgfplots/scaled #1 ticks=false, - /pgfplots/plot coordinates/math parser=false,% + \pgfkeysifdefined{/pgfplots/date default inv/#1}{% + \edef\pgfmathresult{\pgfkeysvalueof{/pgfplots/date default inv/#1}}% + }{% + \edef\pgfmathresult{\year-\month-\day\space\hour:\minute:\second}% + }% + }% + \pgfkeysifdefined{/pgfplots/#1ticklabel/.@cmd}{% + \pgfkeysalso{% + /pgfplots/#1ticklabel={\tick},% + /pgfplots/scaled #1 ticks=false,% + /pgfplots/plot coordinates/math parser=false,% + }% + }{% + % OK. The style can be used for other coordinates as well + % (like hist/data) + }% + % + \pgfkeysifdefined{/pgfplots/#1 is expr}{% + \pgfkeyssetvalue{/pgfplots/#1 is expr}{0}% + }{}% + % + % Allow a callback (optional) + \pgfkeysifdefined{/pgfplots/#1/@execute on coord trafo changed/.@cmd}{% + \pgfkeysalso {/pgfplots/#1/@execute on coord trafo changed}% + }{}% }, /pgfplots/date coordinates in/.value required, + % + % #1: the argument for 'data coordinates in={#1} + % #2: the default for the inverse transformation. If there is + % none, a default will be chosen automatically (with full + % information) + /pgfplots/date coordinates default inverse/.style 2 args={% + /pgfplots/date default inv/#1/.initial=#2, + }, + /pgfplots/date coordinates default inverse={x}{\year-\month-\day}, + /pgfplots/date coordinates default inverse={y}{\year-\month-\day}, + /pgfplots/date coordinates default inverse={z}{\year-\month-\day}, } diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.groupplots.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.groupplots.code.tex index 5086fef9d47..32b0e5f32ee 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.groupplots.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.groupplots.code.tex @@ -56,38 +56,58 @@ /pgfplots/group/shared labels=false, /pgfplots/group/xticklabels at/.is choice, /pgfplots/group/xticklabels at/all/.code=\def\pgfplots@group@xticklabels{all}, - /pgfplots/group/xticklabels at/edge top/.code=\def\pgfplots@group@xticklabels{upper}, + /pgfplots/group/xticklabels at/edge top/.code=\def\pgfplots@group@xticklabels{top}, /pgfplots/group/xticklabels at/edge bottom/.code=\def\pgfplots@group@xticklabels{lower}, + /pgfplots/group/xticklabels at/edge left/.code=\def\pgfplots@group@xticklabels{left}, % TODO + /pgfplots/group/xticklabels at/edge right/.code=\def\pgfplots@group@xticklabels{right}, % TODO /pgfplots/group/xticklabels at=all, /pgfplots/group/yticklabels at/.is choice, /pgfplots/group/yticklabels at/all/.code=\def\pgfplots@group@yticklabels{all}, /pgfplots/group/yticklabels at/edge left/.code=\def\pgfplots@group@yticklabels{left}, /pgfplots/group/yticklabels at/edge right/.code=\def\pgfplots@group@yticklabels{right}, + /pgfplots/group/yticklabels at/edge top/.code=\def\pgfplots@group@yticklabels{top}, % TODO + /pgfplots/group/yticklabels at/edge bottom/.code=\def\pgfplots@group@yticklabels{bottom}, % TODO /pgfplots/group/yticklabels at=all, /pgfplots/group/xlabels at/.is choice, /pgfplots/group/xlabels at/all/.code=\def\pgfplots@group@xlabels{all}, - /pgfplots/group/xlabels at/edge top/.code=\def\pgfplots@group@xlabels{upper}, + /pgfplots/group/xlabels at/edge top/.code=\def\pgfplots@group@xlabels{top}, /pgfplots/group/xlabels at/edge bottom/.code=\def\pgfplots@group@xlabels{lower}, + /pgfplots/group/xlabels at/edge right/.code=\def\pgfplots@group@xlabels{right}, % TODO + /pgfplots/group/xlabels at/edge left/.code=\def\pgfplots@group@xlabels{left},% TODO /pgfplots/group/xlabels at=all, /pgfplots/group/ylabels at/.is choice, /pgfplots/group/ylabels at/all/.code=\def\pgfplots@group@ylabels{all}, /pgfplots/group/ylabels at/edge left/.code=\def\pgfplots@group@ylabels{left}, /pgfplots/group/ylabels at/edge right/.code=\def\pgfplots@group@ylabels{right}, + /pgfplots/group/ylabels at/edge top/.code=\def\pgfplots@group@ylabels{top}, % TODO + /pgfplots/group/ylabels at/edge bottom/.code=\def\pgfplots@group@ylabels{bottom}, % TODO /pgfplots/group/ylabels at=all, /pgfplots/group/x descriptions at/.is choice, - /pgfplots/group/x descriptions at/all/.style= - {/pgfplots/group/xlabels at=all,/pgfplots/group/xticklabels at=all}, - /pgfplots/group/x descriptions at/edge bottom/.style= - {/pgfplots/group/xlabels at=edge bottom, /pgfplots/group/xticklabels at=edge bottom}, - /pgfplots/group/x descriptions at/edge top/.style= - {/pgfplots/group/xlabels at=edge top, /pgfplots/group/xticklabels at=edge top}, + /pgfplots/group/x descriptions at/all/.style={ + /pgfplots/group/xlabels at=all, + /pgfplots/group/xticklabels at=all + }, + /pgfplots/group/x descriptions at/edge bottom/.style={ + /pgfplots/group/xlabels at=edge bottom, + /pgfplots/group/xticklabels at=edge bottom + }, + /pgfplots/group/x descriptions at/edge top/.style={ + /pgfplots/group/xlabels at=edge top, + /pgfplots/group/xticklabels at=edge top + }, /pgfplots/group/y descriptions at/.is choice, - /pgfplots/group/y descriptions at/all/.style= - {/pgfplots/group/ylabels at=all, /pgfplots/group/yticklabels at=all}, - /pgfplots/group/y descriptions at/edge left/.style= - {/pgfplots/group/ylabels at=edge left, /pgfplots/group/yticklabels at=edge left}, - /pgfplots/group/y descriptions at/edge right/.style= - {/pgfplots/group/ylabels at=edge right, /pgfplots/group/yticklabels at=edge right}, + /pgfplots/group/y descriptions at/all/.style={ + /pgfplots/group/ylabels at=all, + /pgfplots/group/yticklabels at=all + }, + /pgfplots/group/y descriptions at/edge left/.style={ + /pgfplots/group/ylabels at=edge left, + /pgfplots/group/yticklabels at=edge left + }, + /pgfplots/group/y descriptions at/edge right/.style={ + /pgfplots/group/ylabels at=edge right, + /pgfplots/group/yticklabels at=edge right + }, /pgfplots/group/group name/.store in=\pgfplots@group@name, /pgfplots/group/empty plot/.style={/pgfplots/hide axis=true}, } @@ -200,9 +220,9 @@ }% \fi% \else - \def\pgfplots@loc@TMPb{upper}% + \def\pgfplots@loc@TMPb{top}% \ifx\pgfplots@loc@TMPb\pgfplots@group@xlabels% - % xlabels at=upper + % xlabels at=top \ifnum1<\pgfplots@group@rows\relax \foreach \pgfplots@column in {1,...,\pgfplots@group@columns} {% \foreach \pgfplots@row in {1,...,\pgfplots@group@rows} {% @@ -264,7 +284,7 @@ % \def\pgfplots@group@determine@ticklabels{% \def\pgfplots@loc@TMPa{all} - \def\pgfplots@loc@TMPb{upper} + \def\pgfplots@loc@TMPb{top} \def\pgfplots@loc@TMPc{lower} \ifx\pgfplots@loc@TMPa\pgfplots@group@xticklabels% % Do nothing as all should have xticklabels diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.patchplots.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.patchplots.code.tex new file mode 100644 index 00000000000..4076e37281c --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.patchplots.code.tex @@ -0,0 +1,1783 @@ +%-------------------------------------------- +% +% Package pgfplots, library for higher order patch plots. +% It contains advanced patch plots like quadratic triangles, +% biquadratic quadrilaterals, coons patches and others. +% The basic implementation for patches supports already line, triangle +% and rectangle (=2 triangles) patches. +% +% Copyright 2007/2008/2009 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +%-------------------------------------------- + + % NOTES: + % In general, a Bezier spline C:[0,1] -> \R of order n fulfills + % C'(0) = n ( P_1 - P_0 ), + % C'(1) = n ( P_n - P_{n-1} ). + % For n=3 and given P_0 and P_3, I can directly compute P_1 and P_2 once I know + % the derivatives at t=0 and t=1. + % + % + % +%-------------------------------------------------- +% 4-point Lagrange interpolation on {0,1/3,2/3,1}: +% C(x) = +% a * (1/3 - x)/(1/3) * (2/3-x)/(2/3) * (1-x) + +% b * (0 - x)/(0 - 1/3) * (2/3-x)/(2/3-1/3) * (1-x)/(1-1/3) + +% c * (0 - x)/(0 - 2/3) * (1/3-x)/(1/3-2/3) * (1-x)/(1-2/3) + +% d * (0 - x)/(0 - 1) * (1/3-x)/(1/3-1) * (2/3-x) /(2/3-1) +% +% +% Derivative: +% +% (-9*c + 2*d + 72*c*x - 18*d*x - 81*c*x^2 + 27*d*x^2 + +% a*(-11 + 36*x - 27*x^2) + 9*b*(2 - 10*x + 9*x^2))/2 +% +% bezier control points are +% P1 = (-5*a)/6 + 3*b - (3*c)/2 + d/3 +% = -0.833333 a + 3. b - 1.5 c + 0.333333 d +% +% P2 = 0.333333 (0.5 (2. a - 9. b + 18. c - 11. d) + 3. d) +% = 0.333333 a - 1.5 b + 3. c - 0.833333 d +%-------------------------------------------------- + + + +\pgfplotsdeclarepatchclass{quadratic spline}{% + allow matrix=0, + uses view depth=0, + new=\def\pgfplotspatchclass@qspline@no{A}, + set next vertex={% + % EXPECTED ORDERING: first 2 corners, then 1 mid nodes + % (interpolatory). + % defines \pgfplotspatchclass@qspline@A ... \pgfplotspatchclass@qspline@C (3 points) + \expandafter\edef\csname pgfplotspatchclass@qspline@\pgfplotspatchclass@qspline@no\endcsname{#1}% + \if C\pgfplotspatchclass@qspline@no + \def\pgfplotspatchclass@qspline@no{A}% + \pgfplotspatchready + \else + \expandafter\let\expandafter\pgfplotspatchclass@qspline@no\csname pgfpptchindexnext@\pgfplotspatchclass@qspline@no\endcsname + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@qspline@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qspline@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qspline@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qspline@C\endvertex #1% + }, + fill path={% + \begingroup + % Draw the patch boundary using a bezier curves. + % + % Since I have lagrange points to describe the patch (i.e. + % points the patch passes through), I have to convert the + % lagrange representation to bezier. + % + % Furthermore, I convert to *cubic* bezier since pdf only + % supports cubic curves. + % + % See the docs for 'biquadratic::fill path' for more details, + % in does the same. + \def\pgfplots@edge{% + \ifx\pgfplotspatchclass@qspline@A\PA + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\PA\endvertex}% + \fi + \pgfpathcurveto {% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PC\endvertex}}% + }{% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PA\endvertex}}% + }{% + \expandafter\pgfplotspointpatchvertex\PC\endvertex + }% + }% + \let\PA=\pgfplotspatchclass@qspline@A + \let\PB=\pgfplotspatchclass@qspline@C + \let\PC=\pgfplotspatchclass@qspline@B + \pgfplots@edge + \endgroup + }, + triangulate class=line, + triangulate={% + \let\pgfplotsplothandlermesh@patchclass@=\pgfplotsplothandlermesh@patchclass + \def\pgfplotsplothandlermesh@patchclass{line}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{new}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@B}% + \let\pgfplotsplothandlermesh@patchclass=\pgfplotsplothandlermesh@patchclass@ + },% + recursive refine@={% + \pgfplotspatchclass{\pgfplotspatchclassname}{new}% + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qspline@A\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qspline@B\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qspline@C\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qspline@AC + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@AC}% + #1% + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qspline@A\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qspline@B\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qspline@C\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qspline@CB + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@B}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qspline@CB}% + #1% + % + },% + get pdf shading type=0, + get num vertices=3, +}% + +\pgfplotsdeclarepatchclass{cubic spline}{% + allow matrix=0, + uses view depth=0, + new=\def\pgfplotspatchclass@cspline@no{A}, + set next vertex={% + % EXPECTED ORDERING: first 2 corners, then 1 mid nodes + % (interpolatory). + % defines \pgfplotspatchclass@cspline@A ... \pgfplotspatchclass@cspline@D (4 points) + \expandafter\edef\csname pgfplotspatchclass@cspline@\pgfplotspatchclass@cspline@no\endcsname{#1}% + \if D\pgfplotspatchclass@cspline@no + \def\pgfplotspatchclass@cspline@no{A}% + \pgfplotspatchready + \else + \expandafter\let\expandafter\pgfplotspatchclass@cspline@no\csname pgfpptchindexnext@\pgfplotspatchclass@cspline@no\endcsname + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@cspline@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@cspline@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@cspline@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@cspline@C\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@cspline@D\endvertex #1% + }, + fill path={% + % Draw the patch boundary using a bezier curve. + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@cspline@A\endvertex}% + % switch basis from lagrange to bezier (see formular on top of + % this file) + \pgfpathcurveto {% + \begingroup + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@cspline@A\times{-0.833333}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@cspline@C\times{3}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@cspline@D\times{-1.5}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@cspline@B\times{0.3333333}% + \pgfplotspatchvertexfinish\pgfplots@loc@TMPa + \expandafter\pgfplotspointpatchvertex\pgfplots@loc@TMPa\endvertex + \endgroup + }{% + \begingroup + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@cspline@A\times{0.333333}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@cspline@C\times{-1.5}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@cspline@D\times{3}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@cspline@B\times{-0.833333}% + \pgfplotspatchvertexfinish\pgfplots@loc@TMPa + \expandafter\pgfplotspointpatchvertex\pgfplots@loc@TMPa\endvertex + \endgroup + }{% + \expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@cspline@B\endvertex + }% + }, + triangulate class=line, + triangulate={% + \let\pgfplotsplothandlermesh@patchclass@=\pgfplotsplothandlermesh@patchclass + \def\pgfplotsplothandlermesh@patchclass{line}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{new}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@B}% + \let\pgfplotsplothandlermesh@patchclass=\pgfplotsplothandlermesh@patchclass@ + },% + recursive refine@={% + % The 4-point lagrangian interpolation formular is shown on + % the top of this page. What I do here is simply to evaluate + % C(i*1/9) for i =0,...,9: + % 0 + % 0.493827 A +0.740741 C -0.296296 D +0.0617284 B + % 0.17284 A +1.03704 C -0.259259 D +0.0493827 B + % 1/3 + % -0.0617284 A +0.740741 C +0.37037 D -0.0493827 B + % -0.0493827 A +0.37037 C +0.740741 D -0.0617284 B + % 2/3 + % 0.0493827 A -0.259259 C +1.03704 D +0.17284 B + % 0.0617284 A -0.296296 C +0.740741 D +0.493827 B + % 1 + \pgfplotspatchclass{\pgfplotspatchclassname}{new}% + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@A\times{0.493827}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@B\times{0.0617284}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@C\times{0.740741}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@D\times{-0.296296}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@cspline@AA + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@A\times{0.17284}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@B\times{0.0493827}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@C\times{1.03704}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@D\times{-0.259259}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@cspline@AB + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@AA}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@AB}% + #1% + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@A\times{-0.0617284}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@B\times{-0.0493827}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@C\times{0.740741}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@D\times{0.37037}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@cspline@AA + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@A\times{-0.0493827}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@B\times{-0.0617284}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@C\times{0.37037}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@D\times{0.740741}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@cspline@AB + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@AA}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@AB}% + #1% + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@A\times{0.0493827}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@B\times{0.17284}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@C\times{-0.259259}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@D\times{+1.03704}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@cspline@AA + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@A\times{0.0617284}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@B\times{0.493827}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@C\times{-0.296296}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@cspline@D\times{0.740741}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@cspline@AB + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@B}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@AA}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@cspline@AB}% + #1% + }, + get pdf shading type=0, + get num vertices=4, +}% + +% make a linearized sequence around the edge of the quad.triangle. +% note the ordering: first 3 corners, then 3 mid nodes: +\def\pgfplots@qtri@next@A{D}% +\def\pgfplots@qtri@next@B{E}% +\def\pgfplots@qtri@next@C{F}% +\def\pgfplots@qtri@next@D{B}% +\def\pgfplots@qtri@next@E{C}% +\def\pgfplots@qtri@next@F{A}% + +\def\pgfplots@qtri@rnext@A{F}% +\def\pgfplots@qtri@rnext@B{D}% +\def\pgfplots@qtri@rnext@C{E}% +\def\pgfplots@qtri@rnext@D{A}% +\def\pgfplots@qtri@rnext@E{B}% +\def\pgfplots@qtri@rnext@F{C}% + +\def\pgfplotspatchclass@qtri@recursiverefine@newnames{% + \let\pgfplotspatchclass@qtri@A@=\pgfplotspatchclass@qtri@A% + \let\pgfplotspatchclass@qtri@B@=\pgfplotspatchclass@qtri@B% + \let\pgfplotspatchclass@qtri@C@=\pgfplotspatchclass@qtri@C% + \let\pgfplotspatchclass@qtri@D@=\pgfplotspatchclass@qtri@D% + \let\pgfplotspatchclass@qtri@E@=\pgfplotspatchclass@qtri@E% + \let\pgfplotspatchclass@qtri@F@=\pgfplotspatchclass@qtri@F% +}% + + +% A 3-point interpolatory patch which draws quadratic polynomial +% splines (functions f(x), x 1d). +\pgfplotsdeclarepatchclass{triangle quadr}{% + allow matrix=0, + uses view depth=1, + new=\def\pgfplotspatchclass@qtri@no{A}\let\pgfplotspatchclass@qtrie@AB\relax, + set next vertex={% + % EXPECTED ORDERING: first 3 corners, then 3 mid nodes. + % defines \pgfplotspatchclass@qtri@A ... \pgfplotspatchclass@qtri@F (6 points) + \expandafter\edef\csname pgfplotspatchclass@qtri@\pgfplotspatchclass@qtri@no\endcsname{#1}% + \if F\pgfplotspatchclass@qtri@no + \def\pgfplotspatchclass@qtri@no{A}% + \pgfplotspatchready + \else + \expandafter\let\expandafter\pgfplotspatchclass@qtri@no\csname pgfpptchindexnext@\pgfplotspatchclass@qtri@no\endcsname + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@C\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@D\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@E\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@F\endvertex #1% + }, + fill path={% + \begingroup + % Draw the patch boundary using three bezier curves. + % + % Since I have lagrange points to describe the patch (i.e. + % points the patch passes through), I have to convert the + % lagrange representation to bezier. + % + % Furthermore, I convert to *cubic* bezier since pdf only + % supports cubic curves. + % + % See the docs for 'biquadratic::fill path' for more details, + % in does the same. + \def\pgfplots@edge{% + \ifx\pgfplotspatchclass@qtri@A\PA + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\PA\endvertex}% + \fi + \pgfpathcurveto {% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PC\endvertex}}% + }{% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PA\endvertex}}% + }{% + \expandafter\pgfplotspointpatchvertex\PC\endvertex + }% + }% + \let\PA=\pgfplotspatchclass@qtri@A + \let\PB=\pgfplotspatchclass@qtri@D + \let\PC=\pgfplotspatchclass@qtri@B + \pgfplots@edge + % + \let\PA=\pgfplotspatchclass@qtri@B + \let\PB=\pgfplotspatchclass@qtri@E + \let\PC=\pgfplotspatchclass@qtri@C + \pgfplots@edge + % + \let\PA=\pgfplotspatchclass@qtri@C + \let\PB=\pgfplotspatchclass@qtri@F + \let\PC=\pgfplotspatchclass@qtri@A + \pgfplots@edge + \endgroup + \pgfpathclose + }, + %-------------------------------------------------- + % stroke path={% + % \ifx\pgfplotspatchclass@qtrie@AB\relax + % \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@A\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@B\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@C\endvertex}% + % \pgfpathclose + % \else + % \if1\pgfplotspatchclass@qtrie@AB + % \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@A\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@B\endvertex}% + % \fi + % \if1\pgfplotspatchclass@qtrie@BC + % \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@B\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@C\endvertex}% + % \fi + % \if1\pgfplotspatchclass@qtrie@CA + % \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@C\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@qtri@A\endvertex}% + % \fi + % \fi + % }, + %-------------------------------------------------- + stream to shader={% + % create a degenerate coons patch: + \begingroup +%\message{EDGE INIT^^J}% + % this defines \Pcur and \Pnextseq : + \pgfplotspatchclass@tri@to@coonspatch@findshadingsequence@for@depth + % + \pgfutil@namelet{Pstart}{pgfplotspatchclass@qtri@\Pcur}% + % + % see the docus for "fill path" about these 1.33333 and -0.33333 factors + \def\pgfplots@coonsedge{% +%\message{EDGE \Pcur^^J}% + \expandafter\let\expandafter\PA\csname pgfplotspatchclass@qtri@\Pcur\endcsname + \edef\Pcur{\csname pgfplots@qtri@\Pnextseq next@\Pcur\endcsname}% +%\message{---> \Pcur^^J}% + \expandafter\let\expandafter\PB\csname pgfplotspatchclass@qtri@\Pcur\endcsname + \edef\Pcur{\csname pgfplots@qtri@\Pnextseq next@\Pcur\endcsname}% +%\message{---> \Pcur^^J}% + \expandafter\let\expandafter\PC\csname pgfplotspatchclass@qtri@\Pcur\endcsname + \ifx\PA\Pstart + \expandafter\pgfplotspatchvertex\PA\endvertex + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + % degenerate: the "edge" \PA -- \PA collabses into one + % point. + % Per construction, the "edge" is the FOREGROUND. +%\message{STREAMING COLLAPSED EDGE AT START POINT^^J}% + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + \fi + \pgfplotslibrarysurfstreamcoord{% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PC\endvertex}}% + }{}% + \pgfplotslibrarysurfstreamcoord{% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PA\endvertex}}% + }{}% + \ifx\PC\Pstart + \else + \expandafter\pgfplotspatchvertex\PC\endvertex + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + \fi + }% + \pgfplots@coonsedge + % + \pgfplots@coonsedge + % + \pgfplots@coonsedge + % + % + \endgroup + },% + triangulate={% + \let\pgfplotsplothandlermesh@patchclass@=\pgfplotsplothandlermesh@patchclass + \def\pgfplotsplothandlermesh@patchclass{triangle}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{new}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}01% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}11% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}20% + % Ok. Now create 4 triangles. The ordering is not arbitrary + % (unless z buffer=sort is in effect). Let's assume that the + % AB edge is BACKGROUND and the CD edge is FOREGROUND. Then + % this sequence here should have approximately the same depth + % ordering: + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@F}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@D}% + % + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}00% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}10% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@F}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@E}% + % + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}01% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}11% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@B}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@E}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@E}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@F}% + \let\pgfplotsplothandlermesh@patchclass=\pgfplotsplothandlermesh@patchclass@ + },% + set edge visible={% + \ifcase#1 + \edef\pgfplotspatchclass@qtrie@AB{#2}% + \or + \edef\pgfplotspatchclass@qtrie@BC{#2}% + \or + \edef\pgfplotspatchclass@qtrie@CA{#2}% + \fi + }, + serialize except vertices={% + \ifx\pgfplotspatchclass@qtrie@AB\relax + \let\pgfplotsretval\pgfutil@empty% + \else + \edef\pgfplotsretval{% + \noexpand\def\noexpand\pgfplotspatchclass@qtrie@AB{\pgfplotspatchclass@qtrie@AB}% + \noexpand\def\noexpand\pgfplotspatchclass@qtrie@BC{\pgfplotspatchclass@qtrie@BC}% + \noexpand\def\noexpand\pgfplotspatchclass@qtrie@CA{\pgfplotspatchclass@qtrie@CA}% + }% + \fi + },% + deserialize except vertices=% + \let\pgfplotspatchclass@qtrie@AB\relax + #1, + recursive refine@={% + \pgfplotspatchclass@qtri@recursiverefine@newnames + % + \pgfplotspatchclass{\pgfplotspatchclassname}{new}% + %-------------------------------------------------- + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}01% + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}11% + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}20% + %-------------------------------------------------- + % The ordering is not arbitrary + % (unless z buffer=sort is in effect). Let's assume that the + % AB edge is BACKGROUND and the CD edge is FOREGROUND. Then + % this sequence here should have approximately the same depth + % ordering: + % + % I used the reference triangle and shape functions as listed in + % http://www.colorado.edu/engineering/CAS/courses.d/IFEM.d/ + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@A\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@B\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@D\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@AD + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@B\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@C\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@D\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@E\times{0.25}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@F\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@DF + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@A\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@C\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@F\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@AF + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@F@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@A@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@D@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@AF}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@AD}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@DF}% + % + #1\pgfplotspatchclass@qtri@recursiverefine@newnames + % + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@B\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@C\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@D\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@E\times{0.25}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@F\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@DF + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@A\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@C\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@D\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@E\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@F\times{0.25}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@DE + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@A\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@B\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@D\times{0.25}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@E\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@F\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@EF + % + % + %-------------------------------------------------- + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}00% + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}10% + %-------------------------------------------------- + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@F@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@D@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@E@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@DF}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@DE}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@EF}% + % % + % %-------------------------------------------------- + % % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}01% + % % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}11% + % %-------------------------------------------------- + #1\pgfplotspatchclass@qtri@recursiverefine@newnames + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@A\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@B\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@D\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@DB + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@A\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@C\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@D\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@E\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@F\times{0.25}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@DE + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@B\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@C\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@E\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@BE + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@D@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@B@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@E@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@DB}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@BE}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@DE}% + % + #1\pgfplotspatchclass@qtri@recursiverefine@newnames + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@B\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@C\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@E\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@EC + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@A\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@B\times{-.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@D\times{0.25}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@E\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@F\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@EF + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@A\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@C\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@qtri@F\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@qtri@CF + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@E@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@C@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@F@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@EC}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@CF}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@qtri@EF}% + % + #1% + % + },% + get pdf shading type=6, + get num vertices=6, +}% + + +% see +% \pgfplotspatchclass@rect@to@coonspatch@findshadingsequence@for@depth +% and its documentation. +% +% POSTCONDITION: +% \Pcur and \Pnextseq are defined. +\def\pgfplotspatchclass@tri@to@coonspatch@findshadingsequence@for@depth{% + \def\Pcur{A}% + \def\Pnextseq{}% + % + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@A\endvertex + \ifx\pgfplotspatchvertexdepth\pgfutil@empty + \else + % ah. We have view depth. Use it! + % The idea here is as follows. + % According to pdf standard, the COONS Shading is + % generated in the unit cube and then mapped to the + % shading. If u,v in [0,1] are the coordinates in the unit + % cube, pixel values for v=1 overwrite values for v=0. + % If pixel values have the same v, u=1 overwrites u=0. + % In other words, the loop is + % for v= 0 to Nv + % for u = 0 to Nu + % shade pixel for (u,v) + % + % BB-------CC <--v=1 + % | | + % | | + % | | + % AA-------DD <--v=0 + % | | + % u=0 u=1 + % + % + % IDEA: re-order the sequence of vertices such that z + % buffering is obtained. + % + % APPROACH: + % the edge BB--CC collapses into just one point, namely + % the FOREGROUND point (i.e. it is drawn on top of + % everything else). + % + % The AA point is the second nearest foreground point. + % The sequence is chosen such that AA,BB is the first + % edge. + % + % What is to do (besides determining the vertices for AA + % and BB)? Well, make sure, that we can arrange them in + % the desired order. This involves a periodic "next vertex" + % algorithm which might either go forward + % or backward. + % + % sort according to depth. + % To do so, prepare macros \PA,\PB,\PC for use in + % \pgfplotsutilsortthree. FORMAT: + % \PA={<sortkey>pt <originalindex>} + \edef\PA{\pgfplotspatchvertexdepth pt A}% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@B\endvertex + \edef\PB{\pgfplotspatchvertexdepth pt B}% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@qtri@C\endvertex + \edef\PC{\pgfplotspatchvertexdepth pt C}% + \pgfplotsutilsortthree\PA\PB\PC + \def\toCHAR##1pt ##2{##2}% get original index + % + \edef\Pcur{\expandafter\toCHAR\PB}%% + \edef\Pnext{\csname pgfplots@qtri@next@\Pcur\endcsname}% + \edef\Pnext{\csname pgfplots@qtri@next@\Pnext\endcsname}% + \if\Pnext\PA + % ok, next(next(AA)) = BB. + % that means we have to advance forward. + \def\Pnextseq{}% + \else + % well, since we have a triangle, there only remains + % the backwards direction. + \def\Pnextseq{r}% + \fi +%\message{FOREGROUND VERTEX = \PA.^^J}% +%\message{SECOND NEAREST VERTEX = \PB.^^J}% + \fi +} +\def\pgfplotspatchclass@tri@to@coonspatch@findshadingsequence@for@depth@no@op{% + \def\Pcur{A}% + \def\Pnextseq{}% +} + +% bilinear is the same as 'rectangle', but it uses a different shader. +\pgfplotsdeclarepatchclass{bilinear}{% + allow matrix=1, + new=\def\pgfplotspatchclass@rect@no{0}, + set next vertex={% + \ifcase\pgfplotspatchclass@rect@no\relax + \edef\pgfplotspatchclass@rect@A{#1}% + \def\pgfplotspatchclass@rect@no{1}% + \or + \edef\pgfplotspatchclass@rect@B{#1}% + \def\pgfplotspatchclass@rect@no{2}% + \or + \edef\pgfplotspatchclass@rect@C{#1}% + \def\pgfplotspatchclass@rect@no{3}% + \or + \edef\pgfplotspatchclass@rect@D{#1}% + \def\pgfplotspatchclass@rect@no{0}% + \pgfplotspatchready% + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@C\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@D\endvertex #1% + }, + stream to shader={% + % create a coons patch: + \begingroup + \pgfplotspatchclass@rect@to@coonspatch@findshadingsequence@for@depth + {pgfplotspatchclass@rect@}{\Pcur}{\Pnextseq}% + % + \pgfutil@namelet{Pstart}{pgfplotspatchclass@rect@\Pcur}% + \def\pgfplots@coonsedge{% +%\message{EDGE \Pcur^^J}% + \expandafter\let\expandafter\PA\csname pgfplotspatchclass@rect@\Pcur\endcsname + \edef\Pcur{\csname pgfplots@rect@\Pnextseq next@\Pcur\endcsname}% +%\message{---> \Pcur^^J}% + \expandafter\let\expandafter\PB\csname pgfplotspatchclass@rect@\Pcur\endcsname + \ifx\PA\Pstart + \expandafter\pgfplotspatchvertex\PA\endvertex + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + \fi + % + % CONTROL POINT A+1/3(B-A) + \pgfplotslibrarysurfstreamcoord{% + \pgfpointadd + {\pgfqpointscale{0.6666666}{\expandafter\pgfplotspointpatchvertex\PA\endvertex}}% + {\pgfqpointscale{0.3333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + }{}% + % CONTROL POINT A+2/3(B-A) + \pgfplotslibrarysurfstreamcoord{% + \pgfpointadd + {\pgfqpointscale{0.3333333}{\expandafter\pgfplotspointpatchvertex\PA\endvertex}}% + {\pgfqpointscale{0.6666666}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + }{}% + \ifx\PB\Pstart + \else + \expandafter\pgfplotspatchvertex\PB\endvertex + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + \fi + }% + % + \pgfplots@coonsedge + % + \pgfplots@coonsedge + % + \pgfplots@coonsedge + % + \pgfplots@coonsedge + % + \endgroup + },% + fill path={% + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@rect@A\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@rect@B\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@rect@C\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@rect@D\endvertex}% + \pgfpathclose + }, + triangulate={% + \pgfplotscoordmath{meta}{parsenumber}{0.25}% + \let\pgfplots@loc@scale=\pgfmathresult + % + \pgf@xa=0pt + \pgf@ya=0pt + \pgf@yb=0pt + \pgfplotscoordmath{meta}{zero}% + \def\pgfplots@loc@accum@mean{% + \advance\pgf@xa by\pgfplotspatchvertexx\relax + \advance\pgf@ya by\pgfplotspatchvertexy\relax + \pgfplotscoordmath{meta}{op}{add}{{\pgfmathresult}{\pgfplotspatchvertexmeta}}% + \ifx\pgfplotspatchvertexdepth\pgfutil@empty + \else + \advance\pgf@yb by\pgfplotspatchvertexdepth pt\relax + \fi + }% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@A\endvertex \pgfplots@loc@accum@mean% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@B\endvertex \pgfplots@loc@accum@mean% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@C\endvertex \pgfplots@loc@accum@mean% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@D\endvertex \pgfplots@loc@accum@mean% + % + \divide\pgf@xa by4 + \divide\pgf@ya by4 + \divide\pgf@yb by4 + \pgfplotscoordmath{meta}{op}{multiply}{{\pgfmathresult}{\pgfplots@loc@scale}}% + \edef\pgfplotspatchclass@rect@M{{\the\pgf@xa}{\the\pgf@ya}{\pgfmathresult}\ifx\pgfplotspatchvertexdepth\pgfutil@empty\else \pgf@sys@tonumber\pgf@yb\fi}% + % + \let\pgfplotsplothandlermesh@patchclass@=\pgfplotsplothandlermesh@patchclass + \def\pgfplotsplothandlermesh@patchclass{triangle}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{new}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}01% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}10% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}20% + % Ok. Now create 4 triangles. The ordering is not arbitrary + % (unless z buffer=sort is in effect). Let's assume that the + % AB edge is BACKGROUND and the CD edge is FOREGROUND. Then + % this sequence here should have approximately the same depth + % ordering: + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@B}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@M}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@B}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@M}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@M}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@M}% + \let\pgfplotsplothandlermesh@patchclass=\pgfplotsplothandlermesh@patchclass@ + },% + recursive refine@={% + \pgfplotspatchclass@rect@refine@{#1}% + },% + serialize except vertices=\let\pgfplotsretval\pgfutil@empty,% + deserialize except vertices=, + get pdf shading type=6, + get num vertices=4, +}% + +\pgfplotsdeclarepatchclass{rectangle}{% + recursive refine@={% + \pgfplotspatchclass@rect@refine@{#1}% + },% +} +\def\pgfplotspatchclass@rect@refine@#1{% + \pgfplotspatchclass@rect@recursiverefine@newnames + % + \pgfplotspatchclass{\pgfplotspatchclassname}{new}% + %-------------------------------------------------- + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}01% + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}11% + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}20% + %-------------------------------------------------- + % The ordering is not arbitrary + % (unless z buffer=sort is in effect). Let's assume that the + % AB edge is BACKGROUND and the CD edge is FOREGROUND. Then + % this sequence here should have approximately the same depth + % ordering: + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@A\times{0.25}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@B\times{0.25}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@C\times{0.25}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@D\times{0.25}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@M + % + \expandafter\pgfplotspatchclass@rect@refine@@\expandafter{\pgfplotspatchclass@rect@M}{#1}% +} +\def\pgfplotspatchclass@rect@refine@@#1#2{% + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@A\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@B\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@AB + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@A\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@D\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@DA + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@A@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@AB}% + \pgfplotsplothandlermesh@setnextvertex{#1}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@DA}% + #2\pgfplotspatchclass@rect@recursiverefine@newnames + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@A\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@B\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@AB + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@B\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@C\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@BC + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@AB}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@B@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@BC}% + \pgfplotsplothandlermesh@setnextvertex{#1}% + #2\pgfplotspatchclass@rect@recursiverefine@newnames + % + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@C\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@D\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@CD + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@B\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@C\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@BC + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@BC}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@C@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@CD}% + \pgfplotsplothandlermesh@setnextvertex{#1}% + #2\pgfplotspatchclass@rect@recursiverefine@newnames + % + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@C\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@D\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@CD + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@D\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@rect@A\times{0.5}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@rect@DA + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@CD}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@D@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@DA}% + \pgfplotsplothandlermesh@setnextvertex{#1}% + #2\pgfplotspatchclass@rect@recursiverefine@newnames + % +}% + +\def\pgfplotspatchclass@rect@recursiverefine@newnames{% + \let\pgfplotspatchclass@rect@A@=\pgfplotspatchclass@rect@A% + \let\pgfplotspatchclass@rect@B@=\pgfplotspatchclass@rect@B% + \let\pgfplotspatchclass@rect@C@=\pgfplotspatchclass@rect@C% + \let\pgfplotspatchclass@rect@D@=\pgfplotspatchclass@rect@D% +}% + +\def\pgfplots@biquad@next@A{E} +\def\pgfplots@biquad@next@B{F} +\def\pgfplots@biquad@next@C{G} +\def\pgfplots@biquad@next@D{H} +\def\pgfplots@biquad@next@E{B} +\def\pgfplots@biquad@next@F{C} +\def\pgfplots@biquad@next@G{D} +\def\pgfplots@biquad@next@H{A} + + +\def\pgfplots@biquad@rnext@A{H} +\def\pgfplots@biquad@rnext@B{E} +\def\pgfplots@biquad@rnext@C{F} +\def\pgfplots@biquad@rnext@D{G} +\def\pgfplots@biquad@rnext@E{A} +\def\pgfplots@biquad@rnext@F{B} +\def\pgfplots@biquad@rnext@G{C} +\def\pgfplots@biquad@rnext@H{D} + +\def\pgfplotspatchclass@biquad@recursiverefine@newnames{% + \let\pgfplotspatchclass@biquad@A@=\pgfplotspatchclass@biquad@A% + \let\pgfplotspatchclass@biquad@B@=\pgfplotspatchclass@biquad@B% + \let\pgfplotspatchclass@biquad@C@=\pgfplotspatchclass@biquad@C% + \let\pgfplotspatchclass@biquad@D@=\pgfplotspatchclass@biquad@D% + \let\pgfplotspatchclass@biquad@E@=\pgfplotspatchclass@biquad@E% + \let\pgfplotspatchclass@biquad@F@=\pgfplotspatchclass@biquad@F% + \let\pgfplotspatchclass@biquad@G@=\pgfplotspatchclass@biquad@G% + \let\pgfplotspatchclass@biquad@H@=\pgfplotspatchclass@biquad@H% + \let\pgfplotspatchclass@biquad@I@=\pgfplotspatchclass@biquad@I% +}% + + +% mathematica shape functions parameterized in +% (xi,eta) in [-1,1]x[-1,1]: +%f[xi_, eta_] = +% a*1/4*(1 - xi) (1 - eta) xi*eta + +% b 1/4 (-1 - xi) (1 - eta) xi*eta + +% c* 1/4 (-1 - xi) (-1 - eta) xi*eta + +% d *1/4 (1 - xi) (-1 - eta) xi*eta + +% e * 1/2 (xi^2 - 1) (1 - eta) eta + +% f*1/2 (-1 - xi) (eta^2 - 1) xi + +% g* -1/2 (1 - xi^2) (-1 - eta) eta + +% h* -1/2 (1 - xi) (1 - eta^2) xi + +% i*(1 - xi^2) (1 - eta^2) +% here, a,b,...,i are the 9 nodes. +\pgfplotsdeclarepatchclass{biquadratic}{% + allow matrix=0, + new=\def\pgfplotspatchclass@biquad@no{A}\let\pgfplotspatchclass@biquade@AB\relax, + set next vertex={% + % defines \pgfplotspatchclass@biquad@A ... \pgfplotspatchclass@biquad@I (9 points) + \expandafter\edef\csname pgfplotspatchclass@biquad@\pgfplotspatchclass@biquad@no\endcsname{#1}% + \if I\pgfplotspatchclass@biquad@no + \def\pgfplotspatchclass@biquad@no{A}% + \pgfplotspatchready + \else + \expandafter\let\expandafter\pgfplotspatchclass@biquad@no\csname pgfpptchindexnext@\pgfplotspatchclass@biquad@no\endcsname + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@C\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@D\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@E\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@F\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@G\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@H\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@biquad@I\endvertex #1% + }, + fill path={% + \begingroup + % Visualize the patch boundary using four bezier curves. + % + % This involves a change from Lagrange to bezier + % representation of the boundary curves. + % + % Furthermore, pdf supports only **cubic** bezier curves. What + % I am doing here is + % a) change of basis from 3-point lagrange ---> 3 point quadratic bezier + % b) expression 3 point quadratic bezier ----> 4 point cubic bezier + % + % INPUT: + % 3 langrange points (i.e. the patch passes through them) + % \PA,\PB,\PC (start,middle,end) + % + % OUTPUT: + % \PA,bezier control 1, bezier control 2, \PC. + % + \def\pgfplots@edge{% + \ifx\pgfplotspatchclass@biquad@A\PA + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\PA\endvertex}% + \fi + \pgfpathcurveto {% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PC\endvertex}}% + }{% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PA\endvertex}}% + }{% + \expandafter\pgfplotspointpatchvertex\PC\endvertex + }% + }% + \let\PA=\pgfplotspatchclass@biquad@A + \let\PB=\pgfplotspatchclass@biquad@E + \let\PC=\pgfplotspatchclass@biquad@B + \pgfplots@edge + % + \let\PA=\pgfplotspatchclass@biquad@B + \let\PB=\pgfplotspatchclass@biquad@F + \let\PC=\pgfplotspatchclass@biquad@C + \pgfplots@edge + % + \let\PA=\pgfplotspatchclass@biquad@C + \let\PB=\pgfplotspatchclass@biquad@G + \let\PC=\pgfplotspatchclass@biquad@D + \pgfplots@edge + % + \let\PA=\pgfplotspatchclass@biquad@D + \let\PB=\pgfplotspatchclass@biquad@H + \let\PC=\pgfplotspatchclass@biquad@A + \pgfplots@edge + \endgroup + \pgfpathclose + }, + %-------------------------------------------------- + % stroke path={% + % \ifx\pgfplotspatchclass@biquade@AB\relax + % \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@A\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@B\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@C\endvertex}% + % \pgfpathclose + % \else + % \if1\pgfplotspatchclass@biquade@AB + % \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@A\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@B\endvertex}% + % \fi + % \if1\pgfplotspatchclass@biquade@BC + % \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@B\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@C\endvertex}% + % \fi + % \if1\pgfplotspatchclass@biquade@CA + % \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@C\endvertex}% + % \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@biquad@A\endvertex}% + % \fi + % \fi + % }, + %-------------------------------------------------- + stream to shader={% + \begingroup + \pgfplotspatchclass@rect@to@coonspatch@findshadingsequence@for@depth + {pgfplotspatchclass@biquad@}{\Pcur}{\Pnextseq}% + % + \let\Pstartidx\Pcur% + \pgfutil@namelet{Pstart}{pgfplotspatchclass@biquad@\Pcur}% + % + % create a tensor cubic bezier patch. + % + % Again, the outer boundary involves a map from 3 point lagrange + % representation to 4 point cubic bezier. + % + % The main complication arises to support the INNER node (\pgfplotspatchclass@biquad@I) . + % We need the four inner bezier control points to get it + % correctly. + % + % this here handles only the OUTER shaper. It is the same as + % for 'fill path'. + % See 'fill path' for docs. + % + \pgfplotspatchclass@biquad@coonsedge + % + \pgfplotspatchclass@biquad@coonsedge + % + \pgfplotspatchclass@biquad@coonsedge + % + \pgfplotspatchclass@biquad@coonsedge + % + % FIXME: + % \pgfplotspatchclass@biquad@innercontrolpoints + % + \endgroup + },% + triangulate={% + \let\pgfplotsplothandlermesh@patchclass@=\pgfplotsplothandlermesh@patchclass + \def\pgfplotsplothandlermesh@patchclass{triangle}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{new}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}01% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}10% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}20% + % Ok. Now create 4 triangles. The ordering is not arbitrary + % (unless z buffer=sort is in effect). Let's assume that the + % AB edge is BACKGROUND and the CD edge is FOREGROUND. Then + % this sequence here should have approximately the same depth + % ordering: + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@E}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@H}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@E}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@B}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@B}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@F}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@H}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@G}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@G}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I}% + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@F}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I}% + \let\pgfplotsplothandlermesh@patchclass=\pgfplotsplothandlermesh@patchclass@ + },% + %-------------------------------------------------- + % set edge visible={% + % \ifcase#1 + % \edef\pgfplotspatchclass@biquade@AB{#2}% + % \or + % \edef\pgfplotspatchclass@biquade@BC{#2}% + % \or + % \edef\pgfplotspatchclass@biquade@CA{#2}% + % \fi + % }, + %-------------------------------------------------- + serialize except vertices={% + \ifx\pgfplotspatchclass@biquade@AB\relax + \let\pgfplotsretval\pgfutil@empty% + \else + \edef\pgfplotsretval{% + \noexpand\def\noexpand\pgfplotspatchclass@biquade@AB{\pgfplotspatchclass@biquade@AB}% + \noexpand\def\noexpand\pgfplotspatchclass@biquade@BC{\pgfplotspatchclass@biquade@BC}% + \noexpand\def\noexpand\pgfplotspatchclass@biquade@CA{\pgfplotspatchclass@biquade@CA}% + }% + \fi + },% + deserialize except vertices=% + \let\pgfplotspatchclass@biquade@AB\relax + #1, + recursive refine@={% + \pgfplotspatchclass@biquad@recursiverefine@newnames + % + \pgfplotspatchclass{\pgfplotspatchclassname}{new}% + %-------------------------------------------------- + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}01% + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}11% + % \pgfplotspatchclass{\pgfplotspatchclassname}{set edge visible}20% + %-------------------------------------------------- + % The ordering is not arbitrary + % (unless z buffer=sort is in effect). Let's assume that the + % AB edge is BACKGROUND and the CD edge is FOREGROUND. Then + % this sequence here should have approximately the same depth + % ordering: + % + % I used the reference triangle and shape functions as listed in + % http://www.colorado.edu/engineering/CAS/courses.d/IFEM.d/, + % see above for the definition of f[xi,eta] + % + % N[{f[-1/2, -1], f[0, -1/2], f[-1/2, 0], f[-1, -1/2], f[-1/2, -1/2]}] + % {0.375` a - 0.125` b + 0.75` e, + % 0.375` e - 0.125` g + 0.75` i, + % -0.125` f + 0.375` h + 0.75` i, + % 0.375` a - 0.125` d + 0.75` h, + % 0.140625` a - 0.046875` b + 0.015625` c - 0.046875` d + + % 0.28125` e - 0.09375` f - 0.09375` g + 0.28125` h + + % 0.5625` i} + %-------------------------------------------------- + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@A\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@B\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@AE + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@EI + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@HI + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@A\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@D\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@AH + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@A\times{0.140625}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@B\times{-0.046875}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@C\times{0.015625}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@D\times{-0.046875}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{0.28125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{-0.09375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{-0.09375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{0.28125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.5625}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@AEIH + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@A@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@E@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@H@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@AE}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@EI}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@HI}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@AH}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@AEIH}% + % + #1\pgfplotspatchclass@biquad@recursiverefine@newnames + % + % N[{f[1/2, -1], f[1, -1/2], f[1/2, 0], f[1/2, -1/2]}] + % {-0.125` a + 0.375` b + 0.75` e, + % 0.375` b - 0.125` c + 0.75` f, + % 0.375` f - 0.125` h + 0.75` i, + % -0.046875 a + 0.140625 b - 0.046875 c + 0.015625 d + 0.28125 e + 0.28125 f - 0.09375 g - 0.09375 h + 0.5625 i} + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@A\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@B\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@EB + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@B\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@C\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@BF + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@FI + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@EI + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@A\times{-0.046875}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@B\times{0.140625}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@C\times{-0.046875}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@D\times{0.015625}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{0.28125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{0.28125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{-0.09375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{-0.09375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.5625}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@EBFI + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@E@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@B@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@F@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@EB}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@BF}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@FI}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@EI}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@EBFI}% + % + #1\pgfplotspatchclass@biquad@recursiverefine@newnames + % + % + % N[ {f[1, 1/2], f[1/2, 1], f[0, 1/2], f[1/2, 1/2]}] + % {-0.125` b + 0.375` c + 0.75` f, + % 0.375` c - 0.125` d + 0.75` g, + % -0.125` e + 0.375` g + 0.75` i, + % 0.015625` a - 0.046875` b + 0.140625` c - 0.046875` d - 0.09375` e + 0.28125` f + 0.28125` g - 0.09375` h + 0.5625` i} + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@B\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@C\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@FC + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@C\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@D\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@CG + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@GI + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@FI + % + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@A\times{0.015625}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@B\times{-0.046875}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@C\times{0.140625}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@D\times{-0.046875}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{-0.09375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{0.28125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{0.28125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{-0.09375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.5625}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@IFCG + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@F@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@C@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@G@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@FI}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@FC}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@CG}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@GI}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@IFCG}% + % + #1\pgfplotspatchclass@biquad@recursiverefine@newnames + % + % + % N[{f[-1/2, 1], f[-1, 1/2], f[-1/2, 1/2]}] + % {-0.125 c + 0.375 d + 0.75 g, + % -0.125 a + 0.375 d + 0.75 h, + % -0.046875 a + 0.015625 b - 0.046875 c + 0.140625 d - 0.09375 e - 0.09375 f + 0.28125 g + 0.28125 h + 0.5625 i} + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@C\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@D\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@GD + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@A\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@D\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@DH + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@GI + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{-0.125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{0.375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@HI + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@A\times{-0.046875}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@B\times{0.015625}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@C\times{-0.046875}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@D\times{0.140625}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@E\times{-0.09375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@F\times{-0.09375}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@G\times{0.28125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@H\times{0.28125}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@biquad@I\times{0.5625}% + \pgfplotspatchvertexfinish\pgfplotspatchclass@biquad@HIGD + % + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@H@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@I@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@G@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@D@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@HI}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@GI}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@GD}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@DH}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@biquad@HIGD}% + % + #1% + % + },% + get pdf shading type=6, + get num vertices=9, +}% + +% see docs in 'biquadratic::stream to shader' for details. +% PRECONDITION: to be used inside of 'stream to shader'. +\def\pgfplotspatchclass@biquad@coonsedge{% +%\message{EDGE \Pcur^^J}% + \expandafter\let\expandafter\PA\csname pgfplotspatchclass@biquad@\Pcur\endcsname + \edef\Pcur{\csname pgfplots@biquad@\Pnextseq next@\Pcur\endcsname}% + \expandafter\let\expandafter\PB\csname pgfplotspatchclass@biquad@\Pcur\endcsname +%\message{---> \Pcur^^J}% + \edef\Pcur{\csname pgfplots@biquad@\Pnextseq next@\Pcur\endcsname}% + \expandafter\let\expandafter\PC\csname pgfplotspatchclass@biquad@\Pcur\endcsname +%\message{---> \Pcur^^J}% + \ifx\PA\Pstart + \expandafter\pgfplotspatchvertex\PA\endvertex + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + \fi + \pgfplotslibrarysurfstreamcoord{% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PC\endvertex}}% + }{}% + \pgfplotslibrarysurfstreamcoord{% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PA\endvertex}}% + }{}% + \ifx\PC\Pstart + \else + \expandafter\pgfplotspatchvertex\PC\endvertex + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord{\pgfqpoint\pgfplotspatchvertexx\pgfplotspatchvertexy}{\pgfplotspointmetatransformed}% + \fi +}% +\def\pgfplotspatchclass@biquad@innercontrolpoints{% + \begingroup + % + % This here computes the FOUR INNER CONTROL POINTS of a tensor + % cubic bezier patch (Shading Type 7). + % + % + % the following point coordinates have been acquired from + % biquadratic::recursive refine. See above for documentation. + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@A\times{0.375}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@B\times{-0.125}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@E\times{0.75}% + \pgfplotspatchvertexfinishXY\pgfplotspatchclass@biquad@AE + % + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@F\times{-0.125}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@H\times{0.375}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinishXY\pgfplotspatchclass@biquad@HI + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@A\times{-0.125}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@B\times{0.375}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@E\times{0.75}% + \pgfplotspatchvertexfinishXY\pgfplotspatchclass@biquad@EB + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@F\times{0.375}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@H\times{-0.125}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@I\times{0.75}% + \pgfplotspatchvertexfinishXY\pgfplotspatchclass@biquad@FI + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@C\times{0.375}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@D\times{-0.125}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@G\times{0.75}% + \pgfplotspatchvertexfinishXY\pgfplotspatchclass@biquad@CG + % + \pgfplotspatchvertexaccumstart + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@C\times{-0.125}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@D\times{0.375}% + \expandafter\pgfplotspatchvertexaddXY\pgfplotspatchclass@biquad@G\times{0.75}% + \pgfplotspatchvertexfinishXY\pgfplotspatchclass@biquad@GD + % + % + \let\PA=\pgfplotspatchclass@biquad@AE + \let\PB=\pgfplotspatchclass@biquad@HI + \let\PC=\pgfplotspatchclass@biquad@GD + \pgfplotspatchclass@biquad@innercontrolpoints@PREPARE\pgfplotspatchclass@biquad@@A\pgfplotspatchclass@biquad@@D + % + \let\PA=\pgfplotspatchclass@biquad@EB + \let\PB=\pgfplotspatchclass@biquad@FI + \let\PC=\pgfplotspatchclass@biquad@CG + \pgfplotspatchclass@biquad@innercontrolpoints@PREPARE\pgfplotspatchclass@biquad@@B\pgfplotspatchclass@biquad@@C + % + % + \let\Pcur=\Pstartidx + \pgfplotslibrarysurfstreamcoord{\csname pgfplotspatchclass@biquad@@\Pcur\endcsname}{}% + % + \edef\Pcur{\csname pgfplots@rect@\Pnextseq next@\Pcur\endcsname}% + \pgfplotslibrarysurfstreamcoord{\csname pgfplotspatchclass@biquad@@\Pcur\endcsname}{}% + % + \edef\Pcur{\csname pgfplots@rect@\Pnextseq next@\Pcur\endcsname}% + \pgfplotslibrarysurfstreamcoord{\csname pgfplotspatchclass@biquad@@\Pcur\endcsname}{}% + % + \edef\Pcur{\csname pgfplots@rect@\Pnextseq next@\Pcur\endcsname}% + \pgfplotslibrarysurfstreamcoord{\csname pgfplotspatchclass@biquad@@\Pcur\endcsname}{}% + \endgroup +}% +\def\pgfplotspatchclass@biquad@innercontrolpoints@PREPARE#1#2{% + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PC\endvertex}}% + \edef#1{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% + % + \pgfpointadd + {\pgfqpointscale{1.333333}{\expandafter\pgfplotspointpatchvertex\PB\endvertex}}% + {\pgfqpointscale{-0.333333}{\expandafter\pgfplotspointpatchvertex\PA\endvertex}}% + \edef#2{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% + % +\pgfpathcircle{\expandafter\pgfplotspointpatchvertex\PA\endvertex}{1pt}\pgfusepath{fill}% +\pgfpathcircle{\expandafter\pgfplotspointpatchvertex\PB\endvertex}{1pt}\pgfusepath{fill}% +\pgfpathcircle{\expandafter\pgfplotspointpatchvertex\PC\endvertex}{1pt}\pgfusepath{fill}% +\pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\PA\endvertex}% +\pgfpathcurveto{#1}{#2}{\expandafter\pgfplotspointpatchvertex\PC\endvertex}% +\pgfusepath{stroke}% +} + +% Direct interface to coons patches (pdf shading type 6). +% See manual and/or pdf reference +\pgfplotsdeclarepatchclass{coons}{% + allow matrix=0, + new=\def\pgfplotspatchclass@coons@no{A}, + set next vertex={% + % defines \pgfplotspatchclass@coons@A ... \pgfplotspatchclass@coons@L (12 points) + \expandafter\edef\csname pgfplotspatchclass@coons@\pgfplotspatchclass@coons@no\endcsname{#1}% + \if L\pgfplotspatchclass@coons@no + \def\pgfplotspatchclass@coons@no{A}% + \pgfplotspatchready + \else + \expandafter\let\expandafter\pgfplotspatchclass@coons@no\csname pgfpptchindexnext@\pgfplotspatchclass@coons@no\endcsname + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@C\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@D\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@E\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@F\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@G\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@H\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@I\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@J\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@K\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@L\endvertex #1% + }, + foreach cdata vertex={% + % 0, 3, 6, 9 + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@D\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@G\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@coons@J\endvertex #1% + }, + fill path={% + \pgfpathmoveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@A\endvertex}% + \pgfpathcurveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@B\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@C\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@D\endvertex}% + \pgfpathcurveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@E\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@F\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@G\endvertex}% + \pgfpathcurveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@H\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@I\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@J\endvertex}% + \pgfpathcurveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@K\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@L\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@coons@A\endvertex}% + \pgfpathclose + }, + serialize except vertices=\let\pgfplotsretval\pgfutil@empty,% + deserialize except vertices=, + get pdf shading type=6, + get num vertices=12, + get num cdata vertices=4, +}% + +% Direct interface to tensor product bezier patches (pdf shading type 7). +% See manual and/or pdf reference +\pgfplotsdeclarepatchclass{tensor bezier}{% + allow matrix=0, + new=\def\pgfplotspatchclass@tensor@no{A}, + set next vertex={% + % defines \pgfplotspatchclass@tensor@A ... \pgfplotspatchclass@tensor@P (16 points) + \expandafter\edef\csname pgfplotspatchclass@tensor@\pgfplotspatchclass@tensor@no\endcsname{#1}% + \if P\pgfplotspatchclass@tensor@no + \def\pgfplotspatchclass@tensor@no{A}% + \pgfplotspatchready + \else + \expandafter\let\expandafter\pgfplotspatchclass@tensor@no\csname pgfpptchindexnext@\pgfplotspatchclass@tensor@no\endcsname + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@C\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@D\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@E\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@F\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@G\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@H\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@I\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@J\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@K\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@L\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@M\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@N\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@O\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@P\endvertex #1% + }, + foreach cdata vertex={% + % 0, 3, 6, 9 + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@D\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@G\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tensor@J\endvertex #1% + }, + fill path={% + \pgfpathmoveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@A\endvertex}% + \pgfpathcurveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@B\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@C\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@D\endvertex}% + \pgfpathcurveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@E\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@F\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@G\endvertex}% + \pgfpathcurveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@H\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@I\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@J\endvertex}% + \pgfpathcurveto {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@K\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@L\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tensor@A\endvertex}% + \pgfpathclose + }, + serialize except vertices=\let\pgfplotsretval\pgfutil@empty,% + deserialize except vertices=, + get pdf shading type=7, + get num vertices=16, + get num cdata vertices=4, +}% diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.polar.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.polar.code.tex new file mode 100644 index 00000000000..7502dac1c36 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.polar.code.tex @@ -0,0 +1,733 @@ +%-------------------------------------------- +% +% Package pgfplots, library for polar coordinates. +% +% Copyright 2010 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +% A polar axis lives in (ANGLE,LENGTH). +% That is +% x == ANGLE +% y == LENGTH +% +% + +\pgfplotsdefineaxistype[polar]{polar}{% + \pgfplots@polaraxis@activate +}% + +\newif\ifpgfplots@polaraxis@rellimits + +\pgfplotsset{ + /pgfplots/every polar axis/.style={ + grid=major, + xtick pos=right, + ytick pos=right, + every axis title shift=1.2\baselineskip, + legend style={anchor=center}, + }, + /pgfplots/xticklabel in circle/.style={ + xtick align=inside, + xticklabel style={ + rotate=90, + sloped like x axis={% + execute for upside down={\tikzset{anchor=north east}}, + %allow upside down, + reset nontranslations=false}, + anchor=south west, + %font=\tiny, + } + }, +} + +\def\pgfplots@polaraxis@activate{% + \let\pgfplotsqpointxy@cart=\pgfplotsqpointxy + \let\pgfplotsqpointxy=\pgfplotsqpointxy@polaraxis + \let\pgfplotsqpointxy@orthogonal=\pgfplotsqpointxy +% \def\pgfplotsqpointxyz##1##2##3{\pgfplotsqpointxy{##1}{##2}}% FIXME + \let\pgfplotspointouternormalvectorofaxis@=\pgfplotspointouternormalvectorofaxis@polaraxis + \def\pgfplotspointouternormalvectorofaxis@ifdependson@v##1##2##3{##2}% + \def\pgfplots@drawtickgridlines@INSTALLCLIP@onorientedsurf##1{}% + \let\pgfplots@clippath@prepare@for@axistype=\pgfplots@clippath@prepare@for@axistype@polaraxis + \let\pgfplots@handle@invalid@range@defaultlimits=\pgfplots@handle@invalid@range@defaultlimits@polar% + \let\pgfplots@check@invalid@range=\pgfplots@check@invalid@range@polar + \let\pgfplotspointonorientedsurfaceabwithbshift=\pgfplotspointonorientedsurfaceabwithbshift@polaraxis + \let\pgfplots@drawgridlines@onorientedsurf@fromto=\pgfplots@drawgridlines@onorientedsurf@fromto@polar + \let\pgfplotspoint@initialisation@axes=\pgfplotspoint@initialisation@axes@polar% + \let\pgfplotspoint@initialisation@units=\pgfplotspoint@initialisation@units@polar + \let\pgfplotsaxisifcontainspoint=\pgfplotsaxisifcontainspoint@polar + \let\pgfplots@prepare@axis@API=\pgfplots@prepare@axis@API@polar + \def\axisdefaultheight{\axisdefaultwidth}% + \let\pgfplots@initsizes=\pgfplots@initsizes@polar + \let\pgfplots@limits@ready=\pgfplots@limits@ready@polar + \let\pgfplots@assign@default@tick@foraxis@normalizetickdist=\pgfplots@assign@default@tick@foraxis@normalizetickdist@polar + \let\pgfplots@show@ticklabel@=\pgfplots@show@ticklabel@@polar + \let\pgfplots@enlarge@limit@for=\pgfplots@enlarge@limit@for@polar + \def\pgfplots@xtick@disable@last@tick{0}% + \let\pgfplots@xtick@check@tickshow=\pgfplots@xtick@check@tickshow@polar% + \let\pgfplots@set@options@sanitize=\relax + \let\pgfplots@set@options@sanitizemode=\relax + \let\pgfplotscoordmathnotifydatascalesetfor=\pgfplotscoordmathnotifydatascalesetfor@polar + % + % this here is set *before* 'every polar axis' is invoked. + \pgfplotsset{ + enlarge x limits=false, + }% + \expandafter\def\expandafter\pgfplots@notify@options@are@set\expandafter{% + \pgfplots@notify@options@are@set + \pgfplotsset{separate axis lines}% + }% + \def\pgfplots@xticklabel@pos{}% + \def\pgfplots@yticklabel@pos{}% + \def\pgfplots@zticklabel@pos{}% + \def\pgfplots@init@ticklabelaxisspecfor##1##2{}% + \def\pgfplots@init@ticklabelaxisspec@twodim@for##1##2{}% + \def\pgfplots@xticklabelaxisspec{v10}% + \def\pgfplots@yticklabelaxisspec{0v0}% + \def\pgfplots@zticklabelaxisspec{00v}% + % + % cartesian cs + \tikzdeclarecoordinatesystem{cartesian}{\edef\pgfplots@loc@TMPa{##1}\expandafter\pgfplotspointcartesian@\pgfplots@loc@TMPa\pgfplots@coord@end}% + % +}% + +\let\pgfplots@prepare@axis@API@orig=\pgfplots@prepare@axis@API +\def\pgfplots@prepare@axis@API@polar{% + \pgfplots@prepare@axis@API@orig + \let\pgfplotsaxisupdatelimitsforcoordinatetwodim=\pgfplotsaxisupdatelimitsforcoordinatetwodim@polar + \let\pgfplotsaxisupdatelimitsforcoordinatethreedim=\pgfplotsaxisupdatelimitsforcoordinatetwodim@polar +}% + +\def\pgfplotsaxisupdatelimitsforcoordinatetwodim@polar#1#2#3{% + % + % + % Update limits: + % I do not respect x limits (since they are periodic). + % Consequently, I do not respect the clip limits options here (I + % suppose it is useless) + % + % for y (radius) limits, I always use the ABSOLUTE value: + \pgfmathfloatabs@{#2}% + \let\pgfplots@loc@limit=\pgfmathresult + % + \ifpgfplots@autocompute@ymax + \ifpgfplots@yislinear + \pgfplotsmathfloatmax{\pgfplots@ymax}{\pgfplots@loc@limit}% + \global\let\pgfplots@ymax=\pgfmathresult + \else + \pgfplotsmathmax{\pgfplots@ymax}{\pgfplots@loc@limit}% + \global\let\pgfplots@ymax=\pgfmathresult + \fi + \fi + % + % Compute data range: + \pgfplotsmathfloatmin{\pgfplots@data@xmin}{#1}% + \global\let\pgfplots@data@xmin=\pgfmathresult + \pgfplotsmathfloatmax{\pgfplots@data@xmax}{#1}% + \global\let\pgfplots@data@xmax=\pgfmathresult + \pgfplotsmathfloatmin{\pgfplots@data@ymin}{#2}% + \global\let\pgfplots@data@ymin=\pgfmathresult + \pgfplotsmathfloatmax{\pgfplots@data@ymax}{#2}% + \global\let\pgfplots@data@ymax=\pgfmathresult +%\pgfplots@message{Updated limits: (\pgfplots@xmin,\pgfplots@ymin) rectangle (\pgfplots@xmax,\pgfplots@ymax).}% +% +%\tracingmacros=0\tracingcommands=0 +}% +\def\pgfplotsaxisifcontainspoint@polar#1#2{% + \pgfmath@basic@mod@{\pgfplots@current@point@x}{360}% + \pgf@xa=\pgfmathresult pt % + % + \pgf@ya=\pgfplots@current@point@y pt % + \ifdim\pgf@ya<0pt + % absolute value: + \pgf@ya=-\pgf@ya + \fi + % + % I assume that \pgfplots@[xyz]min@reg and min@reg are registers + % containing the limits. + \pgfplots@loop@CONTINUEfalse + \ifdim\pgf@ya<\pgfplots@ymin@reg + \else + \ifdim\pgf@ya>\pgfplots@ymax@reg + \else + \if1\b@pgfplots@polar@limit@around@zero + % check condition + % x <= max || x >= min + % <=> ! (x > max && x < min) + \pgfplots@loop@CONTINUEtrue + \ifdim\pgf@xa>\pgfplots@xmax@mod pt % + \ifdim\pgf@xa<\pgfplots@xmin@mod pt % + \pgfplots@loop@CONTINUEfalse + \fi + \fi + \else + \ifdim\pgf@xa<\pgfplots@xmin@mod pt % + \else + \ifdim\pgf@xa>\pgfplots@xmax@mod pt % + \else + \pgfplots@loop@CONTINUEtrue + \fi + \fi + \fi + \fi + \fi + \ifpgfplots@loop@CONTINUE + \def\pgfplots@loc@TMPa{#1}% + \else + \def\pgfplots@loc@TMPa{#2}% + \fi + \pgfplots@loc@TMPa% +} + +\def\pgfplots@check@invalid@range@polar{% + % + % A polar axis allows \addplot3, but it ignores the third + % coordinate. + \pgfplots@threedimfalse + % + \pgfplots@limits@are@computedtrue + \ifx\pgfplots@xmin\pgfplots@invalidrange@xmin + \pgfplotscoordmath{x}{zero}% + \let\pgfplots@xmin=\pgfmathresult + \fi + \ifx\pgfplots@xmax\pgfplots@invalidrange@xmax + \pgfplotscoordmath{x}{parsenumber}{360}% + \let\pgfplots@xmax=\pgfmathresult + \fi + \ifx\pgfplots@ymin\pgfplots@invalidrange@ymin + \pgfplotscoordmath{y}{zero}% + \let\pgfplots@ymin=\pgfmathresult + \fi + \ifx\pgfplots@ymax\pgfplots@invalidrange@ymax + \pgfplots@limits@are@computedfalse + \fi + \ifpgfplots@limits@are@computed + \ifx\pgfplots@data@xmin\pgfplots@invalidrange@xmin + \global\let\pgfplots@data@xmin=\pgfplots@xmin + \fi + \ifx\pgfplots@data@xmin\pgfplots@invalidrange@xmax + \global\let\pgfplots@data@xmax=\pgfplots@xmax + \fi + \ifx\pgfplots@data@ymin\pgfplots@invalidrange@ymin + \global\let\pgfplots@data@ymin=\pgfplots@ymin + \fi + \ifx\pgfplots@data@ymin\pgfplots@invalidrange@ymax + \global\let\pgfplots@data@ymax=\pgfplots@ymax + \fi + \ifpgfplots@clip@limits + \else + % there is a rare change that min > max. + % Handle that ... + \pgfplotscoordmath{x}{min}{\pgfplots@xmin}{\pgfplots@xmax}% + \global\let\pgfplots@xmin=\pgfmathresult + \pgfplotscoordmath{x}{max}{\pgfplots@xmin}{\pgfplots@xmax}% + \global\let\pgfplots@xmax=\pgfmathresult + % + \pgfplotscoordmath{y}{min}{\pgfplots@ymin}{\pgfplots@ymax}% + \global\let\pgfplots@ymin=\pgfmathresult + \pgfplotscoordmath{y}{max}{\pgfplots@ymin}{\pgfplots@ymax}% + \global\let\pgfplots@ymax=\pgfmathresult + % + \ifpgfplots@threedim + \pgfplotscoordmath{z}{min}{\pgfplots@zmin}{\pgfplots@zmax}% + \global\let\pgfplots@zmin=\pgfmathresult + \pgfplotscoordmath{z}{max}{\pgfplots@zmin}{\pgfplots@zmax}% + \global\let\pgfplots@zmax=\pgfmathresult + \fi + \fi + \else + \pgfplots@handle@invalid@range + \fi +}% + +\def\pgfplotspointcartesian@#1,#2\pgfplots@coord@end{% + \pgfpointxy@orig{#1}{#2}% +}% +\def\pgfplotscoordmathnotifydatascalesetfor@polar#1{% + \def\pgfplotscoordmathnotifydatascalesetfor##1{}% + \edef\pgfplotscoordmathnotifydatascalesetfor@{#1}% + \def\pgfplotscoordmathnotifydatascalesetfor@@{x}% + \ifx\pgfplotscoordmathnotifydatascalesetfor@@\pgfplotscoordmathnotifydatascalesetfor@ + \pgfplotscoordmath{#1}{datascaletrafo set params}{0}{0}% + \else + \def\pgfplotscoordmathnotifydatascalesetfor@@{y}% + \ifx\pgfplotscoordmathnotifydatascalesetfor@@\pgfplotscoordmathnotifydatascalesetfor@ + \pgfplotscoordmath{#1}{datascaletrafo set shift}{0}% + \fi + \fi + \let\pgfplotscoordmathnotifydatascalesetfor=\pgfplotscoordmathnotifydatascalesetfor@polar +}% + +% #1: the "a" value on the oriented surf +% #2: the "b" value. +% #3: the shift along the normal. +% +\def\pgfplotspointonorientedsurfaceabwithbshift@polaraxis#1#2#3{% + % implement the shift in "b" direction explicitly: + % + \pgfplotspointonorientedsurfaceab{#1}{#2}% + \edef\pgfplots@loc@TMPe{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + \pgfpointadd + {\pgfplots@loc@TMPe}% + {% + \begingroup + % I need a '-' here because for polaraxis axes, the "b" axis + % points to the *outside* instead of the inside. + \pgf@xa=-#3\relax + \if r\pgfkeysvalueof{/pgfplots/\pgfplotspointonorientedsurfaceB\space dir/value}% + % oh. a reversed axis. + \pgf@xa=-\pgf@xa + \fi + \edef\pgfmathresult{\pgf@sys@tonumber\pgf@xa}% + \pgfmath@smuggleone\pgfmathresult + \endgroup + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfqpointscale{\pgfplots@loc@TMPa}{% + \if x\pgfplotspointonorientedsurfaceB + % the angle. + % FIXME : datascaling! + % FIXME : aspect ratios! + \pgfmath@basic@sin@{#2}% + \pgf@x=-\pgfmathresult pt + \pgfmath@basic@cos@{#2}% + \pgf@y=\pgfmathresult pt + \else + % the length. + % FIXME : datascaling! + % FIXME : aspect ratios! + % perhaps pgfpointpolarxy? + \if y\pgfplotspointonorientedsurfaceB + \pgfqpointpolar{#1}{1pt}% + \else + \pgfpointorigin + \fi + \fi + }% + }% +} + + +\def\pgfplotsqpointxy@polaraxis#1#2{% + \pgf@process{% + \pgfplotsmathpoltocartbasic{#1}{#2}\x\y + \pgfqpointxy@orig\x\y +%\message{pgfplotsqpointxy{#1}{#2} ---> (\x,\y) ---> (\the\pgf@x,\the\pgf@y)}% + }% +}% +\def\pgfplots@clippath@prepare@for@axistype@polaraxis{% + \def\pgfplots@clippath@install##1{% + \pgfpathmoveto + {\pgfplotsqpointxy\pgfplots@xmin\pgfplots@ymax}% + \pgfpatharcaxes{\pgfplots@xmin}{\pgfplots@xmax} + {\pgfqpointxy@orig{\pgfplots@ymax}{0}}% + {\pgfqpointxy@orig{0}{\pgfplots@ymax}}% + \if1\pgfplots@xtick@disable@last@tick + % we have min angle = max angle. + \ifdim\pgfplots@ymin pt=0pt + \else + \pgfseteorule + \pgfpathmoveto + {\pgfplotsqpointxy\pgfplots@xmin\pgfplots@ymin}% + \pgfpatharcaxes{\pgfplots@xmin}{\pgfplots@xmax} + {\pgfqpointxy@orig{\pgfplots@ymin}{0}}% + {\pgfqpointxy@orig{0}{\pgfplots@ymin}}% + \fi + \else + % we have min angle != max angle. + \ifdim\pgfplots@ymin pt=0pt + % Ok, then pass through origin: + \pgfpathlineto\pgfplotspointaxisorigin + \else + % complicated special case. + \pgfpathlineto + {\pgfplotsqpointxy\pgfplots@xmax\pgfplots@ymin}% + \pgfpatharcaxes{\pgfplots@xmax}{\pgfplots@xmin} + {\pgfqpointxy@orig{\pgfplots@ymin}{0}}% + {\pgfqpointxy@orig{0}{\pgfplots@ymin}}% + \fi + \pgfpathclose + \fi + \pgfplots@clippath@use@{##1}% + }% +}% + +\def\pgfplotspointouternormalvectorofaxis@polaraxis#1#2#3\relax{% + \if v#1% + \pgfplotspointouternormalvectorofaxisgetv{#1#2#3}% + % in direction of the length. + \ifx\pgfplotsretval\pgfutil@empty + \def\pgfplotsretval{0}% + \fi + % FIXME : datascaling! + % FIXME : aspect ratios! + % perhaps pgfpointpolarxy? + \pgfqpointpolar{\pgfplotsretval}{1pt}% + \else + \if v#2% + \if#10% + \def\pgfplotsretval{\pgfplots@xmin}% + \else + \def\pgfplotsretval{\pgfplots@xmax}% + \fi + % in direction of the angle. + % FIXME : datascaling! + % FIXME : aspect ratios! + \pgfmath@basic@sin@{\pgfplotsretval}% + \pgf@x=-\pgfmathresult pt + \pgfmath@basic@cos@{\pgfplotsretval}% + \pgf@y=\pgfmathresult pt + \else + \pgfqpoint{0pt}{1pt}% + \fi + \fi + %\pgf@process{\pgfpointnormalised{}}% + \pgf@process{}% + \endgroup +}% + +\def\pgfplotspoint@initialisation@axes@polar{% + % + \begingroup + \pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}% + \xdef\pgfplotspointminminmin{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + % + \pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}% + \xdef\pgfplotspointxaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + % + % the length of the "angle" axis is 2*pi*r . + % The radius, however, is the length of (0,ymax) which is (0pt,\pgf@xx*ymax): + \pgfmath@basic@multiply@{\pgf@sys@tonumber\pgf@xx}{\pgfplots@ymax}% + \pgfmathmultiply@{\pgfmathresult}{6.28318530717959}% 2*pi * r + \if0\pgfplots@xtick@disable@last@tick + % oh: minangle != maxangle. We have a partial circle. + % compute the arc length (<360 deg) + \pgf@xa=\pgfplots@xmax pt + \advance\pgf@xa by-\pgfplots@xmin pt + \divide\pgf@xa by360 + \ifdim\pgf@xa<1pt + \edef\pgfplots@loc@TMPa{\pgf@sys@tonumber\pgf@xa}% + \pgfmathmultiply@{\pgfmathresult}{\pgfplots@loc@TMPa}% + \fi + \fi + \xdef\pgfplotspointxaxislength{\pgfmathresult pt}% + % + \pgfpointdiff + {\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymin}}% + {\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}}% + \xdef\pgfplotspointyaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \xdef\pgfplotspointyaxislength{\pgfmathresult pt}% + % + \global\let\pgfplotspointzaxis=\pgfpointorigin + \gdef\pgfplotspointzaxislength{0pt}% + \endgroup + % +} +\let\pgfplotspoint@initialisation@units@orig=\pgfplotspoint@initialisation@units +\def\pgfplotspoint@initialisation@units@polar{% + \def\pgfplotspointunitx{% + \pgfplotspointouternormalvectorofaxisgetv{v10}% angle varying, radius at outer pos + \ifx\pgfplotsretval\pgfutil@empty + \def\pgfplotsretval{0}% + \fi + \pgfmath@basic@sin@{\pgfplotsretval}% + \pgf@x=-\pgfmathresult pt + \pgfmath@basic@cos@{\pgfplotsretval}% + \pgf@y=\pgfmathresult pt + }% + \def\pgfplotsunitxlength{1}% + \def\pgfplotsunitxinvlength{1}% + % + \def\pgfplotspointunity{% + \pgfqpointpolar{\pgfplots@xmin}{1pt}% + }% + \def\pgfplotsunitylength{1}% + \def\pgfplotsunityinvlength{1}% +}% + +\def\pgfplots@drawgridlines@onorientedsurf@fromto@polar#1{% + \if x\pgfplotspointonorientedsurfaceA + \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{#1}{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceab{#1}{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}}% + \else + \if y\pgfplotspointonorientedsurfaceA\relax + \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{#1}{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}}% + \pgf@x=#1\pgf@xx + \pgf@y=#1\pgf@yy + \edef\pgfplots@loc@TMPa{\the\pgf@x\space and \the\pgf@y}% + \def\pgfplots@loc@TMPb{\pgfpatharc{\pgfplots@xmin}{\pgfplots@xmax}}% + \expandafter\pgfplots@loc@TMPb\expandafter{\pgfplots@loc@TMPa}% + \else + \fi + \fi +}% + +\def\pgfplots@initsizes@polar{% + % I copy-pasted most of this code, up to just one position where + % I introduced the modified scaling for polar axes + %---------------------------------- + % INIT. + % + % + \pgfmath@basic@mod@{\pgfplots@xmin}{360}% + \let\pgfplots@xmin@mod=\pgfmathresult + \pgfmath@basic@mod@{\pgfplots@xmax}{360}% + \let\pgfplots@xmax@mod=\pgfmathresult + \ifdim\pgfplots@xmax@mod pt<\pgfplots@xmin@mod pt + \def\b@pgfplots@polar@limit@around@zero{1}% + \else + \def\b@pgfplots@polar@limit@around@zero{0}% + \fi + % + \pgfplots@xmin@reg=\pgfplots@xmin pt % + \pgfplots@xmax@reg=\pgfplots@xmax pt % + % + % + \pgfplots@ymin@reg=\pgfplots@ymin pt % + \pgfplots@ymax@reg=\pgfplots@ymax pt % + \ifpgfplots@threedim + \pgfplots@zmin@reg=\pgfplots@zmin pt % + \pgfplots@zmax@reg=\pgfplots@zmax pt % + \fi + % + % + %----------------------------------------- + % PROCESS THE 'width' and 'height' options + %----------------------------------------- + % + % + \pgfkeysgetvalue{/pgfplots/view/az}{\pgfplots@view@az}% + \pgfkeysgetvalue{/pgfplots/view/el}{\pgfplots@view@el}% + \ifpgfplots@threedim + \def\pgfplots@tmpZscale{1pt}% + \else + \def\pgfplots@tmpZscale{0pt}% + \let\pgfplots@view@el=\pgfutil@empty + \let\pgfplots@view@az=\pgfutil@empty + \fi + \ifx\pgfplots@view@az\pgfutil@empty + %\let\pgfplots@rectangle@width=\pgfutil@empty + %\let\pgfplots@rectangle@height=\pgfutil@empty + \def\pgfplots@view@dir@threedim@x{0}% + \def\pgfplots@view@dir@threedim@y{0}% + \def\pgfplots@view@dir@threedim@z{1}% + % + % FIXME HERE COMES THE polar MODIFICATION + %-------------------------------------------------- + % \pgfpointdiff + % {\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}} + % {\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}}% + %-------------------------------------------------- + % instead of scaling from (min) (max), we only need the UPPER + % bound -- in both, x and y directions (since we have a cycle. + % Furthermore, we need it twice since we are interested in the + % diameter, not the radius. + \global\pgf@x=\pgfplots@ymax pt % radius + \global\multiply\pgf@x by2 % diameter + \global\pgf@y=\pgf@x % same for y + % + % only used temporarily in this macro to compute the correct + % length for unit vectors: + \edef\pgfplots@initsizes@axisdiag@x{\the\pgf@x}% + \edef\pgfplots@initsizes@axisdiag@y{\the\pgf@y}% + % + \ifx\pgfplots@x\pgfutil@empty + \ifx\pgfplots@width\pgfutil@empty + \pgfplots@error{INTERNAL LOGIC ERROR! WIDTH NOT SET}% + \fi + \pgfplots@initsizes@getXscale\pgfplots@initsizes@axisdiag@x\into\pgfplots@tmpXscale + %\ifpgfplots@scale@only@axis + % \let\pgfplots@rectangle@width=\pgfplots@width + %\fi + \else + \def\pgfplots@tmpXscale{1}% + \fi + % + \ifx\pgfplots@y\pgfutil@empty + \ifx\pgfplots@height\pgfutil@empty + \pgfplots@error{INTERNAL LOGIC ERROR! HEIGHT NOT SET}% + \fi + \pgfplots@initsizes@getYscale\pgfplots@initsizes@axisdiag@y\into\pgfplots@tmpYscale + %\ifpgfplots@scale@only@axis + % \let\pgfplots@rectangle@height=\pgfplots@height + %\fi + \else + \def\pgfplots@tmpYscale{1}% + \fi + % + \edef\pgfplots@tmpXscale{\pgfplots@tmpXscale pt}% + \edef\pgfplots@tmpYscale{\pgfplots@tmpYscale pt}% + % + \pgfplots@initsizes@setunitvector{x}{0}{\pgfplots@tmpXscale}{\pgfplots@tmp@xisaxisparallel}% + \pgfplots@initsizes@setunitvector{y}{1}{\pgfplots@tmpYscale}{\pgfplots@tmp@yisaxisparallel}% + \pgfplots@initsizes@setunitvector{z}{2}{\pgfplots@tmpZscale}{\pgfplots@loc@TMPc}% + \else + % 3D case is currently always initialised by `view': + \let\pgfplots@x=\pgfutil@empty + \let\pgfplots@y=\pgfutil@empty + \let\pgfplots@z=\pgfutil@empty + \pgfplotssetaxesfromazel{\pgfplots@view@az}{\pgfplots@view@el}{\pgfplots@tmp@xisaxisparallel}% + \if1\pgfplots@tmp@xisaxisparallel% + \def\pgfplots@tmp@yisaxisparallel{1}% + \fi + \fi +%\message{Pgfplots debug: initialised unit vectors to x=(\the\pgf@xx,\the\pgf@xy), y=(\the\pgf@yx,\the\pgf@yy), z=(\the\pgf@zx,\the\pgf@zy). }% + % + \let\pgfplotsmathfloatviewdepthxyz@=\pgfplotsmathfloatviewdepthxyz@infigure + \let\pgfplotsmathviewdepthxyz@=\pgfplotsmathviewdepthxyz@infigure + % + \pgfplotsmath@ifzero{\pgfplots@x@veclength}{\pgfplots@hide@xtrue\pgfplots@shownothingof@xtrue}{}% + \pgfplotsmath@ifzero{\pgfplots@y@veclength}{\pgfplots@hide@ytrue\pgfplots@shownothingof@ytrue}{}% + \ifpgfplots@threedim + \pgfplotsmath@ifzero{\pgfplots@z@veclength}{\pgfplots@hide@ztrue\pgfplots@shownothingof@ztrue}{}% + \else + \if1\pgfplots@tmp@xisaxisparallel% + \if1\pgfplots@tmp@yisaxisparallel% + % Optimize for axis-parallel case! + % puh. Did not make any measureable difference!? Ok... + \let\pgfplotsqpointxy=\pgfplotsqpointxy@orthogonal + \fi + \fi + \fi + % + % FIXME : unit vector ratio / axis equal +} + +\def\pgfplots@handle@invalid@range@defaultlimits@polar{% + \def\pgfplots@loc@TMPa{0}% + \ifx\pgfplots@xmin\pgfplots@invalidrange@xmin + \def\pgfplots@loc@TMPa{1}% + \fi + \ifx\pgfplots@xmax\pgfplots@invalidrange@xmax + \def\pgfplots@loc@TMPa{1}% + \fi + \if\pgfplots@loc@TMPa1% + \pgfplotscoordmath{x}{parsenumber}{0}% + \global\let\pgfplots@xmin=\pgfmathresult + \pgfplotscoordmath{x}{parsenumber}{360}% + \global\let\pgfplots@xmax=\pgfmathresult + \global\let\pgfplots@data@xmin=\pgfplots@xmin + \global\let\pgfplots@data@xmax=\pgfplots@xmax + \fi + % + \pgfplotscoordmath{y}{parsenumber}{0}% + \global\let\pgfplots@ymin=\pgfmathresult + \pgfplotscoordmath{y}{parsenumber}{1}% + \global\let\pgfplots@ymax=\pgfmathresult + \global\let\pgfplots@data@ymin=\pgfplots@ymin + \global\let\pgfplots@data@ymax=\pgfplots@ymax +} + +\let\pgfplots@show@ticklabel@@orig=\pgfplots@show@ticklabel@ +\def\pgfplots@show@ticklabel@@polar#1#2{% + \def\pgfmathresult{#2}% + \if#1x% + \ifdim#2pt>360pt + \pgfmath@basic@mod@{#2}{360}% + \fi + \fi + \def\pgfplots@loc@TMPa{\pgfplots@show@ticklabel@@orig{#1}}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}% +}% + +\let\pgfplots@xtick@check@tickshow@orig=\pgfplots@xtick@check@tickshow% +\def\pgfplots@xtick@check@tickshow@polar{% + \if1\pgfplots@xtick@disable@last@tick + \pgfplotsmath@ifapproxequal@dim + {\pgfplots@tmpa}{\pgfplots@xmax pt} + {\pgfplots@loc@tick@placement@tolerance} + {% + \pgfplots@tickshowfalse + }{% + \pgfplots@xtick@check@tickshow@orig + }% + \else + \pgfplots@xtick@check@tickshow@orig + \fi +} + +\let\pgfplots@enlarge@limit@for@orig=\pgfplots@enlarge@limit@for +\def\pgfplots@enlarge@limit@for@polar#1{% + \if#1x% + % ignore 'enlarge x limits' (degrees). + \else + % allow 'enlarge y limits', but only for UPPER radius + \def\bool@pgfplots@loc@enlargelimits@min{0}% + \pgfplots@enlarge@limit@for@orig{#1}% + \fi +}% + +\let\pgfplots@assign@default@tick@foraxis@normalizetickdist@orig=\pgfplots@assign@default@tick@foraxis@normalizetickdist +\def\pgfplots@assign@default@tick@foraxis@normalizetickdist@polar#1#2{% + \if#1x% + % special handling for the angles: + \begingroup + \pgfmathfloattofixed{#2}% + \let\H=\pgf@xb + \H=\pgfmathresult pt + % only allow step sizes of + % 90, 45, 30, 15, 10, 5. + % + % Prefer the LARGER step size during the snap-to-nearest. + % The following decision boundaries are heuristics and have no + % mathematical foundation. + \ifdim\H>67pt + \H=90pt + \else + \ifdim\H>30pt + \H=45pt + \else + \ifdim\H>18pt + \H=30pt + \else + \ifdim\H>10pt + \H=15pt + \else + \ifdim\H>6pt + \H=10pt + \else + \H=5pt + \fi + \fi + \fi + \fi + \fi + \edef\pgfplots@loc@TMPa{\pgf@sys@tonumber\H}% + \pgfmathfloatparsenumber{\pgfplots@loc@TMPa}% + \pgfmath@smuggleone\pgfmathresult + \endgroup + \else + \pgfplots@assign@default@tick@foraxis@normalizetickdist@orig{#1}{#2}% + \fi +}% + +\let\pgfplots@limits@ready@orig=\pgfplots@limits@ready +\def\pgfplots@limits@ready@polar{% + \pgfplots@limits@ready@orig + % + % Avoid tick labels at upper *and* lower angle range if both are the + % same: + \pgfmath@basic@subtract@{\pgfplots@xmax}{\pgfplots@xmin}% + \pgfmath@basic@mod@{\pgfmathresult}{360}% + \pgfplotsmath@ifapproxequal@dim + {\pgfmathresult pt}{0pt}% + {0.002pt} + {% + \def\pgfplots@xtick@disable@last@tick{1}% + }{% + }% + % +}% +\endinput diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.smithchart.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.smithchart.code.tex new file mode 100644 index 00000000000..7d24c53216d --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.smithchart.code.tex @@ -0,0 +1,1761 @@ +%-------------------------------------------- +% +% Package pgfplots, library for smith charts. +% +% Copyright 2010 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +% A smithchart maps the complex halfplane +% H subset \C, +% H := [0,infty] x [-infty,infty] +% =~ \{ z = a+ j *b | a >=0, b \in \R } +% +% to the unit circle. +% +% A number z = a+jb is mapped to r(z) = (z-1) / (z+1) which is, per +% definition, in the 2d unit circle. +% +% Grid lines (i.e. a==const or b==const) are mapped on circles. +% +% In PGFPlots, the a=Re(z) is the x axis and b = Im(z) is the y axis. +% +% - CARTESIAN INPUT +% - tick/grid coordinates are from +% - input coordinates can be either from H or (perhaps preferred) from +% the unit circle. +% this "preferred" needs to be discussed. +% - the transformed data range is the unit circle (or a sequeezed variant) +% - in order to compute limits etc., I should accept data in H. this +% should simplify the logic to determine ticks etc considerably. +% problem: this transformation appears to be quite difficult (?) +% -> r(z) = (z-1)/(z+1) +% in complex arithmetics (but the G-tutorial.pdf says something +% about these circle equations!?) +% +% www.amanogawa.com/archive/docs/G-tutorial.pdf +% +% +% Idea: +% - work on H +% - transform whereever necessary +% - implement all pgfplots wrinkles in analogy to polar axes +% - provide support for normalized input coords (combined with +% untransformed limits or something like that) + +\pgfplotsdefineaxistype{smithchart}{% + \pgfplots@smithchartaxis@activate +}% + +\newif\ifpgfplotspointisinsmithchartCS +\newif\ifpgfplots@smithchart@showorigin +\newif\ifpgfplots@smithchart@mirrored + +\pgfplotsset{ + /pgfplots/xgrid each nth passes y/.initial=,% format: CSV list, each entry of the form '<at> | <at> ':' <eachnth> | <at> 'if <' <xvalue> | <at> ':' <eachnth> 'if <' <xvalue>' + /pgfplots/xgrid each nth passes y start/.initial=0, + /pgfplots/ygrid each nth passes x/.initial=, + /pgfplots/ygrid each nth passes x start/.initial=0, + % + /pgfplots/xgrid stop at y/.initial=,% individual stop map of the form '<xpos> ':' <stopaty>', separated by white space + /pgfplots/ygrid stop at x/.initial=, + % + % FIXME : this is undocumented: + /pgfplots/smithchart mirrored/.is if=pgfplots@smithchart@mirrored, + /pgfplots/smithchart mirrored/.default=true, + % + % this boolean may only be used inside of \addplot. It will be + % ignored otherwise. + /pgfplots/is smithchart cs/.is if=pgfplotspointisinsmithchartCS, + /pgfplots/is smithchart cs/.default=true, + /pgfplots/show origin/.is if=pgfplots@smithchart@showorigin, + /pgfplots/show origin/.default=true, + /pgfplots/show origin code/.code={% + \path[draw=black,fill=white] (0pt,0pt) circle (2.5pt); + \path[fill=black] (0pt,0pt) circle (0.5pt); + }, + /pgfplots/every smithchart axis/.style={ + grid=both, + xmin=0, + xmax=16000,% FIXME : more is not possible because some code uses the \pgfplots@xmin@reg registers... (ticks) + ymin=-16000,ymax=16000, + scaled ticks=false, % never draw the \cdot 10^4 labels + major tick style={draw=black}, + xtick align=center, + ytick align=center, + every axis title shift=1.2\baselineskip, + legend style={anchor=center}, + }, + /pgfplots/default smithchart xtick/.code=, + /pgfplots/default smithchart ytick/.code=, + /pgfplots/default smithchart xytick/.code=, + /pgfplots/smithchart ticks by size/.code 2 args={% + \ifdim#1<14cm + \pgfkeysalso{/pgfplots/few smithchart ticks}% + \else + \ifdim#1<20cm + \pgfkeysalso{/pgfplots/many smithchart ticks}% + \else + \pgfkeysalso{/pgfplots/dense smithchart ticks}% + \fi + \fi + }, + /pgfplots/few smithchart ticks*/.style={ + default smithchart xtick/.style={ + xtick={0.2,0.5,1,2,5}, + }, + default smithchart ytick/.style={ + ytick={% + 0,% + 0.2, 0.5, 1, 2, 5,% + -0.2,-0.5,-1,-2,-5}, + }, + default smithchart xytick/.style={ + xgrid each nth passes y={2}, + ygrid each nth passes x={2}, + }, + }, + /pgfplots/few smithchart ticks/.style={/pgfplots/few smithchart ticks*}, + /pgfplots/few smithchart ticks*,% use it as initial config + /pgfplots/many smithchart ticks*/.style={ + default smithchart xtick/.style={ + xtick={ + 0.1,0.2,0.3,0.4,0.5,1,1.5,2,3,4,5,10,20% + }, + minor xtick={0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.6,1.7,1.8,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50}, + }, + default smithchart ytick/.style={ + ytick={% + 0,% + 0.1,0.2,...,1,1.5,2,3,4,5,10,20,% + -0.1,-0.2,...,-1,-1.5,-2,-3,-4,-5,-10,-20% + }, + minor ytick={% + 1.1,1.2,1.3,1.4,1.6,1.7,1.8,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50,% + -1.1,-1.2,-1.3,-1.4,-1.6,-1.7,-1.8,-1.9,-2.2,-2.4,-2.6,-2.8,-3.2,-3.4,-3.6,-3.8,-4.5,-6,-7,-8,-9,-50% + }, + }, + default smithchart xytick/.style={ + xgrid each nth passes y={1,2,4,5,10,20}, + ygrid each nth passes x={1,2,3,5,10:3,20:3}, + }, + }, + /pgfplots/many smithchart ticks/.style={ + many smithchart ticks*, + every axis title shift=6pt, + yticklabel in circle, + show origin=true, + }, + /pgfplots/dense smithchart ticks*/.style={ + default smithchart xtick/.style={ + %ygrid each nth passes x start=0, + xtick={ + 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.2,1.4,1.6,1.8,2,3,4,5,10,20% + }, + minor xtick={% + 0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,% + 0.22,0.24,0.26,0.28,0.32,0.34,0.36,0.38,0.42,0.44,0.46,0.48,% + 0.52,% + 0.55,0.65,0.75,0.85,0.95,% + %0.6,0.7,0.8,0.9,% + 1.1,1.3,1.5,1.7,1.9,% + 2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50}, + }, + default smithchart ytick/.style={ + ytick={% + 0,% + 0.1,0.2,...,1,1.2,1.4,1.6,1.8,2,3,4,5,10,20,% + -0.1,-0.2,...,-1,-1.2,-1.4,-1.6,-1.8,-2,-3,-4,-5,-10,-20% + }, + minor ytick={% + 0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,% + 0.22,0.24,0.26,0.28,0.32,0.34,0.36,0.38,0.42,0.44,0.46,0.48,% + 0.55,0.65,0.75,0.85,0.95,% + 1.1,1.3,1.5,1.7,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50,% + -0.01,-0.02,-0.03,-0.04,-0.05,-0.06,-0.07,-0.08,-0.09,-0.11,-0.12,-0.13,-0.14,-0.15,-0.16,-0.17,-0.18,-0.19,% + -0.22,-0.24,-0.26,-0.28,-0.32,-0.34,-0.36,-0.38,-0.42,-0.44,-0.46,-0.48,% + -0.55,-0.65,-0.75,-0.85,-0.95,% + -1.1,-1.3,-1.5,-1.7,-1.9,-2.2,-2.4,-2.6,-2.8,-3.2,-3.4,-3.6,-3.8,-4.5,-6,-7,-8,-9,-50% + }, + }, + default smithchart xytick/.style={ + xgrid each nth passes y={0.2 if < 0.2001,0.5 if < 0.50001,1 if < 1.001,2,4,5,10,20}, + ygrid each nth passes x={0.2 if < 0.2001,0.52 if < 0.52001,1 if < 1.001,2,3,5,10:3,20:3}, + }, + }, + /pgfplots/dense smithchart ticks/.style={ + yticklabel in circle, + every axis title shift=6pt, + dense smithchart ticks*, + show origin=true, + every major grid/.style={black!60}, + }, + /pgfplots/yticklabel in circle/.style={ + ytick align=inside, + yticklabel style={ + rotate=90, + sloped like y axis={% + execute for upside down={\tikzset{anchor=north east}}, + %allow upside down, + reset nontranslations=false}, + anchor=south west, + %font=\tiny, + } + }, +} + +\def\pgfplots@smithchartaxis@activate{% + \def\axisdefaultwidth{207pt}% + \def\axisdefaultheight{207pt}% + \let\pgfplotsqpointxy@cart=\pgfplotsqpointxy + \let\pgfplotsqpointxy=\pgfplotsqpointxy@smithchartaxis + \let\pgfplotsqpointxy@orthogonal=\pgfplotsqpointxy + \def\pgfplotsqpointxyz##1##2##3{\pgfplotsqpointxy{##1}{##2}}% FIXME + \let\pgfplotspointouternormalvectorofaxis@=\pgfplotspointouternormalvectorofaxis@smithchartaxis + \def\pgfplotspointouternormalvectorofaxis@ifdependson@v##1##2##3{##2}% + \def\pgfplots@drawticklines@INSTALLCLIP@onorientedsurf##1{}% + \let\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf=\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf@smithchartaxis + \def\pgfplots@visphase@notify@changeofcanvaslimits##1{}% + \def\pgfplots@avoid@empty@axis@range@for##1{}% + \def\pgfplotsaxisifcontainspoint##1##2{##1}% + \let\pgfplots@set@default@size@options=\pgfplots@set@default@size@options@smithchart% + % + \def\b@pgfplots@smithchart@defaultticks@x{0}% + \def\b@pgfplots@smithchart@defaultticks@y{0}% + \let\pgfplots@assign@default@tick@foraxis=\pgfplots@assign@default@tick@foraxis@smithchart + \def\pgfplots@checkisuniformLINEARtick##1##2{% + % don't do anything here. I suppose it is useless and is a + % waste of time for many ticks. + \global\pgfplots@isuniformtickfalse + }% + \let\pgfplots@clippath@prepare@for@axistype=\pgfplots@clippath@prepare@for@axistype@smithchartaxis + % + % invalid range: do not clear plots. simply assign default limits. + \let\pgfplots@handle@invalid@range@defaultlimits=\pgfplots@handle@invalid@range@defaultlimits@smithchart% + \def\pgfplots@handle@invalid@range{\pgfplots@handle@invalid@range@defaultlimits}% + % + \let\pgfplotspointonorientedsurfaceabwithbshift=\pgfplotspointonorientedsurfaceabwithbshift@smithchartaxis + \let\pgfplots@draw@axis@is@prepared=\pgfplots@draw@axis@is@prepared@smithchartaxis + \let\pgfplots@drawgridlines@onorientedsurf@fromto=\pgfplots@drawgridlines@onorientedsurf@fromto@smithchart + \let\pgfplots@drawaxis@innerlines@onorientedsurf=\pgfplots@drawaxis@innerlines@onorientedsurf@smithchart + \let\pgfplots@drawaxis@outerlines@separate@onorientedsurf=\pgfplots@drawaxis@outerlines@separate@onorientedsurf@smithchartaxis + \let\pgfplotspoint@initialisation@axes=\pgfplotspoint@initialisation@axes@smithchart% + \let\pgfplotspoint@initialisation@units=\pgfplotspoint@initialisation@units@smithchart + \expandafter\def\expandafter\pgfplots@create@axis@descriptions@\expandafter{% + \pgfplots@create@axis@descriptions@ + \ifpgfplots@smithchart@showorigin + \pgfkeysvalueof{/pgfplots/show origin code/.@cmd}\pgfeov% + \fi + }% + \def\axisdefaultheight{\axisdefaultwidth}% + \let\pgfplots@initsizes=\pgfplots@initsizes@smithchart + %\let\pgfplots@limits@ready=\pgfplots@limits@ready@smithchart + %\let\pgfplots@show@ticklabel@=\pgfplots@show@ticklabel@@smithchart + %\def\pgfplots@xtick@disable@last@tick{0}% + \let\pgfplots@xtick@check@tickshow=\pgfplots@xtick@check@tickshow@smithchart% + \let\pgfplots@ytick@check@tickshow=\pgfplots@ytick@check@tickshow@smithchart% + \let\pgfplots@set@options@sanitize=\relax + \let\pgfplots@set@options@sanitizemode=\relax + \let\pgfplotscoordmathnotifydatascalesetfor=\pgfplotscoordmathnotifydatascalesetfor@smithchart + % + \expandafter\def\expandafter\pgfplots@notify@options@are@set\expandafter{% + \pgfplots@notify@options@are@set + \pgfplotsset{% + separate axis lines,% + is smithchart cs=false,% + xtick pos=left, + ytick pos=left, + axis x line*=center, + disabledatascaling, + }% + \def\pgfplots@xtickposnum{2}% + % + \ifx\pgfplots@xtick\pgfutil@empty + \def\b@pgfplots@smithchart@defaultticks@x{1}% + \fi + \ifx\pgfplots@ytick\pgfutil@empty + \def\b@pgfplots@smithchart@defaultticks@y{1}% + \fi + \pgfplotscoordmath{default}{parsenumber}{0.002}% + \let\pgfplots@almost@zero@thresh=\pgfmathresult + }% + \def\pgfplots@xticklabel@pos{}% + \def\pgfplots@yticklabel@pos{}% + \def\pgfplots@zticklabel@pos{}% + \def\pgfplots@init@ticklabelaxisspecfor##1##2{}% + \def\pgfplots@init@ticklabelaxisspec@twodim@for##1##2{}% + \def\pgfplotspointonorientedsurfaceabmatchaxisline@warn##1{}% clear warning. It works for smith charts. + \def\pgfplots@xticklabelaxisspec{v20}% + \def\pgfplots@yticklabelaxisspec{0v0}% + \def\pgfplots@zticklabelaxisspec{00v}% + % + % cartesian cs + \tikzdeclarecoordinatesystem{cartesian}{\edef\pgfplots@loc@TMPa{##1}\expandafter\pgfplotspointcartesian@\pgfplots@loc@TMPa\pgfplots@coord@end}% + % + % + % Special treatment for + % \pgfplots@prepare@tick@coordlists@for: make sure we don't need + % to use the register arithmetics in \pgfplots@xmin@reg and its + % variants! I want an UNRESTRICTED max data range! + \def\pgfplots@prepare@tick@coordlists@for@assign##1=##2{\edef##1{##2}}% + \def\pgfplots@prepare@tick@coordlists@for@advance##1by##2{% + % THIS IS NEVER USED (at the time of this writing). + \edef\pgfplots@loc@TMPa{##2}% + \pgfplotscoordmath{default}{parsenumber}{##1}% + \pgfplotscoordmath{default}{op}{add}{{\pgfmathresult}{\pgfplots@loc@TMPa}}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let##1=\pgfmathresult + }% + \def\pgfplots@prepare@tick@coordlists@for@tofixed##1{\edef\pgfmathresult{##1}}% + \def\pgfplots@prepare@tick@coordlists@for@handletolerance##1{}% does not apply to smithcharts. + \def\pgfplots@prepare@tick@coordlists@for@checktickmin##1{% + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tmpa}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@##1tickmin\endcsname}% + \let\pgfplots@loc@TMPb=\pgfmathresult + \pgfplotscoordmath{default}{if less than}{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}{% + \pgfplots@tickshowfalse + }{% + }% + }% + \def\pgfplots@prepare@tick@coordlists@for@checktickmax##1{% + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tmpa}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@##1tickmin\endcsname}% + \let\pgfplots@loc@TMPb=\pgfmathresult + \pgfplotscoordmath{default}{if less than}{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPa}{% + \pgfplots@tickshowfalse + }{% + }% + }% + \def\pgfplots@prepare@tick@coordlists@for@checkdatalimits##1{}% I won't do this here. Smithcharts are somewhat special. +}% + +\def\pgfplotspointcartesian@#1,#2\pgfplots@coord@end{% + \pgfpointxy@orig{#1}{#2}% +}% +\def\pgfplotscoordmathnotifydatascalesetfor@smithchart#1{% + \def\pgfplotscoordmathnotifydatascalesetfor##1{}% + \edef\pgfplotscoordmathnotifydatascalesetfor@{#1}% + \def\pgfplotscoordmathnotifydatascalesetfor@@{x}% + \ifx\pgfplotscoordmathnotifydatascalesetfor@@\pgfplotscoordmathnotifydatascalesetfor@ + \pgfplotscoordmath{#1}{datascaletrafo set params}{0}{0}% + \else + \def\pgfplotscoordmathnotifydatascalesetfor@@{y}% + \ifx\pgfplotscoordmathnotifydatascalesetfor@@\pgfplotscoordmathnotifydatascalesetfor@ + \pgfplotscoordmath{#1}{datascaletrafo set shift}{0}% + \fi + \fi + \let\pgfplotscoordmathnotifydatascalesetfor=\pgfplotscoordmathnotifydatascalesetfor@smithchart +}% + +% #1: the "a" value on the oriented surf +% #2: the "b" value. +% #3: the shift along the normal. +% +\def\pgfplotspointonorientedsurfaceabwithbshift@smithchartaxis#1#2#3{% + % implement the shift in "b" direction explicitly: + \pgfpointadd + {\pgfplotspointonorientedsurfaceab{#1}{#2}}% + {% + \pgfplotspointonorientedsurfaceabtolinespec{v}{0}% + \afterassignment\pgfplots@gobble@until@relax + \pgf@xa=-#3\relax + \edef\pgfplots@shift@no@unit{\pgf@sys@tonumber\pgf@xa}% + \pgfqpointscale + {\pgfplots@shift@no@unit} + {\expandafter\pgfplotspointouternormalvectorofaxis\expandafter{\pgfplotsretval}}% + }% +} + + +% Computes the complex division +% (A + j B) / (C + j D) = (A C + B D + j (B C - A D) ) / (C^2 + D^2) +% and assigns the result to \pgfmathresult and \pgfmathresultim . Here +% 'j = sqrt{-1}' is the imaginary unit. +% +% #1 : A +% #2 : B +% #3 : C +% #4 : D +% +% The arithmetics is performed in \pgfplotscoordmath{default} (which +% uses the floating point unit in the initial configuration) +% +% Numbers are expected to be already parsed (i.e. you need to invoke +% \pgfplotscoordmath{default}{parsenumber}{#1}% +% \let\A=\pgfmathresult +% before) +\def\pgfplotscoordmathcomplexdivision#1#2#3#4{% + \begingroup + \edef\pgfplots@A{#1}% + \edef\pgfplots@B{#2}% + \edef\pgfplots@C{#3}% + \edef\pgfplots@D{#4}% + % + % + % ok, compute it: + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@A}{\pgfplots@C}}% + \let\pgfplots@AC=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@A}{\pgfplots@D}}% + \let\pgfplots@AD=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@B}{\pgfplots@D}}% + \let\pgfplots@BD=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@B}{\pgfplots@C}}% + \let\pgfplots@BC=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@C}{\pgfplots@C}}% + \let\pgfplots@CC=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@D}{\pgfplots@D}}% + \let\pgfplots@DD=\pgfmathresult + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@CC}{\pgfplots@DD}}% + \pgfplotscoordmath{default}{op}{reciprocal}{{\pgfmathresult}}% + \let\pgfplots@scale=\pgfmathresult + % + % + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@AC}{\pgfplots@BD}}% + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@scale}}% + \let\pgfplots@x=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplots@BC}{\pgfplots@AD}}% + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@scale}}% + \let\pgfplots@y=\pgfmathresult + % + \xdef\pgfplots@glob@TMPa{% + \noexpand\def\noexpand\pgfmathresult{\pgfplots@x}% + \noexpand\def\noexpand\pgfmathresultim{\pgfplots@y}% + }% + \endgroup + \pgfplots@glob@TMPa +}% + +\def\pgfplotsqpointxy@smithchartaxis#1#2{% + \pgf@process{% + \ifpgfplotspointisinsmithchartCS + \def\pgfplots@x{#1}% + \def\pgfplots@y{#2}% + \else + % compute rx + j* ry = (#1 + j * #2 -1) / (#1 + j*#2 + 1) + % + % I write + % #1 - 1 + j * #2 = A + j * B + % 1 + #1 + j * #2 = C + j * D + % + % -> rx + j * ry = (A + j B) / (C + j D) = (A C + B D + j (B C - A D) ) / (C^2 + D^2) + \pgfplotscoordmath{default}{parsenumber}{#1}% + \let\pgfplots@x=\pgfmathresult + % + \pgfplotscoordmath{default}{parsenumber}{#2}% + \let\pgfplots@D=\pgfmathresult + % + \pgfplotscoordmath{default}{one}% + \let\pgfplots@one=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@one}{\pgfplots@x}}% + \let\pgfplots@C=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplots@x}{\pgfplots@one}}% + \let\pgfplots@A=\pgfmathresult + % + \let\pgfplots@B=\pgfplots@D + % + \pgfplotscoordmathcomplexdivision\pgfplots@A\pgfplots@B\pgfplots@C\pgfplots@D + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@x=\pgfmathresult + \pgfplotscoordmath{default}{tofixed}{\pgfmathresultim}% + \let\pgfplots@y=\pgfmathresult + \fi + % + \pgfplotsqpointxy@smithchart@canvas\pgfplots@x\pgfplots@y +%\message{pgfplotsqpointxy{#1}{#2} ---> (\pgfplots@x,\pgfplots@y) ---> (\the\pgf@x,\the\pgf@y)}% + }% +}% + +\def\pgfplotsqpointxy@smithchart@canvas#1#2{% + \ifpgfplots@smithchart@mirrored + \pgfqpointxy@orig{-#1}{#2}% + \else + \pgfqpointxy@orig{#1}{#2}% + \fi +}% + +\def\pgfplots@clippath@prepare@for@axistype@smithchartaxis{% + \def\pgfplots@clippath@install##1{% + \pgfpathellipse + {\pgfplotsqpointxy@smithchart@canvas{0}{0}} + {\pgfplotsqpointxy@smithchart@canvas{1}{0}} + {\pgfplotsqpointxy@smithchart@canvas{0}{1}}% + \pgfplots@clippath@use@{##1}% + }% +}% + +\def\pgfplotspointouternormalvectorofaxis@smithchartaxis#1#2#3\relax{% + \if v#1% + \pgfqpoint{0pt}{1pt}% + \else + \if v#2% + \pgfplotspointouternormalvectorofaxisgetv{#1#2#3}% + \ifx\pgfplotsretval\pgfutil@empty + \def\pgfplotsretval{0}% + \fi + \pgfpointdiff + {\pgfplotsqpointxy@smithchart@canvas{0}{0}}% + {\pgfplotsqpointxy{0}{\pgfplotsretval}}% + \pgfpointnormalised{}% + \else + \pgfqpoint{0pt}{1pt}% + \fi + \fi + \pgf@process{}% + \endgroup +}% + +\def\pgfplotspoint@initialisation@axes@smithchart{% + \begingroup + %\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}% + \gdef\pgfplotspointminminmin{\pgfplotsqpointxy@smithchart@canvas{0}{0}}% + % + % the "x" axis is the diameter of the circle (for fixed y=0) + \pgf@x=2\pgf@xx + \pgf@y=0pt + \xdef\pgfplotspointxaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \xdef\pgfplotspointxaxislength{\pgfmathresult pt}% + % + \pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}% + \xdef\pgfplotspointyaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + % + % the length of the "y" axis is 2*pi*r (for fixed x=0, the outer + % circle). + % The radius is the length of (0,1) which is (0pt,\pgf@xx1): + \pgfmath@basic@multiply@{\pgf@sys@tonumber\pgf@xx}{1}% + \pgfmathmultiply@{\pgfmathresult}{6.28318530717959}% 2*pi * r + \xdef\pgfplotspointyaxislength{\pgfmathresult pt}% + % + \global\let\pgfplotspointzaxis=\pgfpointorigin + \gdef\pgfplotspointzaxislength{0pt}% + \endgroup + % + \edef\pgfplots@loc@TMPa{\pgf@sys@tonumber\pgf@xx}% + \pgfmathdivide@{16000}{\pgfplots@loc@TMPa}% + \let\pgfplots@smithchart@axis@max@xradius@for@ycircle=\pgfmathresult + % + \ifdim\pgf@xx=\pgf@yy + \def\pgfplots@smithchart@axis@ratioxy{1}% + \def\pgfplots@smithchart@axis@ratioyx{1}% + \let\pgfplots@smithchart@axis@max@yradius@for@ycircle=\pgfplots@smithchart@axis@max@xradius@for@ycircle + \else + \edef\pgfplots@loc@TMPb{\pgf@sys@tonumber\pgf@yy}% + \pgfmathdivide@\pgfplots@loc@TMPa\pgfplots@loc@TMPb + \let\pgfplots@smithchart@axis@ratioxy=\pgfmathresult + \pgfmathdivide@\pgfplots@loc@TMPb\pgfplots@loc@TMPa + \let\pgfplots@smithchart@axis@ratioyx=\pgfmathresult + % + \pgfmathdivide@{16000}{\pgfplots@loc@TMPb}% + \let\pgfplots@smithchart@axis@max@yradius@for@ycircle=\pgfmathresult + \fi +} +\let\pgfplotspoint@initialisation@units@orig=\pgfplotspoint@initialisation@units +\def\pgfplotspoint@initialisation@units@smithchart{% + \pgfplotspoint@initialisation@units@orig + \def\pgfplotspointunity{% + \pgfplotspointouternormalvectorofaxisgetv{0v0}% x=0 (outer circle) and v varies (the yticks) + \ifx\pgfplotsretval\pgfutil@empty + \def\pgfplotsretval{0}% + \fi + \pgfpointnormalised{\pgfplotsqpointxy{0}{\ifx\pgfplotsretval\pgfutil@empty 0\else\pgfplotsretval\fi}}% + \pgf@xa=-\pgf@y + \global\pgf@y=\pgf@x + \global\pgf@x=\pgf@xa + }% + \def\pgfplotsunitylength{1}% + \def\pgfplotsunityinvlength{1}% +}% + +\def\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf@smithchartaxis#1{% + %\pgfplots@clippath@install{\pgfusepath{clip}}% +}% + +% At this time, the minor/major tick lists are initialised. +\def\pgfplots@draw@axis@is@prepared@smithchartaxis{% + \pgfplots@gridlines@init@grid@stop@points@for xy% + \pgfplots@gridlines@init@grid@stop@points@for yx% + % + % and finalize x: + \def\pgfplots@finalize@constraints{1}% + \pgfplots@gridlines@init@grid@stop@points@for@computethem{x}{y}{\pgfplots@finalize@constraints}% +}% + + +% Initialises the '#1grid each nth passes #2' and '#1grid stop at #2' +% features. All it does is to prepare the +% method \pgfplots@get@current@grid@stop@point. +% +% The method is quite involved. Please refer to the manual for what it +% is supposed to do, and refer to the code comments below for +% implementational details. +% +% #1 either x or y +% #2 either x or y +\def\pgfplots@gridlines@init@grid@stop@points@for#1#2{% + % + \expandafter\let\csname pgfplots@#1grid@stop@points\endcsname=\relax + % + \pgfkeysgetvalue{/pgfplots/#1grid each nth passes #2}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + % we have no "xticknum -> xtickpos" lookup table yet. + \expandafter\def\csname b@pgfplots@#2ticknum@to@pos@lookup\endcsname{0}% + % + \pgfplotslistnewempty\pgfplots@loc@TMPd + % normalise the argument for 'ygrid each nth passes x': each list element + % should be of the form '<xtickpos>:<n>' where <n> means that each + % <n>th arc can pass. + \expandafter\pgfplotsutilforeachcommasep\pgfplots@loc@TMPa\as\entry{% + \expandafter\pgfplots@gridlines@init@grid@stop@points@for@normalise\entry\relax#1#2% + \expandafter\pgfplotslistpushback\entry\to\pgfplots@loc@TMPd + }% + \expandafter\let\csname pgfplots@#1grid@stop@points\endcsname=\pgfplots@loc@TMPd + % + % Ok. + % + % Now, the 'ygrid each nth passes x' feature relies *crucially* on grid line + % indices (for the 'each nth' feature). + % + % I sort the arcs according to their absolute magnitude and assign + % indices into the resulting arrays to normalize that stuff. + % + % The array is of the form + % A[i] = entry of \pgfplots@prepared@tick@positions@* + % and contains *both*, major and minor grid lines. + \pgfplotsarraynewempty\pgfplots@gridlines + \pgfplotscoordmath{default}{zero}% + \edef\elem{{-1}{\pgfmathresult}}% require 0 to be zero for symmetry even if there is no such tick pos + \expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines + \pgfplots@if{pgfplots@#1majorgrids}{% + % insert all major tick positions, using their absolute value. + \expandafter + \pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#1\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}% + \pgfplotscoordmath{default}{op}{abs}{{\pgfmathresult}}% + \edef\elem{{\pgfplots@ticknum}{\pgfmathresult}}% + \expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines + }% + }{}% + \pgfplots@if{pgfplots@#1minorgrids}{% + % now the same for minor grid positions: + \expandafter + \pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#1\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}% + \pgfplotscoordmath{default}{op}{abs}{{\pgfmathresult}}% + \edef\elem{{\pgfplots@ticknum}{\pgfmathresult}}% + \expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines + }% + }{}% + % sort the array! + \pgfkeysgetvalue{/pgfplots/smithchart@sortlt/.@cmd}\pgfplots@loc@TMPa + \pgfkeyslet{/pgfplots/iflessthan/.@cmd}\pgfplots@loc@TMPa + \pgfplotsarraysort\pgfplots@gridlines + % + % ok. Now it is sorted. + % + % I finally need a lookup + % \pgfplots@ticknum --> sort index. + % If the associated values have the same absolute value, the same + % sort index should be assigned. + % + % For example, the array might be associated to the following tick + % positions, sorted by absolute value: + % 0.0, 1.0, -1.0, 3.0, -3.0, 4.0, -4.0, 5.0, -5.0 + % What I want is that + % 0.0 gets sort index 0 + % 1.0 and -1.0 get sort index 1 + % 3.0 and -3.0 get sort index 2 + % 4.0 and -4.0 get sort index 3 + % and so on. The array contains only absolute values, so that's + % not too difficult to check. + % + % Since each of the tick positions can be (uniquely) identified by + % its associated \pgfplots@ticknum value, I map \pgfplots@ticknum + % to the sort index. + \countdef\c@sortindex=\c@pgf@counta + \c@sortindex=\pgfkeysvalueof{/pgfplots/#1grid each nth passes #2 start} % this is assigned to the '0.0' gridline (if any) + \def\pgfplots@lasttickpos{}% + \pgfplotsarrayforeachungrouped\pgfplots@gridlines\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \ifx\pgfplots@lasttickpos\pgfutil@empty + \else + \ifx\pgfplots@lasttickpos\pgfplots@tick + \else + \advance\c@sortindex by1 + \fi + \fi + \expandafter\edef\csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname{\the\c@sortindex}% +%\message{\pgfplots@ticknum\space(abs(tickpos) = \pgfplots@tick)---> sort index \csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname^^J}% + \let\pgfplots@lasttickpos=\pgfplots@tick + }% + % + % unfortunately, I can't free the \pgfplots@gridlines array + % without extensive overhead :-( + \fi + % + \expandafter\let\csname b@pgfplots@#1gridline@stopmap\endcsname\relax + \pgfkeysgetvalue{/pgfplots/#1grid stop at #2}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa,}% this inserts the final comma and handles any active ':' sign (for french babel) + \def\pgfplots@loc@TMPb{\pgfplots@gridlines@init@stop@maps #1#2}% + \expandafter\pgfplots@loc@TMPb\pgfplots@loc@TMPa\pgfplots@EOI% + \fi + % + % + % Now, compute all final stop positions. Also prepare the cross + % dependencies between x grids and y grids here (such that there + % is no grid line stopping in white space) + % + \if#1x% + \def\pgfplots@finalize@constraints{0}% we have to wait until y stop points are known. + \else + \def\pgfplots@finalize@constraints{1}% + \fi + \pgfplots@gridlines@init@grid@stop@points@for@computethem{#1}{#2}{\pgfplots@finalize@constraints}% +}% +% #1,#2,#3 the arguments for +% \pgfplots@gridlines@preparation@get@current@grid@stop@point +\def\pgfplots@gridlines@init@grid@stop@points@for@computethem#1#2#3{% + % + \expandafter\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#1\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}\let\pgfplots@tick=\pgfmathresult + \pgfplots@gridlines@preparation@get@current@grid@stop@point{#1}{#2}{\pgfplots@tick}{#3}% + \if1#3% + \pgfplots@gridlines@let{#1}{\pgfplots@tick@prepared}=\pgfplotsretval + \fi + }% + \expandafter\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#1\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}\let\pgfplots@tick=\pgfmathresult + \pgfplots@gridlines@preparation@get@current@grid@stop@point{#1}{#2}{\pgfplots@tick}{#3}% + \if1#3% + \pgfplots@gridlines@let{#1}{\pgfplots@tick@prepared}=\pgfplotsretval + \fi + }% + \expandafter\def\csname b@pgfplots@#1gridline@stopmap\endcsname{1}% +} + +\def\pgfplots@gridlines@init@stop@maps#1#2{% + \pgfutil@ifnextchar\pgfplots@EOI{% + \pgfutil@gobble + }{% + \pgfutil@ifnextchar,{% + \pgfplots@gridlines@init@stop@maps@next@@#1#2% + }{% + \pgfplots@gridlines@init@stop@maps@next#1#2% + }% + }% +}% +\def\pgfplots@gridlines@init@stop@maps@next#1#2#3:#4,{% + \pgfplotscoordmath{default}{parsenumber}{#4}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplots@gridlines@stopmap@prepare{#3}% + \pgfplots@gridlines@let{#1}{\pgfmathresult}=\pgfplots@loc@TMPa + \expandafter\def\csname b@pgfplots@#1gridline@stopmap\endcsname{1}% + % + \pgfplots@gridlines@init@stop@maps #1#2% +} +% just eat one empty comma: +\def\pgfplots@gridlines@init@stop@maps@next@@#1#2,{\pgfplots@gridlines@init@stop@maps #1#2}% +\def\pgfplots@gridlines@let#1#2=#3{% + \expandafter\let\csname pgfplots@#1gridline@stopmap@#2\endcsname=#3% + \if#1y% + % support symmetry: + % add -\pgfmathresult to the map. + % To disable this symmetry, use 'ygrid stop at x={0.2:4 -0.2:5} + % you can also use an empty value '-0.2:{}', that's also ok. + \expandafter\let\csname pgfplots@#1gridline@stopmap@-#2\endcsname=#3% + \fi +}% + +\def\pgfplots@gridlines@stopmap@prepare@digits{2}% +\def\pgfplots@gridlines@stopmap@prepare#1{% + \begingroup + \pgfmathfloatparsenumber{#1}% + \let\pgfmathfloat@round@precision=\pgfplots@gridlines@stopmap@prepare@digits% + \pgfmathfloatroundzerofill\pgfmathresult + \pgfmath@smuggleone\pgfmathresult + \endgroup +}% +\def\pgfplots@gridlines@stopmap@trunc@#1.#2#3#4\relax{% + \def\pgfmathresult{#1.#2#3}% +}% + +\pgfkeysdefargs{/pgfplots/smithchart@sortlt}{#1#2#3#4}{% + \expandafter\pgfplots@prepared@tick@pos@unpack#1% + \let\pgfplots@A=\pgfplots@tick + \expandafter\pgfplots@prepared@tick@pos@unpack#2% + \let\pgfplots@B=\pgfplots@tick + \pgfplotscoordmath{default}{if less than}{\pgfplots@A}{\pgfplots@B}{#3}{#4}% +}% + +% initialise a lookuptable from ticknumber -> tick position (sort +% of an array) +% +% This is only invoked if it is needed (if 'arc +% limits={[index]4,[index]2}' or something like that is used, see the +% manual). +% +% #1 either x or y +% #2 either x or y +\def\pgfplots@gridlines@init@grid@stop@points@for@init@ticknum@lookup#1#2{% + \c@pgf@counta=0 + \pgfplots@if{pgfplots@#1majorgrids}{% + \expandafter + \pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#2\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \expandafter\let\csname pgfplots@#2tick@num@to@pos@\the\c@pgf@counta\endcsname=\pgfplots@tick + \advance\c@pgf@counta by1 + }% + }{}% + \pgfplots@if{pgfplots@#1minorgrids}{% + \expandafter + \pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#2\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \expandafter\let\csname pgfplots@#2tick@num@to@pos@\the\c@pgf@counta\endcsname=\pgfplots@tick + \advance\c@pgf@counta by1 + }% + }{}% + \expandafter\def\csname b@pgfplots@#2ticknum@to@pos@lookup\endcsname{1}% +}% +\def\pgfplots@gridlines@init@grid@stop@points@for@normalise#1\relax#2#3{% + \def\b@pgfplots@haslt{0}% + % + \pgfutil@in@{if <}{#1}% + \ifpgfutil@in@ + % strip the white space between 'if' and '<': + \def\pgfplots@loc@TMPa##1if <##2\relax{\edef\entry{##1if<##2}}% + \expandafter\pgfplots@loc@TMPa\entry\relax + \def\b@pgfplots@haslt{1}% + \fi + % + \pgfutil@in@{if<}{#1}% + \ifpgfutil@in@ + \def\b@pgfplots@haslt{1}% + \fi + % + \pgfutil@in@:{#1}% + \ifpgfutil@in@ + \def\b@pgfplots@hascolon{1}% + \else + \def\b@pgfplots@hascolon{0}% + \fi + % + \if1\b@pgfplots@hascolon + \edef\entry{\entry\if0\b@pgfplots@haslt if<\fi}% + \else + \if1\b@pgfplots@haslt + \expandafter\pgfplots@gridlines@stop@at@unpack@@@\entry\relax + \edef\entry{\pgfplots@grid@stop@at:2if<\pgfplots@grid@stop@at@iflt}% + \else + \edef\entry{\entry:2if<}% + \fi% + \fi% + % + \pgfutil@in@{[index]}{#1}% + \ifpgfutil@in@ + \if0\csname b@pgfplots@#3ticknum@to@pos@lookup\endcsname + \pgfplots@gridlines@init@grid@stop@points@for@init@ticknum@lookup#2#3% + \fi + \expandafter\pgfplots@gridlines@stop@at@unpack\entry\relax + \pgfutil@ifundefined{pgfplots@#3tick@num@to@pos@\pgfplots@grid@stop@at}{% + \pgfplots@warning{There is no #3tick with index '\pgfplots@grid@stop@at'. Skipping it.}% + \let\entry=\pgfutil@empty + }{% + \edef\entry{\csname pgfplots@#3tick@num@to@pos@\pgfplots@grid@stop@at\endcsname:\pgfplots@grid@stop@at@eachnth}% + }% + \fi + % + \expandafter\pgfplots@gridlines@stop@at@unpack\entry\relax + \pgfplotscoordmath{default}{parsenumber}\pgfplots@grid@stop@at + \let\pgfplots@grid@stop@at=\pgfmathresult + \ifx\pgfplots@grid@stop@at@iflt\pgfutil@empty + \else + \pgfplotscoordmath{default}{parsenumber}\pgfplots@grid@stop@at@iflt + \let\pgfplots@grid@stop@at@iflt=\pgfmathresult + \fi + \edef\entry{\pgfplots@grid@stop@at:\pgfplots@grid@stop@at@eachnth if<\pgfplots@grid@stop@at@iflt}% +}% +\def\pgfplots@gridlines@stop@at@unpack@@@#1if<#2\relax{% + \def\pgfplots@grid@stop@at{#1}% + \def\pgfplots@grid@stop@at@iflt{#2}% +}% +\def\pgfplots@gridlines@stop@at@unpack#1:#2if<#3\relax{% + \def\pgfplots@grid@stop@at{#1}% + \def\pgfplots@grid@stop@at@eachnth{#2}% + \def\pgfplots@grid@stop@at@iflt{#3}% +}% + +% Returns the xtick position which should end the current arc. +% +% This is an INTERNAL preparation method. See +% \pgfplots@get@current@grid@stop@point for the final one. +% +% Note that arcs correspond to ygrid lines. +% +% #1 either x or y +% #2 either x or y +% #3 the value of the current grid line +% #4 a boolean which expands either to 0 or to 1. +% The \pgfplots@get@current@grid@stop@point@handle@constraints method +% will be invoked if and only if #4=1 +% +% @POSTCONDITION On output, +% - \pgfplotsretval will be filled with the +% result. If the result is empty, no restriction is imposed. +% Otherwise, it contains the #2tick value at which the current #1grid shall end. +% The result is already processed with +% \pgfplotscoordmath{default}{parsenumber}{<value>} +% - \pgfplots@tick@prepared contains a rounded representation of #3. +% +% The method relies on the 'ygrid each nth passes x' feature, more specifically the +% stuff prepared by \pgfplots@gridlines@init@grid@stop@points@for +\def\pgfplots@gridlines@preparation@get@current@grid@stop@point#1#2#3#4{% + \def\pgfplotsretval{}% + % + \pgfplots@gridlines@stopmap@prepare{#3}% + \let\pgfplots@tick@prepared=\pgfmathresult + \pgfmathfloatabs@\pgfplots@tick@prepared + \let\pgfplots@tick@prepared@abs=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{abs}{{#3}}% + \let\pgfplots@tick@abs=\pgfmathresult + % + % first: check the '#1grid stop at #2': + \expandafter\ifx\csname b@pgfplots@#1gridline@stopmap\endcsname\relax% + % ok. there is no such thing. + \else + % ah - process it! + \pgfutil@ifundefined{pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared}{% + }{% + \edef\pgfplotsretval{\csname pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared\endcsname}% + }% + \fi + % + \ifx\pgfplotsretval\pgfutil@empty + % the individual map failed. Ok, then check for the '#1grid each nth passes #2' + \expandafter\ifx\csname pgfplots@#1grid@stop@points\endcsname\relax + \else + % \pgfplots@ticknum is defined in this context here. + \pgfutil@ifundefined{pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum}{% + \pgfplots@warning{Sorry, I can't get the current arc limit for #1grid no \#\pgfplots@ticknum\space(value \pgfplots@tick). This seems like an internal error!?}% + }{% + % get the sort index for the current tick (which is + % uniquely identified by its \pgfplots@ticknum) + \expandafter\let\expandafter\pgfplots@k\csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname + % + \expandafter\pgfplotslistforeachungrouped\csname pgfplots@#1grid@stop@points\endcsname\as\pgfplots@loc@TMPa{% + \ifx\pgfplotsretval\pgfutil@empty + % we found no final limit so far. proceed. + \expandafter\pgfplots@gridlines@stop@at@unpack\pgfplots@loc@TMPa\relax + \ifx\pgfplots@grid@stop@at@iflt\pgfutil@empty + \pgfplots@loop@CONTINUEtrue + \else + \pgfplotscoordmath{default}{if less than}{\pgfplots@tick@abs}{\pgfplots@grid@stop@at@iflt}{% + \pgfplots@loop@CONTINUEtrue + }{% + \pgfplots@loop@CONTINUEfalse + }% + \fi + % + \ifpgfplots@loop@CONTINUE + \pgfplotsmathmodint\pgfplots@k\pgfplots@grid@stop@at@eachnth + \ifnum\pgfmathresult=0 + \c@pgf@counta=\pgfplots@k + \divide\c@pgf@counta by\pgfplots@grid@stop@at@eachnth\relax + \edef\pgfplots@k{\the\c@pgf@counta}% + \else + % found the final limit. + % + % Now, check the constraints which couple + % X and Y. + \let\pgfplotsretval=\pgfplots@grid@stop@at + \if1#4% + \pgfplots@get@current@grid@stop@point@handle@constraints #1#2{#3}% + \fi + \fi + \fi + \fi + }% + }% + \fi + \fi + \ifx\pgfplotsretval\pgfutil@empty + \else + \expandafter\let\csname pgfplots@final@stop@point@for@#1tick@\pgfplots@tick@prepared\endcsname=\pgfplotsretval +%\message{#1 grid line: storing end value for '#3' END[\pgfplots@tick@prepared] = \pgfplotsretval.^^J}% + \fi +}% + +% PRECONDITION +% \pgfplotsretval contains a non-zero constraint for the ygrid at #1. +% +% POSTCONDITION +% either \pgfplotsretval is unchanged, or it is reset to +% \pgfutil@empty if constraints are violated. +% +% The constraints are ONLY effective if BOTH, incomplete x- and y grid +% lines are in effect. In that case, it should never happen that a +% single grid line ends in a dead-end somewhere in white space. +% +% I enforce two constraints which apply only to ygrid to fix this +% issue (this may be improved later). +% +% The idea is simple: +% 1. suppose the grid line 'x=1' stops at 'y=5'. +% Suppose further that the y grid line 'y=0.95' should stop at 'x=1'. +% Is that acceptable? Yes, because |y| < 5. +% Now, suppose an y grid line with |y| > 5 should stop at 'x=1'. +% Is this allowed? NO! Because it would become a dead end since +% the 'x=1' line ends at 'y=5'! +% +% So, whenever we consider ygrids and stop point candidates "x=X", +% acquire the value Q where the x (!) grid line "x=X" stops. +% If |y| > Q, the candidate "x=X" is rejected. +% +% 2. There might still be the case that x grid lines have dead-ends. +% The current solution applies the idea first to all y grid lines, +% and once the y grid lines are ready, it applies the same idea to +% x grid lines. +% +% Uncomment the routine(s) and run the test cases to see what happens. +\def\pgfplots@get@current@grid@stop@point@handle@constraints#1#2#3{% + \ifx\pgfplotsretval\pgfutil@empty + \else + \pgfplots@gridlines@stopmap@prepare{\pgfplotsretval}% + \let\pgfplots@loc@TMPa=\pgfmathresult + % +%\message{checking ending '#1=#3' at '#2=\pgfplotsretval'. '#2=\pgfplots@loc@TMPa' stops}% + \pgfutil@ifundefined{pgfplots@final@stop@point@for@#2tick@\pgfplots@loc@TMPa}{% + % no constraint. Ok. +%\message{ nowhere. No constraint.^^J}% + }{% +%\message{ at \pgfplots@loc@TMPa. Feasible: }% + % Oh, a constraint. That means + % further work. + \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@final@stop@point@for@#2tick@\pgfmathresult\endcsname + \pgfplotscoordmath{default}{op}{abs}{{#3}}% + \pgfplotscoordmath{default}{if less than}{\pgfmathresult}{\pgfplots@loc@TMPa}{% + % ok, we can use the found + % stop value. +%\message{YES.^^J}% + }{% +%\message{NO.^^J}% + % no, the stop value is + % invalid; it would stop in + % white space! + \let\pgfplotsretval=\pgfutil@empty + }% + }% + \fi +}% + +% Returns the xtick position which should end the current arc. +% +% Note that arcs correspond to ygrid lines. +% +% #1 either x or y +% #2 either x or y +% #3 the value of the current grid line +% +% @POSTCONDITION On output, \pgfplotsretval will be filled with the +% result. If the result is empty, no restriction is imposed. +% Otherwise, it contains the #2tick value at which the current #1grid shall end. +% The result is already processed with +% \pgfplotscoordmath{default}{parsenumber}{<value>} +% +% The method relies on the 'ygrid each nth passes x' feature, more specifically the +% stuff prepared by \pgfplots@gridlines@init@grid@stop@points@for +% +% Note that all work has already been done by +% \pgfplots@gridlines@init@grid@stop@points@for. We only need to query +% the result at this point. +% @see \pgfplots@gridlines@init@grid@stop@points@for +% @see \pgfplots@gridlines@preparation@get@current@grid@stop@point +\def\pgfplots@get@current@grid@stop@point#1#2#3{% + \def\pgfplotsretval{}% + % + % check the '#1grid stop at #2': + \expandafter\ifx\csname b@pgfplots@#1gridline@stopmap\endcsname\relax% + % ok. there is no such thing. + \else + % + \pgfplots@gridlines@stopmap@prepare{#3}% + \let\pgfplots@tick@prepared=\pgfmathresult + \pgfmathfloatabs@\pgfplots@tick@prepared + \let\pgfplots@tick@prepared@abs=\pgfmathresult + % + % ah - process it! + \pgfutil@ifundefined{pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared}{% + \let\pgfplotsretval\pgfutil@empty + }{% + \edef\pgfplotsretval{\csname pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared\endcsname}% + }% + \fi + % +}% + + +\def\pgfplots@smithchart@draw@xcircle#1{% + \pgfplotscoordmath{default}{one}% + \let\pgfplots@loc@TMPa=\pgfmathresult + % + \pgfplotscoordmath{default}{parsenumber}{#1}% + \let\pgfplots@x=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@loc@TMPa}{\pgfplots@x}}% + \let\pgfplots@radius@inverse=\pgfmathresult + \pgfplotscoordmath{default}{op}{reciprocal}{{\pgfmathresult}}% + \let\pgfplots@radius=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@x}}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@center=\pgfmathresult + % + \pgfplotscoordmath{default}{tofixed}{\pgfplots@radius}% + \let\pgfplots@radius=\pgfmathresult + % + \pgfplotscoordmath{default}{tofixed}{\pgfplots@radius@inverse}% + \let\pgfplots@radius@inverse=\pgfmathresult + % + % This here would suffice in case 'xgrid each nth passes y={}': +% \pgfpathellipse +% {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@center}{0}} +% {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@radius}{0}} +% {\pgfplotsqpointxy@smithchart@canvas{0}{\pgfplots@radius}}% + % + % but we also check for the 'xgrid each nth passes y' feature: + \pgfplots@get@current@grid@stop@point xy{\pgfplots@x}% + \let\pgfplots@arc@ends@at@y@arc@value\pgfplotsretval% + % + \ifx\pgfplots@arc@ends@at@y@arc@value\pgfutil@empty + % Ok. There is no specific end point -- simply use the + % (1,0) point (i.e. draw the full circle). + % + \pgfmathadd@{\pgfplots@center}{\pgfplots@radius}% + \let\pgfplots@start=\pgfmathresult% + \def\pgfplots@startim{0}% + \def\pgfplots@startangle{0}% + \let\pgfplots@end=\pgfplots@start + \let\pgfplots@endim=\pgfplots@startim + \def\pgfplots@endangle{360}% + \else + % Ok. The arc should end before it reaches the (1,0) + % point. Determine the exact position and the + % corresponding arc end angle. + % + % In general, the intersection between the circle for + % fixed x=A and fixed y=B is given by + % + % p + j * q = (A + j * B -1 ) / ( A + j*B +1) + % see http://www.siart.de/lehre/tutorien.xhtml#smishort + \pgfplotscoordmath{default}{one}% + \let\pgfplots@one=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{-1}% + \let\pgfplots@mone=\pgfmathresult + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@x}{\pgfplots@mone}}% + \let\pgfplots@A@mone=\pgfmathresult + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@x}{\pgfplots@one}}% + \let\pgfplots@A@one=\pgfmathresult + % oh - we should only draw a partial arc. + % Well, then compute its end point and the + % corresponding end angle. + \pgfplotscoordmathcomplexdivision + {\pgfplots@A@mone}{\pgfplots@arc@ends@at@y@arc@value}% + {\pgfplots@A@one}{\pgfplots@arc@ends@at@y@arc@value}% + \let\pgfplots@start=\pgfmathresult + \let\pgfplots@startim=\pgfmathresultim + \pgfplotscoordmath{default}{tofixed}{\pgfplots@start}% + \let\pgfplots@start=\pgfmathresult + \pgfplotscoordmath{default}{tofixed}{\pgfplots@startim}% + \let\pgfplots@startim=\pgfmathresult + % + \pgfplots@compute@angle@of@point@in@circle\pgfplots@start\pgfplots@startim{\pgfplots@center}{\pgfplots@radius}{\pgfplots@radius@inverse}% + \let\pgfplots@startangle=\pgfmathresult + \pgfmathsubtract@{360}{\pgfplots@startangle}% + \let\pgfplots@endangle=\pgfmathresult + \let\pgfplots@end=\pgfplots@start + \edef\pgfplots@endim{-\pgfplots@startim}% + \ifdim\pgfplots@startangle pt>\pgfplots@endangle pt + \let\pgfplots@loc@TMPa=\pgfplots@startangle + \let\pgfplots@startangle=\pgfplots@endangle + \let\pgfplots@endangle=\pgfplots@loc@TMPa + \fi + \fi + % +%\message{X grid line \#\csname pgfplots@ticknum\endcsname \space at '#1': center = (\pgfplots@center,0); radius = \pgfplots@radius\space(start angle \pgfplots@startangle, end angle = \pgfplots@endangle; stops at y = \pgfplots@arc@ends@at@y@arc@value).^^J}% + % + % Now, compute the arc. + % + % first, compute the absolute x/y radii: + \pgf@xa=\pgfplots@radius\pgf@xx + \pgf@xb=\pgfplots@radius\pgf@yy + \edef\pgfplots@mirror@sign{\ifpgfplots@smithchart@mirrored -\fi}% + \pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{\pgfplots@start}{\pgfplots@startim}}% + % note that the case startangle > endangle is + % automatically correct; patharc handles that. + %\edef\pgfplots@loc@TMPa{{\pgfplots@startangle}{\pgfplots@endangle}{\pgfplots@mirror@sign\the\pgf@xa\space and \the\pgf@xb}}% + %\expandafter\pgfpatharc\pgfplots@loc@TMPa + % + % prefer \pgfpatharctoprecomputed. It is faster and more accurate + \edef\pgfplots@loc@TMPa{% + {\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@center}{0}}% + {\pgfplots@startangle}% + {\pgfplots@endangle}% + {\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@end}{\pgfplots@endim}}% + {\pgfplots@mirror@sign\the\pgf@xa}% + {\the\pgf@xb}% + {\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioxy}% + {\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioyx}% + }% + \expandafter\pgfpatharctoprecomputed\pgfplots@loc@TMPa +} + +\def\pgfplots@smithchart@draw@yarc#1{% + \pgfplotscoordmath{default}{parsenumber}{#1}% + \let\pgfplots@y\pgfmathresult + \pgfplotscoordmath{default}{op}{abs}{{\pgfplots@y}}% + \pgfplotscoordmath{default}{if less than}{\pgfmathresult}{\pgfplots@almost@zero@thresh}{% + \pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{-1}{0}}% + \pgfpathlineto{\pgfplotsqpointxy@smithchart@canvas{1}{0}}% + }{% + \pgfplotscoordmath{default}{op}{reciprocal}{{\pgfplots@y}}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@signedradius=\pgfmathresult + % + \pgfplotscoordmath{default}{tofixed}{\pgfplots@y}% + \ifdim\pgfplots@signedradius pt<0pt + \def\pgfplots@radius@sign{-}% + \edef\pgfplots@radius@inverse{-\pgfmathresult}% + \edef\pgfplots@radius{-\pgfplots@signedradius}% + \else + \def\pgfplots@radius@sign{}% + \edef\pgfplots@radius@inverse{\pgfmathresult}% + \let\pgfplots@radius=\pgfplots@signedradius + \fi + % this here is the correct, complete circle -- together + % with a clip path, you get what you want: + %\pgfpathellipse + % {\pgfplotsqpointxy@smithchart@canvas{1}{\pgfplots@signedradius}} + % {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@signedradius}{0}} + % {\pgfplotsqpointxy@smithchart@canvas{0}{\pgfplots@signedradius}}% + % But I only want the arc (probably stopped earlier to + % improve qualtity of the chart) + % + % compute start point for the arc. + % + % To do so, we need to compute the intersection between + % the circle for fixed x=0 and the circle for y=#1. + % + % In general, the intersection between the circle for + % fixed x=A and fixed y=B is given by + % + % p + j * q = (A + j * B -1 ) / ( A + j*B +1) + % see http://www.siart.de/lehre/tutorien.xhtml#smishort + % + % inserting A = 0 and B = #1 yields the result + % p=\pgfplots@start + % q=\pgfplots@startim + % as follows: + \pgfplotscoordmath{default}{one}% + \let\pgfplots@one=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{-1}% + \let\pgfplots@mone=\pgfmathresult + \pgfplotscoordmathcomplexdivision{\pgfplots@mone}{\pgfplots@y}{\pgfplots@one}{\pgfplots@y}% + \let\pgfplots@start=\pgfmathresult + \let\pgfplots@startim=\pgfmathresultim + \pgfplotscoordmath{default}{tofixed}{\pgfplots@start}% + \let\pgfplots@start=\pgfmathresult + \pgfplotscoordmath{default}{tofixed}{\pgfplots@startim}% + \let\pgfplots@startim=\pgfmathresult + % + \pgfplots@compute@angle@of@point@in@circle\pgfplots@start\pgfplots@startim{1}{\pgfplots@signedradius}{\pgfplots@radius@inverse}% + \let\pgfplots@startangle=\pgfmathresult + % + % + % compute end angle. + \pgfplots@get@current@grid@stop@point yx{\pgfplots@y}% + \let\pgfplots@arc@ends@at@x@circle@value\pgfplotsretval% + % + \ifx\pgfplots@arc@ends@at@x@circle@value\pgfutil@empty + % Ok. There is no specific end point -- simply use the + % (1,0) point (i.e. draw the full arc). + % + % The "0 degree" angle in my circles is in the direction + % of (1,0) . + \ifdim\pgfplots@startim pt>0pt + % ok; this arc belongs to the upper hemisphere. + \def\pgfplots@endangle{270}% + \else + % ok; this arc belongs to the lower hemisphere. + \def\pgfplots@endangle{90}% + \fi + \def\pgfplots@end{1}% + \def\pgfplots@endim{0}% + \else + % Ok. The arc should end before it reaches the (1,0) + % point. Determine the exact position and the + % corresponding arc end angle. + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@arc@ends@at@x@circle@value}{\pgfplots@mone}}% + \let\pgfplots@A@mone=\pgfmathresult + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@arc@ends@at@x@circle@value}{\pgfplots@one}}% + \let\pgfplots@A@one=\pgfmathresult + % oh - we should only draw a partial arc. + % Well, then compute its end point and the + % corresponding end angle. + \pgfplotscoordmathcomplexdivision{\pgfplots@A@mone}{\pgfplots@y}{\pgfplots@A@one}{\pgfplots@y}% + \let\pgfplots@end=\pgfmathresult + \let\pgfplots@endim=\pgfmathresultim + \pgfplotscoordmath{default}{tofixed}{\pgfplots@end}% + \let\pgfplots@end=\pgfmathresult + \pgfplotscoordmath{default}{tofixed}{\pgfplots@endim}% + \let\pgfplots@endim=\pgfmathresult + % + \pgfplots@compute@angle@of@point@in@circle\pgfplots@end\pgfplots@endim{1}{\pgfplots@signedradius}{\pgfplots@radius@inverse}% + \let\pgfplots@endangle=\pgfmathresult + \fi + % + % + % + % Now, compute the arc. + % + % first, compute the absolute x/y radii: + % + % Note that for small y (like y=0.01), the arc is almost a + % straight line. Consequently, the ellipsis radius will be much larger + % than 16000, violating TeX's number range. + % + % To avoid that, I clip it to the highest allowed value. + % The final radius is + % \pgfplots@radius * \pgf@xx and \pgfplots@radius * \pgf@yy. + % the clipped value thus needs to respect the magnitude of \pgf@xx and \pgf@yy. + \ifdim\pgfplots@radius pt<\pgfplots@smithchart@axis@max@xradius@for@ycircle pt + \let\pgfplots@radius@x\pgfplots@radius + \else + \let\pgfplots@radius@x=\pgfplots@smithchart@axis@max@xradius@for@ycircle + \fi + \ifdim\pgfplots@radius pt<\pgfplots@smithchart@axis@max@yradius@for@ycircle pt + \let\pgfplots@radius@y\pgfplots@radius + \else + \let\pgfplots@radius@y=\pgfplots@smithchart@axis@max@yradius@for@ycircle + \fi +%\message{Y grid line \#\csname pgfplots@ticknum\endcsname\space at '#1': center = (1,\pgfplots@signedradius); signedradius = \pgfplots@signedradius\space clipped radii = \pgfplots@radius@x*\the\pgf@xx\space and \pgfplots@radius@y*\the\pgf@yy\space ( start angle \pgfplots@startangle, end angle \pgfplots@endangle, arc limit: \ifx\pgfplots@arc@ends@at@x@circle@value\pgfutil@empty NONE\else \pgfplots@arc@ends@at@x@circle@value\fi)^^J}% + \pgf@xa=\pgfplots@radius@x\pgf@xx + \pgf@xb=\pgfplots@radius@y\pgf@yy + \edef\pgfplots@mirror@sign{\ifpgfplots@smithchart@mirrored -\fi}% + \pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{\pgfplots@start}{\pgfplots@startim}}% + % note that the case startangle > endangle is + % automatically correct; patharc handles that. + %\edef\pgfplots@loc@TMPa{{\pgfplots@startangle}{\pgfplots@endangle}{\pgfplots@mirror@sign\the\pgf@xa\space and \the\pgf@xb}}% + %\expandafter\pgfpatharc\pgfplots@loc@TMPa + % + % prefer \pgfpatharctoprecomputed. It is faster and more accurate + \ifdim\pgfplots@startangle pt>\pgfplots@endangle pt + \let\pgfplots@loc@TMPa=\pgfplots@startangle +% \let\pgfplots@startangle=\pgfplots@endangle +% \let\pgfplots@endangle=\pgfplots@loc@TMPa + \fi + \edef\pgfplots@loc@TMPa{% + {\noexpand\pgfplotsqpointxy@smithchart@canvas{1}{\pgfplots@radius@sign\pgfplots@radius@y}}% + {\pgfplots@startangle}% + {\pgfplots@endangle}% + {\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@end}{\pgfplots@endim}}% + {\pgfplots@mirror@sign\the\pgf@xa}% + {\the\pgf@xb}% + {\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioxy}% + {\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioyx}% + }% + \expandafter\pgfpatharctoprecomputed\pgfplots@loc@TMPa + }% +} + +\def\pgfplots@drawgridlines@onorientedsurf@fromto@smithchart#1{% + \if x\pgfplotspointonorientedsurfaceA + \pgfplots@smithchart@draw@xcircle{#1}% + \else + \pgfplots@smithchart@draw@yarc{#1}% + \fi +}% + +% Given a circle with center point (#3,#4), we search for the angle +% of the point (#1,#2). The point is expected to be on the circle. +% The resulting angle is returned in \pgfmathresult +% +% #1 x coordinate of the point for which an angle is searched +% #2 y coordinate of the point for which an angle is searched +% #3 x coordinate of the circle's center point +% #4 y coordinate of the circle's center point +% #5 is either empty or it is expected to contain the inverse radius, 1/r +% this information is available in my context, so I don't recompute +% it. +% +% All coordinates are expected in standard TeX precision (numbers +% without unit) +\def\pgfplots@compute@angle@of@point@in@circle#1#2#3#4#5{% + % + % 1. compute diff vector from center=(1,\pgfplots@signedradius) to start: + \pgfmathsubtract@{#1}{#3}% + \let\pgfplots@D\pgfmathresult + \pgfmathsubtract@{#2}{#4}% + \let\pgfplots@Dim\pgfmathresult + % + % 2. compute the start angle. + % It is related to the angle between the point (1,0) and + % diff, which, in turn is given by + % < (1,0), (D,Dim) > = cos(alpha) ||(D,Dim)|| + % < (1,0), (D,Dim) > = D + % + % Note that ||(D,Dim)|| = r, the radius of the involved circle + % around (#3,#4). If 1/r is already available, use it! Saves a lot + % of time. + % + \def\pgfplots@loc@TMPa{#5}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \pgfmathveclen\pgfplots@D\pgfplots@Dim + \let\pgfplots@veclen=\pgfmathresult + \pgfmathreciprocal@\pgfplots@veclen + \let\pgfplots@inverseveclen=\pgfmathresult + \else + % oh, good -- we already have 1/||(D,Dim)||. Use it. + \def\pgfplots@inverseveclen{#5}% +%\message{using already available inverseveclen '#5' }% + \fi + \pgfmathmultiply@{\pgfplots@D}{\pgfplots@inverseveclen}% +%\message{D= (\pgfplots@D,\pgfplots@Dim).. acos(\pgfplots@D * \pgfplots@inverseveclen) = acos(\pgfmathresult)}% + \pgfmathacos@{\pgfmathresult}% the '-' comes from D<0 . +%\message{= \pgfmathresult^^J}% + \let\pgfplots@tmpangle\pgfmathresult% + % ok. tmpangle is per definition less than 180; it is the + % smaller angle between (1,0) and (D,Dim). + % + % compute the angle relative to (1,0): + \ifdim\pgfplots@Dim pt<0pt + \pgfmathsubtract@{360}{\pgfplots@tmpangle}% + \fi +}% + +\def\pgfplots@drawaxis@innerlines@onorientedsurf@smithchart#1#2#3{% + \if2\csname pgfplots@#1axislinesnum\endcsname + \draw[/pgfplots/every inner #1 axis line,% + decorate,% + #1discont,% + decoration={pre length=\csname #1disstart\endcsname, post length=\csname #1disend\endcsname}] + \pgfextra + \csname pgfplotspointonorientedsurfaceabsetupforset#3\endcsname{\csname pgfplots@logical@ZERO@#3\endcsname}{2}% + \if#1x% + \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + \pgfplots@drawgridlines@onorientedsurf@fromto{0}% + \else + \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1min\endcsname}{\csname pgfplots@logical@ZERO@#2\endcsname}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1max\endcsname}{\csname pgfplots@logical@ZERO@#2\endcsname}}% + \fi + \endpgfextra + ; + \fi +}% +\def\pgfplots@drawaxis@outerlines@separate@onorientedsurf@smithchartaxis#1#2{% + \if2\csname pgfplots@#1axislinesnum\endcsname + % centered axis lines handled elsewhere. + \else + \scope[/pgfplots/every outer #1 axis line, + #1discont,decoration={pre length=\csname #1disstart\endcsname, post length=\csname #1disend\endcsname}] + \if#1x + \draw decorate { + \pgfextra + % exchange roles of A <-> B axes: + \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + \pgfplots@drawgridlines@onorientedsurf@fromto{0}% + \endpgfextra + }; + \else + \pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn{0}{% + \draw decorate { + \pgfextra + % exchange roles of A <-> B axes: + \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + \pgfplots@drawgridlines@onorientedsurf@fromto{\csname pgfplots@#2min\endcsname}% + \endpgfextra + }; + }{}% + %-------------------------------------------------- + % \pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn{1}{% + % \draw decorate { + % \pgfextra + % % exchange roles of A <-> B axes: + % \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + % \pgfplots@drawgridlines@onorientedsurf@fromto{\csname pgfplots@#2max\endcsname}% + % \endpgfextra + % }; + % }{}% + %-------------------------------------------------- + \fi + \endscope + \fi +}% + +\def\pgfplots@initsizes@smithchart{% + % I copy-pasted most of this code, up to just one position where + % I introduced the modified scaling for smithchart axes + %---------------------------------- + % INIT. + % + % + \def\pgfplots@minmax@reg@forbidden{\pgfplots@error{Sorry, an internal logic error occured during smithchart processing (a routine tried to access \string\pgfplots@xmin@reg\space or its variants). Please report this as bug, sorry}}% + \iffalse + \pgfplots@xmin@reg=\pgfplots@xmin pt % + \pgfplots@xmax@reg=\pgfplots@xmax pt % + \pgfplots@ymin@reg=\pgfplots@ymin pt % + \pgfplots@ymax@reg=\pgfplots@ymax pt % + \ifpgfplots@threedim + \pgfplots@zmin@reg=\pgfplots@zmin pt % + \pgfplots@zmax@reg=\pgfplots@zmax pt % + \fi + \else + \let\pgfplots@xmin@reg=\pgfplots@minmax@reg@forbidden + \let\pgfplots@xmax@reg=\pgfplots@minmax@reg@forbidden + \let\pgfplots@ymin@reg=\pgfplots@minmax@reg@forbidden + \let\pgfplots@ymax@reg=\pgfplots@minmax@reg@forbidden + \let\pgfplots@zmin@reg=\pgfplots@minmax@reg@forbidden + \let\pgfplots@zmax@reg=\pgfplots@minmax@reg@forbidden + \fi + % + % + %----------------------------------------- + % PROCESS THE 'width' and 'height' options + %----------------------------------------- + % + % + \pgfkeysgetvalue{/pgfplots/view/az}{\pgfplots@view@az}% + \pgfkeysgetvalue{/pgfplots/view/el}{\pgfplots@view@el}% + \ifpgfplots@threedim + \def\pgfplots@tmpZscale{1pt}% + \else + \def\pgfplots@tmpZscale{0pt}% + \let\pgfplots@view@el=\pgfutil@empty + \let\pgfplots@view@az=\pgfutil@empty + \fi + \ifx\pgfplots@view@az\pgfutil@empty + %\let\pgfplots@rectangle@width=\pgfutil@empty + %\let\pgfplots@rectangle@height=\pgfutil@empty + \def\pgfplots@view@dir@threedim@x{0}% + \def\pgfplots@view@dir@threedim@y{0}% + \def\pgfplots@view@dir@threedim@z{1}% + % + % FIXME HERE COMES THE smithchart MODIFICATION + %-------------------------------------------------- + % \pgfpointdiff + % {\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}} + % {\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}}% + %-------------------------------------------------- + % instead of scaling from (min) (max), we only need the UPPER + % bound -- in both, x and y directions (since we have a cycle. + % Furthermore, we need it twice since we are interested in the + % diameter, not the radius. + \global\pgf@x=2 pt % radius + \global\pgf@y=\pgf@x % same for y + % + % only used temporarily in this macro to compute the correct + % length for unit vectors: + \edef\pgfplots@initsizes@axisdiag@x{\the\pgf@x}% + \edef\pgfplots@initsizes@axisdiag@y{\the\pgf@y}% + % + \ifx\pgfplots@x\pgfutil@empty + \ifx\pgfplots@width\pgfutil@empty + \pgfplots@error{INTERNAL LOGIC ERROR! WIDTH NOT SET}% + \fi + \pgfplots@initsizes@getXscale\pgfplots@initsizes@axisdiag@x\into\pgfplots@tmpXscale + %\ifpgfplots@scale@only@axis + % \let\pgfplots@rectangle@width=\pgfplots@width + %\fi + \else + \def\pgfplots@tmpXscale{1}% + \fi + % + \ifx\pgfplots@y\pgfutil@empty + \ifx\pgfplots@height\pgfutil@empty + \pgfplots@error{INTERNAL LOGIC ERROR! HEIGHT NOT SET}% + \fi + \pgfplots@initsizes@getYscale\pgfplots@initsizes@axisdiag@y\into\pgfplots@tmpYscale + %\ifpgfplots@scale@only@axis + % \let\pgfplots@rectangle@height=\pgfplots@height + %\fi + \else + \def\pgfplots@tmpYscale{1}% + \fi + % + \edef\pgfplots@tmpXscale{\pgfplots@tmpXscale pt}% + \edef\pgfplots@tmpYscale{\pgfplots@tmpYscale pt}% + % + \pgfplots@initsizes@setunitvector{x}{0}{\pgfplots@tmpXscale}{\pgfplots@tmp@xisaxisparallel}% + \pgfplots@initsizes@setunitvector{y}{1}{\pgfplots@tmpYscale}{\pgfplots@tmp@yisaxisparallel}% + \pgfplots@initsizes@setunitvector{z}{2}{\pgfplots@tmpZscale}{\pgfplots@loc@TMPc}% + \else + % 3D case is currently always initialised by `view': + \let\pgfplots@x=\pgfutil@empty + \let\pgfplots@y=\pgfutil@empty + \let\pgfplots@z=\pgfutil@empty + \pgfplotssetaxesfromazel{\pgfplots@view@az}{\pgfplots@view@el}{\pgfplots@tmp@xisaxisparallel}% + \if1\pgfplots@tmp@xisaxisparallel% + \def\pgfplots@tmp@yisaxisparallel{1}% + \fi + \fi +%\message{Pgfplots debug: initialised unit vectors to x=(\the\pgf@xx,\the\pgf@xy), y=(\the\pgf@yx,\the\pgf@yy), z=(\the\pgf@zx,\the\pgf@zy). }% + % + \let\pgfplotsmathfloatviewdepthxyz@=\pgfplotsmathfloatviewdepthxyz@infigure + \let\pgfplotsmathviewdepthxyz@=\pgfplotsmathviewdepthxyz@infigure + % + \pgfplotsmath@ifzero{\pgfplots@x@veclength}{\pgfplots@hide@xtrue\pgfplots@shownothingof@xtrue}{}% + \pgfplotsmath@ifzero{\pgfplots@y@veclength}{\pgfplots@hide@ytrue\pgfplots@shownothingof@ytrue}{}% + \ifpgfplots@threedim + \pgfplotsmath@ifzero{\pgfplots@z@veclength}{\pgfplots@hide@ztrue\pgfplots@shownothingof@ztrue}{}% + \else + \if1\pgfplots@tmp@xisaxisparallel% + \if1\pgfplots@tmp@yisaxisparallel% + % Optimize for axis-parallel case! + % puh. Did not make any measureable difference!? Ok... + \let\pgfplotsqpointxy=\pgfplotsqpointxy@orthogonal + \fi + \fi + \fi + % + % FIXME : unit vector ratio / axis equal + % +} + +\def\pgfplots@handle@invalid@range@defaultlimits@smithchart{% + \pgfplotscoordmath{x}{parsenumber}{0}% + \global\let\pgfplots@xmin=\pgfmathresult + \pgfplotscoordmath{x}{parsenumber}{16000}% + \global\let\pgfplots@xmax=\pgfmathresult + \global\let\pgfplots@data@xmin=\pgfplots@xmin + \global\let\pgfplots@data@xmax=\pgfplots@xmax + % + \pgfplotscoordmath{y}{parsenumber}{0}% + \global\let\pgfplots@ymin=\pgfmathresult + \pgfplotscoordmath{y}{parsenumber}{16000}% + \global\let\pgfplots@ymax=\pgfmathresult + \global\let\pgfplots@data@ymin=\pgfplots@ymin + \global\let\pgfplots@data@ymax=\pgfplots@ymax + \pgfplotsset{enlargelimits=false}% +} + +\let\pgfplots@set@default@size@options@standard=\pgfplots@set@default@size@options +\def\pgfplots@set@default@size@options@smithchart{% + \pgfplots@set@default@size@options@standard + \pgfplotsset{smithchart ticks by size={\pgfkeysvalueof{/pgfplots/width}}{\pgfkeysvalueof{/pgfplots/height}}}% + % + \if1\b@pgfplots@smithchart@defaultticks@x + \if1\b@pgfplots@smithchart@defaultticks@y + \pgfplotsset{default smithchart xytick}% + \fi + \fi +} +\def\pgfplots@assign@default@tick@foraxis@smithchart#1{% + % do nothing here. I don't know the algorithm yet... but for + % smithcharts, it may be sufficient to simply predefine several + % sets of ticks, depending on the final size. + % + % This is realized in + % \pgfplots@set@default@size@options@smithchart (which is invoked + % before the ticks are processed). + \pgfplots@determinedefaultvalues@needs@check@uniformtickfalse + \expandafter\let\csname pgfplots@tick@distance@#1\endcsname=\pgfutil@empty + % + \pgfplotsset{default smithchart #1tick}% + % ok, I expect the '#1tick' key to be set now. Process it. + % Note that the earlier processing of pgfplots has been bypassed + % at this point -- we need to preprocess the tick list *here*: + \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1tick\endcsname + \expandafter\pgfplots@assign@default@tick@foraxis@smithchart@\expandafter{\pgfplots@loc@TMPa}% + \expandafter\let\csname pgfplots@#1tick\endcsname=\pgfplotsretval + % + \pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \expandafter\pgfplots@assign@default@tick@foraxis@smithchart@\expandafter{\pgfplots@loc@TMPa}% + \pgfkeyslet{/pgfplots/minor #1tick}\pgfplotsretval + \fi + % +}% +% #1: a \foreach list +% on output, \pgfplotsretval contains a parsed list of positions +\def\pgfplots@assign@default@tick@foraxis@smithchart@#1{% + \pgfplotsapplistXXglobalnewempty + \gdef\pgfplots@loc@TMPd{1}% + \foreach \pgfplots@loc@TMPb in {#1} {% + \ifx\pgfplots@loc@TMPb\pgfutil@empty + \else + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@loc@TMPb}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% per convention... + \edef\pgfmathresult{\if0\pgfplots@loc@TMPd,\fi\pgfmathresult}% + \gdef\pgfplots@loc@TMPd{0}% + \expandafter\pgfplotsapplistXXglobalpushback\expandafter{\pgfmathresult}% + \fi + }% + \pgfplotsapplistXXgloballet\pgfplotsretval + \pgfplotsapplistXXglobalclear +}% + +\let\pgfplots@show@ticklabel@@orig=\pgfplots@show@ticklabel@ +\def\pgfplots@show@ticklabel@@smithchart#1#2{% + \def\pgfmathresult{#2}% + \if#1x% + \ifdim#2pt>360pt + \pgfmath@basic@mod@{#2}{360}% + \fi + \fi + \def\pgfplots@loc@TMPa{\pgfplots@show@ticklabel@@orig{#1}}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}% +}% + +\def\pgfplots@xtick@check@tickshow@smithchart{% + \pgfplots@tickshowtrue +} +\def\pgfplots@ytick@check@tickshow@smithchart{% + \pgfplots@tickshowtrue +} + +\let\pgfplots@limits@ready@orig=\pgfplots@limits@ready +\def\pgfplots@limits@ready@smithchart{% + \pgfplots@limits@ready@orig + % + % Avoid tick labels at upper *and* lower angle range if both are the + % same: + \pgfmath@basic@sin@{\pgfplots@xmin}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfmath@basic@sin@{\pgfplots@xmax}% + \pgfplotsmath@ifapproxequal@dim + {\pgfmathresult pt}{\pgfplots@loc@TMPa pt}% + {0.002pt} + {% + \def\pgfplots@xtick@disable@last@tick{1}% + }{% + }% +}% + +\def\smithchart{\smithchartaxis} +\def\endsmithchart{\endsmithchartaxis} + +\def\startsmithchart{\smithchart}% +\def\stopsmithchart{\endsmithchart}% +\endinput diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.ternary.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.ternary.code.tex new file mode 100644 index 00000000000..dfb520af190 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.ternary.code.tex @@ -0,0 +1,904 @@ +%-------------------------------------------- +% +% Package pgfplots, library for ternary plots (triangular axes). +% +% Copyright 2010 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +% +% This is a library to draw ternary diagrams. +% +% A ternary diagram visualizes percentages of three components in a +% triangle. +% +% Sometimes there is also contour data drawn on top of the ternary +% diagram, i.e. data (x,y,z, T(x,y,z) ), but I can't do that yet. +% +% How to read a ternary diagram: http://csmres.jmu.edu/geollab/fichter/SedRx/readternary.html +% +% Another usage example: http://www.sv.vt.edu/classes/MSE2094_NoteBook/96ClassProj/experimental/ternary2.html +% +% Drawing ternary diagrams: http://staff.aist.go.jp/a.noda/programs/ternary/ternary-en.html +% +% computing these coordinates: http://www.gamedev.net/community/forums/topic.asp?topic_id=451357 +% + +\pgfplotsdefineaxistype{ternary}{% + \pgfplots@ternary@activate +}% + +\newif\ifpgfplots@ternary@rellimits + + +\pgfplotsset{ + /pgfplots/ternary limits relative/.is if=pgfplots@ternary@rellimits, + /pgfplots/ternary limits relative=true, + /pgfplots/ternary limits relative/.default=true, + /pgfplots/ternary relative limits/.style={/pgfplots/ternary limits relative=#1}, + /pgfplots/ternary start x/.initial=, % FIXME : implement + /pgfplots/ternary start y/.initial=, + /pgfplots/ternary start z/.initial=, + /pgfplots/every ternary axis/.style={ + /pgfplots/tick align=outside, + grid=major, + xticklabel style={anchor=west}, + % yticklabel style={anchor=south east}, + % zticklabel style={anchor=north}, + /pgfplots/every 3d description/.style={}, + /pgfplots/every axis x label/.style={at={(ticklabel cs:0.5)},anchor=near ticklabel},% + /pgfplots/every axis y label/.style={at={(ticklabel cs:0.5)},anchor=near ticklabel},% + /pgfplots/every axis z label/.style={at={(ticklabel cs:0.5)},anchor=near ticklabel},% + /pgfplots/every x tick scale label/.style={at={(xticklabel cs:0.95,5pt)},anchor=near xticklabel,inner sep=0pt}, + /pgfplots/every y tick scale label/.style={at={(yticklabel cs:0.95,5pt)},anchor=near yticklabel,inner sep=0pt}, + /pgfplots/every z tick scale label/.style={at={(yticklabel cs:0.95,5pt)},anchor=near yticklabel,inner sep=0pt}, + /pgfplots/every axis title shift=15pt, + /pgfplots/every axis legend/.style={% + cells={anchor=center}, + inner xsep=3pt,inner ysep=2pt,nodes={inner sep=2pt,text depth=0.15em}, + shape=rectangle,% + fill=white,% + draw=black, + at={(1.03,1.03)}, + anchor=north west,% + }, + annot/point format 3d/.initial={(\%.2f, \%.2f, \%.2f)}, + }, +} + +\def\pgfplots@ternary@activate{% + \let\pgfplotsqpointxy=\pgfplotsqpointxy@ternary + \let\pgfplotsqpointxy@orthogonal=\pgfplotsqpointxy + \let\pgfplotsqpointxyz=\pgfplotsqpointxyz@ternary + \let\pgfplots@draw@axis=\pgfplots@draw@axis@ternary + \def\pgfplots@drawaxis@outerlines@separate@onorientedsurf##1##2{}% + \def\pgfplots@drawaxis@innerlines@onorientedsurf##1##2##3{}% + \let\pgfplots@draw@axis@post=\pgfplots@draw@axis@post@ternary + \let\pgfplots@initsizes=\pgfplots@initsizes@ternary + \let\pgfplotspoint@initialisation@axes=\pgfplotspoint@initialisation@axes@ternary + \let\pgfplotspoint@initialisation@units=\pgfplotspoint@initialisation@units@ternary + \let\pgfplots@initsizes@setunitvector=\pgfplots@initsizes@setunitvector@ternary + \let\pgfplotspointouternormalvectorofaxis@=\pgfplotspointouternormalvectorofaxis@ternary + \let\pgfplots@prepare@ZERO@coordinates=\pgfplots@prepare@ZERO@coordinates@ternary + \let\pgfplotsgetnormalforcurrentview=\relax + \def\pgfplots@drawtickgridlines@INSTALLCLIP@onorientedsurf##1{}% + \let\pgfplots@clippath@prepare@for@axistype=\pgfplots@clippath@prepare@for@axistype@ternary + % + \pgfkeys{/pgfplots/oriented surf installed/.add={}{% + \let\pgfplotspointonorientedsurfaceab@ternary@orig=\pgfplotspointonorientedsurfaceab + \let\pgfplotspointonorientedsurfaceab=\pgfplotspointonorientedsurfaceab@ternary + }}% + \let\pgfplotspointonorientedsurfaceabwithbshift=\pgfplotspointonorientedsurfaceabwithbshift@ternary + \pgfkeyssetvalue{/pgfplots/view/az}{}% + \pgfkeyssetvalue{/pgfplots/view/el}{}% + \let\pgfplots@set@options@sanitize=\relax + \let\pgfplots@set@options@sanitizemode=\relax + % + \expandafter\def\expandafter\pgfplots@notify@options@are@set\expandafter{\pgfplots@notify@options@are@set + \ifpgfplots@ternary@rellimits + \pgfplotsset{scaled ticks=false,ticklabel style={/pgf/number format/precision=0}}% + \let\pgfplots@show@ticklabel@orig=\pgfplots@show@ticklabel@ + \let\pgfplots@show@ticklabel@=\pgfplots@show@ticklabel@ternary@relative + \fi + }% + % + % this here is set *before* 'every ternary axis' is invoked. + \pgfplotsset{ + /pgfplots/footnotesize/.append style= {/pgfplots/every axis title shift=15pt},% + /pgfplots/tiny/.append style= {/pgfplots/every axis title shift=15pt},% + enlargelimits=false, + xmin=0,xmax=1, + ymin=0,ymax=1, + zmin=0,zmax=1, + annot/point format/.style={/pgfplots/annot/point format 3d={##1}}, + }% + \def\pgfplots@xticklabel@pos{}% + \def\pgfplots@yticklabel@pos{}% + \def\pgfplots@zticklabel@pos{}% + %\def\pgfplots@xaxislinesnum{1}% + %\def\pgfplots@yaxislinesnum{3}% + %\def\pgfplots@zaxislinesnum{3}% + \def\pgfplotsifaxissurfaceisforeground##1##2##3{##2}% + \def\pgfplots@init@ticklabelaxisspecfor##1##2{}% + \def\pgfplots@xticklabelaxisspec{v00}% + \def\pgfplots@yticklabelaxisspec{0v0}% + \def\pgfplots@zticklabelaxisspec{00v}% + \def\pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn@##1##2##3{% + \pgfplotspointonorientedsurfaceabtolinespec v##1% + \edef\pgfplots@loc@TMPe{\csname pgfplots@\pgfplotspointonorientedsurfaceA ticklabelaxisspec\endcsname}% + \ifx\pgfplots@loc@TMPe\pgfplotsretval +%\message{pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn@{##1}---> TRUE.}% + ##2% + \else +%\message{pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn@{##1}---> FALSE.}% + ##3% + \fi + }% + \def\pgfplots@ifgridlines@onorientedsurf@should@be@drawn##1##2{% + ##1% FIXME + }% + \def\pgfplotspointonorientedsurfaceabmatchaxisline##1##2{% + \pgfplotspointonorientedsurfaceabtolinespec v0% FIXME that's just a bad guess! + \edef\pgfplots@loc@TMPe{##1}% + \ifx\pgfplots@loc@TMPe\pgfplotsretval + \def##2{0}% + \else + \def##2{}% + \fi + }% + \let\pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn=\pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn@% + % + % + % cartesian cs + \tikzdeclarecoordinatesystem{cartesian}{\edef\pgfplots@loc@TMPa{##1}\expandafter\pgfplotspointcartesian@\pgfplots@loc@TMPa\pgfplots@coord@end} +}% + +\def\pgfplots@show@ticklabel@ternary@relative#1#2{% + \csname pgfplots@ternary@map@to@unit@#1\endcsname{#2}% + \pgfmathfloatparsenumber\pgfmathresult + \pgfmathfloatshift@\pgfmathresult{2}% + \let\tick=\pgfmathresult +}% + +\def\pgfplotspointcartesian@#1,#2\pgfplots@coord@end{% + \pgfpointxy@orig{#1}{#2}% +}% + +% This here is *the* key point why ternary axes can be processed with +% almost the same code as rectangular axes. +% +% Recall that rectangular axes are drawn using "oriented surfaces", +% the complete code is based on them. The "a" axis is the direction in +% which we have tick positions and the "b" axis is the direction in +% which tick lines (or grid lines) shall be drawn). +% +% Now, ternary axes do not directly fit into the "oriented surface" +% framework. But they have a lot of structure which allows to use it +% with a specialed "pointonorientedsurfaceab" routine: by noting that +% - there are only three axes, +% - the axis containing tick lines (and grid lines) *always* has one +% component set to 0 (lower limit), and the remaining two components +% sum to 1. Thus, we can simply use one value (for example the "a" +% value) and compute the remaining one, +% - \pgfplotspointonorientedsurfaceab is *always* invoked with +% b set to either the lower or the upper limit. +% The lower limit is easy, see above. The upper limit is mainly used +% for grid lines, more precisely it denotes the target point of the grid line. +% I use special handling to find this target point (by exchanging +% coordinate components, see the implementation). +% +% #1: the "a" value on the oriented surf +% #2: the "b" value. Note that *only* the lower *or* the upper limit +% on the "b" axis are supported here! +% +\def\pgfplotspointonorientedsurfaceab@ternary#1#2{% + \let\pgfplotspointonorientedsurfaceab@ternary@fixedx=\pgfplotspointonorientedsurfaceabsetupfor@fixedx + \let\pgfplotspointonorientedsurfaceab@ternary@fixedy=\pgfplotspointonorientedsurfaceabsetupfor@fixedy + \let\pgfplotspointonorientedsurfaceab@ternary@fixedz=\pgfplotspointonorientedsurfaceabsetupfor@fixedz + % +%\message{\string\pgfplotspointonorientedsurfaceab{#1}{#2} -----> }% + \ifpgfplots@ternary@next@is@unitinterval + \edef\pgfplotspointonorientedsurfaceab@ternary@A{#1}% + \edef\pgfplotspointonorientedsurfaceab@ternary@B{#2}% + \else + \csname pgfplots@ternary@map@to@unit@\pgfplotspointonorientedsurfaceA\endcsname{#1}% + \let\pgfplotspointonorientedsurfaceab@ternary@A=\pgfmathresult + % + \csname pgfplots@ternary@map@to@unit@\pgfplotspointonorientedsurfaceB\endcsname{#2}% + \let\pgfplotspointonorientedsurfaceab@ternary@B=\pgfmathresult + \fi + \if0\pgfplotspointonorientedsurfacespecsymbol + \else + \pgfplots@error{Internal processing error: only \string\pgfplotspointonorientedsurfaceab\space for ternary axes works only for oriented surfs fixed to LOWER or UPPER axis limits.}% + \fi +%\message{A=\pgfplotspointonorientedsurfaceab@ternary@A; B=\pgfplotspointonorientedsurfaceab@ternary@B -----> }% + \ifdim\pgfplotspointonorientedsurfaceab@ternary@B pt=0pt + \pgfmath@basic@subtract@{1}{\pgfplotspointonorientedsurfaceab@ternary@A}% + \let\pgfplotspointonorientedsurfaceab@ternary@B=\pgfmathresult + \expandafter\def\csname pgfplotspointonorientedsurfaceabsetupfor@fixed\pgfplotspointonorientedsurfaceN\endcsname{0}% + \else + %\let\pgfplots@loc@TMPa=\pgfplotspointonorientedsurfaceab@ternary@A + %\pgfmath@basic@subtract@{1}{\pgfplotspointonorientedsurfaceab@ternary@A}% + %\let\pgfplotspointonorientedsurfaceab@ternary@A=\pgfmathresult + %\let\pgfplotspointonorientedsurfaceab@ternary@B=\pgfplots@loc@TMPa + \pgfmath@basic@subtract@{1}{\pgfplotspointonorientedsurfaceab@ternary@A}% + \def\pgfplotspointonorientedsurfaceab@ternary@B{0}% + \expandafter\let\csname pgfplotspointonorientedsurfaceabsetupfor@fixed\pgfplotspointonorientedsurfaceN\endcsname=\pgfmathresult% + \fi + % + \global\pgfplots@ternary@next@is@unitintervaltrue +%\message{\string\pgfplotspointonorientedsurfaceab@orig{\pgfplotspointonorientedsurfaceab@ternary@A}{\pgfplotspointonorientedsurfaceab@ternary@B}[fixedsymbol=\pgfplotspointonorientedsurfacespecsymbol; a=\pgfplotspointonorientedsurfaceA,b=\pgfplotspointonorientedsurfaceB.]}% + \pgfplotspointonorientedsurfaceab@ternary@orig + {\pgfplotspointonorientedsurfaceab@ternary@A}% + {\pgfplotspointonorientedsurfaceab@ternary@B}% + % + \let\pgfplotspointonorientedsurfaceabsetupfor@fixedx=\pgfplotspointonorientedsurfaceab@ternary@fixedx + \let\pgfplotspointonorientedsurfaceabsetupfor@fixedy=\pgfplotspointonorientedsurfaceab@ternary@fixedy + \let\pgfplotspointonorientedsurfaceabsetupfor@fixedz=\pgfplotspointonorientedsurfaceab@ternary@fixedz +}% + +\def\pgfplotspointonorientedsurfaceabwithbshift@ternary#1#2#3{% + % implement the shift in "b" direction explicitly: + % + \pgfplotspointonorientedsurfaceab@ternary{#1}{#2}% + \edef\pgfplots@loc@TMPe{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + \pgfpointadd + {\pgfplots@loc@TMPe}% + {% + \begingroup + % I need a '-' here because for ternary axes, the "b" axis + % points to the *outside* instead of the inside. + \pgf@xa=-#3\relax + \if r\pgfkeysvalueof{/pgfplots/\pgfplotspointonorientedsurfaceB\space dir/value}% + % oh. a reversed axis. + \pgf@xa=-\pgf@xa + \fi + \edef\pgfplots@loc@TMPa{\pgf@sys@tonumber\pgf@xa}% + \pgfmath@basic@multiply@{\csname pgfplots@\pgfplotspointonorientedsurfaceB @inverseveclength\endcsname}{\pgfplots@loc@TMPa}% + \pgfmath@smuggleone\pgfmathresult + \endgroup + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfqpointscale{\pgfplots@loc@TMPa}{\csname pgfplotspointunit\pgfplotspointonorientedsurfaceB\endcsname}% + }% +} + + +\let\pgfplots@initsizes@ternary@orig=\pgfplots@initsizes +\def\pgfplots@initsizes@ternary{% + \ifpgfplots@threedim + \else + \pgfplots@error{Sorry, 'axis type=ternary' needs a three dimensional axes. Make sure you supplied three dimensional coordinates (using \string\addplot3, for example). This error is critical; I can't recover}% + \fi +%\message{ternary with limits x=[\pgfplots@xmin:\pgfplots@xmax], y=[\pgfplots@ymin:\pgfplots@ymax]; z=[\pgfplots@zmin:\pgfplots@zmax].}% + \pgfplots@ternary@init@map@to@unit x + \pgfplots@ternary@init@map@to@unit y + \pgfplots@ternary@init@map@to@unit z + % + \pgfplots@initsizes@get@width@withoutlabels + \pgf@x=\pgfmathresult + \edef\pgfplots@width@ternary{\pgf@sys@tonumber\pgf@x}% + % + \pgfplots@initsizes@ternary@orig + % +}% + +\def\pgfplots@ternary@init@map@to@unit#1{% + \begingroup + \pgfmath@basic@subtract@ + {\csname pgfplots@#1max\endcsname} + {\csname pgfplots@#1min\endcsname}% + \pgfmath@basic@reciprocal@\pgfmathresult + \let\pgfplots@map@to@unit@scale=\pgfmathresult + % + \expandafter\xdef\csname pgfplots@ternary@map@to@unit@#1\endcsname##1{% + \noexpand\pgfmath@basic@subtract@{##1}{\csname pgfplots@#1min\endcsname}% + \noexpand\pgfmath@basic@multiply@{\noexpand\pgfmathresult}{\pgfplots@map@to@unit@scale}% + }% + \endgroup +} + +\def\pgfplots@initsizes@setunitvector@ternary#1#2#3#4{% + % ternary axis are DIFFERENT here. + % They don't use the (xx,xy), (yx,yy), (zx,zy) vectors, so we can + % use them to realize *cartesian* coordinates. + % + % Thus, any \draw (0,0) inside of a ternary axis will yield + % cartesian coordinates. + % + % The relevant quantities to *draw* the diagram are the three + % axis, they are also prepared here. + % + \def#4{0}% whether we have (#1,0) or (0,#1) + \ifcase#2% + \pgfsetxvec{% + \pgfqpoint{\pgfplots@width@ternary pt}{0pt}% + }% + \pgfpointdiff + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary001} + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary100}% + \or + \pgfsetyvec{% + \pgfqpoint{0pt}{\pgfplots@width@ternary pt}% + }% + \pgfpointdiff + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary100} + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary010}% + \or + \pgfsetzvec{% + \pgfpointorigin + }% + \pgfpointdiff + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary010} + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary001}% + \fi + \expandafter\xdef\csname pgfplotspoint#1axis\endcsname{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \expandafter\let\csname pgfplots@#1@veclength\endcsname=\pgfmathresult + \pgfplotsmath@ifzero{\pgfmathresult}{% + \expandafter\def\csname pgfplots@#1@inverseveclength\endcsname{infty}% + }{% + \expandafter\pgfmathreciprocal@\expandafter{\pgfmathresult}% + \expandafter\let\csname pgfplots@#1@inverseveclength\endcsname=\pgfmathresult + }% + \expandafter\xdef\csname pgfplotspoint#1axislength\endcsname{\pgfplots@x@veclength pt}% + % +%\message{-> got unitvector(#1) = (\the\csname pgf@#1x\endcsname, \the\csname pgf@#1y\endcsname).}% +}% + +\newif\ifpgfplots@ternary@next@is@unitinterval + +% Deduce z = 1-x-y after transformation to relative coordinates. +\def\pgfplotsqpointxy@ternary#1#2{% + \pgf@process{% + \ifpgfplots@ternary@next@is@unitinterval + \dimen1=#1pt + \dimen2=#2pt + \else + \pgfplots@ternary@map@to@unit@x{#1}% + \dimen1=\pgfmathresult pt + % + \pgfplots@ternary@map@to@unit@y{#2}% + \dimen2=\pgfmathresult pt + \fi + \dimen4=\dimen1 + \advance\dimen4 by\dimen2 + \dimen3=1pt + \advance\dimen3 by-\dimen4 + % + \global\pgfplots@ternary@next@is@unitintervalfalse + \pgfplotsqpointxyz@ternary@ + }% +}% +% gx(x,y,z) = 0.5 * (x + 2*z)/(x+y+z) +% gy(x,y,z) = (sqrt(3) / 2) * x / (x+y+z) +\def\pgfplotsqpointxyz@ternary#1#2#3{% + \pgf@process{% + \ifpgfplots@ternary@next@is@unitinterval + \dimen1=#1pt + \dimen2=#2pt + \dimen3=#3pt + \else + \pgfplots@ternary@map@to@unit@x{#1}% + \dimen1=\pgfmathresult pt + % + \pgfplots@ternary@map@to@unit@y{#2}% + \dimen2=\pgfmathresult pt + % + \pgfplots@ternary@map@to@unit@z{#3}% + \dimen3=\pgfmathresult pt + \fi + \global\pgfplots@ternary@next@is@unitintervalfalse + % + \pgfplotsqpointxyz@ternary@ + }% +}% +\def\pgfplotsqpointxyz@ternary@{% + %\dimen1=#1 + %\dimen2=#2 + %\dimen3=#3 + % FIXME . I didn't understand that stuff. + \if r\pgfkeysvalueof{/pgfplots/x dir/value}% reversed + %\multiply\dimen1 by-1 + %\advance\dimen1 by1pt + %\dimen1=#2 + %\dimen2=#3 + %\dimen3=#1 + \fi + %-------------------------------------------------- + % \if r\pgfkeysvalueof{/pgfplots/y dir/value}% reversed + % \multiply\dimen2 by-1 + % \advance\dimen2 by1pt + % \fi + % \if r\pgfkeysvalueof{/pgfplots/z dir/value}% reversed + % \multiply\dimen3 by-1 + % \advance\dimen3 by1pt + % \fi + %-------------------------------------------------- + \pgfplotsqpointxyz@ternary@@% +}% +\def\pgfplotsqpointxyz@ternary@@{% + % Disable renormalization!? + %\dimen4=\dimen1 + %\advance\dimen4 by\dimen2 + %\advance\dimen4 by\dimen3 + %\edef\pgfplots@ternary@sum{\pgf@sys@tonumber{\dimen4}}% + %\pgfmathapproxequalto@{1}{\pgfplots@ternary@sum}% + \pgfmathcomparisontrue + \ifpgfmathcomparison + \let\pgfplots@ternary@scale=\pgfplots@width@ternary + \else + \pgfmath@basic@divide@ + {\pgfplots@width@ternary}% + {\pgfplots@ternary@sum}% + \let\pgfplots@ternary@scale=\pgfmathresult + \fi + % + \dimen4=2\dimen3 + \advance\dimen4 by \dimen1 + \divide\dimen4 by2 + \pgf@x=\pgfplots@ternary@scale\dimen4 + % + \dimen4=\dimen1 + \dimen4=0.866025403784\dimen4 % *= sqrt(3)/2 + \pgf@y=\pgfplots@ternary@scale\dimen4 + % +}% +\def\pgfplotspoint@initialisation@units@ternary{% + \let\pgfplotspointunitx\pgfplotspointxaxis + \let\pgfplotspointunity\pgfplotspointyaxis + \let\pgfplotsunitxlength=\pgfplots@x@veclength + \let\pgfplotsunitylength=\pgfplots@y@veclength + \let\pgfplotsunitxinvlength=\pgfplots@x@inverseveclength + \let\pgfplotsunityinvlength=\pgfplots@y@inverseveclength + \ifpgfplots@threedim + \let\pgfplotspointunitz=\pgfplotspointzaxis + \let\pgfplotsunitzlength=\pgfplots@z@veclength + \let\pgfplotsunitzinvlength=\pgfplots@z@inverseveclength + \fi +}% + +% POSTCONDITION: the macros +% \pgfplotspointminminmin +% \pgfplotspoint[xyz]axis +% \pgfplotspoint[xyz]axislength +% are defined (globally). +\def\pgfplotspoint@initialisation@axes@ternary{% + \xdef\pgfplotspointminminmin{\noexpand\pgfpointorigin}% + % + \pgfpointdiff + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary001} + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary100}% + \if r\pgfkeysvalueof{/pgfplots/x dir/value}% reverse + \pgfqpointscale{-1}{}% + \fi + \xdef\pgfplotspointxaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \expandafter\let\csname pgfplots@x@veclength\endcsname=\pgfmathresult + \pgfplotsmath@ifzero{\pgfmathresult}{% + \expandafter\def\csname pgfplots@x@inverseveclength\endcsname{infty}% + }{% + \expandafter\pgfmathreciprocal@\expandafter{\pgfmathresult}% + \expandafter\let\csname pgfplots@x@inverseveclength\endcsname=\pgfmathresult + }% + \xdef\pgfplotspointxaxislength{\pgfplots@x@veclength pt}% + % + \pgfpointdiff + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary100} + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary010}% + \if r\pgfkeysvalueof{/pgfplots/y dir/value}% reverse + \pgfqpointscale{-1}{}% + \fi + \xdef\pgfplotspointyaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \expandafter\let\csname pgfplots@y@veclength\endcsname=\pgfmathresult + \pgfplotsmath@ifzero{\pgfmathresult}{% + \expandafter\def\csname pgfplots@y@inverseveclength\endcsname{infty}% + }{% + \expandafter\pgfmathreciprocal@\expandafter{\pgfmathresult}% + \expandafter\let\csname pgfplots@y@inverseveclength\endcsname=\pgfmathresult + }% + \xdef\pgfplotspointyaxislength{\pgfplots@y@veclength pt}% + % + \pgfpointdiff + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary010} + {\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz@ternary001}% + \if r\pgfkeysvalueof{/pgfplots/z dir/value}% reverse + \pgfqpointscale{-1}{}% + \fi + \xdef\pgfplotspointzaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \expandafter\let\csname pgfplots@z@veclength\endcsname=\pgfmathresult + \pgfplotsmath@ifzero{\pgfmathresult}{% + \expandafter\def\csname pgfplots@z@inverseveclength\endcsname{infty}% + }{% + \expandafter\pgfmathreciprocal@\expandafter{\pgfmathresult}% + \expandafter\let\csname pgfplots@z@inverseveclength\endcsname=\pgfmathresult + }% + \xdef\pgfplotspointzaxislength{\pgfplots@z@veclength pt}% + % +} +\def\pgfplots@prepare@ZERO@coordinates@ternary{% + \ifpgfplots@xislinear + \ifpgfplots@apply@datatrafo@x + \pgfplotscoordmath{x}{parsenumber}{0}% + \pgfplotscoordmath{x}{datascaletrafo}{\pgfmathresult}% + \global\let\pgfplots@logical@ZERO@x=\pgfmathresult + \else + \gdef\pgfplots@logical@ZERO@x{0}% + \fi + \pgfplotsmathmax{\pgfplots@logical@ZERO@x}{\pgfplots@xmin}% + \global\let\pgfplots@logical@ZERO@x=\pgfmathresult + \pgfplotsmathmin{\pgfplots@logical@ZERO@x}{\pgfplots@xmax}% + \global\let\pgfplots@logical@ZERO@x=\pgfmathresult + \else + \global\let\pgfplots@logical@ZERO@x=\pgfplots@xmin% + \fi + % + \ifpgfplots@yislinear + \ifpgfplots@apply@datatrafo@y + \pgfplotscoordmath{y}{parsenumber}{0}% + \pgfplotscoordmath{y}{datascaletrafo}{\pgfmathresult}% + \global\let\pgfplots@logical@ZERO@y=\pgfmathresult + \else + \gdef\pgfplots@logical@ZERO@y{0}% + \fi + \pgfplotsmathmax{\pgfplots@logical@ZERO@y}{\pgfplots@ymin}% + \global\let\pgfplots@logical@ZERO@y=\pgfmathresult + \pgfplotsmathmin{\pgfplots@logical@ZERO@y}{\pgfplots@ymax}% + \global\let\pgfplots@logical@ZERO@y=\pgfmathresult + \else + \global\let\pgfplots@logical@ZERO@y=\pgfplots@ymin% + \fi + % + \ifpgfplots@threedim + \ifpgfplots@zislinear + \ifpgfplots@apply@datatrafo@z + \pgfplotscoordmath{z}{parsenumber}{0}% + \pgfplotscoordmath{z}{datascaletrafo}{\pgfmathresult}% + \global\let\pgfplots@logical@ZERO@z=\pgfmathresult + \else + \gdef\pgfplots@logical@ZERO@z{0}% + \fi + \pgfplotsmathmax{\pgfplots@logical@ZERO@z}{\pgfplots@zmin}% + \global\let\pgfplots@logical@ZERO@z=\pgfmathresult + \pgfplotsmathmin{\pgfplots@logical@ZERO@z}{\pgfplots@zmax}% + \global\let\pgfplots@logical@ZERO@z=\pgfmathresult + \else + \global\let\pgfplots@logical@ZERO@z=\pgfplots@zmin% + \fi + \fi + % + % + \global\pgfplots@ternary@next@is@unitintervaltrue + \pgfplotsqpointxyz100% + \xdef\pgfplots@ZERO@x{\the\pgf@x}% + \xdef\pgfplots@ZERO@y{\the\pgf@y}% + \xdef\pgfplotspointaxisorigin{\noexpand\pgf@x=\pgfplots@ZERO@x\space\noexpand\pgf@y=\pgfplots@ZERO@y\space}% +}% + + +\def\pgfplots@draw@axis@ternary{% + % + % this should become the line for varying y: + \pgfplotspointonorientedsurfaceabsetupforsetz{\pgfplots@zmin}{0}% + \pgfplots@draw@axis@insurface yxz + % + % this should become the line for varying z: + \pgfplotspointonorientedsurfaceabsetupforsetx{\pgfplots@xmin}{0}% + \pgfplots@draw@axis@insurface zyx + % + % + % this should become the line for varying x: + \pgfplotspointonorientedsurfaceabsetupforsety{\pgfplots@ymin}{0}% + \pgfplots@draw@axis@insurface xzy + % + \pgfplots@ternary@draw@axislines +}% +\def\pgfplots@ternary@draw@axislines{% + \if r\pgfkeysvalueof{/pgfplots/x dir/value}% reverse + \pgfplots@separate@axis@linestrue + \fi + \if r\pgfkeysvalueof{/pgfplots/y dir/value}% reverse + \pgfplots@separate@axis@linestrue + \fi + \if r\pgfkeysvalueof{/pgfplots/z dir/value}% reverse + \pgfplots@separate@axis@linestrue + \fi + \ifpgfplots@separate@axis@lines + \scope[/pgfplots/every outer x axis line, + xdiscont,decoration={pre length=\csname xdisstart\endcsname, post length=\csname xdisend\endcsname}] + \draw decorate { + \pgfextra + \if r\pgfkeysvalueof{/pgfplots/x dir/value}% reverse + \pgfpathmoveto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz100}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz001}% + \else + \pgfpathmoveto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz001}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz100}% + \fi + \endpgfextra + }; + \endscope + % + \scope[/pgfplots/every outer y axis line, + ydiscont,decoration={pre length=\csname ydisstart\endcsname, post length=\csname ydisend\endcsname}] + \draw decorate { + \pgfextra + \if r\pgfkeysvalueof{/pgfplots/y dir/value}% reverse + \pgfpathmoveto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz010}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz100}% + \else + \pgfpathmoveto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz100}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz010}% + \fi + \endpgfextra + }; + \endscope + % + \scope[/pgfplots/every outer z axis line, + zdiscont,decoration={pre length=\csname zdisstart\endcsname, post length=\csname zdisend\endcsname}] + \draw decorate { + \pgfextra + \if r\pgfkeysvalueof{/pgfplots/z dir/value}% reverse + \pgfpathmoveto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz001}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz010}% + \else + \pgfpathmoveto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz010}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz001}% + \fi + \endpgfextra + }; + \endscope + \else + \draw[ + /pgfplots/every outer x axis line, % FIXME! these outer styles need much more attention :-( + /pgfplots/every outer y axis line] + \pgfextra{% + \pgfpathmoveto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz001}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz100}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz010}% + \pgfpathclose + }; + \fi +}% +\def\pgfplots@clippath@prepare@for@axistype@ternary{% + \def\pgfplots@clippath@install##1{% + \pgfpathmoveto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz001}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz100}% + \pgfpathlineto{\global\pgfplots@ternary@next@is@unitintervaltrue\pgfplotsqpointxyz010}% + \pgfpathclose + \pgfplots@clippath@use@{##1}% + }% +}% + +\def\pgfplots@draw@axis@post@ternary{% + % do nothing. There is no 3d box to draw here. +}% + +\def\pgfplotspointouternormalvectorofaxis@ternary#1#2#3\relax{% + \edef\pgfplots@loc@TMPa{\if r\pgfkeysvalueof{/pgfplots/x dir/value}-\fi}% reverse + \edef\pgfplots@loc@TMPb{\if r\pgfkeysvalueof{/pgfplots/y dir/value}-\fi}% reverse + \edef\pgfplots@loc@TMPc{\if r\pgfkeysvalueof{/pgfplots/z dir/value}-\fi}% reverse + \if v#1% + \pgfpointadd + {\pgfqpointscale{\pgfplots@loc@TMPb-1}{\pgfplotspointyaxis}}% + {\pgfqpointscale{\pgfplots@loc@TMPc}{\pgfplotspointzaxis}}% + \else + \if v#2% + \pgfpointadd + {\pgfqpointscale{\pgfplots@loc@TMPa}{\pgfplotspointxaxis}}% + {\pgfqpointscale{\pgfplots@loc@TMPc-1}{\pgfplotspointzaxis}}% + \else + \pgfpointadd + {\pgfqpointscale{\pgfplots@loc@TMPa-1}{\pgfplotspointxaxis}}% + {\pgfqpointscale{\pgfplots@loc@TMPb}{\pgfplotspointyaxis}}% + \fi + \fi + \pgf@process{\pgfpointnormalised{}}% + \endgroup +}% + + +\def\pgfplotsclickable@check@enable@axistype@ternaryaxis{% + \def\pgfplotsretval{1}% +}% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +% tieline plots +% +\pgfplotsset{ + tieline/.code={% + \let\tikz@plot@handler=\pgfplotsplothandlertieline + \pgfkeysifdefined{/pgfplots/table/tie end x}{}{% + % provide these keys locally: + \pgfkeyslet{/pgfplots/table/tie end x}\pgfutil@empty% + \pgfkeyslet{/pgfplots/table/tie end y}\pgfutil@empty% + \pgfkeyslet{/pgfplots/table/tie end z}\pgfutil@empty% + \pgfkeyslet{/pgfplots/table/tie end x index}\pgfutil@empty% + \pgfkeyslet{/pgfplots/table/tie end y index}\pgfutil@empty% + \pgfkeyslet{/pgfplots/table/tie end z index}\pgfutil@empty% + }% + \pgfqkeys{/pgfplots/tieline}{#1}% + }, + tieline/every tieline/.style={}, + tieline/tieline style/.style={/pgfplots/tieline/every tieline/.append style={#1}}, + tieline/every curve/.style={}, + tieline/curve style/.style={/pgfplots/tieline/every curve/.append style={#1}}, + tieline/each nth tie/.initial=, +} +\def\pgfplotsplothandlertieline{% + \pgfplotsresetplothandler + \let\pgf@plotstreamstart=\pgfplotsplothandlervisbegin@tieline + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@tieline + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@tieline + \let\pgfplotsplothandlersurveyend=\pgfplotsplothandlersurveyend@tieline +}% +\def\pgfplotsplothandlervisbegin@tieline{% + \pgfplotsapplistXnewempty\pgfp@binodal@A + \pgfplotsapplistXnewempty\pgfp@ties + \pgfplotsprependlistXnewempty{pgfp@binodal@B@reverse} + \def\b@pgfplotsplothandlersurveystart@tieline@even{1}% + % + \global\let\pgf@plotstreampoint=\pgfplotsplothandlervis@streampoint@tieline + \global\let\pgf@plotstreamend=\pgfplotsplothandlervis@streamend@tieline + % + \pgfkeysgetvalue{/pgfplots/tieline/each nth tie}\pgfplots@eachnth@tie + \ifx\pgfplots@eachnth@tie\pgfutil@empty + \def\pgfplots@eachnth@tie{1}% + \fi + \let\c@pgfplots@tiecounter=\c@pgfplotstable@counta + \c@pgfplots@tiecounter=0 +}% +\def\pgfplotsplothandlervis@streampoint@tieline#1{% + \pgf@process{#1}% + \edef\pgfplots@loc@TMPa{% + \noexpand\pgfplots@stream@withmeta@ + {\pgfplots@current@point@coordindex}% + {\the\pgf@x}{\the\pgf@y}% + {\pgfplots@current@point@meta}% + }% + \if1\b@pgfplotsplothandlersurveystart@tieline@even + \let\pgfplotsplothandlervis@streampoint@tieline@last=\pgfplots@loc@TMPa + \expandafter\pgfplotsapplistXpushback\pgfplots@loc@TMPa\to\pgfp@binodal@A + \def\b@pgfplotsplothandlersurveystart@tieline@even{0}% + \else + \expandafter\pgfplotsprependlistXpushfront\pgfplots@loc@TMPa\to{pgfp@binodal@B@reverse}% + % + \advance\c@pgfplots@tiecounter by1 + \ifnum\pgfplots@eachnth@tie=\c@pgfplots@tiecounter + \t@pgfplots@toka=\expandafter{\pgfplots@loc@TMPa}% + \t@pgfplots@tokb=\expandafter{\pgfplotsplothandlervis@streampoint@tieline@last}% + \edef\pgfplots@loc@TMPa{\the\t@pgfplots@toka\the\t@pgfplots@tokb\noexpand\pgfplotsplothandlertieline@finishtie}% + \expandafter\pgfplotsapplistXpushback\pgfplots@loc@TMPa\to\pgfp@ties + \c@pgfplots@tiecounter=0 + \fi + % + \def\b@pgfplotsplothandlersurveystart@tieline@even{1}% + \fi +}% +\def\pgfplotsplothandlervis@streamend@tieline{% + \begingroup + \pgfplots@drawmodes@appendtrue + \path[/pgfplots/tieline/every curve]% + \pgfextra + \ifx\tikz@plot@handler\pgfplotsplothandlertieline + \let\tikz@plot@handler\pgfplothandlerlineto + \fi + \pgfplotsresetplothandler + \tikz@plot@handler + \pgf@plotstreamstart + % + \pgfplotsapplistXlet\pgfplots@loc@TMPa=\pgfp@binodal@A + \pgfplots@loc@TMPa + \pgfplotsapplistXnewempty\pgfp@binodal@A + \pgfplotsprependlistXlet\pgfplots@loc@TMPa={pgfp@binodal@B@reverse}% + \pgfplots@loc@TMPa + \pgfplotsprependlistXnewempty{pgfp@binodal@B@reverse}% + % + \pgf@plotstreamend + \endpgfextra; + \endgroup + % + % + \pgfplotsset{/pgfplots/tieline/every tieline}% + \ifx\tikz@plot@handler\pgfplotsplothandlertieline + \let\tikz@plot@handler\pgfplothandlerlineto + \fi + \pgfplotsresetplothandler + \tikz@plot@handler + \pgf@plotstreamstart + % + \def\pgfplotsplothandlertieline@finishtie{% + \pgfplotsplothandlervisualizejump + }% + \pgfplotsapplistXlet\pgfplots@loc@TMPa=\pgfp@ties + \pgfplots@loc@TMPa + \pgfplotsapplistXnewempty\pgfp@ties + % + \pgf@plotstreamend +}% + +\def\pgfplotsplothandlersurveystart@tieline{% + \def\pgfplots@loc@TMPa{table}% + \ifx\pgfplotssurveyphaseinputclass\pgfplots@loc@TMPa + \else + \pgfplots@error{Sorry, 'tieline' plots are currently only supported for \string\addplot\space table}% + \fi + \def\b@pgfplotsplothandlersurveystart@tieline@init{0}% +}% +\def\pgfplotsplothandlersurveyend@tieline{% +}% + +\def\pgfplotsplothandlersurveypoint@tieline@init{% + \pgfplotsplothandlersurveypoint@tieline@init@find@tieendcolfor x\pgfplotsplothandlertieline@Bx + \pgfplotsplothandlersurveypoint@tieline@init@find@tieendcolfor y\pgfplotsplothandlertieline@By + \ifpgfplots@curplot@threedim + \pgfplotsplothandlersurveypoint@tieline@init@find@tieendcolfor z\pgfplotsplothandlertieline@Bz + \fi + % + \def\b@pgfplotsplothandlersurveystart@tieline@init{1}% +}% +\def\pgfplotsplothandlersurveypoint@tieline@init@find@tieendcolfor#1#2{% + \let#2=\relax + \pgfkeysgetvalue{/pgfplots/table/tie end #1}{\pgfplots@loc@TMPa}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \pgfkeysgetvalue{/pgfplots/table/tie end #1 index}{\pgfplots@loc@TMPa}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \edef#2{\noexpand\getthisrowno{\pgfplots@loc@TMPa}\noexpand\pgfmathresult}% + \fi + \else + \edef#2{\noexpand\getthisrow{\pgfplots@loc@TMPa}\noexpand\pgfmathresult}% + \fi + \ifx#2\relax + \pgfplotsplothandlersurveypoint@tieline@init@find@colindex@for #1\pgfplots@loc@ind + \c@pgf@countd=\pgfplots@loc@ind\relax + \advance\c@pgf@countd by3 + \ifnum\c@pgf@countd<\pgfplotstablecols\relax + \else + \c@pgf@countd=0 + \pgfplots@error{Sorry, I can't find the 'tie end #1 index' automatically. Please provide 'table[tie end #1={<colname>}]' or 'table[tie end #1 index=<col index>]' manually and verify the all, x,y and z components are correct}% + \fi + \edef\pgfplots@loc@ind{\the\c@pgf@countd}% + \pgfkeyslet{/pgfplots/table/tie end #1 index}\pgfplots@loc@ind + \edef#2{\noexpand\getthisrowno{\pgfplots@loc@ind}\noexpand\pgfmathresult}% + \fi +}% + +\def\pgfplotsplothandlersurveypoint@tieline@init@find@colindex@for#1#2{% + \pgfkeysgetvalue{/pgfplots/table/#1}{\pgfplots@loc@TMPa}% + \pgfkeysgetvalue{/pgfplots/table/#1 index}{\pgfplots@loc@TMPb}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \let#2=\pgfplots@loc@TMPb + \else + \def\pgfplots@loc@TMPb{\expandafter\pgfplotstablegetcolumnindexforname\expandafter{\pgfplots@loc@TMPa}\of}% + \expandafter\pgfplots@loc@TMPb\pgfplotstablename\to#2% + \fi +}% + +\def\pgfplotsplothandlersurveypoint@tieline{% + \if0\b@pgfplotsplothandlersurveystart@tieline@init + \pgfplotsplothandlersurveypoint@tieline@init + \fi + \pgfplotsplothandlersurveypoint@default + % + \pgfplotsplothandlertieline@Bx\let\pgfplots@current@point@x=\pgfmathresult + \pgfplotsplothandlertieline@By\let\pgfplots@current@point@y=\pgfmathresult + \ifpgfplots@curplot@threedim + \pgfplotsplothandlertieline@Bz\let\pgfplots@current@point@z=\pgfmathresult + \fi + \pgfplotsplothandlersurveypoint@default +}% +\endinput diff --git a/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsarray.code.tex b/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsarray.code.tex index 1a0ce28dc03..59b69da9712 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsarray.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsarray.code.tex @@ -58,10 +58,12 @@ % % the elements won't be initialised. Use 'set' for each element. \def\pgfplotsarrayresize#1#2{% - \pgfplotsarray@@edef{#1@size}{#2}% + \c@pgfplotsarray@tmp=#2 + \pgfplotsarray@@edef{#1@size}{\the\c@pgfplotsarray@tmp}% } \def\pgfplotsarrayresizeglobal#1#2{% - \expandafter\xdef\csname\string#1@size\endcsname{#2}% + \c@pgfplotsarray@tmp=#2 + \expandafter\xdef\csname\string#1@size\endcsname{\the\c@pgfplotsarray@tmp}% } % Invokes code '#2' if the array named '#1' exists and '#3' if it does @@ -136,7 +138,7 @@ \def\pgfplotsarray@@let#1=#2{% \def\pgfplotsarray@TMP@@{\expandafter\let\csname\string#1\endcsname}% - \expandafter\pgfplotsarray@TMP@@\expandafter=\csname\string#2\endcsname + \expandafter\pgfplotsarray@TMP@@\csname\string#2\endcsname }% \def\pgfplotsarray@@#1#2{% @@ -178,6 +180,12 @@ \advance\c@pgfplotsarray@tmp by1 \pgfplotsarray@@edef{#2@size}{\the\c@pgfplotsarray@tmp}% } +\long\def\pgfplotsarraypushbackglobal#1\to#2{% + \pgfplotsarraysize{#2}\to\c@pgfplotsarray@tmp + \pgfplotsarray@@\gdef{#2@\the\c@pgfplotsarray@tmp}{#1}% + \advance\c@pgfplotsarray@tmp by1 + \pgfplotsarray@@\xdef{#2@size}{\the\c@pgfplotsarray@tmp}% +} \long\def\pgfplotsarraypushbackglobal#1\to#2{% \pgfplotsarraysize{#2}\to\c@pgfplotsarray@tmp @@ -245,6 +253,23 @@ \expandafter\global\expandafter\let\csname\string#2@\the\c@pgfplotsarray@tmp\endcsname=#3\relax } +% Defines \pgfplotsretval to be a text-representation of the array. +% It will contain \t to separate cells. +% +\def\pgfplotsarraytotext#1{% + \begingroup + \pgfplotsapplistXnewempty\pgfplotsretval@ + \pgfplotsarrayforeachungrouped#1\as\entry{% + \pgfmathfloatparsenumber\entry + \pgfmathfloattosci\pgfmathresult + \edef\entry{\pgfmathresult\noexpand\t}% + \expandafter\pgfplotsapplistXpushback\entry\to\pgfplotsretval@ + }% + \pgfplotsapplistXlet\pgfplotsretval=\pgfplotsretval@ + \pgfmath@smuggleone\pgfplotsretval + \endgroup +} + % Sets the boolean \ifpgfplotsarrayempty depending on whether array #1 is empty % or not. % Example: @@ -296,11 +321,19 @@ \pgfplotsarray@@getsizeto{#1}{\pgfplotsarray@TMP}% \c@pgfplotsarray@tmp=0\relax \def\pgfplotsarrayforeachindex{\the\c@pgfplotsarray@tmp}% - \long\def\pgfplotsarray@TMPb{#3}% \pgfutil@loop \ifnum\c@pgfplotsarray@tmp<\pgfplotsarray@TMP\relax \expandafter\let\expandafter#2\expandafter=\csname\string#1@\the\c@pgfplotsarray@tmp\endcsname% - \pgfplotsarray@TMPb + \begingroup + \toks0={#3}% + \xdef\pgfplotsarray@glob@TMP{% + \the\toks0 % + % restore loop state: + \c@pgfplotsarray@tmp=\the\c@pgfplotsarray@tmp\space + \noexpand\def\noexpand\pgfplotsarray@TMP{\pgfplotsarray@TMP}% + }% + \endgroup + \pgfplotsarray@glob@TMP \advance\c@pgfplotsarray@tmp by1 \pgfutil@repeat \let\pgfplotsarrayforeachindex=\relax% @@ -417,6 +450,9 @@ % [\pgfplotsarrayforeach\testarray\as\elem{\elem\space}] % %-------------------------------------------------- +% +% @see \pgfplotsutilsortthree +% @see \pgfplotsutilsortfour \def\pgfplotsarraysort{% \pgfutil@ifnextchar[{\pgfplotsarraysort@opt}{\pgfplotsarraysort@opt[]}% }% @@ -570,3 +606,64 @@ \pgfplotsarray@mergesort{#1}{#2}{#3}% \pgfplotsarray@mergesort{#1}{#4}{#5}% } + + +% A simple, ungrouped insert sort algorithm for small arrays. +% +% for i := 1; i < N; ++i do +% begin +% value := A[i]; +% j := i - 1; +% done := false; +% repeat +% if A[j] > value then +% begin +% A[j + 1] := A[j]; +% j := j - 1; +% if j < 0 then +% done := true; +% end +% else +% done := true; +% until done; +% A[j + 1] := value; +% end; +\def\pgfplotsarrayinsertionsort#1{% + \pgfkeysgetvalue{/pgfplots/iflessthan/.@cmd}\pgfplotsarraysort@iflt + \pgfplotsarraysizetomacro#1\to\pgfplotsarrayinsertionsort@N + \c@pgf@countd=1 + \pgfplotsarrayinsertionsort@{#1}% +}% +\def\pgfplotsarrayinsertionsort@#1{% + \ifnum\c@pgf@countd<\pgfplotsarrayinsertionsort@N\relax + \pgfplotsarrayselect\c@pgf@countd\of#1\to\pgfplotsarrayinsertionsort@v + % + \c@pgf@countb=\c@pgf@countd + \advance\c@pgf@countb by-1 + % + \pgfplotsarrayinsertionsort@@{#1}% + \advance\c@pgf@countb by1 + \pgfplotsarrayletentry\c@pgf@countb\of#1=\pgfplotsarrayinsertionsort@v + % + \advance\c@pgf@countd by1 + \expandafter\pgfplotsarrayinsertionsort@\expandafter#1% + \fi +} +\def\pgfplotsarrayinsertionsort@@#1{% + \pgfplotsarrayselect\c@pgf@countb\of#1\to\pgfplotsarrayinsertionsort@j + \pgfplotsarraysort@iflt{\pgfplotsarrayinsertionsort@v}{\pgfplotsarrayinsertionsort@j} + {% + \advance\c@pgf@countb by1 + \pgfplotsarrayletentry\c@pgf@countb\of#1=\pgfplotsarrayinsertionsort@j + \advance\c@pgf@countb by-2 + \ifnum\c@pgf@countb<0 + \let\pgfplotsarrayinsertionsort@@next\relax% + \else + \def\pgfplotsarrayinsertionsort@@next{\pgfplotsarrayinsertionsort@@#1}% + \fi + }{% + \let\pgfplotsarrayinsertionsort@@next\relax% + }\pgfeov% + \pgfplotsarrayinsertionsort@@next +}% + diff --git a/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructure.code.tex b/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructure.code.tex index b60ff65c4f7..34cb67bfe02 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructure.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructure.code.tex @@ -384,7 +384,9 @@ % Each single element will be grouped with TeX groups. \long\def\pgfplotslistforeach#1\as#2#3{% \begingroup - \long\def\pgfpl@@##1{\def#2{##1}% + \long\def\pgfpl@@##1{% + \t@pgfplots@tokc={##1}% this allows '#' inside of '##1' + \edef#2{\the\t@pgfplots@tokc}% \begingroup #3\endgroup}% #1\relax \endgroup @@ -415,13 +417,14 @@ % -> iterate through argument until \pgfplotslistforeachungrouped@EOI % comes. \long\def\pgfplotslistforeachungrouped@#1#2\pgfpl@@#3{% - \def\pgfplots@loc@TMPa{#3}% - \ifx\pgfplots@loc@TMPa\pgfplotslistforeachungrouped@EOI + \def\pgfplotslist@loc@TMPa{#3}% + \ifx\pgfplotslist@loc@TMPa\pgfplotslistforeachungrouped@EOI % ok, terminate loop. \let\pgfplotslistforeachungrouped@next=\relax \else % perform loop iteration ... - \def#1{#3}% + \t@pgfplots@tokc={#3}% + \edef#1{\the\t@pgfplots@tokc}% this allows '#' inside of '#3' #2\relax % and continue iterating. \def\pgfplotslistforeachungrouped@next{\pgfplotslistforeachungrouped@{#1}{#2}}% diff --git a/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructureext.code.tex b/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructureext.code.tex index bea65490068..fa90ea613f6 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructureext.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructureext.code.tex @@ -72,6 +72,8 @@ % - it requires O(N) different macros. % - it ***can't*** be copied outside of the current TeX group! % +% I have never used it (besides early tests) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -132,6 +134,9 @@ % LOCAL, however: 'to global' is to be used inside of a local % group such that the final result, when all buffers are flushed, % is assigned globally. +% +% ATTENTION: maybe that [to global] thing is useless. +% Consider using the \pgfplotsapplistXglobal list (see below) \def\pgfplotsapplistXnewempty{% \pgfutil@ifnextchar[{% \pgfplotsapplistXnewempty@opt @@ -526,3 +531,85 @@ \def\pgfplotsapplistXXglobalexecute#1{% \pgfplotsapplistXXglobalflushbuffers #1}% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \pgfplotsapplistXglobalnewempty --> same as \pgfplotsapplistX, but +% it always assigns everything *globally*. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\pgfplotsgloballet{\global\let}% + +% Usage: +% \pgfplotsapplistXglobalnewempty\macro +% \pgfplotsapplistXglobalnewempty[to global]\macro +% +% The 'to global' flag will configure the list such that all +% assignments to \macro are global. The list accumulation is +% LOCAL, however: 'to global' is to be used inside of a local +% group such that the final result, when all buffers are flushed, +% is assigned globally. +\def\pgfplotsapplistXglobalnewempty#1{% + \pgfplotsgloballet#1=\pgfutil@empty + \expandafter\pgfplotsgloballet\csname\string#1@smallbuf\endcsname=\pgfutil@empty + \expandafter\pgfplotsgloballet\csname\string#1@bigbuf\endcsname=\pgfutil@empty + \expandafter\gdef\csname\string#1@smallbuf@c\endcsname{0}% + \expandafter\gdef\csname\string#1@bigbuf@c\endcsname{0}% +}% + +% #1: the item to append +% #2: the list as macro name +\long\def\pgfplotsapplistXglobalpushback#1\to#2{% + \begingroup + \c@pgf@counta=\csname\string#2@smallbuf@c\endcsname\relax + \advance\c@pgf@counta by1 + \expandafter\xdef\csname\string#2@smallbuf@c\endcsname{\the\c@pgf@counta}% + \endgroup + \ifnum\csname\string#2@smallbuf@c\endcsname<40 + \t@pgfplots@toka=\expandafter\expandafter\expandafter{\csname\string#2@smallbuf\endcsname#1}% + \expandafter\xdef\csname\string#2@smallbuf\endcsname{\the\t@pgfplots@toka}% + \else + \pgfplotsapplistXglobalpushback@smallbufoverfl{#1}{#2}% + \fi +}% +\long\def\pgfplotsapplistXglobalpushback@smallbufoverfl#1#2{% + \begingroup + \c@pgf@counta=\csname\string#2@bigbuf@c\endcsname\relax + \advance\c@pgf@counta by1 + \expandafter\xdef\csname\string#2@bigbuf@c\endcsname{\the\c@pgf@counta}% + \endgroup + % + \ifnum\csname\string#2@bigbuf@c\endcsname<30 + \t@pgfplots@toka=\expandafter\expandafter\expandafter{\csname\string#2@bigbuf\endcsname}% + \t@pgfplots@tokb=\expandafter\expandafter\expandafter{\csname\string#2@smallbuf\endcsname#1}% + \expandafter\xdef\csname\string#2@bigbuf\endcsname{\the\t@pgfplots@toka\the\t@pgfplots@tokb}% + \expandafter\pgfplotsgloballet\csname\string#2@smallbuf\endcsname=\pgfutil@empty + \expandafter\gdef\csname\string#2@smallbuf@c\endcsname{0}% + \else% + \t@pgfplots@toka=\expandafter{#2}% + \t@pgfplots@tokb=\expandafter\expandafter\expandafter{\csname\string#2@bigbuf\endcsname}% + \t@pgfplots@tokc=\expandafter\expandafter\expandafter{\csname\string#2@smallbuf\endcsname#1}% + \xdef#2{\the\t@pgfplots@toka\the\t@pgfplots@tokb\the\t@pgfplots@tokc}% + \expandafter\pgfplotsgloballet\csname\string#2@smallbuf\endcsname=\pgfutil@empty + \expandafter\gdef\csname\string#2@smallbuf@c\endcsname{0}% + \expandafter\pgfplotsgloballet\csname\string#2@bigbuf\endcsname=\pgfutil@empty + \expandafter\gdef\csname\string#2@bigbuf@c\endcsname{0}% + \fi% +}% +\def\pgfplotsapplistXglobalflushbuffers#1{% + \t@pgfplots@toka=\expandafter{#1}% + \t@pgfplots@tokb=\expandafter\expandafter\expandafter{\csname\string#1@bigbuf\endcsname}% + \t@pgfplots@tokc=\expandafter\expandafter\expandafter{\csname\string#1@smallbuf\endcsname}% + \xdef#1{\the\t@pgfplots@toka\the\t@pgfplots@tokb\the\t@pgfplots@tokc}% + \expandafter\pgfplotsgloballet\csname\string#1@smallbuf\endcsname=\pgfutil@empty + \expandafter\gdef\csname\string#1@smallbuf@c\endcsname{0}% + \expandafter\pgfplotsgloballet\csname\string#1@bigbuf\endcsname=\pgfutil@empty + \expandafter\gdef\csname\string#1@bigbuf@c\endcsname{0}% +}% + + +\def\pgfplotsapplistXgloballet#1=#2{% + \pgfplotsapplistXglobalflushbuffers#2% + \let#1=#2} diff --git a/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsmatrix.code.tex b/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsmatrix.code.tex new file mode 100644 index 00000000000..abc273378e0 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsmatrix.code.tex @@ -0,0 +1,544 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a helper package with an elementary (full) matrix datastructure, +% featuring O(1) index access and O(N) creation, deletion, copy. +% +% The following macros are supplied: +% +% \pgfplotsmatrixnewempty +% \pgfplotsmatrixresize +% \pgfplotsmatrixsize +% \pgfplotsmatrixselect +% \pgfplotsmatrixset +% \pgfplotsmatrixletentry +% \pgfplotsmatrixforeach +% \pgfplotsmatrixLUdecomp +% \pgfplotsmatrixLUsolve +% +% +% Copyright 2007/2008 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Creates a new, empty matrix. +\def\pgfplotsmatrixnewempty#1{% + \pgfplotsarray@@def{#1@rows}{0}% + \pgfplotsarray@@def{#1@cols}{1}% +} + +% resizes (truncates) matrix #1 to #2 rows and #3 cols. +% +% the elements won't be initialised. Use 'set' for each element. +\def\pgfplotsmatrixresize#1#2#3{% + \pgfplotsarray@@edef{#1@rows}{#2}% + \pgfplotsarray@@edef{#1@cols}{#3}% +} + +% Invokes code '#2' if the matrix named '#1' exists and '#3' if it does +% not exist. +\def\pgfplotsmatrixifdefined#1#2#3{% + \pgfutil@ifundefined{#1@rows}{#3}{#2}% +}% + + + +% Counts the number of rows/cols in matrix #1, storing it into the count +% registers #2, #3. +% Example: +% \pgfplotsmatrixsize\foo\to{\count0}{\count1}% +% \the\count0, \the\count1 +\long\def\pgfplotsmatrixsize#1\to#2#3{% + #2=\csname\string#1@rows\endcsname\relax + #3=\csname\string#1@cols\endcsname\relax +} + +\long\def\pgfplotsmatrixsizetomacro#1\to#2#3{% + \expandafter\let\expandafter#2\csname\string#1@rows\endcsname + \expandafter\let\expandafter#3\csname\string#1@cols\endcsname +} + + +% Returns the (#1,#2) element of matrix #3 into macro #4 +% Arguments: +% #1: a row index 0,...,N-1 where N is rowcount. +% #1 must expand to an integer. +% #2: a col index 0,...,N-1 where N is colcount. +% #2 must expand to an integer. +% #3: a matrix +% #4: a macro name +% Example: +% Element 0: +% \pgfplotsmatrixselect0,1\of\foo\to\elem +% \elem +% Element \count1: +% \pgfplotsmatrixselect\count1,2\of\foo\to\elem +\def\pgfplotsmatrixselect#1,#2\of#3\to#4{% + \expandafter\let\expandafter#4\csname\string#3@#1,#2\endcsname% + \ifx#4\relax + \pgfplotsthrow{no such element}{#1,#2}{No such element: \string\pgfplotsmatrixselect#1,#2\string\of{\string#3}}\pgfeov% + \fi +} + +% Expands to the value (#1,#2) of matrix #3. +% #1: a row index (not a register) +% #2: a col index +% #3: a matrix +\def\pgfplotsmatrixvalueofelem#1,#2\of#3{\csname\string#3@#1,#2\endcsname}% + +% Sets element '#1,#2' of matrix '#3' to '#4'. +\def\pgfplotsmatrixset#1,#2\of#3\to#4{% + \pgfutil@namedef{\string#3@#1,#2}{#4}% +} +\long\def\pgfplotsmatrixletentry#1,#2\of#3=#4{% + \expandafter\let\csname\string#3@#1,#2\endcsname=#4\relax +} + +% During the loop, \pgfplotsmatrixforeachrowindex expands to the +% current row index and \pgfplotsmatrixforeachcolindex to the actual +% col index. It invokes \pgfplotsmatrixforeachrowend after each +% complete row. +% +% This macro uses +% \c@pgf@counta,\c@pgf@countb,\c@pgf@countc,\c@pgf@countd +\long\def\pgfplotsmatrixforeach#1\as#2#3{% + \pgfplotsmatrixsize#1\to\c@pgf@countc\c@pgf@countd + \long\def\pgfplotsmatrixforeach@{#3}% + \def\pgfplotsmatrixforeach@assign##1{\def#2{##1}}% + \def\pgfplotsmat@select##1,##2\to{\pgfplotsmatrixselect##1,##2\of#1\to}% + \def\pgfplotsmatrixforeachrowindex{\the\c@pgf@counta}% + \def\pgfplotsmatrixforeachcolindex{\the\c@pgf@countb}% + \c@pgf@counta=0 + \pgfplotsmatrixforeach@loop + \let\pgfplotsmatrixforeachcolindex\relax + \let\pgfplotsmatrixforeachrowindex\relax% +}% +\let\pgfplotsmatrixforeachrowend=\relax +\def\pgfplotsmatrixforeach@loop{% + \ifnum\c@pgf@counta<\c@pgf@countc + \c@pgf@countb=0 + \pgfplotsmatrixforeach@loop@ + % + \pgfplotsmatrixforeachrowend + % + \advance\c@pgf@counta by1 + \expandafter\pgfplotsmatrixforeach@loop + \fi +}% +\def\pgfplotsmatrixforeach@loop@{% + \ifnum\c@pgf@countb<\c@pgf@countd + \pgfplotsmat@select\the\c@pgf@counta,\the\c@pgf@countb\to\pgfplotsmat@Aij + \expandafter\pgfplotsmatrixforeach@assign\expandafter{\pgfplotsmat@Aij}% + \pgfplotsmatrixforeach@ + % + \advance\c@pgf@countb by1 + \expandafter\pgfplotsmatrixforeach@loop@ + \fi +}% + +% Defines \pgfplotsretval to be a text-representation of the matrix. +% It will contain '\n' as newline macro and \t to separate cells. +% +\def\pgfplotsmatrixtotext#1{% + \begingroup + \pgfplotsapplistXnewempty\pgfplotsretval@ + \def\pgfplotsmatrixforeachrowend{% + \pgfplotsapplistXpushback\n\to\pgfplotsretval@ + }% + \pgfplotsmatrixforeach#1\as\entry{% + \pgfmathfloatparsenumber\entry + \pgfmathfloattosci\pgfmathresult + \edef\entry{\pgfmathresult\noexpand\t}% + \expandafter\pgfplotsapplistXpushback\entry\to\pgfplotsretval@ + }% + \pgfplotsapplistXlet\pgfplotsretval=\pgfplotsretval@ + \pgfmath@smuggleone\pgfplotsretval + \endgroup +} + +% Takes a matrix #1 and replaces it by its LU decomposition. +% The LU decomposition uses implicit pivoting; the pivoting +% information is stored in a permutation array #2 and a sign macro #3. +% +% It is to be used together with \pgfplotsmatrixsolveLEQS. +% +% #1: the input matrix (square size) +% #2: a macro name; will be used to store the permutation array for +% the pivoting. +% #3: a macro name, will contain the sign of the permutation (either +% +1 or -1). +% +% The algorithm has been converted from Numerical Recipes in C (I did +% not copy the comments, though). You find the complete reference in +% Chapter 2 of Numerical Recipes. +% +% If the matrix is singular, an exception will be raised. +% If the matrix is singular up to working precision, +% \pgfplotsmatrixLUdecompwarnsingular will be invoked and the +% algorithm continues with a small threshold. +% +% All arithmetics is computed with \pgfplotscoordmath{default} (which +% is float in the initial configuration). Use +% \pgfplotssetcoordmathfor{default}{pgfbasic} to switch it to standard +% pgf arithmetics. +% +% ATTENTION. This routine re-uses the four counters +% \c@pgf@counta,...\c@pgf@countd. +% Furthermore, it does not free any memory. +% Make sure you use it inside of local scopes. +\def\pgfplotsmatrixLUdecomp#1\perm#2\sign#3{% + \let\pgfplotsmat@i=\c@pgf@counta + \let\pgfplotsmat@imax=\c@pgf@countb + \let\pgfplotsmat@j=\c@pgf@countc + \let\pgfplotsmat@k=\c@pgf@countd + \countdef\pgfplotsmat@n=0 + \let\pgfplotsmat@big=\pgfutil@empty + \let\pgfplotsmat@dum=\pgfutil@empty + \let\pgfplotsmat@sum=\pgfutil@empty + \let\pgfplotsmat@temp=\pgfutil@empty + \pgfplotsmatrixsize#1\to\pgfplotsmat@n\c@pgf@countd + \ifnum\c@pgf@countd=\pgfplotsmat@n + \else + \pgfplots@error{Sorry, \string\pgfplotsmatrixLUdecomp\space expected an n x n matrix, but got \the\pgfplotsmat@n\space x \the\c@pgf@countd.}% + \fi + \pgfplotsarraynewempty\pgfplotsmat@vv + \pgfplotsarrayresize\pgfplotsmat@vv\pgfplotsmat@n + \pgfplotsarrayresize#2\pgfplotsmat@n + \def\pgfplotsmat@parity{1}% + \def\pgfplotsmat@select##1,##2\to{\pgfplotsmatrixselect##1,##2\of#1\to}% + \def\pgfplotsmat@letentry##1,##2={\pgfplotsmatrixletentry##1,##2\of#1=}% + \def\pgfplotsmat@letpermentry##1={\pgfplotsarrayletentry##1\of#2=}% + % + \pgfplotsmat@i=0 + \pgfplotsmatrixLUdecomp@scalingloop + % + \ifnum\pgfplotsmat@n>0 % this is used for error recovery. + % + \pgfplotsmat@j=0 + \pgfplotsmatrixLUdecomp@mainloop@j + % + \let#3=\pgfplotsmat@parity + \fi +}% +\def\pgfplotsmatrixLUdecomp@scalingloop{% + \ifnum\pgfplotsmat@i<\pgfplotsmat@n + \pgfplotscoordmath{default}{zero}% + \let\pgfplotsmat@big=\pgfmathresult + % + \pgfplotsmat@j=0 + \pgfplotsmatrixLUdecomp@scalingloop@ + % + \pgfplotscoordmath{default}{if is}{\pgfplotsmat@big}{0}{% + \pgfplotsthrow{invalid argument}{\pgfplots@loc@TMPa}{Singular matrix in \string\pgfplotsmatrixLUdecomp}\pgfeov% + \pgfplotsmat@n=-1 + }{% + \pgfplotscoordmath{default}{op}{reciprocal}{{\pgfplotsmat@big}}% + \pgfplotsarrayletentry\pgfplotsmat@i\of\pgfplotsmat@vv=\pgfmathresult + }% + % + \advance\pgfplotsmat@i by1 + \expandafter\pgfplotsmatrixLUdecomp@scalingloop + \fi +}% +\def\pgfplotsmatrixLUdecomp@scalingloop@{% + \ifnum\pgfplotsmat@j<\pgfplotsmat@n + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@j\to\pgfplotsmat@Aij + \pgfplotscoordmath{default}{parsenumber}{\pgfplotsmat@Aij}% + \let\pgfplotsmat@Aij=\pgfmathresult + \pgfplotsmat@letentry\the\pgfplotsmat@i,\the\pgfplotsmat@j=\pgfplotsmat@Aij + % + \pgfplotscoordmath{default}{op}{abs}{{\pgfplotsmat@Aij}}% + \let\pgfplotsmat@temp=\pgfmathresult + \pgfplotscoordmath{default}{max}{\pgfplotsmat@temp}{\pgfplotsmat@big}% + \let\pgfplotsmat@big=\pgfmathresult + % + \advance\pgfplotsmat@j by1 + \expandafter\pgfplotsmatrixLUdecomp@scalingloop@ + \fi +}% + +\def\pgfplotsmatrixLUdecomp@mainloop@j{% + \ifnum\pgfplotsmat@j<\pgfplotsmat@n + % + \pgfplotsmat@i=0 + \pgfplotsmatrixLUdecomp@mainloop@j@i + % + \pgfplotscoordmath{default}{zero}% + \let\pgfplotsmat@big=\pgfmathresult + % + \pgfplotsmat@i=\pgfplotsmat@j + \pgfplotsmatrixLUdecomp@mainloop@j@i@second + % + \ifnum\pgfplotsmat@j=\pgfplotsmat@imax + \else + % interchange rows... + \pgfplotsmat@k=0 + \pgfplotsmatrixLUdecomp@mainloop@j@k + % + \c@pgfplotsarray@tmp=-\pgfplotsmat@parity\relax% + \edef\pgfplotsmat@parity{\the\c@pgfplotsarray@tmp}% + % + % FIXME : this here is DIFFERENT. Seems there is something + % missing in Numerical Recipes book + \pgfplotsarrayselect\pgfplotsmat@j\of\pgfplotsmat@vv\to\pgfplotsmat@dum + %\pgfplotsarrayselect\pgfplotsmat@imax\of\pgfplotsmat@vv\to\pgfplotsmat@temp + %\pgfplotsarrayletentry\pgfplotsmat@j\of\pgfplotsmat@vv=\pgfplotsmat@temp + \pgfplotsarrayletentry\pgfplotsmat@imax\of\pgfplotsmat@vv=\pgfplotsmat@dum + \fi + % + \edef\pgfplotsmat@dum{\the\pgfplotsmat@imax}% + \pgfplotsmat@letpermentry\pgfplotsmat@j=\pgfplotsmat@dum + % + \pgfplotsmat@select\the\pgfplotsmat@j,\the\pgfplotsmat@j\to\pgfplotsmat@Ajj + \pgfplotscoordmath{default}{if is}{\pgfplotsmat@Ajj}{0}{% + \pgfplotscoordmath{default}{parsenumber}{1e-15}% + \pgfplotsmatrixLUdecompwarnsingular + \pgfplotsmat@letentry\the\pgfplotsmat@j,\the\pgfplotsmat@j=\pgfmathresult + }{% + }% + % + % + \advance\pgfplotsmat@j by1 + \ifnum\pgfplotsmat@j=\pgfplotsmat@n + \advance\pgfplotsmat@j by-1 + \else + \advance\pgfplotsmat@j by-1 + \pgfplotsmat@select\the\pgfplotsmat@j,\the\pgfplotsmat@j\to\pgfplotsmat@Ajj + \pgfplotscoordmath{default}{op}{reciprocal}{{\pgfplotsmat@Ajj}}% + \let\pgfplotsmat@dum=\pgfmathresult + \pgfplotsmat@i=\pgfplotsmat@j + \advance\pgfplotsmat@i by1 + \pgfplotsmatrixLUdecomp@mainloop@j@i@final + \fi + \advance\pgfplotsmat@j by1 + \expandafter\pgfplotsmatrixLUdecomp@mainloop@j + \fi +}% +\def\pgfplotsmatrixLUdecompwarnsingular{% + \pgfplots@warning{Linear system is singular up to machine precision! Continuing with small threshold.}% +}% +\def\pgfplotsmatrixLUdecomp@mainloop@j@i{% + \ifnum\pgfplotsmat@i<\pgfplotsmat@j + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@j\to\pgfplotsmat@sum + \pgfplotsmat@k=0 + \pgfplotsmatrixLUdecomp@mainloop@j@i@k + \pgfplotsmat@letentry\the\pgfplotsmat@i,\the\pgfplotsmat@j=\pgfplotsmat@sum + % + \advance\pgfplotsmat@i by1 + \expandafter\pgfplotsmatrixLUdecomp@mainloop@j@i + \fi +}% +\def\pgfplotsmatrixLUdecomp@mainloop@j@i@k{% + \ifnum\pgfplotsmat@k<\pgfplotsmat@i + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@k\to\pgfplotsmat@Aik + \pgfplotsmat@select\the\pgfplotsmat@k,\the\pgfplotsmat@j\to\pgfplotsmat@Akj + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplotsmat@Aik}{\pgfplotsmat@Akj}}% + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplotsmat@sum}{\pgfmathresult}}% + \let\pgfplotsmat@sum=\pgfmathresult + % + \advance\pgfplotsmat@k by1 + \expandafter\pgfplotsmatrixLUdecomp@mainloop@j@i@k + \fi +} +\def\pgfplotsmatrixLUdecomp@mainloop@j@i@second{% + \ifnum\pgfplotsmat@i<\pgfplotsmat@n + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@j\to\pgfplotsmat@sum + % + \pgfplotsmat@k=0 + \pgfplotsmatrixLUdecomp@mainloop@j@i@second@k + \pgfplotsmat@letentry\the\pgfplotsmat@i,\the\pgfplotsmat@j=\pgfplotsmat@sum + % + \pgfplotscoordmath{default}{op}{abs}{{\pgfplotsmat@sum}}% + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplotsarrayvalueofelem\the\pgfplotsmat@i\of\pgfplotsmat@vv}}% + \let\pgfplotsmat@dum=\pgfmathresult + \pgfplotscoordmath{default}{if less than}{\pgfplotsmat@dum}{\pgfplotsmat@big}{% + }{% + \let\pgfplotsmat@big=\pgfplotsmat@dum + \pgfplotsmat@imax=\pgfplotsmat@i + }% + % + \advance\pgfplotsmat@i by1 + \expandafter\pgfplotsmatrixLUdecomp@mainloop@j@i@second + \fi +}% +\def\pgfplotsmatrixLUdecomp@mainloop@j@i@second@k{% + \ifnum\pgfplotsmat@k<\pgfplotsmat@j + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@k\to\pgfplotsmat@Aik + \pgfplotsmat@select\the\pgfplotsmat@k,\the\pgfplotsmat@j\to\pgfplotsmat@Akj + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplotsmat@Aik}{\pgfplotsmat@Akj}}% + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplotsmat@sum}{\pgfmathresult}}% + \let\pgfplotsmat@sum=\pgfmathresult + % + \advance\pgfplotsmat@k by1 + \expandafter\pgfplotsmatrixLUdecomp@mainloop@j@i@second@k + \fi +}% + +\def\pgfplotsmatrixLUdecomp@mainloop@j@k{% + \ifnum\pgfplotsmat@k<\pgfplotsmat@n + % + \pgfplotsmat@select\the\pgfplotsmat@imax,\the\pgfplotsmat@k\to\pgfplotsmat@dum + \pgfplotsmat@select\the\pgfplotsmat@j,\the\pgfplotsmat@k\to\pgfplotsmat@Ajk + \pgfplotsmat@letentry\the\pgfplotsmat@imax,\the\pgfplotsmat@k=\pgfplotsmat@Ajk + \pgfplotsmat@letentry\the\pgfplotsmat@j,\the\pgfplotsmat@k=\pgfplotsmat@dum + % + \advance\pgfplotsmat@k by1 + \expandafter\pgfplotsmatrixLUdecomp@mainloop@j@k + \fi +} +\def\pgfplotsmatrixLUdecomp@mainloop@j@i@final{% + \ifnum\pgfplotsmat@i<\pgfplotsmat@n + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@j\to\pgfplotsmat@Aij + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplotsmat@Aij}{\pgfplotsmat@dum}}% + \pgfplotsmat@letentry\the\pgfplotsmat@i,\the\pgfplotsmat@j=\pgfmathresult + % + \advance\pgfplotsmat@i by1 + \expandafter\pgfplotsmatrixLUdecomp@mainloop@j@i@final + \fi +} + + + +% Solves the set of n linear equations Ax = b where A = LU is given in +% (#1,#2) and b = #3. +% +% #1: is a result of \pgfplotsmatrixLUdecomp +% #2: is the permutation vector returned by \pgfplotsmatrixLUdecomp +% #3: the right hand side. On output, it will be *overwritten* with +% the solution. +% +% The algorithm has been converted from Numerical Recipes in C (I did +% not copy the comments, though). You find the complete reference in +% Chapter 2 of Numerical Recipes. +\def\pgfplotsmatrixLUbacksubst#1\perm#2\inout#3{% + \let\pgfplotsmat@i=\c@pgf@counta + \let\pgfplotsmat@ii=\c@pgf@countb + \let\pgfplotsmat@j=\c@pgf@countc + \let\pgfplotsmat@n=\c@pgf@countd + \let\pgfplotsmat@sum=\pgfutil@empty + \pgfplotsmatrixsize#1\to\pgfplotsmat@n\c@pgf@counta + \pgfplotsarraysize#3\to\c@pgf@counta + \ifnum\c@pgf@counta=\pgfplotsmat@n + \def\pgfplotsmat@select##1,##2\to{\pgfplotsmatrixselect##1,##2\of#1\to}% + \def\pgfplotsmat@selectperm##1\to{\pgfplotsarrayselect##1\of#2\to}% + \def\pgfplotsmat@selectb##1\to{\pgfplotsarrayselect##1\of#3\to}% + \def\pgfplotsmat@letresult##1={\pgfplotsarrayletentry##1\of#3=}% + % + \pgfplotsmat@ii=-1 + \pgfplotsmat@i=0 + \pgfplotsmatrixLUbacksubst@loop@i + % + \pgfplotsmat@i=\pgfplotsmat@n + \advance\pgfplotsmat@i by-1 + \pgfplotsmatrixLUbacksubst@loop@i@backw + \else + \pgfplots@error{Sorry, \string\pgfplotsmatrixLUbacksubst\space expected a vector of length \the\pgfplotsmat@n\space, not \the\c@pgf@counta}% + \fi +}% +\def\pgfplotsmatrixLUbacksubst@loop@i{% + \ifnum\pgfplotsmat@i<\pgfplotsmat@n + % + \pgfplotsmat@selectperm\pgfplotsmat@i\to\pgfplotsmat@ip + \pgfplotsmat@selectb\pgfplotsmat@ip\to\pgfplotsmat@sum + \pgfplotsmat@selectb\pgfplotsmat@i\to\pgfplotsmat@temp + % + \pgfplotscoordmath{default}{parsenumber}{\pgfplotsmat@sum}% + \let\pgfplotsmat@sum=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{\pgfplotsmat@temp}% + \let\pgfplotsmat@temp=\pgfmathresult + % + \pgfplotsmat@letresult\pgfplotsmat@ip=\pgfplotsmat@temp + % + \ifnum\pgfplotsmat@ii<0 + \pgfplotscoordmath{default}{if is}{\pgfplotsmat@sum}{0}{% + }{% + \pgfplotsmat@ii=\pgfplotsmat@i + }% + \else + \pgfplotsmat@j=\pgfplotsmat@ii + \pgfplotsmatrixLUbacksubst@loop@i@j + \fi + \pgfplotsmat@letresult\pgfplotsmat@i=\pgfplotsmat@sum + % + \advance\pgfplotsmat@i by1 + \expandafter\pgfplotsmatrixLUbacksubst@loop@i + \fi +}% +\def\pgfplotsmatrixLUbacksubst@loop@i@j{% + \ifnum\pgfplotsmat@j<\pgfplotsmat@i + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@j\to\pgfplotsmat@Aij + \pgfplotsmat@selectb\pgfplotsmat@j\to\pgfplotsmat@temp + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplotsmat@temp}{\pgfplotsmat@Aij}}% + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplotsmat@sum}{\pgfmathresult}}% + \let\pgfplotsmat@sum=\pgfmathresult + % + \advance\pgfplotsmat@j by1 + \expandafter\pgfplotsmatrixLUbacksubst@loop@i@j + \fi +}% + +\def\pgfplotsmatrixLUbacksubst@loop@i@backw{% + \ifnum\pgfplotsmat@i<0 + \else + % + \pgfplotsmat@selectb\pgfplotsmat@i\to\pgfplotsmat@sum + \pgfplotsmat@j=\pgfplotsmat@i + \advance\pgfplotsmat@j by1 + \pgfplotsmatrixLUbacksubst@loop@i@backw@j + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@i\to\pgfplotsmat@Aii + \pgfplotscoordmath{default}{op}{divide}{{\pgfplotsmat@sum}{\pgfplotsmat@Aii}}% + \pgfplotsmat@letresult\pgfplotsmat@i=\pgfmathresult + % + \advance\pgfplotsmat@i by-1 + \expandafter\pgfplotsmatrixLUbacksubst@loop@i@backw + \fi +}% +\def\pgfplotsmatrixLUbacksubst@loop@i@backw@j{% + \ifnum\pgfplotsmat@j<\pgfplotsmat@n + % + \pgfplotsmat@select\the\pgfplotsmat@i,\the\pgfplotsmat@j\to\pgfplotsmat@Aij + \pgfplotsmat@selectb\pgfplotsmat@j\to\pgfplotsmat@temp + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplotsmat@temp}{\pgfplotsmat@Aij}}% + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplotsmat@sum}{\pgfmathresult}}% + \let\pgfplotsmat@sum=\pgfmathresult + % + \advance\pgfplotsmat@j by1 + \expandafter\pgfplotsmatrixLUbacksubst@loop@i@backw@j + \fi +}% + +% Solves the linear equation system Ax = b. +% #1: the matrix A +% #2: the right-hand-side b. On output, #2 will contain the solution +% and A will be overwritten. +% +% ATTENTION. This routine re-uses the four counters +% \c@pgf@counta,...\c@pgf@countd. +% Furthermore, it does not free any memory. +% Make sure you use it inside of local scopes. +\def\pgfplotsmatrixsolveLEQS#1=#2{% + \pgfplotsmatrixLUdecomp#1\perm\pgfplotsmatrix@perm\sign\pgfplotsmatrix@sign + \pgfplotsmatrixLUbacksubst#1\perm\pgfplotsmatrix@perm\inout#2% +}% diff --git a/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex b/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex index b2c3d7bf946..b5480f58b5b 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex @@ -44,6 +44,7 @@ \newif\ifpgfplotstabletypeset@force@remake \newif\ifpgfplotstable@disable@rowcolstyles +\let\pgfplotstable@outfile=\w@pgf@writea \input pgfplotstable.coltype.code.tex @@ -341,6 +342,12 @@ /pgfplots/table/every last column/.style={}, /pgfplots/table/every even column/.style={}, /pgfplots/table/every odd column/.style={}, + /pgfplots/table/every nth row/.code 2 args={% + \pgfplotstabletypeset@append@every@nth@row{#1}{#2}% + }, + /pgfplots/table/every nth row/.style 2 args/.code 2 args={% + \pgfplotstabletypeset@append@every@nth@row{#1}{#2}% + }, /pgfplots/table/before row/.initial=, /pgfplots/table/after row/.initial=, /pgfplots/table/begin table/.initial={\begin{tabular}}, @@ -464,6 +471,14 @@ \fi } }, + /pgfplots/table/string replace*/.style 2 args={% + /pgfplots/table/preproc cell content/.append code={% + \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult + \def\pgfplots@loc@TMPa{\pgfplotsutilstrreplace{#1}{#2}}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}% + \pgfkeyslet{/pgfplots/table/@cell content}{\pgfplotsretval}% + } + }, /pgfplots/table/preproc/expr/.code={% \ifpgfplots@usefpu \pgfkeysalso{/pgf/fpu=true,/pgf/fpu/output format=sci}% @@ -501,7 +516,8 @@ \fi } }, - /pgfplots/table/multiply with/.code={% + /pgfplots/table/multiply with/.style={/pgfplots/table/multiply by={#1}},% + /pgfplots/table/multiply by/.code={% \pgfmathfloatparsenumber{#1}% \let\pgfplotstable@scale=\pgfmathresult \pgfkeysalso{ @@ -519,7 +535,7 @@ }% }, /pgfplots/table/divide by/.code={% - \pgfkeysalso{/pgfplots/table/multiply with=#1}% + \pgfkeysalso{/pgfplots/table/multiply by=#1}% \let\pgfplotstable@divisor=\pgfplotstable@scale \pgfmathfloatcreate{1}{1.0}{0}% \let\pgfplotstable@ONE=\pgfmathresult @@ -1349,13 +1365,36 @@ %%%%%%%%%%%%%%% +% #1: the original value +% #2: the output macro \long\def\pgfplotstabletypeset@getfinalentry#1#2{% \begingroup + \def\pgfkeysdefaultpath{/pgfplots/table/}% \def\pgfplotstablepartno{0}% \pgfkeyssetvalue{/pgfplots/table/@cell content}{#1}% \pgfkeyssetvalue{/pgfplots/table/@unprocessed cell content}{#1}% + \ifpgfplotstable@disable@rowcolstyles + \else + \def\pgfplots@loc@TMPb##1{% + \edef\pgfplotstable@loc@TMPa{/pgfplots/table/every row ##1\pgfplotstablerow\space column ##1\pgfplotstablecol}% + \pgfkeysifdefined{\pgfplotstable@loc@TMPa/.@cmd}{% + \expandafter\pgfplotstableset\expandafter{\pgfplotstable@loc@TMPa}% + }{}% + \edef\pgfplotstable@loc@TMPa{/pgfplots/table/every row ##1\pgfplotstablerow\space column \pgfplotstable@colname@for@styles}% + \pgfkeysifdefined{\pgfplotstable@loc@TMPa/.@cmd}{% + \expandafter\pgfplotstableset\expandafter{\pgfplotstable@loc@TMPa}% + }{}% + }% + \pgfplots@loc@TMPb{}% + % also accept the same with the 'row no' style: + \pgfplots@loc@TMPb{no }% + \pgfplotstable@debug@notify@cellcontent@afterrowcolstyles% + \fi \pgfplotstable@debug@notify@cellcontent% - \pgfkeysvalueof{/pgfplots/table/preproc cell content/.@cmd}#1\pgfeov + \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult% + \pgfkeyslet{/pgfplots/table/@cell content after rowcol styles}\pgfmathresult% + \pgfkeysgetvalue{/pgfplots/table/preproc cell content/.@cmd}\pgfplotstable@assigncell + \expandafter\pgfplotstable@assigncell\pgfmathresult\pgfeov \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult% \pgfkeyslet{/pgfplots/table/@preprocessed cell content}\pgfmathresult% \pgfplotstable@debug@notify@cellcontent@preprocessed% @@ -1391,6 +1430,7 @@ \def\pgfplotstable@debug@notify@cellcontent{}% \def\pgfplotstable@debug@notify@cellcontent@preprocessed{}% +\def\pgfplotstable@debug@notify@cellcontent@afterrowcolstyles{}% \def\pgfplotstable@debug@notify@cellcontent@assigned{}% \def\pgfplotstable@debug@notify@cellcontent@postprocessed{}% \def\pgfplotstable@debug@notify@preprocess@incol#1{}% @@ -1412,6 +1452,13 @@ \immediate\write16{Row \pgfplotstablerow/out \the\c@pgfplotstable@counta: After '@preproc cell content : `\the\toks0'}% \endgroup }% +\def\pgfplotstable@debug@notify@cellcontent@afterrowcolstyles@ACTIVE{% + \begingroup + \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult% + \toks0=\expandafter{\pgfmathresult}% + \immediate\write16{Row \pgfplotstablerow/out \the\c@pgfplotstable@counta: After applying 'every row * column [no] *' styles : `\the\toks0'}% + \endgroup +}% \def\pgfplotstable@debug@notify@cellcontent@assigned@ACTIVE{% \begingroup \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult% @@ -1454,6 +1501,7 @@ \let\pgfplotstable@debug@notify@preprocessed@col=\pgfplotstable@debug@notify@preprocessed@col@ACTIVE \let\pgfplotstable@debug@notify@cellcontent=\pgfplotstable@debug@notify@cellcontent@ACTIVE \let\pgfplotstable@debug@notify@cellcontent@preprocessed=\pgfplotstable@debug@notify@cellcontent@preprocessed@ACTIVE + \let\pgfplotstable@debug@notify@cellcontent@afterrowcolstyles=\pgfplotstable@debug@notify@cellcontent@afterrowcolstyles@ACTIVE \let\pgfplotstable@debug@notify@cellcontent@assigned=\pgfplotstable@debug@notify@cellcontent@assigned@ACTIVE \let\pgfplotstable@debug@notify@cellcontent@postprocessed=\pgfplotstable@debug@notify@cellcontent@postprocessed@ACTIVE \let\pgfplotstable@debug@notify@balancingcell=\pgfplotstable@debug@notify@balancingcell@ACTIVE @@ -1506,6 +1554,60 @@ \fi }% +% Upon execution, \pgfplotsretval contains a set of /pgfplots/table +% keys from 'every nth row' styles. +% +% @PRECONDITION this macro assumes it is run in \pgfplotstabletypeset. +\def\pgfplots@each@nth@styles{\let\pgfplotsretval\pgfutil@empty}% + +% Defines an 'every nth row' style for an integer #1. +% +% #1: integer +% #2: style arguments +% +% All these styles are accumulated into the macro +% \pgfplots@each@nth@styles. +\def\pgfplotstabletypeset@append@every@nth@row#1#2{% + \edef\pgfplots@loc@TMPa{#1}% + % chech for the special 'each nth row={3[+1]}{...} format: + \expandafter\pgfutil@in@\expandafter[\expandafter{\pgfplots@loc@TMPa}% + \ifpgfutil@in@ + \expandafter\pgfplotstabletypeset@append@every@nth@row@getshift\pgfplots@loc@TMPa% + \t@pgfplots@toka={#2}% + \edef\pgfplots@loc@TMPa{% + \noexpand\pgfplotstabletypeset@append@every@nth@row@{\pgfplots@loc@TMPa}{\the\t@pgfplots@toka}{\pgfplots@loc@TMPb}% + }% + \pgfplots@loc@TMPa + \else + \expandafter\pgfplotstabletypeset@append@every@nth@row@\expandafter{\pgfplots@loc@TMPa}{#2}{0}% + \fi +}% +\def\pgfplotstabletypeset@append@every@nth@row@getshift#1[#2]{% + \def\pgfplots@loc@TMPa{#1}% + \ifnum#2<0 + \c@pgf@countc=#1\relax + \advance\c@pgf@countc by#2 + \edef\pgfplots@loc@TMPb{\the\c@pgf@countc}% + \else + \def\pgfplots@loc@TMPb{#2}% + \fi +}% +% #3 is an additional shift. It is usually 0 +\def\pgfplotstabletypeset@append@every@nth@row@#1#2#3{% + \expandafter\def\expandafter\pgfplots@each@nth@styles\expandafter{% + \pgfplots@each@nth@styles + \expandafter\pgfplotsmathmodint\expandafter{\the\c@pgfplotstable@rowindex}{#1}% + \ifnum\pgfmathresult=#3\relax + \ifx\pgfplotsretval\pgfutil@empty + \def\pgfplotsretval{#2}% + \else + \expandafter\def\expandafter\pgfplotsretval\expandafter{\pgfplotsretval,% + #2}% + \fi + \fi + }% +} + \def\pgfplotstable@insertemptycells@forbalance{% \pgfutil@loop \ifnum\c@pgfplotstable@counta<\pgfplotstable@firstnumrows\relax @@ -1529,7 +1631,7 @@ % \pgfplotslistnewempty#2 % }{}% %-------------------------------------------------- - \def\pgfplotstablename{#2}% + \def\pgfplotstablename{#2}% the name of the actual table struct \def\pgfplotstablecolname{\pgfplotstable@colname}% \def\pgfplotstablecol{\the\c@pgfplotstable@colindex}% \def\pgfplotstablerow{\the\c@pgfplotstable@rowindex}% @@ -1702,10 +1804,11 @@ \t@pgfplots@tokb=\expandafter{\pgfplotstable@colname}% \expandafter\pgfplotstable@checkspecialchars@pgfkeys\the\t@pgfplots@tokb\pgfplotstable@EOI \ifpgfutil@in@ - \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,columns/{\the\t@pgfplots@tokb}/.try}% + \edef\pgfplotstable@colname@for@styles{{\the\t@pgfplots@tokb}}% \else - \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,columns/\the\t@pgfplots@tokb/.try}% + \edef\pgfplotstable@colname@for@styles{\the\t@pgfplots@tokb}% \fi + \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,columns/\pgfplotstable@colname@for@styles/.try}% \t@pgfplots@toka=\expandafter{\pgfplotstable@loc@TMPa}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@displaycolkey}% \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,\the\t@pgfplots@tokb}% @@ -1901,6 +2004,21 @@ \else \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,every row no \the\c@pgfplotstable@rowindex/.try}% \t@pgfplots@toka=\expandafter{\pgfplotstable@loc@TMPa}% + % + \ifnum\c@pgfplotstable@rowindex=0\relax + \else + % process 'every nth row' styles: + \begingroup + \pgfplots@each@nth@styles + \pgfmath@smuggleone\pgfplotsretval + \endgroup + \ifx\pgfplotsretval\pgfutil@empty + \else + \t@pgfplots@tokb=\expandafter{\pgfplotsretval}% + \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,\the\t@pgfplots@tokb}% + \t@pgfplots@toka=\expandafter{\pgfplotstable@loc@TMPa}% + \fi + \fi \fi % misuse as temporary variable: \c@pgfplotstable@colindex=\c@pgfplotstable@rowindex @@ -1987,13 +2105,14 @@ \pgfplots@glob@TMPa% execute 'write to macro' if set. }% + \newif\ifpgfplotstable@isfirstrow \newif\ifpgfplotstable@islastrow \newif\ifpgfplotstablecreatecol@isreallynew \def\pgfplotstablecreatecol@opt[#1]#2#3{% \begingroup - \def\pgfplotstablename{#3}% + \def\pgfplotstablename{#3}% the name of the table struct \pgfplotstableset{columns=,#1,% /pgf/fpu/handlers/empty number/.code 2 args={% \pgfmathfloatcreate{0}{0.0}{0}% @@ -2525,7 +2644,7 @@ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/variance src}{\pgfplotstable@variance@table}% % \ifx\pgfplotstable@table\pgfutil@empty - \pgfutil@ifundefined{pgfplotstablename}{}{% + \pgfutil@ifundefined{pgfplotstablename}{}{% query the name of the actual table struct \let\pgfplotstable@table=\pgfplotstablename }% \fi diff --git a/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstableshared.code.tex b/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstableshared.code.tex index 4a31f8fc84d..37eed5ad6ce 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstableshared.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstableshared.code.tex @@ -56,7 +56,6 @@ \newif\ifpgfplotstable@firstline@is@header \newcount\c@pgfplotstable@counta \newtoks\t@pgfplotstable@a -\newwrite\pgfplotstable@outfile \newif\ifpgfplots@addplotimpl@readcompletely % should always be false; use only in grouped internal macros \newif\ifpgfplots@table@options@areset @@ -97,6 +96,8 @@ /pgfplots/table/z error expr/.initial=, /pgfplots/table/ignore chars/.initial=, /pgfplots/table/white space chars/.initial=, + /pgfplots/table/comment chars/.initial=, + /pgfplots/table/skip first n/.initial=0, /pgfplots/table/trim cells/.is if=pgfplotstable@trimcells, /pgfplots/table/trim cells/.default=true, /pgfplots/table/read completely/.is choice, @@ -481,9 +482,31 @@ \expandafter\pgfplotstablegetcolumnbyname\pgfplotstable@loc@TMPc\of#2\to{#3}% }% +% Defines #3 to be the column name of the column with index '#1'. +% +% #1: a column index (starting with 0) +% #2: a loaded table structure +% #3: an output macro name. \def\pgfplotstablegetcolumnnamebyindex#1\of#2\to#3{% \pgfplotslistselect#1\of#2\to#3\relax }% + +% Defines #3 to be the column index of the column with name '#1'. +% +% #1: a column name +% #2: a loaded table structure +% #3: an output macro name which will be filled with the index (or -1 +% if there is no such index) +\def\pgfplotstablegetcolumnindexforname#1\of#2\to#3{% + \def#3{-1}% + \edef\pgfplotstablegetcolumnindexforname@@{#1}% + \pgfplotstableforeachcolumn{#2}\as\pgfplotstablegetcolumnindexforname@{% + \relax + \ifx\pgfplotstablegetcolumnindexforname@\pgfplotstablegetcolumnindexforname@@ + \edef#3{\pgfplotstablecol}% + \fi + }% +}% \def\pgfplotstablegetcolumnbyindex#1\of#2\to#3{% \pgfplotslistselect#1\of#2\to#3\relax \expandafter\pgfplotstablegetcolumnbyname#3\of#2\to{#3}% @@ -664,7 +687,7 @@ }% }% \long\def\pgfplotstableread@impl@collectfirstarg#1#2{% - \pgfutil@ifnextchar t{% + \pgfplotsutil@ifnextchar t{% \pgfplotstableread@impl@@{#1}{#2}% }{% \pgfplotstableread@impl@{#1}{#2}% @@ -752,6 +775,15 @@ \pgfplotstableread@inlinefalse \fi % + % optimizations: + \pgfkeysgetvalue{/pgfplots/table/comment chars}\pgfplots@loc@TMPd + \ifx\pgfplots@loc@TMPd\pgfutil@empty + \let\pgfplotstableread@checkspecial@line@default=\relax + \fi + \pgfkeysgetvalue{/pgfplots/table/skip first n}\pgfplots@loc@TMPd + \ifx\pgfplots@loc@TMPd\pgfutil@empty \let\pgfplotstableread@check@skipfirstn=\relax \fi + \ifnum\pgfplots@loc@TMPd=0 \let\pgfplotstableread@check@skipfirstn=\relax \fi + % \ifpgfplotstableread@inline \def\pgfplotstableread@impl@fCLOSE{}% \let\pgfplotstableread@loop@over@lines=\pgfplotstableread@loop@over@lines@frominline% @@ -877,6 +909,8 @@ \pgfplotstableset@every@table{#2}{#1}% \fi % + \def\pgfplotstablename{\pgfplotstable@colnames@glob}% provide the name of the actual table struct (during \pgfplotstableread, only partial functionality is available!) + % % local counter definitions: \ifpgfplots@tableread@use@begingroup \let\pgfplotstableread@lineno=\c@pgf@counta @@ -1024,10 +1058,17 @@ }% }% +\def\pgfplotstableread@check@skipfirstn{% + \ifnum\pgfplotstableread@lineno<\pgfkeysvalueof{/pgfplots/table/skip first n} % + \pgfplotstableread@skiplinetrue + \fi +}% + % PRECONDITION: % \pgfplotstable@LINE contains the current input line. \def\pgfplotstableread@loop@processnextline{% \expandafter\pgfplotstableread@checkspecial@line\pgfplotstable@LINE\pgfplotstable@EOI + \pgfplotstableread@check@skipfirstn \ifpgfplotstableread@skipline \def\pgfplotstableread@gnuplotcheck{####x y type}% \ifx\pgfplotstableread@gnuplotcheck\pgfplotstable@LINE @@ -1055,6 +1096,7 @@ \fi \pgfplotstableread@impl@DO\pgfplotstableread@impl@countcols@and@identifynames@NEXT\pgfplotstable@LINE \pgfplotstableread@countset\pgfplotstableread@numcols{\pgfplotstableread@curcol}% + \edef\pgfplotstablecols{\thepgfplotstableread@numcols}% \pgfplotstableread@countreset\pgfplotstableread@curcol % Create empty column lists: \pgfplotstableread@create@column@lists @@ -1109,30 +1151,78 @@ % WARNING: this routine is also used in pgfplots.code.tex ... \def\pgfplotstableread@checkspecial@line{% - \pgfutil@ifnextchar##{% + \futurelet\pgfplotstableread@tmp\pgfplotstableread@checkspecial@line@ +}% +\def\pgfplotstableread@checkspecial@line@{% + \pgfplotstableread@skiplinefalse + \let\pgfplotstableread@checkspecial@line@@\pgfplotstableread@impl@gobble% + % + \let\pgfplotstableread@tmpb=##% + \ifx\pgfplotstableread@tmp\pgfplotstableread@tmpb \pgfplotstableread@skiplinetrue - \pgfplotstableread@impl@gobble - }{% - \pgfutil@ifnextchar${% - \pgfplotstableread@process@flags@line - }{% - \pgfutil@ifnextchar\pgfplotstable@EOI{% + \else + \let\pgfplotstableread@tmpb=$% + \ifx\pgfplotstableread@tmp\pgfplotstableread@tmpb + \let\pgfplotstableread@checkspecial@line@@=\pgfplotstableread@process@flags@line + \else + \let\pgfplotstableread@tmpb=\pgfplotstable@EOI% + \ifx\pgfplotstableread@tmp\pgfplotstableread@tmpb \pgfplotstableread@skiplinetrue \pgfplotsscanlinecomplete% the line is empty; same as \par! - \pgfplotstableread@impl@gobble - }{% - \pgfutil@ifnextchar\par{% + \else + \let\pgfplotstableread@tmpb=\par% + \ifx\pgfplotstableread@tmp\pgfplotstableread@tmpb \pgfplotstableread@skiplinetrue - \pgfplotsscanlinecomplete - \pgfplotstableread@impl@gobble - }{% - \pgfplotstableread@skiplinefalse - \pgfplotstableread@impl@gobble - }% - }% + \pgfplotsscanlinecomplete% the line is empty; + \else + \pgfplotstableread@checkspecial@line@default% + \fi + \fi + \fi + \fi + \pgfplotstableread@checkspecial@line@@ +}% +\def\pgfplotstableread@checkspecial@line@default{% + % this routine can be optimized away + \pgfkeysgetvalue{/pgfplots/table/comment chars}\pgfplots@loc@TMPd + \ifx\pgfplots@loc@TMPd\pgfutil@empty + \else + \expandafter\pgfplotsutilforeachcommasep\expandafter{\pgfplots@loc@TMPd}\as\pgfplots@loc@TMPd{% + \expandafter\let\expandafter\pgfplotstableread@tmpb\pgfplots@loc@TMPd + \ifx\pgfplotstableread@tmp\pgfplotstableread@tmpb + \pgfplotstableread@skiplinetrue + \fi }% - }% -} + \fi +}% + +%-------------------------------------------------- +% \def\pgfplotstableread@checkspecial@line{% +% \pgfutil@ifnextchar##{% +% \pgfplotstableread@skiplinetrue +% \pgfplotstableread@impl@gobble +% }{% +% \pgfutil@ifnextchar${% +% \pgfplotstableread@process@flags@line +% }{% +% \pgfutil@ifnextchar\pgfplotstable@EOI{% +% \pgfplotstableread@skiplinetrue +% \pgfplotsscanlinecomplete% the line is empty; same as \par! +% \pgfplotstableread@impl@gobble +% }{% +% \pgfutil@ifnextchar\par{% +% \pgfplotstableread@skiplinetrue +% \pgfplotsscanlinecomplete +% \pgfplotstableread@impl@gobble +% }{% +% \pgfplotstableread@skiplinefalse +% \pgfplotstableread@impl@gobble +% }% +% }% +% }% +% }% +% } +%-------------------------------------------------- \long\def\pgfplotstableread@process@flags@line$flags {% %\pgfplots@message{Ignoring flags line ...}% @@ -1435,7 +1525,7 @@ \else \begingroup \t@pgfplots@tokc={#1}% - \pgfplotstable@error{Table '\pgfplotstableread@filename' has too much columns in line \thepgfplotstableread@lineno: Ignoring '\the\t@pgfplots@tokc'. Please verify that every cell entry is separated correctly (use braces {<cell entry>} if necessary). This error is not critical}% + \pgfplotstable@error{Table '\pgfplotstableread@filename' appears to have too many columns in line \thepgfplotstableread@lineno: Ignoring '\the\t@pgfplots@tokc'. PGFPlots found that the number of columns is larger than the previously determined number of columns. Please verify that every cell entry is separated correctly (use braces {<cell entry>} if necessary. Also verify that column names are plain ASCII.). This error is not critical}% \endgroup \fi } @@ -1648,17 +1738,14 @@ }% \let\pgfplotstablecol=\relax }% +\let\pgfplotstableforeachcolumn@orig=\pgfplotstableforeachcolumn + % A variant of \pgfplotstableforeachcolumn which is used inside of % \pgfplotstableread to listener. % % It is used as \pgfplotstableforeachcolumn\as\cur{<do something with \cur>} -\long\def\pgfplotstableforeachcolumn@listener\as#1#2{% - \def\pgfplotstablecol{0}% - \pgfplotslistforeachungrouped\pgfplotstable@colnames@glob\as#1{% - #2\relax% - \pgfplotsutil@advancestringcounter\pgfplotstablecol - }% - \let\pgfplotstablecol=\relax +\long\def\pgfplotstableforeachcolumn@listener#1\as#2#3{% + \pgfplotstableforeachcolumn@orig\pgfplotstable@colnames@glob\as{#2}{#3}% }% % Reports every element t_{ij} for a fixed column j (in read-only diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_loader.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_loader.code.tex index 180ca8ce195..42499218fef 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_loader.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_loader.code.tex @@ -17,7 +17,7 @@ % #2: for normal processing. \def\pgfplots@ifneedspgfcompabitibilitycode#1#2{% %\pgfkeysifdefined{/pgf/number format/sci precision/.@cmd}{#2}{#1}% - \pgfutil@ifundefined{tikzifinpicture}{#1}{#2}% + \pgfutil@ifundefined{pgfmath@tonumber@notrailingzero}{#1}{#2}% }% \pgfplots@ifneedspgfcompabitibilitycode @@ -45,4 +45,6 @@ } {}% + + \endinput diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_misc.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_misc.code.tex index 12d308255bd..dad89e7c7e1 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_misc.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_misc.code.tex @@ -2,13 +2,14 @@ % ====================================================== % compatibility with PGF 2.0 % ====================================================== +\def\pgfutil@gobble@until@relax#1\relax{} \expandafter\ifx\csname w@pgf@writea\endcsname\relax -\newwrite\w@pgf@writea +\csname newwrite\endcsname\w@pgf@writea \fi \expandafter\ifx\csname r@pgf@reada\endcsname\relax -\newread\r@pgf@reada +\csname newread\endcsname\r@pgf@reada \fi \let\pgfutil@inputcheck=\r@pgf@reada @@ -442,3 +443,333 @@ \global\pgf@picmaxy=-16000pt\relax% \global\pgf@picminy=16000pt\relax% }% + +% from pgfcorepathconstruct.code.tex: + + +\def\pgfpatharctomaxstepsize{45} + +% A specialized arc operation for an arc on an (axis--parallel) ellipse. +% +% In contrast to \pgfpatharc, it explicitly interpolates start- and end points. +% +% In contrast to \pgfpatharcto, this routine is numerically stable and +% quite fast since it relies on a lot of precomputed information. +% +% #1 center of ellipse +% #2 angle of last path position inside of the ellipse +% #3 end angle +% #4 end point (a \pgfpoint) +% #5 xradius +% #6 yradius +% #7 the ratio xradius/yradius of the ellipse +% #8 the ratio yradius/xradius of the ellipse +% Example: +% \def\cx{1cm}% center x +% \def\cy{1cm}% center y +% \def\startangle{0}% +% \def\endangle{45}% +% \def\a{5cm}% xradius +% \def\b{10cm}% yradius +% \pgfmathparse{\a/\b}\let\abratio=\pgfmathresult +% \pgfmathparse{\b/\a}\let\baratio=\pgfmathresult +% +% \pgfpathmoveto{\pgfpoint{\cx+\a*cos(\startangle)}{\cy+\b*sin(\startangle)}}% +% \pgfpatharctoprecomputed +% {\pgfpoint{\cx}{\cy}} +% {\startangle} +% {\endangle} +% {\pgfpoint{\cx+\a*cos(\endangle)}{\cy+\b*sin(\endangle)}}% +% {\a} +% {\b} +% {\abratio} +% {\baratio} +% +\def\pgfpatharctoprecomputed#1#2#3#4#5#6#7#8{% + \begingroup + % Implementation idea: + % + % let + % m = center (#1) + % \gamma_0 = start angle + % \gamma_1 = end angle + % a = x radius + % b = y radius + % + % an axis parallel ellipse is parameterized by + % C(\gamma) = m + ( a cos(\gamma), b sin(\gamma) ), \gamma in [0,360]. + % + % Now, consider the segment \gamma(t), + % \gamma:[0,1] -> [\gamma_0,\gamma_1], + % t -> \gamma_0 + t(\gamma_1 - \gamma_0) + % and + % C(\gamma(t)) which is defined on [0,1]. + % + % I'd like to approximate the arc by one or more cubic bezier + % splines which interpolate through the last and first provided + % points. + % + % In general, a Bezier spline C:[0,1] -> \R of order n fulfills + % C'(0) = n ( P_1 - P_0 ), + % C'(1) = n ( P_n - P_{n-1} ). + % For n=3 and given P_0 and P_3, I can directly compute P_1 and P_2 once I know + % the derivatives at t=0 and t=1. + % + % The derivatives in our case are + % ( C \circ \gamma )'(t) = C'[\gamma(t)] * \gamma'(t) + % = ( -a pi/180 sin(\gamma(t)), b pi/180 cos(\gamma(t)) ) * (\gamma_1 - \gamma_0). + % The pi/180 comes into play since we are working with degrees. + % + % Expression (C\circ\gamma)'(0) using P_0 and (C \circ \gamma)'(1) + % using P_3 yields the expressions + % (C \circ \gamma)'(0) = + % pi/180 * (\gamma_1 - \gamma_0)* [ - a/b(P_0^y - my), b/a (P_0^x - mx) ] + % (C \circ \gamma)'(1) = + % pi/180 * (\gamma_1 - \gamma_0)* [ - a/b(P_3^y - my), b/a (P_3^x - mx) ] + % + % defining + % scaleA = a/b * pi / (3*180) * (\gamma_1 - \gamma_0) + % and + % scaleB = b/a * pi / (3*180) * (\gamma_1 - \gamma_0) + % yields the direct expressions for the intermediate bezier + % control points + % + % P_1 = [ + % P_0^x - scaleA* ( P_0^y -my), + % P_0^y + scaleB* ( P_0^x -mx) ] + % and + % P_2 = [ + % P_3^x + scaleA* ( P_3^y -my), + % P_3^y - scaleB* ( P_3^x -mx) ]. + % + % This works fast, with few operations, if + % - a/b and b/a are known in advance + % - P_0 and P_3 are known in advance + % - \gamma_0 and \gamma_1 are known. + % + % It is also reliable if (\gamma_1 - \gamma_0) is small + % + \pgf@process{#1}% + \edef\pgfpath@center@x{\the\pgf@x}% + \edef\pgfpath@center@y{\the\pgf@y}% + \def\pgfpath@completearcend{#4}% + % compute scale (#3-#2) * pi/(3*180) = (#3 - #2) * pi/27 * 1/20 + % splitting pi/(3*180) into two scales has higher TeX accuracy + \pgf@xa=#2pt + \pgf@xb=#3pt + \edef\pgfpath@startangle{#2pt}% + \edef\pgfpath@endangle{\pgf@sys@tonumber\pgf@xb}% + % + \pgf@ya=\pgf@xb + \advance\pgf@ya by-\pgf@xa + % + \ifx\pgfpatharctomaxstepsize\pgfutil@empty + \def\pgfpath@N{1}% + \pgf@xc=\pgf@ya + \else + \pgf@xc=\pgf@ya% compute N = floor((gamma_1 - gamma_0) / max) +1 + \ifdim\pgf@xc<0pt + \multiply\pgf@xc by-1 + \fi + \divide\pgf@xc by\pgfpatharctomaxstepsize\relax + \afterassignment\pgfutil@gobble@until@relax + \c@pgf@counta=\the\pgf@xc\relax + \advance\c@pgf@counta by1 + \edef\pgfpath@N{\the\c@pgf@counta}% + % + \pgf@xc=\pgf@ya + \divide\pgf@xc by\c@pgf@counta + \fi + % + \edef\pgfpath@h{\pgf@sys@tonumber\pgf@xc}% + % +%\message{pgfpathellipse: using N =\pgfpath@N\space spline points y0 = \pgfpath@startangle, y0+i*h, yN=\pgfpath@endangle, i=1,...,(\pgfpath@N-1), with h=\pgfpath@h\space mesh width (total arc angle \pgf@sys@tonumber\pgf@ya).}% + % + % + \pgf@xc=0.116355283466289\pgf@xc % pi/27 + \divide\pgf@xc by20 + \pgf@xa=#7\pgf@xc + \edef\pgfpath@scale@A{\pgf@sys@tonumber\pgf@xa}% + \pgf@xa=#8\pgf@xc + \edef\pgfpath@scale@B{\pgf@sys@tonumber\pgf@xa}% + % + % compute intermediate spline segments for + % i = 1,...,N-1 + % this is a no-op for N=1. + \c@pgf@countd=1 + \pgfutil@loop + \ifnum\c@pgf@countd<\pgfpath@N\relax + % + \pgf@xa=\pgfpath@startangle % compute \pgf@xa = y_0 + i*h + \pgf@xb=\pgfpath@h pt + \multiply\pgf@xb by\c@pgf@countd + \advance\pgf@xa by\pgf@xb + \edef\pgfpath@angle@i{\pgf@sys@tonumber\pgf@xa}% +%\message{angle \the\c@pgf@countd: \pgfpath@angle@i...}% + % + \pgfpatharcofellipse@{% + \pgfpoint + {\pgfpath@center@x + #5*cos(\pgfpath@angle@i)} + {\pgfpath@center@y + #6*sin(\pgfpath@angle@i)} + }% + % + \advance\c@pgf@countd by1 + \pgfutil@repeat + % + % compute final spline segment. It only differs insofar as the + % final point is already known explicitly and should be + % interpolated without additional math error. +%\message{angle \pgfpath@N: \pgfpath@endangle...}% + \pgfpatharcofellipse@{\pgfpath@completearcend}% + \endgroup +}% +\def\pgfpatharcofellipse@#1{% + \begingroup + \pgf@process{#1}% + \edef\pgfpath@endpt{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% + % + \pgfpathcurveto{ + \begingroup + \global\pgf@x=\pgf@path@lastx + \global\pgf@y=\pgf@path@lasty + \pgf@xa=\pgf@x \advance\pgf@xa by-\pgfpath@center@x + \pgf@ya=\pgf@y \advance\pgf@ya by-\pgfpath@center@y + \global\advance\pgf@x by-\pgfpath@scale@A\pgf@ya + \global\advance\pgf@y by \pgfpath@scale@B\pgf@xa + \endgroup + }{% + \begingroup + \pgfpath@endpt + \pgf@xa=\pgf@x \advance\pgf@xa by-\pgfpath@center@x + \pgf@ya=\pgf@y \advance\pgf@ya by-\pgfpath@center@y + \global\advance\pgf@x by \pgfpath@scale@A\pgf@ya + \global\advance\pgf@y by-\pgfpath@scale@B\pgf@xa + \endgroup + }{% + \pgfpath@endpt + }% + \endgroup +} + +% bugfix for pgf 2.10, pgfmathfunctions.basic.code.tex : +% +\newif\ifpgfmath@divide@period +\def\pgfmathdivide@#1#2{% + \begingroup% + \pgfmath@x=#1pt\relax% + \pgfmath@y=#2pt\relax% + \let\pgfmath@sign=\pgfmath@empty% + \ifdim0pt=\pgfmath@y% + \pgfmath@error{You've asked me to divide `#1' by `#2', % + but I cannot divide any number by `#2'}% + \fi% + \afterassignment\pgfmath@xa% + \c@pgfmath@counta\the\pgfmath@y\relax% + \ifdim0pt=\pgfmath@xa% + \divide\pgfmath@x by\c@pgfmath@counta% + \else% + \ifdim0pt>\pgfmath@x% + \def\pgfmath@sign{-}% + \pgfmath@x=-\pgfmath@x% + \fi% + \ifdim0pt>\pgfmath@y% + \expandafter\def\expandafter\pgfmath@sign\expandafter{\pgfmath@sign-}% + \pgfmath@y=-\pgfmath@y% + \fi% + \ifdim1pt>\pgfmath@y% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgfmath@y}}% + \pgfmath@x=\pgfmath@sign\pgfmathresult\pgfmath@x% + \else% + \def\pgfmathresult{0}% + \pgfmath@divide@periodtrue% + \c@pgfmath@counta=0\relax% + \pgfmathdivide@@% + \pgfmath@x=\pgfmath@sign\pgfmathresult pt\relax% + \fi% + \fi% + \pgfmath@returnone\pgfmath@x% + \endgroup% +} +\def\pgfmath@small@number{0.00002} +\def\pgfmathdivide@@{% + \let\pgfmath@next=\relax% + \ifdim\pgfmath@small@number pt<\pgfmath@x% + \ifdim\pgfmath@small@number pt<\pgfmath@y% + \ifdim\pgfmath@y>\pgfmath@x% + \ifpgfmath@divide@period% + \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult.}% + \pgfmath@divide@periodfalse% + \fi% + \pgfmathdivide@dimenbyten\pgfmath@y% + \ifdim\pgfmath@y>\pgfmath@x% + \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult0}% + \fi% + \else% + \c@pgfmath@counta=\pgfmath@x% + \c@pgfmath@countb=\pgfmath@y% + \divide\c@pgfmath@counta by\c@pgfmath@countb% + \pgfmath@ya=\c@pgfmath@counta\pgfmath@y% + \advance\pgfmath@x by-\pgfmath@ya% + \def\pgfmath@next{% + \toks0=\expandafter{\pgfmathresult}% + \edef\pgfmathresult{\the\toks0 \the\c@pgfmath@counta}% + }% + \ifpgfmath@divide@period + \else + % we are behind the period. It may happen that the + % result is more than one digit - in that case, + % introduce special handling: + \ifnum\c@pgfmath@counta>9 % + \expandafter\pgfmathdivide@advance@last@digit\pgfmathresult CCCCC\@@ + \advance\c@pgfmath@counta by-10 % + \ifnum\c@pgfmath@counta=0 + \let\pgfmath@next=\relax + \fi + \fi + \fi + \pgfmath@next + \fi% + \let\pgfmath@next=\pgfmathdivide@@% + \fi% + \fi% + \pgfmath@next% +} + +% advances the last digit found in the number. Any missing digits are +% supposed to be filled with 'C'. +\def\pgfmathdivide@advance@last@digit#1.#2#3#4#5#6#7\@@{% + \pgfmath@ya=\pgfmathresult pt % + \if#2C% + \pgfmath@xa=1pt % + \else + \if#3C% + \pgfmath@xa=0.1pt % + \else + \if#4C% + \pgfmath@xa=0.01pt % + \else + \if#5C% + \pgfmath@xa=0.001pt % + \else + \if#6C% + \pgfmath@xa=0.0001pt % + \else + \pgfmath@xa=0.00001pt % + \fi + \fi + \fi + \fi + \fi + \advance\pgfmath@ya by\pgfmath@xa + \edef\pgfmathresult{\pgfmath@tonumber@notrailingzero\pgfmath@ya}% +}% + +{ +\catcode`\p=12 +\catcode`\t=12 +\gdef\Pgf@geT@NO@TRAILING@ZERO#1.#2pt{% + #1.% + \ifnum#2=0 \else #2\fi +} +} +\def\pgfmath@tonumber@notrailingzero#1{\expandafter\Pgf@geT@NO@TRAILING@ZERO\the#1} diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfcoreexternal.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfcoreexternal.code.tex index 8f769db849b..5b9be1a3087 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfcoreexternal.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfcoreexternal.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% @@ -27,16 +27,30 @@ % % See the file doc/generic/pgf/licenses/LICENSE for more details. -\ProvidesFileRCS $Header: /cvsroot/pgf/pgf/generic/pgf/basiclayer/pgfcoreexternal.code.tex,v 1.9 2010/07/14 19:32:13 ludewich Exp $ +\ProvidesFileRCS $Header: /cvsroot/pgf/pgf/generic/pgf/basiclayer/pgfcoreexternal.code.tex,v 1.17 2010/09/01 08:56:40 ludewich Exp $ \newif\ifpgfexternal@aux@in@dpth +\newif\ifpgfexternal@info \pgfkeys{ - /pgf/images/include external/.code={\pgfimage{#1}}, - /pgf/images/aux in dpth/.is if=pgfexternal@aux@in@dpth, - /pgf/images/aux in dpth/.default=true + /pgf/images/include external/.code={\pgfimage{#1}}, + /pgf/images/aux in dpth/.is if=pgfexternal@aux@in@dpth, + /pgf/images/aux in dpth/.default=true, + /pgf/images/trim external/.code n args={4}{% + \def\pgf@external@kern@left{#1}% + \def\pgf@external@kern@bottom{#2}% + \def\pgf@external@kern@right{#3}% + \def\pgf@external@kern@top{#4}% + \ifx\pgf@external@kern@left\pgfutil@empty\def\pgf@external@kern@left{0sp}\fi% + \ifx\pgf@external@kern@bottom\pgfutil@empty\def\pgf@external@kern@bottom{0sp}\fi% + \ifx\pgf@external@kern@right\pgfutil@empty\def\pgf@external@kern@right{0sp}\fi% + \ifx\pgf@external@kern@top\pgfutil@empty\def\pgf@external@kern@top{0sp}\fi% + }, + /pgf/images/trim external={1truein}{1truein}{1truein}{1truein}, + /pgf/images/external info/.is if=pgfexternal@info, + /pgf/images/external info/.default=true, } % The external read/write mechanism is used as follows: @@ -103,68 +117,68 @@ \ifx\pgf@tempa\pgf@tempb% \else% \pgf@external@grabshipouttrue% - \pgfexternal@nofiles% see also \pgf@external@init@aux@in@dpth - \ifpgfexternalreadmainaux - % and reset the jobname. This should allow to handle any - % \label/\ref constructions which are stored in \jobname.aux (and - % which won't be found otherwise) - \gdef\jobname{#1}% - \fi - \ifpgfexternal@aux@in@dpth - \csname newwrite\endcsname\w@pgfexternal@auxout - \fi + \pgfexternal@nofiles% see also \pgf@external@init@aux@in@dpth + \ifpgfexternalreadmainaux + % and reset the jobname. This should allow to handle any + % \label/\ref constructions which are stored in \jobname.aux (and + % which won't be found otherwise) + \gdef\jobname{#1}% + \fi + \ifpgfexternal@aux@in@dpth + \csname newwrite\endcsname\w@pgfexternal@auxout + \fi \fi% \gdef\pgfrealjobname##1{}% avoid multiple calls. } \def\pgfexternal@nofiles{% - % replace \relax. The \nofiles macros does - % \let\makeglossary=\relax - % but the glossary.sty calls \renewcommand\makeglossary (which - % will fail if \makeglossary=\relax). Stupid, but it works. - \let\pgfexternal@nofiles@=\relax - \def\relax{\relax}% - % - % suppress generation of LaTeX .aux, .toc etc files. - % generation of these files is not thread-safe. - % the \csname \endcsname yields \relax if \nofiles doesn't exist. - \csname nofiles\endcsname - % - \let\relax=\pgfexternal@nofiles@ + % replace \relax. The \nofiles macros does + % \let\makeglossary=\relax + % but the glossary.sty calls \renewcommand\makeglossary (which + % will fail if \makeglossary=\relax). Stupid, but it works. + \let\pgfexternal@nofiles@=\relax + \def\relax{\relax}% + % + % suppress generation of LaTeX .aux, .toc etc files. + % generation of these files is not thread-safe. + % the \csname \endcsname yields \relax if \nofiles doesn't exist. + \csname nofiles\endcsname + % + \let\relax=\pgfexternal@nofiles@ }% \newif\ifpgf@external@grabshipout \newbox\pgfexternal@startupbox \pgfutil@ifundefined{AtBeginDocument}{}{% - \AtBeginDocument{% - \ifpgf@external@grabshipout% - \global\let\pgfexternal@originalshipout=\shipout% - \global\def\shipout{\setbox\pgfpic=}% - \maxdeadcycles=10000% - % Ok, gather everything we have seen up to now in a box. This box - % will contain any specials that have been used. - {% - \output{\global\setbox\pgfexternal@startupbox=\vbox{\csname @begindvi\endcsname\unvbox255}}% - \hbox{}\eject% - }% - \fi% - } + \AtBeginDocument{% + \ifpgf@external@grabshipout% + \global\let\pgfexternal@originalshipout=\shipout% + \global\def\shipout{\setbox\pgfpic=}% + \maxdeadcycles=10000% + % Ok, gather everything we have seen up to now in a box. This box + % will contain any specials that have been used. + {% + \output{\global\setbox\pgfexternal@startupbox=\vbox{\csname @begindvi\endcsname\unvbox255}}% + \hbox{}\eject% + }% + \fi% + } }% \pgfutil@ifundefined{AtEndDocument}{}{% - \AtEndDocument{% - \ifpgf@external@grabshipout - \pgfutil@ifundefined{pgfexternal@did@a@shipout}{% - \pgfexternal@error@no@shipout - }{}% - \fi - }% + \AtEndDocument{% + \ifpgf@external@grabshipout + \pgfutil@ifundefined{pgfexternal@did@a@shipout}{% + \pgfexternal@error@no@shipout + }{}% + \fi + }% } % This will be overwritten by the tikz external lib if it is loaded. \def\pgfexternal@error@no@shipout{% - \PackageError{pgf}{Sorry, image externalization failed: the resulting image was EMPTY. I tried to externalize '\pgfactualjobname'. Perhaps there was a typo somewhere? Please check that your document contains '\string\beginpgfgraphicnamed{\pgfactualjobname} ... \string\endpgfgraphicnamed'}% + \PackageError{pgf}{Sorry, image externalization failed: the resulting image was EMPTY. I tried to externalize '\pgfactualjobname'. Perhaps there was a typo somewhere? Please check that your document contains '\string\beginpgfgraphicnamed{\pgfactualjobname} ... \string\endpgfgraphicnamed'}% }% @@ -215,7 +229,7 @@ } \long\def\pgf@replacepicturebygraphic#1\endpgfgraphicnamed{% - \expandafter\pgfincludeexternalgraphics\expandafter{\pgf@filename}\unskip + \expandafter\pgfincludeexternalgraphics\expandafter{\pgf@filename}\unskip } % This is almost the same as \includegraphics{#1}, but it checks @@ -226,22 +240,22 @@ % collected for the external graphics (references). They start after % the first line (if any). \def\pgfincludeexternalgraphics#1{% - \begingroup - \pgfexternalreaddpth{#1}% - \pgfkeysifdefined{/pgf/images/include external/#1/.@cmd}{% - \pgfkeysgetvalue{/pgf/images/include external/#1/.@cmd}\pgf@tempa - \pgfkeysgetlet{/pgf/images/include external/.@cmd}\pgf@tempa - }{}% - \setbox1=\hbox{\pgfkeysvalueof{/pgf/images/include external/.@cmd}{#1}\pgfeov}% - \ifdim\pgfexternaltrimleft=0sp \else \kern\pgfexternaltrimleft\relax \fi - \ifdim\pgfexternaldepth=0pt - \box1 - \else - \dimen0=\pgfexternaldepth\relax - \hbox{\lower\dimen0 \box1 }% - \fi - \ifdim\pgfexternaltrimright=0sp \else \kern\pgfexternaltrimright\relax \fi - \endgroup + \begingroup + \pgfexternalreaddpth{#1}% + \pgfkeysifdefined{/pgf/images/include external/#1/.@cmd}{% + \pgfkeysgetvalue{/pgf/images/include external/#1/.@cmd}\pgf@tempa + \pgfkeyslet{/pgf/images/include external/.@cmd}\pgf@tempa + }{}% + \setbox1=\hbox{\pgfkeysvalueof{/pgf/images/include external/.@cmd}{#1}\pgfeov}% + \ifdim\pgfexternaltrimleft=0sp \else \kern\pgfexternaltrimleft\relax \fi + \ifdim\pgfexternaldepth=0pt + \box1 + \else + \dimen0=\pgfexternaldepth\relax + \hbox{\lower\dimen0 \box1 }% + \fi + \ifdim\pgfexternaltrimright=0sp \else \kern\pgfexternaltrimright\relax \fi + \endgroup } % Defines \pgfexternaldepth to be the depth of the external picture @@ -252,81 +266,88 @@ % .dpth file (it appends it to the main aux file). % \def\pgfexternalreaddpth#1{% - % no \begingroup. Handle that manually: - \edef\pgfexternalreaddpth@restore{% - \noexpand\endlinechar=\the\endlinechar\space - \noexpand\catcode`\noexpand\@=\the\catcode`\@\space - }% - % - \def\pgfexternaldepth{0sp}% - \def\pgfexternaltrimleft{0sp}% - \def\pgfexternaltrimright{0sp}% - \endlinechar=-1 % suppress white space at end - \catcode`\@=11 - \openin\r@pgf@reada=#1.dpth - \pgfincludeexternalgraphics@read@dpth - % - \pgfexternalreaddpth@restore + % no \begingroup. Handle that manually: + \edef\pgfexternalreaddpth@restore{% + \noexpand\endlinechar=\the\endlinechar\space + \noexpand\catcode`\noexpand\@=\the\catcode`\@\space + }% + % + \def\pgfexternaldepth{0sp}% + \def\pgfexternaltrimleft{0sp}% + \def\pgfexternaltrimright{0sp}% + \endlinechar=-1 % suppress white space at end + \catcode`\@=11 + \openin\r@pgf@reada=#1.dpth + \pgfincludeexternalgraphics@read@dpth + % + \pgfexternalreaddpth@restore }% % % The .dpth consists of 0-N lines, where each is either a single % dimension (the box' depth) or something which belongs to the .aux % file (such lines will always start with a macro). \def\pgfincludeexternalgraphics@read@dpth{% - \ifeof\r@pgf@reada - \closein\r@pgf@reada - \else - \read\r@pgf@reada to\pgfincludeexternalgraphics@auxline - \ifx\pgfincludeexternalgraphics@auxline\pgfutil@empty - \else - \expandafter\pgfincludeexternalgraphics@read@dpth@line\pgfincludeexternalgraphics@auxline\pgfincludeexternalgraphics@read@dpth@line@EOI - \fi - \expandafter\pgfincludeexternalgraphics@read@dpth - \fi + \ifeof\r@pgf@reada + \closein\r@pgf@reada + \else + \read\r@pgf@reada to\pgfincludeexternalgraphics@auxline + \ifx\pgfincludeexternalgraphics@auxline\pgfutil@empty + \else + \expandafter\pgfincludeexternalgraphics@read@dpth@line\pgfincludeexternalgraphics@auxline\pgfincludeexternalgraphics@read@dpth@line@EOI + \fi + \expandafter\pgfincludeexternalgraphics@read@dpth + \fi }% -\def\pgfexternal@restore#1{}% - -\long\def\pgfincludeexternalgraphics@read@dpth@line#1#2\pgfincludeexternalgraphics@read@dpth@line@EOI{% - \ifcat\noexpand#1\relax - % Ah -- the first token is a control sequence. It belongs to - % the .aux file. - % - \ifx#1\pgfexternal@restore - #2% - \else - % do NOT execute #1#2! many LaTeX commands don't support it (\label for example) - \pgfutil@ifundefined{if@filesw}{% - % sorry, .aux file support only for latex - }{% - % append to main .aux file (for forward references) - \if@filesw - {% - \toks0={#1#2}% - % believe it or not, but the - % \def\dpthimport{...}\dpthimport *makes* a - % difference! In ensures any occuring `##' characters are properly expanded to `#'. - \immediate\write\@auxout{\noexpand\def\noexpand\dpthimport{\the\toks0 }\noexpand\dpthimport }% - }% - \fi - }% - \fi - \else% it is the depth (which is simply a number for backwards compatibility) - \def\pgfexternaldepth{#1#2}% - \fi +\def\pgfexternal@restore#1{#1}% + +\long\def\pgfincludeexternalgraphics@read@dpth@line@getfirst#1#2\pgfincludeexternalgraphics@read@dpth@line@EOI{% + \def\pgf@first{#1}% +}% +\long\def\pgfincludeexternalgraphics@read@dpth@line#1\pgfincludeexternalgraphics@read@dpth@line@EOI{% + \pgfincludeexternalgraphics@read@dpth@line@getfirst#1\pgfincludeexternalgraphics@read@dpth@line@EOI + \expandafter\ifcat\expandafter\noexpand\pgf@first\relax + % Ah -- the first token is a control sequence. It belongs to + % the .aux file. + % + \expandafter\ifx\pgf@first\pgfexternal@restore + #1% + \else + % do NOT execute #1! many LaTeX commands don't support it (\label for example) + \pgfutil@ifundefined{if@filesw}{% + % sorry, .aux file support only for latex + }{% + % append to main .aux file (for forward references) + \if@filesw + {% + \toks0={#1}% + % believe it or not, but the + % \def\dpthimport{...}\dpthimport *makes* a + % difference! In ensures any occuring `##' characters are properly expanded to `#'. + \immediate\write\@auxout{% + \noexpand\def\noexpand\dpthimport{\the\toks0}\noexpand\dpthimport}% + }% + \fi + }% + \fi + \else% it is the depth (which is simply a number for backwards compatibility) + \def\pgfexternaldepth{#1}% + \fi }% -% Stores '#1' into (expanded!) into the .dpth file of the currently +% Stores '#1' (expanded!) into the .dpth file of the currently % exported image. % -% Just before the image is included into the main document, '#1' will be -% invoked. -% % This command has only an effect if an image is being exported. +% +% The stored contents will be read in the context where +% /pgf/images/include external is active (i.e. by +% \pgfexternalreaddpth). +% \def\pgfexternalstorecommand#1{% }% \def\pgfexternalstorecommand@isexporting#1{% - \immediate\write\w@pgfexternal@auxout{\noexpand\pgfexternal@restore{#1}}% + \immediate\write\w@pgfexternal@auxout{\noexpand\pgfexternal@restore{#1}}% }% @@ -337,10 +358,10 @@ % this method is also invoked from within the tikz external library. \def\pgf@external@grab#1{% \def\pgf@filename{#1}% - \ifpgfexternal@aux@in@dpth - \begingroup - \pgf@external@init@aux@in@dpth - \let\G@refundefinedtrue=\pgf@external@grab@refundefinedtrue + \ifpgfexternal@aux@in@dpth + \begingroup + \pgf@external@init@aux@in@dpth + \let\G@refundefinedtrue=\pgf@external@grab@refundefinedtrue \fi \gdef\pgf@trimleft@final{0sp}% \gdef\pgf@trimright@final{0sp}% @@ -353,99 +374,115 @@ \expandafter\let\expandafter\pgf@external@grab@refundefinedtrue@orig\csname G@refundefinedtrue\endcsname \def\pgf@external@grab@refundefinedtrue{% - \pgf@external@grab@refundefinedtrue@orig - \begingroup - \def\n{\pgfexternal@hat\pgfexternal@hat J}% - \pgfexternalstorecommand{% - \noexpand\immediate\noexpand\write16{\pgf@external@grab@refundefinedtrue@warning}% - \noexpand\G@refundefinedtrue - }% - \endgroup + \pgf@external@grab@refundefinedtrue@orig + \begingroup + \def\n{\pgfexternal@hat\pgfexternal@hat J}% + \pgfexternalstorecommand{% + \noexpand\immediate\noexpand\write16{\pgf@external@grab@refundefinedtrue@warning}% + \noexpand\G@refundefinedtrue + }% + \endgroup }% \def\pgf@external@grab@refundefinedtrue@warning{% - LaTeX Warning: External picture `\pgfactualjobname' contains undefined references\noexpand\on@line.\n + LaTeX Warning: External picture `\pgfactualjobname' contains undefined references\noexpand\on@line.\n }% \let\pgf@external@@protected@write@orig=\protected@write \long\def\pgf@external@@protected@write@immediate#1#2#3{% - \begingroup - \let\pgf@write@=\write - \def\write{\noexpand\immediate\pgf@write@}% - \pgf@external@@protected@write@orig{#1}{#2}{#3}% - \endgroup + \begingroup + \let\pgf@write@=\write + \def\write{\noexpand\immediate\pgf@write@}% + \pgf@external@@protected@write@orig{#1}{#2}{#3}% + \endgroup }% \def\pgf@external@init@aux@in@dpth{% - \let\pgfexternalstorecommand=\pgfexternalstorecommand@isexporting - % - % tell LaTeX to write aux files... - \csname @fileswtrue\endcsname - % ... but redirect output to the .dpth file! - \immediate\openout\w@pgfexternal@auxout=\pgf@filename.dpth - \let\@auxout=\w@pgfexternal@auxout - % ... and disable the correct page numbers. I can't get that - % (because the correct page number is only available in the - % shipout routine). Use immediate output: - \let\protected@write=\pgf@external@@protected@write@immediate + \let\pgfexternalstorecommand=\pgfexternalstorecommand@isexporting + % + % tell LaTeX to write aux files... + \csname @fileswtrue\endcsname + % ... but redirect output to the .dpth file! + \immediate\openout\w@pgfexternal@auxout=\pgf@filename.dpth + \let\@auxout=\w@pgfexternal@auxout + % ... and disable the correct page numbers. I can't get that + % (because the correct page number is only available in the + % shipout routine). Use immediate output: + \let\protected@write=\pgf@external@@protected@write@immediate }% \def\pgf@externalend@storeshifts#1{% - \immediate\write#1{\the\dp\pgfpic}% - \ifx\pgf@trimleft@final\pgfutil@empty\else - \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternaltrimleft{\pgf@trimleft@final}}}% - \fi - \ifx\pgf@trimright@final\pgfutil@empty\else - \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternaltrimright{\pgf@trimright@final}}}% - \fi + \immediate\write#1{\the\dp\pgfpic}% store the depth simply as number for backw. compat. + \ifx\pgf@trimleft@final\pgfutil@empty\else + \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternaltrimleft{\pgf@trimleft@final}}}% + \fi + \ifx\pgf@trimright@final\pgfutil@empty\else + \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternaltrimright{\pgf@trimright@final}}}% + \fi + \ifpgfexternal@info + \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternalwidth{\the\wd\pgfpic}}}% + \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternalheight{\the\dimen0}}}% + \fi } % REMARK: % this method is also invoked from within the tikz external library. \def\pgf@externalend{% \unskip\egroup\egroup% {% - \def\pgf@external@trim{0}% - \def\pgf@external@store@dpth{0}% - % - \ifdim\pgf@trimleft@final=0sp \gdef\pgf@trimleft@final{} \else\def\pgf@external@trim{1}\fi - \ifdim\pgf@trimright@final=0sp \gdef\pgf@trimright@final{} \else\def\pgf@external@trim{1}\fi - \if1\pgf@external@trim - % UNDO the trimming! export to pdf doesn't supported trimmed - % bounding boxes (has to do with the mediabox/trimbox etc). - % I'll keep the bounding box intact and store the trim information - % into the .dpth file. - \setbox\pgfpic=\hbox{% - \ifx\pgf@trimleft@final\pgfutil@empty\else\kern-\pgf@trimleft@final\fi - \box\pgfpic - \ifx\pgf@trimright@final\pgfutil@empty\else\kern-\pgf@trimright@final\fi - }% - \def\pgf@external@store@dpth{1}% - \fi - % + \def\pgf@external@trim{0}% + \def\pgf@external@store@dpth{0}% + % + \ifpgf@trim@lowlevel + \gdef\pgf@trimleft@final{}% + \gdef\pgf@trimright@final{}% + \else + \ifdim\pgf@trimleft@final=0sp \gdef\pgf@trimleft@final{} \else\def\pgf@external@trim{1}\fi + \ifdim\pgf@trimright@final=0sp \gdef\pgf@trimright@final{} \else\def\pgf@external@trim{1}\fi + \if1\pgf@external@trim + % UNDO the trimming! export to pdf doesn't supported trimmed + % bounding boxes (has to do with the mediabox/trimbox etc). + % I'll keep the bounding box intact and store the trim information + % into the .dpth file. + \setbox\pgfpic=\hbox{% + \ifx\pgf@trimleft@final\pgfutil@empty\else\kern-\pgf@trimleft@final\fi + \box\pgfpic + \ifx\pgf@trimright@final\pgfutil@empty\else\kern-\pgf@trimright@final\fi + }% + \def\pgf@external@store@dpth{1}% + \fi + \fi + % \parindent0pt % leave the space % \leftmargin0pt% % \rightmargin0pt% + \hoffset=0pt % reset to default + \voffset=0pt \dimen0\ht\pgfpic% \advance\dimen0\dp\pgfpic% - \ifdim\dp\pgfpic=0pt\relax - \else% store the picture's depth. Otherwise, it would be lost. - \def\pgf@external@store@dpth{1}% - \fi - % - \if1\pgf@external@store@dpth - \ifpgfexternal@aux@in@dpth - \pgf@externalend@storeshifts\@auxout - \immediate\closeout\@auxout - \else - \immediate\openout\pgf@plotwrite=\pgf@filename.dpth - \pgf@externalend@storeshifts\pgf@plotwrite - \immediate\closeout\pgf@plotwrite - \fi - \fi + \ifdim\dp\pgfpic=0pt\relax + \else% store the picture's depth. Otherwise, it would be lost. + \def\pgf@external@store@dpth{1}% + \fi + \ifpgfexternal@info + \def\pgf@external@store@dpth{1}% + \fi + % + \if1\pgf@external@store@dpth + \ifpgfexternal@aux@in@dpth + \pgf@externalend@storeshifts\@auxout + \immediate\closeout\@auxout + \else + \immediate\openout\pgf@plotwrite=\pgf@filename.dpth + \pgf@externalend@storeshifts\pgf@plotwrite + \immediate\closeout\pgf@plotwrite + \fi + \fi \pgfsys@papersize{\the\wd\pgfpic}{\the\dimen0}% + % \setbox0=\vbox{% - \kern -1truein % + % I admit that I don't know why there is this kerning: + \kern -\pgf@external@kern@top\relax% \hbox{% - \kern -1truein % + \kern -\pgf@external@kern@left\relax% \hbox to0pt{% \wd\pgfexternal@startupbox=0pt % \ht\pgfexternal@startupbox=0pt % @@ -453,29 +490,32 @@ \box\pgfexternal@startupbox% \pgfsys@atbegindocument\hss}% \box\pgfpic% - \kern 1truein }% - \kern1truein }% - % - % compatibility with eso-pic package: \nointerlineskip is not - % allowed here, but the eso-pic package uses \nointerlineskip in - % its shipout routine. - \let\pgfexternal@nointerlineskip@orig=\nointerlineskip - \let\nointerlineskip=\pgfexternal@nointerlineskip - % + \kern\pgf@external@kern@right\relax% + }% + \kern\pgf@external@kern@bottom\relax% + }% + % + % compatibility with eso-pic package: \nointerlineskip is not + % allowed here, but the eso-pic package uses \nointerlineskip in + % its shipout routine. + \let\pgfexternal@nointerlineskip@orig=\nointerlineskip + \let\nointerlineskip=\pgfexternal@nointerlineskip + % \pgfexternal@originalshipout\box0 % - \gdef\pgfexternal@did@a@shipout{1}% + \gdef\pgfexternal@did@a@shipout{1}% }% \ifpgfexternal@aux@in@dpth - \endgroup + \endgroup \fi } \def\pgfexternal@nointerlineskip{% - \ifvmode - \pgfexternal@nointerlineskip@orig - \else - \relax% \nointerlineskip in horizontal mode not allowed. Silently ignore the error message. - \fi + \ifvmode + \pgfexternal@nointerlineskip@orig + \else + \relax% \nointerlineskip in horizontal mode not allowed. Silently ignore the error message. + \fi }% \endinput +% vi: tabstop=4 shiftwidth=2 expandtab diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfkeys.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfkeys.code.tex index a1410e84a0f..59688c15a67 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfkeys.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfkeys.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% @@ -773,6 +773,7 @@ \pgfkeys{/handlers/.style args/.code 2 args=\pgfkeys{\pgfkeyscurrentpath/.code args={#1}{\pgfkeysalso{#2}}}} \pgfkeys{/handlers/.estyle args/.code 2 args=\pgfkeys{\pgfkeyscurrentpath/.ecode args={#1}{\noexpand\pgfkeysalso{#2}}}} \pgfkeys{/handlers/.style 2 args/.code=\pgfkeys{\pgfkeyscurrentpath/.code 2 args=\pgfkeysalso{#1}}} +\pgfkeys{/handlers/.style n args/.code 2 args=\pgfkeys{\pgfkeyscurrentpath/.code n args={#1}{\pgfkeysalso{#2}}}} % Adding to a style @@ -924,7 +925,7 @@ \pgfkeys{/handlers/.expand twice/.code=\expandafter\expandafter\expandafter\pgfkeys@exp@call\expandafter\expandafter\expandafter{#1}} \pgfkeys{/handlers/.expanded/.code=\edef\pgfkeys@temp{#1}\expandafter\pgfkeys@exp@call\expandafter{\pgfkeys@temp}} -\def\pgfkeys@exp@call#1{\pgfkeysalso{\pgfkeyscurrentpath={#1}}} +\long\def\pgfkeys@exp@call#1{\pgfkeysalso{\pgfkeyscurrentpath={#1}}} % Try to set a key and do nothing if not define diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfkeysfiltered.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfkeysfiltered.code.tex index 82fb11cd2e9..0094344d89b 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfkeysfiltered.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfkeysfiltered.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgflibraryfpu.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgflibraryfpu.code.tex index 39c273655bf..c08f7dee2fe 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgflibraryfpu.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgflibraryfpu.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% @@ -750,7 +750,7 @@ % 100 <= m < 1000 % instead of 1 <= m < 10. % -% The 'extended precision' means we have higher accuracy when we apply pgfmath operations to mantisses. +% The 'extended precision' means we have higher accuracy when we apply pgfmath operations to mantissas. % % The input argument is expected to be a normalized floating point number; the output argument is a non-normalized floating point number (well, normalized to extended precision). % diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgflibraryplothandlers.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgflibraryplothandlers.code.tex index 054598b052e..1cb2e67de17 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgflibraryplothandlers.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgflibraryplothandlers.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.code.tex index 79d03962283..cabffe11ba6 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.pdflinks.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.pdflinks.code.tex index 366a3212cba..380a696a1df 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.pdflinks.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.pdflinks.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% @@ -143,6 +143,11 @@ /pdflinks/internal link prefix/.initial=pgf, } +\begingroup + \catcode`\_=12 + \gdef\pgfmanualpdf@underscore{_}% +\endgroup + \gdef\pgfmanualpdf@installreplacements{% \def\marg##1{{##1}}% \def\oarg##1{[##1]}% @@ -156,6 +161,7 @@ \def\printanat{@}% \def\protect{}% \def\textasciicircum{o}% + \def\_{\pgfmanualpdf@underscore}% \expandafter\edef\pgfmanual@verb@activebar{\pgfmanual@verb@bar}% }% diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.prettyprinter.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.prettyprinter.code.tex index dc5c3867277..b6ca2c4e2e0 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.prettyprinter.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmanual.prettyprinter.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmathfloat.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmathfloat.code.tex index b8d956b6054..6ef0b8f63ff 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmathfloat.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmathfloat.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% @@ -54,6 +54,13 @@ % can be changed with options. \def\pgfmathfloat@round@precision{2} +% I introduced this to acces the "original" precision in case a +% formatted changes it locally... in this case, the formatter may +% overwrite \pgfmathfloat@round@precision@orig to provide the original +% one. +% The default implementation here does nothing: +\def\pgfmathfloat@round@precision@orig{\pgfmathfloat@round@precision}% + \gdef\pgfmathfloat@glob@TMP{} @@ -63,7 +70,7 @@ % meaning % [+-]X.XXXXXXX*10^C % where -% X.XXXXXX is a mantisse with first number != 0, C is an integer and +% X.XXXXXX is a mantissa with first number != 0, C is an integer and % FLAGS contains the sign and some other special cases. % % This method does NOT use TeX Registers to represent the numbers! The @@ -124,13 +131,13 @@ \let\pgfmathfloatqparsenumber=\pgfmathfloatparsenumber % Takes a floating point number #1 as input and writes flags to count -% register #2, mantisse to dimen register #3 and exponent to count +% register #2, mantissa to dimen register #3 and exponent to count % register #4. \def\pgfmathfloattoregisters#1#2#3#4{% \expandafter\pgfmathfloat@decompose#1\relax{#2}{#3}{#4}% } -% the same, but writes the mantisse into a token register. +% the same, but writes the mantissa into a token register. \def\pgfmathfloattoregisterstok#1#2#3#4{% \expandafter\pgfmathfloat@decompose@tok#1\relax{#2}{#3}{#4}% } @@ -144,14 +151,16 @@ \expandafter\pgfmathfloat@decompose@Fmacro#1\relax{#2}% }% -% Extracts the mantisse of #1 into the dimen register #2. -\def\pgfmathfloatgetmantisse#1#2{% +% Extracts the mantissa of #1 into the dimen register #2. +\def\pgfmathfloatgetmantissa#1#2{% \expandafter\pgfmathfloat@decompose@M#1\relax{#2}% } -% Extracts the mantisse of #1 into the token register #2. -\def\pgfmathfloatgetmantissetok#1#2{% +\let\pgfmathfloatgetmantisse=\pgfmathfloatgetmantissa +% Extracts the mantissa of #1 into the token register #2. +\def\pgfmathfloatgetmantissatok#1#2{% \expandafter\pgfmathfloat@decompose@Mtok#1\relax{#2}% } +\let\pgfmathfloatgetmantissetok=\pgfmathfloatgetmantissatok % Extracts the exponent of #1 into the count register #2. \def\pgfmathfloatgetexponent#1#2{% \expandafter\pgfmathfloat@decompose@E#1\relax{#2}% @@ -189,14 +198,14 @@ % decomposes a lowlevel floating point representation into flags, -% mantisse and exponent. +% mantissa and exponent. % % #4: integer register for the flags. -% #5: dimen registers for the mantisse. +% #5: dimen registers for the mantissa. % #6: integer register for the exponent. % % \expandafter\pgfmathfloat@decompose\pgfmathresult\relax\pgfmathfloat@a@S\pgfmathfloat@a@M\pgfmathfloat@a@E -% -> the three temp registers contain flags, mantisse and exponent +% -> the three temp registers contain flags, mantissa and exponent \def\pgfmathfloat@decompose#1#2{% sanitize! \ifx#2Y% \expandafter\pgfmathfloat@decompose@% @@ -211,11 +220,11 @@ #6=#3\relax% } -% overloaded, #5 needs to be a token register for the mantisse. +% overloaded, #5 needs to be a token register for the mantissa. % @see also \pgfmathfloatvalueof which does also employ the load % level repr. % \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E -% -> the three temp registers contain flags, mantisse and exponent +% -> the three temp registers contain flags, mantissa and exponent \def\pgfmathfloat@decompose@tok#1#2{% \ifx#2Y% \expandafter\pgfmathfloat@decompose@tok@% @@ -329,7 +338,7 @@ \pgfmathfloat@decompose@TMP }% % Takes a floating point number #1 as input and writes flags to macro -% #2, mantisse to macro #3 and exponent to macro #4. +% #2, mantissa to macro #3 and exponent to macro #4. \def\pgfmathfloattomacro#1#2#3#4{% \begingroup \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E @@ -344,7 +353,7 @@ % Defines \pgfmathresult as the floating point number encoded by -% the flags #1, mantisse #2 and exponent #3. +% the flags #1, mantissa #2 and exponent #3. % % All arguments are characters and will be expanded using '\edef'. \def\pgfmathfloatcreate#1#2#3{% @@ -490,7 +499,7 @@ \pgfkeysgetvalue{/pgf/number format/set decimal separator}\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP \pgfkeysgetvalue{/pgf/number format/@dec sep mark}\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK \pgfkeysgetvalue{/pgf/number format/set thousands separator}\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP - \c@pgf@counta=#4\relax + \c@pgf@counta=#4\relax % it is the exponent here. \ifnum#2=0 \c@pgf@counta=0 \fi @@ -529,20 +538,30 @@ \else \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod#1\pgfmathfloat@EOI\pgfmathfloat@EOI\pgfmathfloat@EOI \fi + \ifpgfmathprintnumber@thousand@sep@in@fractional + \let\pgfmathresultfractional\pgfutil@empty% + \pgfmathprintnumber@thousand@sep@in@fractional#2MMMM\@@ + \else + \def\pgfmathresultfractional{#2}% + \fi \begingroup \toks0=\expandafter{\pgfmathresult}% \toks1=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK}% - \toks2=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP #2}% - \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 \the\toks2 }% + \toks2=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP}% + \toks3=\expandafter{\pgfmathresultfractional}% + \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 \the\toks2 \the\toks3 }% \endgroup \let\pgfmathresult=\pgfmathfloat@glob@TMP }% + +% assigns \pgfmathresult such that it contains the formatted result. +% It assumes that none of the following tokens contains a period. \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod{% \ifx\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP\pgfutil@empty \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{% \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall}% \else - \ifnum\c@pgf@counta<0\relax + \ifnum\c@pgf@counta<0\relax % exponent of the number in this context \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{% \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall}% \else @@ -579,7 +598,7 @@ \fi \fi \fi - \ifnum\c@pgf@counta>0 + \ifnum\c@pgf@counta>0 % \c@pgf@counta = N MOD 3 in this context \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{% \expandafter\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printtrailingdigits\pgfmathfloat@loc@TMPb }% @@ -591,7 +610,8 @@ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT } \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printtrailingdigits#1#2{% - \ifcase\c@pgf@counta + \ifcase\c@pgf@counta % = N MOD 3 in this context + % does not happen per construction \or \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult #1}% \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{% @@ -603,7 +623,7 @@ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@counteverythird% }% \fi - \ifnum\c@pgf@countb>0\relax + \ifnum\c@pgf@countb>0\relax % \c@pgf@countb = N DIV 3 in this context \begingroup \toks0=\expandafter{\pgfmathresult}% \toks1=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP}% @@ -643,6 +663,32 @@ \fi \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT } + +% \pgfmathprintnumber@thousand@sep@in@fractional 01234525MMMM\@@ +% -> +% 012<sep>345<sep>25 +\def\pgfmathprintnumber@thousand@sep@in@fractional#1#2#3#4{% + \if#4M% + % Ok, no further separator + \def\pgfmathprint@next{\pgfmathprintnumber@thousand@sep@in@fractional@finish#1#2#3#4}% + \else + \begingroup + \toks0=\expandafter{\pgfmathresultfractional}% + \toks1={#1#2#3}% + \toks2=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP}% + \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 \the\toks2 }% + \endgroup + \let\pgfmathresultfractional=\pgfmathfloat@glob@TMP + \def\pgfmathprint@next{\pgfmathprintnumber@thousand@sep@in@fractional#4}% + \fi + \pgfmathprint@next +}% +\def\pgfmathprintnumber@thousand@sep@in@fractional@finish#1M{% + \expandafter\def\expandafter\pgfmathresultfractional\expandafter{\pgfmathresultfractional #1}% + \pgfmathprintnumber@thousand@sep@in@fractional@finish@ +}% +\def\pgfmathprintnumber@thousand@sep@in@fractional@finish@#1\@@{}% + \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall#1{% \def\pgfmathfloat@loc@TMPb{#1}% \let\pgfmathfloat@loc@TMPc=\pgfutil@empty @@ -680,7 +726,7 @@ % The default style to display fixed point numbers. % -% It does not apply numerics, but it is responsable to typeset the +% It does not apply numerics, but it is responsable for typesetting the % rounded number. % It can access the \ifpgfmathfloatroundhasperiod boolean. % @@ -699,12 +745,12 @@ % Rounds a normalized floating point number to \pgfmathfloat@round@precision % digits precision and writes the result to \pgfmathresult. % -% This method uses \pgfmathroundto for the mantisse. +% This method uses \pgfmathroundto for the mantissa. % % @see pgfmathfloatroundzerofill % % SIDE EFFECT: the global variable \ifpgfmathfloatroundhasperiod will be set to -% whether the final mantisse #5 has a period or not. +% whether the final mantissa #5 has a period or not. \def\pgfmathfloatround#1{% \pgfmathfloatroundhasperiodtrue \begingroup @@ -717,13 +763,13 @@ % Overload. % -% This method uses a fixed width for the mantisse and fills in zeros +% This method uses a fixed width for the mantissa and fills in zeros % if necessary. % -% This method uses \pgfmathroundtozerofill for the mantisse. +% This method uses \pgfmathroundtozerofill for the mantissa. % % SIDE EFFECT: the global variable \ifpgfmathfloatroundhasperiod will be set to -% whether the final mantisse #5 has a period or not. +% whether the final mantissa #5 has a period or not. \def\pgfmathfloatroundzerofill#1{% \pgfmathfloatroundhasperiodtrue \begingroup @@ -734,16 +780,16 @@ \endgroup } -\newif\ifpgfmathfloatround@allow@empty@mantisse -\def\pgfmathfloatround@mantisse@ONE{1.0}% +\newif\ifpgfmathfloatround@allow@empty@mantissa +\def\pgfmathfloatround@mantissa@ONE{1.0}% % #1: sign -% #2: mantisse +% #2: mantissa % #3: exponent -% #4: CODE to display if the mantisse is drawn. +% #4: CODE to display if the mantissa is drawn. % This code will be shown just before the exponent. % Example: #4=\cdot -% #5: CODE to display if the mantisse is NOT draw. (unused currently) +% #5: CODE to display if the mantissa is NOT draw. (unused currently) % Might be used to display '10^1' instead of '1*10^1'. % #6: CODE to display the exponent. \def\pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\relax#4#5#6{% @@ -828,11 +874,11 @@ \def\pgfmathfloatrounddisplaystyle@generic#1#2e#3\relax{% \begingroup \pgfkeysvalueof {/pgf/number format/sci generic/@/.@cmd}{#3}{#1}{#2}\pgfeov - \pgfkeysgetvalue{/pgf/number format/sci generic/mantisse sep}\pgfmathdisplay@aftermantisse - \pgfkeysgetvalue{/pgf/number format/sci generic/empty mantisse sep}\pgfmathdisplay@nomantisse + \pgfkeysgetvalue{/pgf/number format/sci generic/mantissa sep}\pgfmathdisplay@aftermantissa + \pgfkeysgetvalue{/pgf/number format/sci generic/empty mantissa sep}\pgfmathdisplay@nomantissa \pgfkeysgetvalue{/pgf/number format/sci generic/exponent}\pgfmathdisplay@e - \toks0=\expandafter{\pgfmathdisplay@aftermantisse}% - \toks1=\expandafter{\pgfmathdisplay@nomantisse}% + \toks0=\expandafter{\pgfmathdisplay@aftermantissa}% + \toks1=\expandafter{\pgfmathdisplay@nomantissa}% \toks2=\expandafter{\pgfmathdisplay@e}% \xdef\pgfmathfloat@glob@TMP{\noexpand\pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\noexpand\relax{\the\toks0}{\the\toks1}{\the\toks2}}% \endgroup @@ -845,7 +891,7 @@ % % PRECONDITION: % the floating point number has already been rounded properly and -% the mantisse has been rounded correcty. +% the mantissa has been rounded correcty. % % The argument needs to be in the format returned by % \pgfmathfloat@to@FMeE@style and terminated by '\relax'. @@ -859,6 +905,7 @@ \long\def\pgfmathfloatfrac@verbatim#1#2{#1/#2}% +\newif\ifpgfmathprintnumber@thousand@sep@in@fractional \pgfkeys{% /pgf/number format/.is family, /pgf/number format, @@ -866,6 +913,10 @@ sci/.code= \pgfmath@set@number@printer{pgfmathprintnumber@SCI}, std/.code= {\pgfmath@set@number@printer{pgfmathprintnumber@STD}\pgfmathprintnumber@STD@setparam{#1}}, std/.default=,% + % relative={<exponent base 10>} + relative/.code= {\pgfmath@set@number@printer{pgfmathprintnumber@RELATIVE}\def\pgfmathprintnumber@RELATIVE@param{#1}},% + relative/.value required, + every relative/.style=std, int detect/.code= \pgfmath@set@number@printer{pgfmathprintnumber@INT@DETECT}, int trunc/.code= \pgfmath@set@number@printer{pgfmathprintnumber@INT@TRUNC}, frac/.code= \pgfmath@set@number@printer{pgfmathprintnumber@frac},% @@ -902,6 +953,8 @@ @dec sep mark/.initial=, @sci exponent mark/.initial=, set thousands separator/.initial=, + 1000 sep in fractionals/.is if=pgfmathprintnumber@thousand@sep@in@fractional, + 1000 sep in fractionals/.default=true, 1000 sep/.style={/pgf/number format/set thousands separator=#1}, min exponent for 1000 sep/.initial=0, use period/.style= {/pgf/number format/set decimal separator={.},/pgf/number format/set thousands separator={{{,}}}}, @@ -926,13 +979,15 @@ {##1##2##3}% {\pgfqkeys{/pgf/number format/sci generic}{#1}}% }, - sci generic/mantisse sep/.initial=,% - sci generic/empty mantisse sep/.initial=,% + sci generic/mantissa sep/.initial=,% + sci generic/empty mantissa sep/.initial=,% + sci generic/mantisse sep/.style={/pgf/number format/sci generic/mantissa sep={#1}},% + sci generic/empty mantisse sep/.style={/pgf/number format/sci generic/empty mantissa sep={#1}},% sci generic/exponent/.initial=,% sci generic/.value required, verbatim/.code={% \pgfqkeys{/pgf/number format}{% - sci generic={mantisse sep=,exponent={e##1}}, + sci generic={mantissa sep=,exponent={e##1}}, 1000 sep=, skip 0.=false, print sign=false, @@ -944,8 +999,8 @@ @sci exponent mark=, }% }, -% sci may skip mantisse/.is if=pgfmathfloatround@allow@empty@mantisse, -% sci may skip mantisse/.default=true, +% sci may skip mantissa/.is if=pgfmathfloatround@allow@empty@mantissa, +% sci may skip mantissa/.default=true, } @@ -962,7 +1017,7 @@ \ifx\pgfmathfloat@loc@TMPb\pgfutil@empty % DEFAULT for lower and upper bound. \def\pgfmathprintnumber@STD@getlowerbound{% - \c@pgf@counta=\pgfmathfloat@round@precision\relax + \c@pgf@counta=\pgfmathfloat@round@precision@orig\relax \divide\c@pgf@counta by-2\relax }% \def\pgfmathprintnumber@STD@upperbound{4}% @@ -1008,6 +1063,55 @@ \fi } +\def\pgfmathprintnumber@RELATIVE#1{% + % parse the input: + \pgfmathfloatparsenumber{#1}% + \pgfmathfloat@to@FMeE@style\pgfmathresult + \expandafter\pgfmathprintnumber@RELATIVE@issci\pgfmathresult\relax +} + +\def\pgfmathprintnumber@RELATIVE@issci#1#2e#3\relax{% + \begingroup + % format X / 10^{relative}: + \c@pgf@counta=#3\relax + \advance\c@pgf@counta by-\pgfmathprintnumber@RELATIVE@param\relax + \pgfmathfloatcreate{#1}{#2}{\the\c@pgf@counta}% + % OK, round it to the desired precision: + \ifnum\c@pgf@counta>0 + % hm. for positive exponents, we should round the + % mantissa rather than only the fractional part. + \expandafter\pgfmathfloatround\expandafter{\pgfmathresult}% + \else + % negative exponent -> round fixed representation: + \pgfmathfloattofixed\pgfmathresult + \expandafter\pgfmathroundto\expandafter{\pgfmathresult}% + \pgfmathfloatparsenumber{\pgfmathresult}% + \pgfmathfloatroundhasperiodtrue% make sure the code below works: + \fi + % Now, compute result * 10^{relative} and format the result: + \pgfmathfloattoregisterstok\pgfmathresult\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E + \ifnum\pgfmathfloat@a@S=0 + \pgfmathfloat@a@E=\pgfmathfloat@a@S % avoid 0 * 10^8 + \else + \advance\pgfmathfloat@a@E by+\pgfmathprintnumber@RELATIVE@param\relax + \fi + \edef\pgfmathresultX{% + \the\pgfmathfloat@a@S + \the\pgfmathfloat@a@Mtok + \ifpgfmathfloatroundhasperiod\else.0\fi + e\the\pgfmathfloat@a@E}% + % call another formatter for the result (but avoid rounding inside of it): + \pgfqkeys{/pgf/number format}{/pgf/number format/every relative}% + \ifx\pgfmathprintnumber@issci\pgfmathprintnumber@RELATIVE@issci + \pgfmath@error{The '/pgf/number format/every relative' style should set a valid display style}% + \fi + \let\pgfmathfloat@round@precision@orig=\pgfmathfloat@round@precision + \def\pgfmathfloat@round@precision{9999}% + \expandafter\pgfmathprintnumber@issci\pgfmathresultX\relax% + \pgfmath@smuggleone\pgfmathresult + \endgroup +} + \def\pgfmathprintnumber@frac#1{% % parse the input: \pgfmathfloatparsenumber{#1}% @@ -1106,8 +1210,8 @@ \fi % \def\pgfmathfloat@loc@TMPa##1.##2\relax{% - \def\pgfmathfloat@mantisse@first{##1}% - \def\pgfmathfloat@mantisse@ltone{0.##2}% + \def\pgfmathfloat@mantissa@first{##1}% + \def\pgfmathfloat@mantissa@ltone{0.##2}% }% \expandafter\pgfmathfloat@loc@TMPa\the\pgfmathfloat@a@Mtok\relax % @@ -1126,7 +1230,7 @@ \ifx\pgfmath@target@denominator\pgfutil@empty % \pgfmathfloat@a@E=-\pgfmathfloat@a@E - \ifdim\pgfmathfloat@mantisse@ltone pt=0pt + \ifdim\pgfmathfloat@mantissa@ltone pt=0pt \def\pgfmathfloat@factor{1}% \edef\pgfmathfloat@scaled@numerator{\the\pgfmathfloat@a@Mtok}% \else @@ -1135,14 +1239,14 @@ % The errors of 1/r are magnified by 10^k which % doesn't work. \pgfutil@ifundefined{FPdiv}{% - \pgfmathfloatparsenumber{\pgfmathfloat@mantisse@ltone}% + \pgfmathfloatparsenumber{\pgfmathfloat@mantissa@ltone}% \pgfmathfloatreciprocal@{\pgfmathresult}% }{% % \usepackage{fp}. % yields higher absolute precision. \FPmessagesfalse% \FPdebugfalse% - \FPdiv\pgfmathresult{1}{\pgfmathfloat@mantisse@ltone}% + \FPdiv\pgfmathresult{1}{\pgfmathfloat@mantissa@ltone}% \pgfmathfloatparsenumber{\pgfmathresult}% }% \let\pgfmathfloat@inv=\pgfmathresult @@ -1519,7 +1623,7 @@ % % Let 'k' be the desired precision. % -% Please note that pgfmathroundto rounds the mantisse, that means |abs(x)|. +% Please note that pgfmathroundto rounds the mantissa, that means |abs(x)|. % % There are exactly TWO cases: % 1. The case with p<=k and x_{-p-1} = end of input. @@ -1864,7 +1968,7 @@ %-------------------------------------------- -% flags, mantisse and exponent has already been stored into +% flags, mantissa and exponent has already been stored into % \pgfmathfloat@a@* [using ...@Mtok] % % PRECONDITION: @@ -1895,7 +1999,7 @@ -% ATTENTION: this thing REQUIRES a period in the mantisse! +% ATTENTION: this thing REQUIRES a period in the mantissa! % collects everything into \pgfmathresult \def\pgfmathfloattofixed@impl#1.#2\relax{% \ifnum\pgfmathfloat@a@E<0 @@ -1942,7 +2046,7 @@ % \edef\pgfmathresult{#1.#2}% % \else % \pgfmathfloat@a@Mtok={#1}% - % \pgfmathfloattofixed@impl@collectmantisse#2\count\pgfmathfloat@a@E + % \pgfmathfloattofixed@impl@collectmantissa#2\count\pgfmathfloat@a@E % \edef\pgfmathresult{\the\pgfmathfloat@a@Mtok}% % \fi %-------------------------------------------------- @@ -1976,11 +2080,11 @@ \else%>=9 \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2#3#4#5#6#7#8}% \advance\pgfmathfloat@a@E by-8 - \pgfmathfloattofixed@impl@collectmantisse#9\count\pgfmathfloat@a@E + \pgfmathfloattofixed@impl@collectmantissa#9\count\pgfmathfloat@a@E \fi }% -\def\pgfmathfloattofixed@impl@collectmantisse#1#2\count#3{% +\def\pgfmathfloattofixed@impl@collectmantissa#1#2\count#3{% \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok #1}% \advance\pgfmathfloat@a@E by-1% \def\pgfmathfloat@loc@TMPb{#2}% @@ -1995,7 +2099,7 @@ \ifnum\pgfmathfloat@a@E=0 \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok .#2}% \else - \pgfmathfloattofixed@impl@collectmantisse#2\count#3% + \pgfmathfloattofixed@impl@collectmantissa#2\count#3% \fi \fi } diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmathparse.opt.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmathparse.opt.code.tex deleted file mode 100644 index e74d47c814e..00000000000 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_pgfmathparse.opt.code.tex +++ /dev/null @@ -1,122 +0,0 @@ -% A small optimization package which provides -% -% \beginpgfmathparsecheckfornumber -% ... -% \endpgfmathparsecheckfornumber -% -% in order to optimize \pgfmathparse. It works as follows: inside of -% the environment (which doesn't use scopes), \pgfmathparse is -% *replaced* by a different method which uses an extremely fast check -% to decide whether the input is a number number. Is so, it returns -% the number. Otherwise, it invokes the standard math parser. -% It is about 400% faster than \pgfmathparse if the argument *is* a -% number. -% -% The \endpgfmathparsecheckfornumber is optional (no groups are -% introduced) -% -% Copyright 2010 by Christian Feuersänger. -% -% Replaces \pgfmathparse by the fast number checker. -\def\beginpgfmathparsecheckfornumber{% - \let\pgfmathparse=\pgfmathparsehashedcheck -}% -\def\endpgfmathparsecheckfornumber{% - \let\pgfmathparse=\pgfmathparsehashedcheck@orig -}% - -\def\pgfmp@EOI{\pgfmp@EOI}% -\def\pgfmathparsehashedcheck@isnumber@gobble#1\pgfmp@EOI{} - -\newdimen\r@pgfmathparse@hashedcheck@ -\newcount\c@pgfmathparse@hashedcheck@ -\let\pgfmathparsehashedcheck@orig=\pgfmathparse - -\def\pgfmathparsehashedcheck#1{% - \edef\pgfmathparse@temp{#1}% - \expandafter\pgfmathparsehashedcheck@isnumber@loop\pgfmathparse@temp\pgfmp@EOI - \pgfmathparsehashedcheck@finalize{#1}% -}% -\def\pgfmathparsehashedcheck@finalize@isnonumber#1{% - \pgfmathparsehashedcheck@orig{#1}% - \let\pgfmathparsehashedcheck@finalize\pgfmathparsehashedcheck@finalize@isnumber -}% -\def\pgfmathparsehashedcheck@finalize@isnumber#1{% - \r@pgfmathparse@hashedcheck@=#1pt - \expandafter\pgfmathparsehashed@assign\the\r@pgfmathparse@hashedcheck@ - %-------------------------------------------------- - % % - % \let\KKK=\pgfmathresult - % \pgfmathparsehashedcheck@orig{#1}% - % \ifx\KKK\pgfmathresult - % \else - % \pgfplots@error{FAILED FOR #1: expected `\pgfmathresult'; got `\KKK' (temp = \pgf@temp)}% - % \fi - %-------------------------------------------------- -}% -{\catcode`\p=12\catcode`\t=12\gdef\PGF@TEMP{pt}} -\expandafter\def\expandafter\pgfmathparsehashed@assign\expandafter#\expandafter1\expandafter.\expandafter#\expandafter2\PGF@TEMP{% - \def\pgf@temp{#2}% - \ifx\pgf@temp0% - \def\pgfmathresult{#1}% - \else - \def\pgfmathresult{#1.#2}% - \fi -}% -\let\pgfmathparsehashedcheck@finalize\pgfmathparsehashedcheck@finalize@isnumber - -\expandafter\def\csname pgf@pp+\endcsname{1} -\expandafter\def\csname pgf@pp-\endcsname{1} -\expandafter\def\csname pgf@p0\endcsname{1} -\expandafter\def\csname pgf@p1\endcsname{1} -\expandafter\def\csname pgf@p2\endcsname{1} -\expandafter\def\csname pgf@p3\endcsname{1} -\expandafter\def\csname pgf@p4\endcsname{1} -\expandafter\def\csname pgf@p5\endcsname{1} -\expandafter\def\csname pgf@p6\endcsname{1} -\expandafter\def\csname pgf@p7\endcsname{1} -\expandafter\def\csname pgf@p8\endcsname{1} -\expandafter\def\csname pgf@p9\endcsname{1} -\expandafter\def\csname pgf@p.\endcsname{1} - -\pgfutil@ifundefined{ifcsname}{% - \def\pgfmathparsehashedcheck@isnumber@loop#1{% - \expandafter\ifx\csname pgf@pp\string#1\endcsname\relax - \expandafter\pgfmathparsehashedcheck@isnumber@loop - \else - \expandafter\pgfmathparsehashedcheck@isnumber@loop@\expandafter#1% - \fi - }% - \def\pgfmathparsehashedcheck@isnumber@loop@#1{% - \expandafter\ifx\csname pgf@p\string#1\endcsname\relax - \expandafter\pgfmathparsehashedcheck@isnumber@loop@ - \else - \expandafter\pgfmathparsehashedcheck@isnumber@endfalse\expandafter#1% - \fi - }% -}{% - \def\pgfmathparsehashedcheck@isnumber@loop#1{% - \ifcsname pgf@pp\string#1\endcsname - \expandafter\pgfmathparsehashedcheck@isnumber@loop - \else - \expandafter\pgfmathparsehashedcheck@isnumber@loop@\expandafter#1% - \fi - }% - \def\pgfmathparsehashedcheck@isnumber@loop@#1{% - \ifcsname pgf@p\string#1\endcsname - \expandafter\pgfmathparsehashedcheck@isnumber@loop@ - \else - \expandafter\pgfmathparsehashedcheck@isnumber@endfalse\expandafter#1% - \fi - }% -}% -\def\pgfmathparsehashedcheck@isnumber@endfalse#1{% - \ifx#1\pgfmp@EOI - \else - \let\pgfmathparsehashedcheck@finalize=\pgfmathparsehashedcheck@finalize@isnonumber - \expandafter\pgfmathparsehashedcheck@isnumber@gobble - \fi -}% - - -\endinput diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzexternal.sty b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzexternal.sty index 9025de703be..7dc97116753 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzexternal.sty +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzexternal.sty @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzexternalshared.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzexternalshared.code.tex index 757439ed17f..2d7a81b2bf5 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzexternalshared.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzexternalshared.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% @@ -46,7 +46,6 @@ \toksdef\t@tikzexternal@tmpa=0 \toksdef\t@tikzexternal@tmpb=1 -\newwrite\tikzexternal@outfile \newif\iftikzexternal@nestedflag \newif\iftikzexternal@verboseio \newif\iftikzexternal@genfigurelist @@ -132,6 +131,9 @@ \pgfqkeys{/tikz/external}{ figure list/.is if=tikzexternal@genfigurelist, aux in dpth/.style={/pgf/images/aux in dpth=#1},% + disable dependency files/.code={% + \let\tikzexternalfiledependsonfile@ACTIVE=\tikzexternalfiledependsonfile + }, % 'mode' applies only if \jobname==real job name. mode/.is choice, mode/only graphics/.code = {% @@ -175,7 +177,7 @@ shell escape/.initial=-shell-escape, read main aux/.is if=pgfexternalreadmainaux, image discarded text/.initial={% - [[ {\sc Image Discarded Due To} {\tt`/tikz/external/% + [[ \textsc{Image Discarded Due To} \texttt{`/tikz/external/% \ifcase\tikzexternal@opmode\relax mode=only graphics% \or @@ -215,6 +217,7 @@ \tikzexternal@optimize@RESTORE },% optimize=true, + optimize away text/.code={[ \textsc{\string#1\ optimized away because it does not contribute to exported PDF}]}, optimize/install/.code={},% optimize/restore/.code={},% % Expects two arguments, the command name and (optionally) a count @@ -332,7 +335,7 @@ \tikzexternalenable \def\tikzexternal@determineimgextension##1:##2\relax{\gdef\tikzexternalimgextension{##1}}% \xdef\pgf@tempa{\pgfsys@imagesuffixlist}% - \expandafter\tikzexternal@determineimgextension\pgf@tempa\relax + \expandafter\tikzexternal@determineimgextension\pgf@tempa:\relax \pgfutil@ifundefined{includegraphics}{% \let\tikzexternal@orig@includegraphics=\relax }{% @@ -344,6 +347,14 @@ } \def\tikzexternalize@hasbeencalled{0}% +\def\tikzifexternalizehasbeencalled#1#2{% + \if1\tikzexternalize@hasbeencalled + #1% + \else + #2% + \fi +}% + % If mode=`convert with system call', the boolean \ifpgfexternalreadmainaux % will be set depending on the current lock file. % @@ -459,27 +470,40 @@ \else \ifx#1\@EOI \else - \expandafter\let\csname tikzexternalauxlock@handleref@orig@\string#1\endcsname=#1% - \def#1{\tikzexternalauxlock@handleref@repl{#1}}% + {% + % strip the leading '\' + % this allows proper \protect ion when you write + % \caption{...\cite{..}} and #1=\cite + \escapechar=-1 + \xdef\pgf@temp{\string#1}% + }% + \expandafter\let\csname tikzexternalauxlock@handleref@orig@\pgf@temp\endcsname=#1% + \edef#1{\noexpand\pgf@texdist@protect\noexpand\tikzexternalauxlock@handleref@repl{\pgf@temp}}% \expandafter\expandafter\expandafter\tikzexternalauxlock@handleref@loop \fi \fi }% \def\tikzexternalauxlock@handleref@repl#1{\pgfutil@ifnextchar[{\tikzexternalauxlock@handleref@repl@{#1}}{\tikzexternalauxlock@handleref@repl@{#1}[]}}% \def\tikzexternalauxlock@handleref@repl@#1[#2]#3{% - \csname tikzexternalauxlock@handleref@orig@\string#1\endcsname{#3}% - \begingroup - \def\n{\pgfexternal@hat\pgfexternal@hat J}% - \tikzexternal@assemble@systemcall{\pgfactualjobname}{\pgf@tempa}% - \def\space{\noexpand\space}% - \pgfexternalstorecommand{% - \noexpand\begingroup - \noexpand\toks0={\pgf@tempa}% - \noexpand\immediate\noexpand\write16{\tikzexternalauxlock@handleref@warning{#3}{\noexpand\the\noexpand\toks0}}% - \noexpand\G@refundefinedtrue - \noexpand\endgroup + \tikzifexternalizingcurrent{% + % note that '#1' is NO control sequence! it is a protected string + \csname tikzexternalauxlock@handleref@orig@#1\endcsname{#3}% + \begingroup + \def\n{\pgfexternal@hat\pgfexternal@hat J}% + \tikzexternal@assemble@systemcall{\pgfactualjobname}{\pgf@tempa}% + \def\space{\noexpand\space}% + \pgfexternalstorecommand{% + \noexpand\begingroup + \noexpand\toks0={\pgf@tempa}% + \noexpand\immediate\noexpand\write16{\tikzexternalauxlock@handleref@warning{#3}{\noexpand\the\noexpand\toks0}}% + \noexpand\G@refundefinedtrue + \noexpand\endgroup + }% + \endgroup + }{% + % ok. We are not externalizing this part of the document. + % Throw the citation away without further notice. }% - \endgroup }% \def\tikzexternalauxlock@handleref@warning#1#2{% \n @@ -798,6 +822,11 @@ \else \pgfutil@ifundefined{tikzexternal@listmode@openedfile}{% \message{Opening '\tikzexternal@realjob.figlist' for writing.}% + \begingroup + \globaldefs=1 + % this gets round '\outer\newwrite' in plain TeX: + \csname newwrite\endcsname\tikzexternal@outfile + \endgroup \immediate\openout\tikzexternal@outfile=\tikzexternal@realjob.figlist\relax \gdef\tikzexternal@listmode@openedfile{1}% \if\tikzexternal@opmode5% mode='list and make' @@ -818,6 +847,9 @@ \def\tikzexternal@list@and@make@gentarget#1{% \tikzexternal@assemble@systemcall{#1}{\pgf@tempa}% + \def\tikzexternal@tempb{\pgfutilstrreplace{^^J}{^^J\tikzexternal@TABchar}}% + \expandafter\tikzexternal@tempb\expandafter{\pgf@tempa}% + \let\pgf@tempa=\pgfretval \iftikzexternal@verboseio \immediate\write16{Writing '#1' to '\tikzexternal@realjob.makefile'.}% \fi @@ -862,6 +894,7 @@ \def\tikzexternalmakefiledefaultdeprule{% \immediate\write\tikzexternal@outmakefile{\tikzexternal@PERCENTchar.\tikzexternaldepext:}% + \immediate\write\tikzexternal@outmakefile{\tikzexternal@TABchar mkdir -p $(dir $@)}% \immediate\write\tikzexternal@outmakefile{\tikzexternal@TABchar touch $@ \tikzexternal@HASHchar\space will be filled later.}% }% @@ -1056,7 +1089,9 @@ \iftikzexternal@verbose@optimize \immediate\write16{The command '\the\toks0' has been optimized away. Use '/tikz/external/optimize=false' to disable this.}% \fi - [ {\sc \string#1\ optimized away because it does not contribute to exported PDF}]% + \endgroup + \begingroup + \pgfkeysvalueof{/tikz/external/optimize away text/.@cmd}#1\pgfeov% \endgroup }% diff --git a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzlibraryexternal.code.tex b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzlibraryexternal.code.tex index 42056506818..badd22fd89d 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzlibraryexternal.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_tikzlibraryexternal.code.tex @@ -14,7 +14,7 @@ %%% - nested \input commands have been updated %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Date of this copy: Do 5. Aug 20:33:50 CEST 2010 %%% +%%% Date of this copy: Sa 30. Apr 21:00:37 CEST 2011 %%% diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex index 14e4d2e9c3d..bca33bab29e 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex @@ -33,6 +33,7 @@ \input pgfplotsutil.code.tex \input pgfplotscolormap.code.tex \input pgfplotsstackedplots.code.tex +\input pgfplotsplothandlers.code.tex \input pgfplotscoordprocessing.code.tex \input pgfplotsticks.code.tex @@ -47,12 +48,12 @@ \newif\ifpgfplots@has@label@information \newif\ifpgfplots@yislinear \newif\ifpgfplots@zislinear -\newif\ifpgfplots@axis@equal -\newif\ifpgfplots@axis@equal@image +\newif\ifpgfplots@unit@vector@rescale@keep@size \newif\ifpgfplots@reverse@legend \newif\ifpgfplots@transpose@legend \newif\ifpgfplots@allow@reversal@of@rel@axis@cs \newif\ifpgfplots@scanline@verbose +\newif\ifpgfplots@plot@graphics@autoadjustaxis \newcount\pgfplots@numplots \newdimen\pgfplots@xmin@reg \newdimen\pgfplots@xmax@reg @@ -109,6 +110,7 @@ \newif\ifpgfplots@stacked@plus \newif\ifpgfplots@plot@file@skipfirst \newif\ifpgfplots@threedim +\newif\ifpgfplots@curplot@threedim \newif\ifpgfplotsthreedim \newif\ifpgfplots@curplot@isirrelevant \newif\ifpgfplots@colorbar @@ -116,6 +118,8 @@ \newif\ifpgfplots@translategnuplot \pgfplots@translategnuplottrue \let\pgfnodepartimagebox=\pgfnodeparttextbox +\newif\ifpgfplotsplothandlermesh@internaldepth +\newif\ifpgfplotsplothandlermesh@hide@refined@edges \newif\ifpgfplots@collect@firstplot@astick \newif\ifpgfplots@units@use @@ -127,6 +131,8 @@ \def\axisdefaultwidth{240pt} \def\axisdefaultheight{207pt} +\def\pgfplotsifaxisthreedim#1#2{\ifpgfplots@threedim #1\else #2\fi}% +\def\pgfplotsifcurplotthreedim#1#2{\ifpgfplots@curplot@threedim #1\else #2\fi}% % Invokes '#2' if a cycle list named '#1' exists and '#3' if not. \long\def\pgfplotsifcyclelistexists#1#2#3{% @@ -167,19 +173,34 @@ red,densely dashed,every mark/.append style={solid,fill=red!80!black},mark=diamond*\\% } \pgfplotscreateplotcyclelist{linestyles}{solid,dashed,dotted} +\pgfplotscreateplotcyclelist{linestyles*}{solid,dashed,dotted,dashdotted,dashdotdotted} \pgfplotscreateplotcyclelist{color list}{red,blue,black,yellow,brown,teal,orange,violet,cyan,green!70!black,magenta,gray} \pgfplotscreateplotcyclelist{mark list}{% - every mark/.append style={fill=.!80!black},mark=*\\% - every mark/.append style={fill=.!80!black},mark=square*\\% - every mark/.append style={fill=.!80!black},mark=triangle*\\% - mark=star\\% - every mark/.append style={fill=.!80!black},mark=diamond*\\% - every mark/.append style={fill=.!80!black},mark=otimes*\\% - mark=|\\% - every mark/.append style={fill=.!80!black},mark=pentagon*\\% - mark=text,text mark=p\\% - mark=text,text mark=a\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=square*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=triangle*\\% + every mark/.append style={solid},mark=star\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=diamond*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill!40},mark=otimes*\\% + every mark/.append style={solid},mark=|\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=pentagon*\\% + every mark/.append style={solid},mark=text,text mark=p\\% + every mark/.append style={solid},mark=text,text mark=a\\% +} +\pgfplotscreateplotcyclelist{mark list*}{% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=square*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=triangle*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=halfsquare*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=pentagon*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=halfcircle*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill,rotate=180},mark=halfdiamond*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill!40},mark=otimes*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=diamond*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=halfsquare right*\\% + every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=halfsquare left*\\% } +\def\pgfplots@mark@list@fill{\pgfkeysvalueof{/pgfplots/mark list fill}} \pgfplotscreateplotcyclelist{exotic}{% teal,every mark/.append style={fill=teal!80!black},mark=*\\% orange,every mark/.append style={fill=orange!80!black},mark=square*\\% @@ -200,8 +221,6 @@ \pgfplots@letcsname{pgfp@cyclist@\string\coloredplotspeclist @}={pgfp@cyclist@color@}% %%%% -\def\pgfplotsset#{\pgfqkeys{/pgfplots}} - \def\pgfplotsdeprecatedstylecheck#1{% \pgfkeysifdefined{#1/.@cmd}{% \begingroup @@ -568,12 +587,12 @@ }, /pgfplots/outer axis line style/.style={ /pgfplots/every outer x axis line/.append style={#1}, - /pgfplots/every outer y axis line/.append style={#1}% + /pgfplots/every outer y axis line/.append style={#1},% /pgfplots/every outer z axis line/.append style={#1}% }, /pgfplots/inner axis line style/.style={ /pgfplots/every inner x axis line/.append style={#1}, - /pgfplots/every inner y axis line/.append style={#1}% + /pgfplots/every inner y axis line/.append style={#1},% /pgfplots/every inner z axis line/.append style={#1}% }, /pgfplots/axis line style/.style={ @@ -717,6 +736,15 @@ /pgfplots/every axis legend/.append code={\pgfplotsdeprecatedstylecheck{/tikz/every axis legend}}, /pgfplots/every axis legend/.belongs to family=/pgfplots/style commands, % + % axis type: + /pgfplots/axis type/.initial=rectangle, + /pgfplots/axis type/.belongs to family=/pgfplots/scale, + /pgfplots/@expected axis cs/.initial=cart, + /pgfplots/every rectangle axis/.style={}, + % + % see \pgfplotsdefinecstransform{<from>}{<to>}{<code>} + /pgfplots/data cs/.initial=cart,% the coordinate system of provided data. Will be transformed to the axis' internal coordinate system (@expected axis cs). + % % Colorbar interface: /pgfplots/colorbar/.is if=pgfplots@colorbar, /pgfplots/colorbar/.default=true, @@ -838,13 +866,6 @@ /pgfplots/colorbar/width/.initial=0.5cm, /pgfplots/colorbar addplot/.initial=\addplot graphics {};, /pgfplots/colorbar/draw/.code={% - % FIXME : the semicolon after ';' has a fixed catcode, namely - % the one assigned while pgfplots.code.tex has been read. - % - % The \pgfplots@checkandpreparefor@active@semicolon gets - % confused if the catcodes change... this here is a - % work-around for babel support. - \let\pgfplots@checkandpreparefor@active@semicolon=\relax \axis[every colorbar,colorbar shift,colorbar=false] \pgfkeysvalueof{/pgfplots/colorbar addplot}% \endaxis @@ -1101,6 +1122,17 @@ /pgfplots/minor z tick num=#1, }, /pgfplots/minor tick num/.belongs to family=/pgfplots/tick, + /pgfplots/minor xtick/.initial=, + /pgfplots/minor xtick/.belongs to family=/pgfplots/tick, + /pgfplots/minor ytick/.initial=, + /pgfplots/minor ytick/.belongs to family=/pgfplots/tick, + /pgfplots/minor ztick/.initial=, + /pgfplots/minor ztick/.belongs to family=/pgfplots/tick, + /pgfplots/minor tick/.style={ + /pgfplots/minor xtick={#1}, + /pgfplots/minor ytick={#1}, + /pgfplots/minor ztick={#1}, + }, /pgfplots/minor tick length/.estore in=\pgfplots@subtickwidth, /pgfplots/minor tick length/.belongs to family=/pgfplots/tick, /pgfplots/major tick length/.estore in=\pgfplots@tickwidth, @@ -1285,6 +1317,21 @@ /pgfplots/anchor/.belongs to family=/pgfplots, /pgfplots/anchor/.store in= \pgfplots@anchorname, /pgfplots/anchor=south west, + /pgfplots/log origin x/.is choice, + /pgfplots/log origin x/infty/.code={\def\pgfplots@log@origin@choice@x{0}}, + /pgfplots/log origin x/0/.code={\def\pgfplots@log@origin@choice@x{1}}, + /pgfplots/log origin y/.is choice, + /pgfplots/log origin y/infty/.code={\def\pgfplots@log@origin@choice@y{0}}, + /pgfplots/log origin y/0/.code={\def\pgfplots@log@origin@choice@y{1}}, + /pgfplots/log origin z/.is choice, + /pgfplots/log origin z/infty/.code={\def\pgfplots@log@origin@choice@z{0}}, + /pgfplots/log origin z/0/.code={\def\pgfplots@log@origin@choice@z{1}}, + /pgfplots/log origin/.style={% + /pgfplots/log origin x={#1}, + /pgfplots/log origin y={#1}, + /pgfplots/log origin z={#1}, + }, + /pgfplots/log origin=0, % tick options: /pgfplots/ticks/.is choice, /pgfplots/ticks/.belongs to family=/pgfplots/tick, @@ -1462,8 +1509,6 @@ /pgfplots/ylabel shift={#1}, /pgfplots/zlabel shift={#1}, },% - /pgfplots/before end axis/.code=, - /pgfplots/after end axis/.code=, /pgfplots/extra description/.code=, % axis options: /pgfplots/at/.code={% @@ -1493,9 +1538,36 @@ /pgfplots/clip/.is if=pgfplots@clip, % will be used if it exists: %/pgfplots/axis background/.style={}, - /pgfplots/axis equal/.is if=pgfplots@axis@equal, + % + % 2d: 'unit vector ratio=2 1 is relative to y axis (x is twice as large as y) + % 3d: 'unit vector ratio=2 2 1 is relative to z axis (x and y are both twice as large as z) + % missing values are assumed to be 1. + /pgfplots/unit vector ratio/.initial=,% empty means 'disable rescale'. + /pgfplots/unit vector ratio axis/.initial=,% DEBUG. This is the reference axis which won't be scaled down. This key might vanish. + /pgfplots/unit vector ratio*/.style={% + /pgfplots/unit vector ratio={#1}, + /pgfplots/unit rescale keep size=false, + }, + /pgfplots/unit rescale keep size/.is if=pgfplots@unit@vector@rescale@keep@size, + /pgfplots/unit rescale keep size/.default=true, + /pgfplots/unit rescale keep size=true, + /pgfplots/axis equal/.is choice, + /pgfplots/axis equal/true/.style={ + /pgfplots/unit vector ratio=1 1 1, + /pgfplots/unit rescale keep size=true + }, + /pgfplots/axis equal/false/.style={ + /pgfplots/unit vector ratio=, + }, /pgfplots/axis equal/.default=true, - /pgfplots/axis equal image/.is if=pgfplots@axis@equal@image, + /pgfplots/axis equal image/.is choice, + /pgfplots/axis equal image/true/.style={% + /pgfplots/unit vector ratio=1 1 1, + /pgfplots/unit rescale keep size=false + }, + /pgfplots/axis equal image/false/.style={% + /pgfplots/unit vector ratio=, + }, /pgfplots/axis equal image/.default=true, /pgfplots/xmin/.initial=, /pgfplots/xmax/.initial=, @@ -1503,6 +1575,8 @@ /pgfplots/ymax/.initial=, /pgfplots/zmin/.initial=, /pgfplots/zmax/.initial=, + /pgfplots/min/.style={xmin={#1},ymin={#1},zmin={#1}}, + /pgfplots/max/.style={xmax={#1},ymax={#1},zmax={#1}}, /pgfplots/xtickmin/.initial=, /pgfplots/xtickmax/.initial=, /pgfplots/ytickmin/.initial=, @@ -1533,6 +1607,7 @@ /pgfplots/stack dir=plus, /pgfplots/filter discard warning/.is if=pgfplots@warn@for@filter@discards, /pgfplots/filter discard warning=true, + /pgfplots/pre filter/.code={}, /pgfplots/x filter/.code={}, /pgfplots/x filter/.belongs to family=/pgfplots, /pgfplots/y filter/.code={}, @@ -1548,9 +1623,9 @@ /pgfplots/restrict y to domain*/.style={/pgfplots/@restrict to domain={y}{}{#1}{1}},% /pgfplots/restrict z to domain*/.style={/pgfplots/@restrict to domain={z}{}{#1}{1}},% /pgfplots/restrict expr to domain*/.style 2 args={/pgfplots/@restrict to domain={x}{#1}{#2}{1}},% - % '#1': the filter to install + % '#1': the filter to install (like 'x', 'y', or even 'hist/data') % '#2': a mathematical expression (or empty) - % '#3': the interval. must be numeric currently. + % '#3': the interval. must be numeric currently, and of the form min:max % '#4': bAssignLimits=0|1. if #4=1, any coordinate outside of the % allowed domain will take the domain boundary as value. If #4=0, % any coordinate outside of the allowed domain will get 'inf' or @@ -1567,31 +1642,31 @@ \def\pgfplots@restrict@to@domain@tmp{#2}% \ifx\pgfplots@restrict@to@domain@tmp\pgfutil@empty % we don't have an expression. - \pgfmathfloatparsenumber{\pgfmathresult}% \else % evaluate the expression! \pgfmathparse{#2}% \fi + \pgfplotscoordmath{default}{parsenumber}{\pgfmathresult}% \let\pgfplots@restrict@to@domain@tmp=\pgfmathresult - \pgfmathfloatlessthan@{\pgfplots@restrict@to@domain@tmp}{##1}% ##1 is the lower argument - \ifpgfmathfloatcomparison - \edef\pgfmathresult{\if0#4inf\else ##1\fi}% - \else - \pgfmathfloatgreaterthan@{\pgfplots@restrict@to@domain@tmp}{##2}% - \ifpgfmathfloatcomparison - \edef\pgfmathresult{\if0#4-inf\else ##2\fi}% - \else - \let\pgfmathresult=\pgfplots@restrict@to@domain@orig - \fi - \fi + % + \pgfplotscoordmath{default}{if less than} + {\pgfplots@restrict@to@domain@tmp}{##1}% ##1 is the lower argument + {% + \edef\pgfmathresult{\if0#4inf\else ##1\fi}% + }{% + \pgfplotscoordmath{default}{if less than} + {##2}{\pgfplots@restrict@to@domain@tmp} + {\edef\pgfmathresult{\if0#4-inf\else ##2\fi}} + {\let\pgfmathresult=\pgfplots@restrict@to@domain@orig}% + }% }% }% }% % when invoked, ##1 and ##2 will be the user-supplied args. \def\pgfplots@loc@TMPc##1:##2\relax{% - \pgfmathfloatparsenumber{##1}% + \pgfplotscoordmath{default}{parsenumber}{##1}% \let\pgfplots@rangea=\pgfmathresult - \pgfmathfloatparsenumber{##2}% + \pgfplotscoordmath{default}{parsenumber}{##2}% \edef\pgfplots@loc@TMPc{\pgfplots@rangea:\pgfmathresult}% \expandafter\pgfplots@loc@TMPb\pgfplots@loc@TMPc\relax }% @@ -1599,11 +1674,14 @@ \expandafter\pgfplots@loc@TMPc\pgfplots@loc@TMPa\relax },% % -> keeps only the nth point, all other ones will get ''. - /pgfplots/each nth point/.style={% - /pgfplots/x filter/.append code={% + /pgfplots/each nth point/.style={/pgfplots/each nth point*={x}{#1}},% + % #1: the filter name: x, y, z, or something exotic like hist/data + % #2: the N of 'each nth' + /pgfplots/each nth point*/.style 2 args={% + /pgfplots/#1 filter/.append code={% \ifnum\coordindex=0 \def\c@pgfplots@eachnthpoint@xfilter{0}% - \edef\c@pgfplots@eachnthpoint@xfilter@cmp{#1}% + \edef\c@pgfplots@eachnthpoint@xfilter@cmp{#2}% \else \pgfplotsutil@advancestringcounter\c@pgfplots@eachnthpoint@xfilter \ifx\c@pgfplots@eachnthpoint@xfilter@cmp\c@pgfplots@eachnthpoint@xfilter @@ -1614,11 +1692,14 @@ \fi }% }, - /pgfplots/skip coords between index/.style 2 args={% - /pgfplots/x filter/.append code={% - \ifnum\coordindex<#1\relax + /pgfplots/skip coords between index/.style 2 args={/pgfplots/skip coords between index*={x}{#1}{#2}},% + % #1: the filter name + % #2,#3: from 'skip coords between index' + /pgfplots/skip coords between index*/.style n args={3}{% + /pgfplots/#1 filter/.append code={% + \ifnum\coordindex<#2\relax \else - \ifnum\coordindex<#2\relax + \ifnum\coordindex<#3\relax \let\pgfmathresult=\pgfutil@empty \fi \fi} @@ -1647,6 +1728,7 @@ /pgfplots/samples y/.initial=,% empty -> use the same as 'samples'. For use in mesh plots. /pgfplots/variable/.code={\pgfkeysalso{/tikz/variable={#1}}}, /pgfplots/variable y/.initial=\y,% + /pgfplots/sample dim/.initial=auto, % and provide aliases in the '/pgfplots/' tree to avoid % search path problems just for the following options: /pgfplots/name/.code={\pgfkeysalso{/tikz/name={#1}}}, @@ -1662,9 +1744,17 @@ /pgfplots/height/.initial=,% /pgfplots/height/.belongs to family=/pgfplots, /pgfplots/execute at begin plot/.initial=, + /pgfplots/execute at begin plot visualization/.initial=, /pgfplots/execute at begin plot@@/.initial=,% an internal variant /pgfplots/execute at end plot/.initial=, + /pgfplots/execute at end plot visualization/.initial=, /pgfplots/execute at end plot@@/.initial=,% an internal variant + /pgfplots/execute at end survey/.initial=,% + /pgfplots/execute at begin axis/.initial=, + /pgfplots/execute at end axis/.initial=, + /pgfplots/execute for finished point/.initial=, + /pgfplots/before end axis/.code=, + /pgfplots/after end axis/.code=, /pgfplots/enlarge x limits/.initial=auto, /pgfplots/enlarge x limits/.default=true, /pgfplots/enlarge y limits/.initial=auto, @@ -1684,16 +1774,31 @@ /pgfplots/y/.belongs to family=/pgfplots, /pgfplots/z/.initial=, /pgfplots/z/.belongs to family=/pgfplots, + /pgfplots/view dir/.initial=,% DEBUG /pgfplots/x dir/.code={\pgfplots@setkey@axisdir@for x{#1}},% /pgfplots/y dir/.code={\pgfplots@setkey@axisdir@for y{#1}},% /pgfplots/z dir/.code={\pgfplots@setkey@axisdir@for z{#1}},% /pgfplots/x dir=normal,% /pgfplots/y dir=normal,% /pgfplots/z dir=normal,% + /pgfplots/x post scale/.initial=, + /pgfplots/y post scale/.initial=, + /pgfplots/z post scale/.initial=, + /pgfplots/scale/.style={% + /pgfplots/x post scale={#1},% + /pgfplots/y post scale={#1},% + /pgfplots/z post scale={#1},% + }, + /pgfplots/scale mode/.is choice, + /pgfplots/scale mode/auto/.code={\def\pgfplots@scale@mode@choice{0}}, + /pgfplots/scale mode/none/.code={\def\pgfplots@scale@mode@choice{1}}, + /pgfplots/scale mode/stretch to fill/.code={\def\pgfplots@scale@mode@choice{2}}, + /pgfplots/scale mode/scale uniformly/.code={\def\pgfplots@scale@mode@choice{3}}, + /pgfplots/scale mode/auto, /pgfplots/allow reversal of rel axis cs/.is if=pgfplots@allow@reversal@of@rel@axis@cs,% /pgfplots/allow reversal of rel axis cs/.default=true,% /pgfplots/allow reversal of rel axis cs=true,% - /pgfplots/plot box ratio/.initial={1}{1}{1},% + /pgfplots/plot box ratio/.initial=1 1 1,% /pgfplots/view/az/.initial=25,% /pgfplots/view/h/.code={\pgfkeyssetvalue{/pgfplots/view/az}{#1}},% /pgfplots/view/el/.initial=30,% @@ -1720,6 +1825,7 @@ /pgfplots/cycle list name/.belongs to family=/pgfplots, /pgfplots/cycle list name=color, /pgfplots/cycle list shift/.initial=, + /pgfplots/mark list fill/.initial=.!80!black, % accepts arguments of the form % <first list spec>\nextlist <second list spec>\nextlist .... % where each list spec is EITHER a cycle list name OR a cycle list @@ -2278,7 +2384,7 @@ \if1\csname pgfpmeta@\pgfplotspointmetainputhandler @issymbolic\endcsname% \def\pgfplots@nodes@near@coords@align{above}% \else - \pgfmathfloatifflags{\pgfplotspointmeta}{2}{% + \pgfplotscoordmath{meta}{if is}{\pgfplotspointmeta}{-}{% % \pgfplotspointmeta < 0 \def\pgfplots@nodes@near@coords@align{left}% }{% @@ -2292,7 +2398,7 @@ \if1\csname pgfpmeta@\pgfplotspointmetainputhandler @issymbolic\endcsname% \def\pgfplots@nodes@near@coords@align{above}% \else - \pgfmathfloatifflags{\pgfplotspointmeta}{2}{% + \pgfplotscoordmath{meta}{if is}{\pgfplotspointmeta}{-}{% % \pgfplotspointmeta < 0 \def\pgfplots@nodes@near@coords@align{below}% }{% @@ -2333,11 +2439,17 @@ },% },% /pgfplots/nodes near coords*/.default={\pgfmathprintnumber\pgfplotspointmeta}, + /pgfplots/visualization depends on/list/.initial=,% + /pgfplots/visualization depends on/.style={% + /pgfplots/visualization depends on/list/.add={}{,{#1}}% + }, /pgfplots/bar cycle list/.style={/pgfplots/cycle list={% {blue,fill=blue!30!white,mark=none},% {red,fill=red!30!white,mark=none},% {brown!60!black,fill=brown!30!white,mark=none},% {black,fill=gray,mark=none},% + {violet!80!black,fill=violet,mark=none},% + {green,fill=green!80!black,mark=none}% } }, /pgfplots/area cycle list/.style={bar cycle list}, @@ -2354,6 +2466,9 @@ /pgfplots/ybar legend/.style={ /pgfplots/legend image code/.code={\draw[##1,/tikz/.cd,bar width=3pt,yshift=-0.2em,bar shift=0pt] plot coordinates {(0cm,0.8em) (2*\pgfplotbarwidth,0.6em)};}, }, + /pgfplots/single ybar legend/.style={ + /pgfplots/legend image code/.code={\draw[##1,/tikz/.cd,bar width=6pt,yshift=-0.2em,bar shift=0pt] plot coordinates {(0pt,0.8em)};}, + }, /pgfplots/ybar/.style={ bar cycle list, xtick align=outside, @@ -2383,6 +2498,9 @@ /pgfplots/xbar legend/.style={ /pgfplots/legend image code/.code={\draw[##1,/tikz/.cd,bar width=3pt,yshift=-0.2em,bar shift=0pt] plot coordinates {(0cm,0.8em) (2*\pgfplotbarwidth,0.6em)};}, }, + /pgfplots/single xbar legend/.style={ + /pgfplots/legend image code/.code={\draw[##1,/tikz/.cd,bar width=6pt,yshift=-0.2em,bar shift=0pt] plot coordinates {(0pt,0.8em)};}, + }, /pgfplots/xbar/.style={ bar cycle list, ytick align=outside, @@ -2444,6 +2562,7 @@ /pgfplots/xbar stacked/.style={ /pgfplots/set point meta if empty=x,% bar cycle list, + single xbar legend, stack plots=x, stack dir=#1, /tikz/xbar, @@ -2452,6 +2571,7 @@ /pgfplots/ybar stacked/.style={ /pgfplots/set point meta if empty=f(x),% bar cycle list, + single ybar legend, stack plots=y, stack dir=#1, /tikz/ybar, @@ -2460,6 +2580,7 @@ /pgfplots/xbar interval stacked/.style={ /pgfplots/set point meta if empty=x,% bar cycle list, + single xbar legend, stack plots=x, stack dir=#1, /tikz/xbar interval, @@ -2468,6 +2589,7 @@ /pgfplots/ybar interval stacked/.style={ /pgfplots/set point meta if empty=f(x),% bar cycle list, + single ybar legend, stack plots=y, stack dir=#1, /tikz/ybar interval, @@ -2496,6 +2618,29 @@ /pgfplots/plot graphics/ymax/.initial=, /pgfplots/plot graphics/zmin/.initial=, /pgfplots/plot graphics/zmax/.initial=, + % + % a) to provide a bounding box: points={(0,1) (0,2)} + % or b) to squeeze the graphics into internal image coordinates: + % points={(0,1,0) => (0,4) (0,0,1) => (40,600)} + % or c) both of them. + /pgfplots/plot graphics/points/.initial=, + /pgfplots/plot graphics/auto adjust axis/.is if=pgfplots@plot@graphics@autoadjustaxis, + /pgfplots/plot graphics/auto adjust axis=true, + /pgfplots/plot graphics/snap z/.initial=0.02, + /pgfplots/plot graphics/debug/.initial=, + /pgfplots/plot graphics/debug/.default=true, + /pgfplots/plot graphics/squeeze tol/.initial=2pt, + % + % this command key should defined \pgfmathresult to be + % \pgfmathresult -> {{<wd>}{<ht>}} + % where <wd> is the natural width of the input image and + % <ht> is the natural height. + % The input image file name is available as 'plot graphics/src'. + % The default implementation invoked 'lowlevel draw={}{}' and + % measures the resulting dimensions. + /pgfplots/plot graphics/lowlevel get natural size/.code={% + \pgfplots@plot@handler@graphics@getnaturalsize + }, /pgfplots/plot graphics/lowlevel draw/.code 2 args={% \pgfplots@plot@handler@graphics@DRAW{#1}{#2}% },% @@ -2508,6 +2653,9 @@ at={(0pt,0pt)}, rectangle }, + % empty line=none|auto|scanline|nan|jump + % nan and jump is the same. + /pgfplots/empty line/.initial=auto, % 'mesh' plots. % The macro \pgfplots@meshmode is % n if meshmode == false, @@ -2531,6 +2679,44 @@ \pgfkeysalso{/pgfplots/mesh=#1}% \def\pgfplots@meshmode{s}% },% + /pgfplots/patch/.code={% + \pgfkeysalso{/pgfplots/surf=#1,/pgfplots/mesh input=patches,/pgfplots/every patch}% + },% + /pgfplots/every patch/.style={miter limit=1}, + /pgfplots/patch table/value/.initial=, + /pgfplots/patch table/.code={ + \pgfkeyssetvalue{/pgfplots/patch table/value}{#1}% + \pgfplotsplothandlermesh@patchtable@hascdatafalse + }, + /pgfplots/patch table with point meta/.code={% + \pgfkeyssetvalue{/pgfplots/patch table/value}{#1}% + \pgfplotsplothandlermesh@patchtable@hascdatatrue + \pgfplotsplothandlermesh@patchtable@cdata@individualfalse + \pgfkeysalso{/pgfplots/point meta/explicit}% + }, + /pgfplots/patch table with individual point meta/.code={% + \pgfkeyssetvalue{/pgfplots/patch table/value}{#1}% + \pgfplotsplothandlermesh@patchtable@hascdatatrue + \pgfplotsplothandlermesh@patchtable@cdata@individualtrue + \pgfkeysalso{/pgfplots/point meta/explicit}% + }, + /pgfplots/patch type/.initial=, + /pgfplots/patch internal depth/.is if=pgfplotsplothandlermesh@internaldepth, + /pgfplots/patch internal depth=true, + /pgfplots/patch to triangles/.is choice, + /pgfplots/patch to triangles/false/.code= {\def\pgfplotsplothandlermesh@triangulate{0}}, + /pgfplots/patch to triangles/true/.code= {\def\pgfplotsplothandlermesh@triangulate{1}}, + /pgfplots/patch to triangles/true with edges/.code= {\def\pgfplotsplothandlermesh@triangulate{2}}, + /pgfplots/patch to triangles=false, + /pgfplots/patch to triangles/.default=true, + /pgfplots/mesh input/.is choice, + /pgfplots/mesh input/lattice/.code= {\def\pgfplotsplothandlermesh@matrixinput{1}}, + /pgfplots/mesh input/patches/.code= {\def\pgfplotsplothandlermesh@matrixinput{0}}, + /pgfplots/mesh input/lattice, + /pgfplots/patch refines/.initial=0, + /pgfplots/hide refined edges/.is if=pgfplotsplothandlermesh@hide@refined@edges, + /pgfplots/hide refined edges/.default=true, + /pgfplots/mesh/refines/.style={/pgfplots/patch refines={#1}}, /pgfplots/mesh/rows/.initial=, /pgfplots/mesh/cols/.initial=, /pgfplots/mesh/scanline verbose/.is if=pgfplots@scanline@verbose,% @@ -2566,7 +2752,7 @@ \pgfplotsplothandlermesh@defaultlegend@img{##1}% }% }, - /pgfplots/mesh/num points/.initial=\numcoords,% this is NOT part of the public interface. Don't change it. + /pgfplots/mesh/num points/.initial=,%\numcoords,% this is NOT part of the public interface. Don't change it. /pgfplots/z buffer/.is choice,% /pgfplots/z buffer/none/.code={\def\pgfplotsplothandlermesh@zbuffer@choice{0}},% /pgfplots/z buffer/reverse x seq/.code={\def\pgfplotsplothandlermesh@zbuffer@choice{1}},% @@ -2592,6 +2778,7 @@ /pgfplots/shader/flat/.style={/pgfplots/shader/flat mean},% /pgfplots/shader/faceted/.code={\def\pgfplotsplothandlermesh@shader{1}}, /pgfplots/shader/interp/.code={\def\pgfplotsplothandlermesh@shader{2}}, + /pgfplots/shader/faceted interp/.code={\def\pgfplotsplothandlermesh@shader{3}}, /pgfplots/shader/faceted, /pgfplots/faceted color/.initial=mapped color!80!black, /pgfplots/clip marker paths/.is if=pgfplots@clip@marker@paths, @@ -2636,19 +2823,22 @@ /pgfplots/z coord trafo/.code={}, /pgfplots/z coord inv trafo/.code={}, % - % #1 = {<symbol1>,<symbol2>,....<symboln>} + % #1 : the coordinate in question. Can be x,y,z, or even hist/data + % or similar constructs. + % #2 : {<symbol1>,<symbol2>,....<symboln>} /pgfplots/symbolic coords/.code 2 args={% - \pgfplotsarraynew\pgfplots@symbolic@coords@inverse{#2}% - \pgfplotsarrayforeachungrouped\pgfplots@symbolic@coords@inverse\as\pgfplots@loc@TMPa{% - \expandafter\edef\csname pgfp@symb@coords@\pgfplots@loc@TMPa\endcsname{\pgfplotsarrayforeachindex}% + \expandafter\pgfplotsarraynew\csname pgfplots@symbolic@coords@#1@inverse\endcsname{#2}% + \expandafter\pgfplotsarrayforeachungrouped\csname pgfplots@symbolic@coords@#1@inverse\endcsname\as\pgfplots@loc@TMPa{% + \expandafter\edef\csname pgfp@symb@coords@#1@\pgfplots@loc@TMPa\endcsname{\pgfplotsarrayforeachindex}% }% \pgfkeysdef{/pgfplots/#1 coord trafo}{% - \pgfutil@ifundefined{pgfp@symb@coords@##1}{% + \pgfutil@ifundefined{pgfp@symb@coords@#1@##1}{% \pgfplots@error{Sorry, the input coordinate `##1' has not been defined with 'symbolic #1 coords={#2}... Maybe it has been misspelled?}% \def\pgfmathresult{0}% }{% - \edef\pgfmathresult{\csname pgfp@symb@coords@##1\endcsname}% + \edef\pgfmathresult{\csname pgfp@symb@coords@#1@##1\endcsname}% }% +%\message{#1 coord trafo{##1} --> \pgfmathresult^^J}% }% \pgfkeysdef{/pgfplots/#1 coord inv trafo}{% \begingroup @@ -2659,22 +2849,38 @@ \ifnum\count0<0 \count0=0 \else - \count1=\pgfplotsarraysizeof\pgfplots@symbolic@coords@inverse\relax + \edef\pgfplots@loc@TMPa{\expandafter\pgfplotsarraysizeof\csname pgfplots@symbolic@coords@#1@inverse\endcsname}% + \count1=\pgfplots@loc@TMPa\relax \ifnum\count0<\count1 \else \count0=\count1 \advance\count0 by-1 \fi \fi - \pgfplotsarrayselect\count0 \of\pgfplots@symbolic@coords@inverse\to\pgfmathresult + \expandafter\pgfplotsarrayselect\expandafter\count\expandafter0\expandafter\of\csname pgfplots@symbolic@coords@#1@inverse\endcsname\to\pgfmathresult +%\message{#1 coord inv trafo{##1} -->\the\count0 --> \pgfmathresult^^J}% \pgfmath@smuggleone\pgfmathresult \endgroup }% - \pgfkeysalso{% - /pgfplots/#1ticklabel={\tick},% - /pgfplots/scaled #1 ticks=false,% - /pgfplots/plot coordinates/math parser=false,% + \pgfkeysifdefined{/pgfplots/#1ticklabel/.@cmd}{% + \pgfkeysalso{% + /pgfplots/#1ticklabel={\tick},% + /pgfplots/scaled #1 ticks=false,% + /pgfplots/plot coordinates/math parser=false,% + }% + }{% + % OK. The style can be used for other coordinates as well + % (like hist/data) }% + % + \pgfkeysifdefined{/pgfplots/#1 is expr}{% + \pgfkeyssetvalue{/pgfplots/#1 is expr}{0}% + }{}% + % + % Allow a callback (optional) + \pgfkeysifdefined{/pgfplots/#1/@execute on coord trafo changed/.@cmd}{% + \pgfkeysalso {/pgfplots/#1/@execute on coord trafo changed}% + }{}% },% /pgfplots/symbolic x coords/.style={symbolic coords={x}{#1}},% /pgfplots/symbolic y coords/.style={symbolic coords={y}{#1}},% @@ -2712,6 +2918,7 @@ /pgfplots/colormap access/direct/.code={\def\pgfplots@colormap@access{d}},% /pgfplots/colormap access/map/.code={\def\pgfplots@colormap@access{m}},% /pgfplots/colormap access/map,% + %/pgfplots/colormap default colorspace/.initial=auto,% declared in pgfplotscolormap.code.tex /pgfplots/colormap/.code 2 args={% \pgfplotscreatecolormap{#1}{#2}% \pgfkeysalso{/pgfplots/colormap name=#1}% @@ -2719,6 +2926,9 @@ /pgfplots/colormap/hot/.style={ colormap name=hot }, + /pgfplots/colormap/hot2/.style={ + /pgfplots/colormap={hot2}{[1cm]rgb255(0cm)=(0,0,0) rgb255(3cm)=(255,0,0) rgb255(6cm)=(255,255,0) rgb255(8cm)=(255,255,255)} + }, /pgfplots/colormap/bluered/.style={ /pgfplots/colormap={bluered}{rgb255(0cm)=(0,0,180); rgb255(1cm)=(0,255,255); rgb255(2cm)=(100,255,0); rgb255(3cm)=(255,255,0); rgb255(4cm)=(255,0,0); rgb255(5cm)=(128,0,0)} }, @@ -2737,6 +2947,12 @@ /pgfplots/colormap/violet/.style={ colormap={violet}{rgb255=(25,25,122) color=(white) rgb255=(238,140,238)} }, + /pgfplots/colormap/jet/.style={ + /pgfplots/colormap={jet}{rgb255(0cm)=(0,0,128) rgb255(1cm)=(0,0,255) rgb255(3cm)=(0,255,255) rgb255(5cm)=(255,255,0) rgb255(7cm)=(255,0,0) rgb255(8cm)=(128,0,0)} + }, + % + % + %% /pgfplots/scatter/.is choice, /pgfplots/scatter/false/.code={% \pgfplots@scatterplotenabledfalse @@ -2909,8 +3125,18 @@ /pgfplots/compat/anchors/pre 1.3/.code={\pgfplots@deprecated@anchorstrue},% FIXME: WAS \global /pgfplots/compat/anchors/1.3/.code= {\pgfplots@deprecated@anchorsfalse},% /pgfplots/compat/anchors/1.4/.style= {/pgfplots/compat/anchors/1.3},% + /pgfplots/compat/anchors/1.5/.style= {/pgfplots/compat/anchors/1.3},% /pgfplots/compat/anchors/newest/.style= {/pgfplots/compat/anchors/1.3},% /pgfplots/compat/anchors/default/.style={/pgfplots/compat/anchors/1.3},% + % + /pgfplots/compat/empty line/.is choice, + /pgfplots/compat/empty line/pre 1.3/.code={\pgfplots@emptyline@compattrue},% FIXME: WAS \global + /pgfplots/compat/empty line/1.3/.style= {/pgfplots/compat/empty line/pre 1.3},% + /pgfplots/compat/empty line/1.4/.code= {\pgfplots@emptyline@compatfalse},% + /pgfplots/compat/empty line/1.5/.style= {/pgfplots/compat/empty line/1.4},% + /pgfplots/compat/empty line/newest/.style= {/pgfplots/compat/empty line/1.4},% + /pgfplots/compat/empty line/default/.style={/pgfplots/compat/empty line/1.4},% + % /pgfplots/compat/labels/.is choice, /pgfplots/compat/labels/pre 1.3/.style={% /pgfplots/xlabel absolute, @@ -2919,14 +3145,41 @@ /pgfplots/xlabel near ticks, /pgfplots/ylabel near ticks},% /pgfplots/compat/labels/1.4/.style= {/pgfplots/compat/labels/1.3},% + /pgfplots/compat/labels/1.5/.style= {/pgfplots/compat/labels/1.3},% /pgfplots/compat/labels/newest/.style= {/pgfplots/compat/labels/1.3},% /pgfplots/compat/labels/default/.style= {/pgfplots/compat/labels/pre 1.3},% maintain backwards compatibility for labels :-( + % + % search for the \pgfplots@compat@scaling@coordmath -- using float + % is much more accurate. But it changes the spacing slightly. + /pgfplots/compat/scaling/.is choice, + /pgfplots/compat/scaling/pre 1.3/.code={% + \def\pgfplots@compat@scaling@zunitfix@enable{0}% + \def\pgfplots@compat@scaling@coordmath{pgfbasic}}, + /pgfplots/compat/scaling/1.3/.style={/pgfplots/compat/scaling/pre 1.3}, + /pgfplots/compat/scaling/1.4/.code={% + \def\pgfplots@compat@scaling@zunitfix@enable{1}% + \def\pgfplots@compat@scaling@coordmath{float}}, + /pgfplots/compat/scaling/1.5/.style={/pgfplots/compat/scaling/1.4}, + /pgfplots/compat/scaling/newest/.style={/pgfplots/compat/scaling/1.4}, + /pgfplots/compat/scaling/default/.style={/pgfplots/compat/scaling/1.4}, + /pgfplots/compat/general/.is choice, + /pgfplots/compat/general/pre 1.3/.style={/pgfplots/log origin=infty},% + /pgfplots/compat/general/1.3/.style={/pgfplots/compat/general/pre 1.3}, + /pgfplots/compat/general/1.4/.style={/pgfplots/compat/general/pre 1.3},% + /pgfplots/compat/general/1.5/.style={/pgfplots/compat/general/newest},% + /pgfplots/compat/general/newest/.style={/pgfplots/log origin=0}, + /pgfplots/compat/general/default/.style={/pgfplots/compat/general/newest}, /pgfplots/compat/.style={% + % ATTENTION: *every* /pgfplots/compat/ setting needs to accept + % the same choices due to this construction: /pgfplots/compat/anchors=#1,% /pgfplots/compat/labels=#1,% + /pgfplots/compat/empty line=#1,% + /pgfplots/compat/scaling=#1,% + /pgfplots/compat/general=#1,% },% - /pgfplots/compat/.default=pre 1.3,% - /pgfplots/compat=default,% + /pgfplots/compat/.default=pre 1.3,% this is used if you type '\pgfplotsset{compat}' without value + /pgfplots/compat=default,% this is the initial config. % /pgfplots/show outer normals/.style={% extra description/.append code={ @@ -3004,6 +3257,8 @@ },% } +\pgfkeysgetvalue{/pgfplots/colorbar/draw/.@cmd}\pgfplots@colorbar@draw@defaultimpl + % call % \pgfkeyslet{.../.@cmd}\pgfplots@cant@set@in@this@context % to replace a key with a generic error message. @@ -3014,10 +3269,10 @@ { -\pgfkeysdef{/pgfplots/empty command key}{}% -\pgfkeysgetvalue{/pgfplots/empty command key/.@cmd}\pgfplots@loc@TMPa +\pgfkeysdef{/empty}{}% +\pgfkeysgetvalue{/empty/.@cmd}\pgfplots@loc@TMPa \global\let\pgfplots@empty@command@key=\pgfplots@loc@TMPa - +% \pgfkeys{/empty/.style={}}% \pgfkeysgetvalue{/empty/.@cmd}\pgfplots@loc@TMPa \global\let\pgfplots@empty@style@key=\pgfplots@loc@TMPa @@ -3138,7 +3393,7 @@ % \pgfkeysgetvalue{/tikz/sloped/.@cmd}\pgfplots@loc@TMPa \pgfkeyslet{/tikz/sloped/orig/.@cmd}\pgfplots@loc@TMPa - \pgfkeysdef{/tikz/sloped}{\pgfkeysalso{/tikz/sloped like #1 axis}}% + \pgfkeysdef{/tikz/sloped}{\pgfkeysalso{/tikz/sloped like #1 axis={##1}}}% % \node [/pgfplots/every axis label,% @@ -3186,16 +3441,18 @@ \pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn{0}{% \draw decorate { \pgfextra - \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1min\endcsname}{\csname pgfplots@#2min\endcsname}}% - \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1max\endcsname}{\csname pgfplots@#2min\endcsname}}% + % exchange roles of A <-> B axes: + \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + \pgfplots@drawgridlines@onorientedsurf@fromto{\csname pgfplots@#2min\endcsname}% \endpgfextra }; }{}% \pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn{1}{% \draw decorate { \pgfextra - \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1min\endcsname}{\csname pgfplots@#2max\endcsname}}% - \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1max\endcsname}{\csname pgfplots@#2max\endcsname}}% + % exchange roles of A <-> B axes: + \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + \pgfplots@drawgridlines@onorientedsurf@fromto{\csname pgfplots@#2max\endcsname}% \endpgfextra }; }{}% @@ -3215,52 +3472,50 @@ % drawn as box. \def\pgfplots@drawaxis@outerlines@cycledpath{% \draw[ - /pgfplots/every outer x axis line, % FIXME! these outer styles need much more attention :-( + /pgfplots/every outer x axis line, % using these outer styles is only useful in conjunction with 'separate axis lines=true' /pgfplots/every outer y axis line] - % FIXME : replace this here with basic layer! This should also - % allow closed paths: - (\pgfplots@xmin, \pgfplots@ymin) + \pgfextra\pgfpathmoveto{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}}\endpgfextra \ifpgfplots@hide@y - { (\pgfplots@xmin, \pgfplots@ymax) } + { \pgfextra\pgfpathmoveto{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymax}}\endpgfextra } \else - \ifcase\pgfplots@yaxislinesnum - decorate [ydiscont,decoration={pre length=\ydisstart, post length=\ydisend}] { -- (\pgfplots@xmin, \pgfplots@ymax) } - \or decorate [ydiscont,decoration={pre length=\ydisstart, post length=\ydisend}] { -- (\pgfplots@xmin, \pgfplots@ymax) } - \or { (\pgfplots@xmin, \pgfplots@ymax) } - \or { (\pgfplots@xmin, \pgfplots@ymax) } - \fi + decorate [ydiscont,decoration={pre length=\ydisstart, post length=\ydisend}] + % { -- (\pgfplots@xmin, \pgfplots@ymax) } + { \pgfextra\pgfpathlineto{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymax}}\endpgfextra } \fi \ifpgfplots@hide@x - { (\pgfplots@xmax, \pgfplots@ymax) } + %{ (\pgfplots@xmax, \pgfplots@ymax) } + { \pgfextra\pgfpathmoveto{\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}}\endpgfextra } \else - \ifcase\pgfplots@xaxislinesnum - decorate [xdiscont,decoration={pre length=\xdisstart, post length=\xdisend}] { -- (\pgfplots@xmax, \pgfplots@ymax) } - \or { (\pgfplots@xmax, \pgfplots@ymax) } - \or { (\pgfplots@xmax, \pgfplots@ymax) } - \or decorate [xdiscont,decoration={pre length=\xdisstart, post length=\xdisend}] { -- (\pgfplots@xmax, \pgfplots@ymax) } - \fi + decorate [xdiscont,decoration={pre length=\xdisstart, post length=\xdisend}] + %{ -- (\pgfplots@xmax, \pgfplots@ymax) } + { \pgfextra\pgfpathlineto{\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}}\endpgfextra } \fi \ifpgfplots@hide@y - { (\pgfplots@xmax, \pgfplots@ymin) } + %{ (\pgfplots@xmax, \pgfplots@ymin) } + { \pgfextra\pgfpathmoveto{\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymin}}\endpgfextra } \else - \ifcase\pgfplots@yaxislinesnum - decorate [ydiscont,decoration={pre length=\ydisend, post length=\ydisstart}] { -- (\pgfplots@xmax, \pgfplots@ymin) } - \or { (\pgfplots@xmax, \pgfplots@ymin) } - \or { (\pgfplots@xmax, \pgfplots@ymin) } - \or decorate [ydiscont,decoration={pre length=\ydisend, post length=\ydisstart}] { -- (\pgfplots@xmax, \pgfplots@ymin) } - \fi + decorate [ydiscont,decoration={pre length=\ydisend, post length=\ydisstart}] + %{ -- (\pgfplots@xmax, \pgfplots@ymin) } + { \pgfextra\pgfpathlineto{\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymin}}\endpgfextra } \fi \ifpgfplots@hide@x - { (\pgfplots@xmin, \pgfplots@ymin) } + %{ (\pgfplots@xmin, \pgfplots@ymin) } + { \pgfextra\pgfpathmoveto{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}}\endpgfextra } \else - \ifcase\pgfplots@xaxislinesnum - decorate [xdiscont,decoration={pre length=\xdisend, post length=\xdisstart}] { -- (\pgfplots@xmin, \pgfplots@ymin) } - \or decorate [xdiscont,decoration={pre length=\xdisend, post length=\xdisstart}] { -- (\pgfplots@xmin, \pgfplots@ymin) } - \or { (\pgfplots@xmin, \pgfplots@ymin) } - \or { (\pgfplots@xmin, \pgfplots@ymin) } - \fi% can't use cycle here! + decorate [xdiscont,decoration={pre length=\xdisend, post length=\xdisstart}] + %{ -- (\pgfplots@xmin, \pgfplots@ymin) } + { \pgfextra\pgfpathlineto{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}}\endpgfextra } \fi - ; % -- cycle; + % make sure that we do not have any of the axis discontinuities + % here - they should not be closed. + \if0\pgfplots@xaxisdiscontnum + \else + \if0\pgfplots@yaxisdiscontnum + \else + -- cycle + \fi + \fi + ;% }% % Assigns the macros @@ -3311,12 +3566,13 @@ \fi }% -\def\pgfplots@rememberplotspec@for@label{\pgfutil@ifnextchar[{\pgfplots@rememberplotspec@for@label@}{\pgfplots@rememberplotspec@for@label@[]}}% +\def\pgfplots@rememberplotspec@for@label{\pgfplotsutil@ifnextchar[{\pgfplots@rememberplotspec@for@label@}{\pgfplots@rememberplotspec@for@label@[]}}% \def\pgfplots@rememberplotspec@for@label@[#1]#2{% - \expandafter\gdef\csname pgfplots@last@plot@style@#1\endcsname{#2}% + \t@pgfplots@tokc={#2}% this token register stuff allows '#' inside of '#2' + \expandafter\xdef\csname pgfplots@last@plot@style@#1\endcsname{\the\t@pgfplots@tokc}% \global\pgfplots@has@label@informationtrue }% -\def\pgfplots@rememberplotspec{\pgfutil@ifnextchar[{\pgfplots@rememberplotspec@opt}{\pgfplots@rememberplotspec@opt[]}}% +\def\pgfplots@rememberplotspec{\pgfplotsutil@ifnextchar[{\pgfplots@rememberplotspec@opt}{\pgfplots@rememberplotspec@opt[]}}% \def\pgfplots@rememberplotspec@opt[#1]#2{% \pgfplots@rememberplotspec@for@label[#1]{#2}% \pgfplotslistpushbackglobal{#2}\to\pgfplots@plotspeclist @@ -3410,8 +3666,19 @@ \axispath\path#1;% } \def\pgfplots@replacement@for@scope{\pgfutil@ifnextchar[{\pgfplots@replacement@for@scope@}{\pgfplots@replacement@for@scope@[]}}% -\def\pgfplots@replacement@for@scope@[#1]{\pgfplotsextra{\scope[#1]}}% -\def\pgfplots@replacement@for@endscope{\pgfplotsextra\endscope}% +\def\pgfplots@replacement@for@scope@[#1]{% + \pgfplotsextra{\scope[#1]}% + \begingroup + % I need to apply anything which might be relevant for \addplot + % here. + % But I do NOT want \scope since this might already affect the low + % level output. Try this: + \tikzset{#1}% +}% +\def\pgfplots@replacement@for@endscope{% + \endgroup + \pgfplotsextra\endscope% +}% { % A block which handles active semicolons. @@ -3463,23 +3730,54 @@ % Remembers the plotting command #2 and '#3=plot coordinates {...} ...'; % for later postprocessing of the coordinates. % -% #1: commands which should be executed before issueing the plotting +% #1: pre-commands which should be executed before issueing the plotting % command #2 #3. -% #2: -% the command which is responsable for drawing. +% #2: the drawing-command. % - If #2 is NOT '\pgfutil@empty', we expect #3 to contain only % EXPANDABLE DATA. % That's important for postponed floating point arithmetics in #3. % - If #2='\pgfutil@empty', we don't make any assumption about #3 % and process it as-is. % -% #3: see above. +% #3: the plot data. If #2 is empty, this can be any command. % % #4: commands which should be executed after '#2 #3'. % \long\def\pgfplots@path@enqueue@coords#1#2#3#4{% - \pgfplotslistpushbackglobal{#1}{#2}{#3}{#4}\to\pgfplots@stored@plotlist + \begingroup + \def\pgfplots@loc@TMPa{#2}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \def\pgfplots@stored@current@precmd{#1}% + \def\pgfplots@stored@current@cmd{#2}% + \def\pgfplots@stored@current@data{#3}% + \def\pgfplots@stored@current@postcmd{#4}% + \ifx\pgfplots@stored@current@precmd\pgfutil@empty + \else + \pgfplots@wrong@plotlist@format@error + \fi + \ifx\pgfplots@stored@current@postcmd\pgfutil@empty + \else + \pgfplots@wrong@plotlist@format@error + \fi + \pgfplotslistpushbackglobal{#1}{#2}{#3}{#4}\to\pgfplots@stored@plotlist + \else + \pgfkeysgetvalue{/pgfplots/execute at begin plot visualization}\pgfplots@loc@TMPa + \pgfkeysgetvalue{/pgfplots/execute at end plot visualization}\pgfplots@loc@TMPb + \t@pgfplots@toka={#1}% + \t@pgfplots@tokb=\expandafter{\pgfplots@loc@TMPa}% + \t@pgfplots@tokc=\expandafter{\pgfplots@loc@TMPb}% + \edef\pgfplots@loc@TMPa{% + \noexpand\pgfkeyssetvalue{/pgfplots/execute at begin plot visualization}{\the\t@pgfplots@tokb}% + \noexpand\pgfkeyssetvalue{/pgfplots/execute at end plot visualization}{\the\t@pgfplots@tokc}% + \the\t@pgfplots@toka + }% + \expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplots@loc@TMPa}{#2}{#3}{#4}\to\pgfplots@stored@plotlist + \fi + \endgroup } +\def\pgfplots@wrong@plotlist@format@error{% + \pgfplots@error{Internal logic error: someone used \string \pgfplots@path@enqueue@coords\space in an unexpected way: if the second argument is empty, ONLY the third argument should be non-empty.^^J I found: pre command (1st arg): \meaning\pgfplots@stored@current@precmd;^^J command (2nd arg): \meaning\pgfplots@stored@current@cmd;^^J data (3rd arg): \meaning\pgfplots@stored@current@data^^J; post cmd (4th arg): \meaning\pgfplots@stored@current@postcmd^^J}% +}% % this was formerly slightly different than % \pgfplots@path@enqueue@coords, but it is now the same. @@ -3909,16 +4207,24 @@ {\tikz[/pgfplots/every legend to name picture/.try]{\pgfplots@legend@to@name}}% \t@pgfplots@tokc=\expandafter{\pgfplotsretval}% % + \begingroup + \pgfkeysgetvalue{/pgfplots/every legend image post/.@cmd}\pgfplots@loc@TMPa + % steal \toks0 temporarily. Within this group, it won't be + % used by any LaTeX code: + \toks0=\expandafter{\pgfplots@loc@TMPa\pgfeov}% + % \expandafter\xdef\csname pgfplots@legend@to@name@\pgfplots@createlegend@toname\endcsname{% \noexpand\begingroup \noexpand\def\noexpand\pgfplots@legend@to@name{% \noexpand\pgfkeysdef{/pgfplots/every axis legend}{\the\t@pgfplots@tokb}% + \noexpand\pgfkeysdef{/pgfplots/every legend image post}{\the\toks0 }% \noexpand\def\noexpand\numplots{\numplots}% \the\t@pgfplots@toka }% \the\t@pgfplots@tokc \noexpand\endgroup }% + \endgroup \t@pgfplots@toka=\expandafter\expandafter\expandafter{\csname pgfplots@legend@to@name@\pgfplots@createlegend@toname\endcsname}% \pgfplots@auxwrite{% \noexpand\expandafter @@ -3934,22 +4240,41 @@ \fi } +\pgfutil@ifundefined{AtBeginDocument}{}{% + \AtBeginDocument{% + \let\pgfplots@original@LaTeX@label@loadtime=\label + }% +} + % Defines a new \label{#1}. When \ref{#1} is used, the code -% \csname #2#1\endcsname +% \csname #3#2\endcsname % will be invoked. -\def\pgfplots@label#1#2{% +% \pgfplots@label[<optional prefix>]{<label name>}{<command prefix>} +% invokes +% \label<optional prefix>{<label name>} +\def\pgfplots@label{\pgfutil@ifnextchar[{\pgfplots@label@@}{\pgfplots@label@@[]}}% +\def\pgfplots@label@@[#1]#2#3{% \begingroup \edef\@currentlabel{% \string\expandafter \string\protect - \string\csname\space #2#1\string\endcsname + \string\csname\space #3#2\string\endcsname }% \pgfutil@ifundefined{hyper@makecurrent}{}{% \hyper@makecurrent{pgfplotslink}% \hyper@anchorstart{\@currentHref}{}\hyper@anchorend \pgfplotsutil@advancestringcounter@global\c@pgfplots@label }% - \expandafter\label\expandafter{#1}% + % + % this is a work-around to support the memoir class (it overwrites + % \label in sub + \let\sf@@memsub@label=\pgfplots@original@LaTeX@label@loadtime + % + \pgfutil@ifundefined{label}{% + }{% + \def\pgfplots@loc@TMPa{\label #1}% + \expandafter\pgfplots@loc@TMPa\expandafter{#2}% the \expandafter is a convenience method; the name should be expandable anyway + }% \endgroup }% \gdef\c@pgfplots@label{0}% @@ -3988,6 +4313,22 @@ }% }% +\def\pgfplotsplotfromname#1{% + \pgfplots@texdist@protect\pgfplotsplotfromname@{#1}% +}% +\def\pgfplotsplotfromname@#1{% + \pgfutil@ifundefined{pgfplots@show@ref@#1}{% + \pgfutil@ifundefined{ref}{% + \pgfplots@warning{There is no \string\addplot\space label `#1', sorry. I am skipping it}% + \string\pgfplotsplotfromname{#1}: ??% + }{% + \ref{\string\pgfplotsplotfromname{#1}}% + }% + }{% + \csname pgfplots@show@ref@#1\endcsname + }% +}% + \def\pgfplots@ifintikzpicture#1#2{% \pgfutil@ifundefined{filldraw}{#2}{#1}% }% @@ -4011,6 +4352,8 @@ } % Simply divides #1 by log(10). +% ATTENTION: in order to implement per-axis log basis, this will be +% OVERWRITTEN in pgfplotsticks.code.tex ! \def\pgfmathlogtologten@#1{% \pgfmathmultiply@{#1}\reciproclogten% }% @@ -4073,7 +4416,7 @@ \pgfkeysdef{/pgfplots/@enlargelimits/rel}{\pgfkeysalso{true,value={#1}}}% \pgfkeysdef{/pgfplots/@enlargelimits/abs value}{% \begingroup - \pgfutil@namelet{pgfplots@datascaletrafo@\pgfplots@enlargelimits@curaxis}{pgfplots@datascaletrafo@\pgfplots@enlargelimits@curaxis @noshift}% + \pgfplotscoordmath{\pgfplots@enlargelimits@curaxis}{datascaletrafo set shift}{0}% \expandafter\csname pgfplotstransformcoordinate\pgfplots@enlargelimits@curaxis\endcsname{#1}% \pgfmath@smuggleone\pgfmathresult \endgroup @@ -4163,7 +4506,8 @@ % helper for \pgfplots@check@and@apply@datatrafo@for. % \def\pgfplots@compute@number@order@for@trafo@isfloat#1\tocount#2{% - \expandafter\pgfmathfloat@decompose@E#1\relax#2\relax + \pgfmathfloatparsenumber{#1}% + \expandafter\pgfmathfloat@decompose@E\pgfmathresult\relax#2\relax \advance#2 by1\relax } @@ -4187,167 +4531,177 @@ % initialise data scale transformation % T(x) = 10^{q-m} * x % - \begingroup - \let\data@max@order=\c@pgf@counta - \let\data@cur@order=\c@pgf@countb - \let\data@dimen=\pgf@xa - \let\data@tmp=\pgf@xb - \let\data@dimen@order=\c@pgf@countc - \let\data@EXPONENT=\c@pgf@countd - \expandafter\let\expandafter\pgfplots@display@min@float\csname pgfplots@#1min\endcsname - \expandafter\let\expandafter\pgfplots@display@max@float\csname pgfplots@#1max\endcsname - \expandafter\let\expandafter\pgfplots@data@min@float\csname pgfplots@data@#1min\endcsname - \expandafter\let\expandafter\pgfplots@data@max@float\csname pgfplots@data@#1max\endcsname - \expandafter\let\expandafter\pgfplots@actual@trafo\csname pgfplots@datascaletrafo@#1\endcsname - \ifpgfplots@autocompute@all@limits - \else - \pgfplotsmathfloatmax{\pgfplots@display@max@float}{\pgfplots@data@max@float}% - \let\pgfplots@data@max@float=\pgfmathresult - \pgfplotsmathfloatmin{\pgfplots@display@min@float}{\pgfplots@data@min@float}% - \let\pgfplots@data@min@float=\pgfmathresult - \fi - % - % Step 1: compute 'm', the data order - \pgfplots@compute@number@order@for@trafo@isfloat - \pgfplots@data@min@float - \tocount\data@cur@order - % - \data@max@order=\data@cur@order - % - \pgfplots@compute@number@order@for@trafo@isfloat - \pgfplots@data@max@float - \tocount\data@cur@order - % - \ifnum\data@cur@order>\data@max@order + \ifpgfplots@disabledatascaling + % this here is a waste of time, I know it. One could really + % safe a lot of CPU time when disabledatascaling is enabled... + % but it requires so much extra cases; I really don't want + % that! + \gdef\pgfplots@glob@TMPa{0}% + \gdef\pgfplots@glob@TMPb{0}% + \else + \begingroup + \let\data@max@order=\c@pgf@counta + \let\data@cur@order=\c@pgf@countb + \let\data@dimen=\pgf@xa + \let\data@tmp=\pgf@xb + \let\data@dimen@order=\c@pgf@countc + \let\data@EXPONENT=\c@pgf@countd + \expandafter\let\expandafter\pgfplots@display@min@float\csname pgfplots@#1min\endcsname + \expandafter\let\expandafter\pgfplots@display@max@float\csname pgfplots@#1max\endcsname + \expandafter\let\expandafter\pgfplots@data@min@float\csname pgfplots@data@#1min\endcsname + \expandafter\let\expandafter\pgfplots@data@max@float\csname pgfplots@data@#1max\endcsname + \ifpgfplots@autocompute@all@limits + \else + \pgfplotscoordmath{#1}{max}{\pgfplots@display@max@float}{\pgfplots@data@max@float}% + \let\pgfplots@data@max@float=\pgfmathresult + \pgfplotscoordmath{#1}{min}{\pgfplots@display@min@float}{\pgfplots@data@min@float}% + \let\pgfplots@data@min@float=\pgfmathresult + \fi + % +%\message{minmax = [\pgfplots@data@min@float,\pgfplots@data@max@float]}% + % Step 1: compute 'm', the data order + \pgfplots@compute@number@order@for@trafo@isfloat + \pgfplots@data@min@float + \tocount\data@cur@order + % \data@max@order=\data@cur@order - \fi - % - % Step 2: compute 'q', the #1-size of the axis. - \expandafter\ifx\csname pgfplots@#1\endcsname\pgfutil@empty - % We have 'width' or 'height'. % - % Use the order of these parameters. - \def\pgfplots@loc@TMPa{#1}% - \def\pgfplots@loc@TMPb{x}% - \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb - \data@dimen=\pgfplots@width\relax - \else - \def\pgfplots@loc@TMPb{y}% + \pgfplots@compute@number@order@for@trafo@isfloat + \pgfplots@data@max@float + \tocount\data@cur@order + % + \ifnum\data@cur@order>\data@max@order + \data@max@order=\data@cur@order + \fi + % + % Step 2: compute 'q', the #1-size of the axis. + %\expandafter\ifx\csname pgfplots@#1\endcsname\pgfutil@empty + % We have 'width' or 'height' (I always have them). + % + % Use the order of these parameters. + \def\pgfplots@loc@TMPa{#1}% + \def\pgfplots@loc@TMPb{x}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb - \data@dimen=\pgfplots@height\relax + \data@dimen=\pgfplots@width\relax + \else + \if1\pgfplots@compat@scaling@zunitfix@enable + \data@dimen=\pgfplots@height\relax + \else + % this code here belongs to versions up to + % 1.3.1. + % It is now deprecated and produces small + % pixel differences. + \def\pgfplots@loc@TMPb{y}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb + \data@dimen=\pgfplots@height\relax + \else + \data@dimen=42pt % this is actually different from 1.3.1: there, it was UNDEFINED. + \fi + \fi \fi - \fi - \pgfplots@compute@number@order@for@trafo@isdimen - \data@dimen - \tocount\data@dimen@order - % This here is to avoid inaccuracies in the final - % axis rectangle size, see \pgfplots@initsizes: - %\advance\data@dimen@order by-1 - \else - % FIXME: - % we have either the 'x=1cm' or 'y=1cm' option! - % How should I initialise the trafo!? - \data@dimen@order=3 - \fi - % + \pgfplots@compute@number@order@for@trafo@isdimen + \data@dimen + \tocount\data@dimen@order + % This here is to avoid inaccuracies in the final + % axis rectangle size, see \pgfplots@initsizes: + %\advance\data@dimen@order by-1 + %\else + % FIXME: + % we have either the 'x=1cm' or 'y=1cm' option! + % How should I initialise the trafo!? + % \data@dimen@order=3 + %\fi + % %\message{Direction #1: data max order=\the\data@max@order; data dimen order=\the\data@dimen@order. }% - \data@EXPONENT=\data@dimen@order - \advance\data@EXPONENT by-\data@max@order - % Now, I introduce a loop which shall avoid cancellation of - % significant digits. - % - % Harmless Example: - % if we have data shift = -3 and - % max = 2e6, min = 1e6, then max-min = 1e6; T(max)-T(min) = 1e3 which is ok. - % In this case, the loop won't change anything. - % - % Critical Example: - % if we have data shift = -3 and - % max = 1980, min = 1930 then - % T(max) = 1.98 and T(min) = 1.93 - % and thus T(max)-T(min) = 0.05 . - % Considering that this is the axis range - % in which tick labels and plot points need to be computed, we - % only have two or three digits left! That happens because the - % prefix '19' is common and is cancelled in the subtraction. - % Idea: while T(max)-T(min) < O(10^2) -> increase shift by +1 - % (and make sure that T(max) < MAX_VALID_TEX_NUMBER). - % - \pgfplots@loop@CONTINUEtrue - \expandafter\edef\csname pgfplots@data@scale@trafo@SHIFT@#1\endcsname{0}% - \pgfutil@loop - \expandafter\edef\csname pgfplots@data@scale@trafo@EXPONENT@#1\endcsname{\the\data@EXPONENT}% - \pgfplots@actual@trafo{\pgfplots@data@min@float}% - \let\pgfplots@min@fixed=\pgfmathresult - \ifpgfplots@loop@CONTINUE - \pgfplots@actual@trafo{\pgfplots@data@max@float}% - \let\pgfplots@max@fixed=\pgfmathresult - \expandafter\data@tmp\pgfplots@max@fixed pt + \data@EXPONENT=\data@dimen@order + \advance\data@EXPONENT by-\data@max@order + % Now, I introduce a loop which shall avoid cancellation of + % significant digits. + % + % Harmless Example: + % if we have data shift = -3 and + % max = 2e6, min = 1e6, then max-min = 1e6; T(max)-T(min) = 1e3 which is ok. + % In this case, the loop won't change anything. + % + % Critical Example: + % if we have data shift = -3 and + % max = 1980, min = 1930 then + % T(max) = 1.98 and T(min) = 1.93 + % and thus T(max)-T(min) = 0.05 . + % Considering that this is the axis range + % in which tick labels and plot points need to be computed, we + % only have two or three digits left! That happens because the + % prefix '19' is common and is cancelled in the subtraction. + % Idea: while T(max)-T(min) < O(10^2) -> increase shift by +1 + % (and make sure that T(max) < MAX_VALID_TEX_NUMBER). + % + \def\pgfplotscoordmathnotifydatascalesetfor##1{}% disable temporarily. We are just testing it. + \pgfplots@loop@CONTINUEtrue + \pgfutil@loop + \pgfplotscoordmath{#1}{datascaletrafo set params}{\the\data@EXPONENT}{0}% + \pgfplotscoordmath{#1}{datascaletrafo}{\pgfplots@data@min@float}% + \let\pgfplots@min@fixed=\pgfmathresult + \ifpgfplots@loop@CONTINUE + \pgfplotscoordmath{#1}{datascaletrafo}{\pgfplots@data@max@float}% + \let\pgfplots@max@fixed=\pgfmathresult + \data@tmp=\pgfplots@max@fixed pt %\message{Current trafo EXPONENT for #1 direction: \the\data@EXPONENT; original #1 data limits: [\pgfplots@data@min@float:\pgfplots@data@max@float]; current transformed #1 limits: [\pgfplots@min@fixed:\pgfplots@max@fixed]; cancellation check max-min running...}% - \ifdim\data@tmp<0pt - % I need absolute values here: - \multiply\data@tmp by-1\relax - \fi - \pgfmathsubtract@{\pgfplots@max@fixed}{\pgfplots@min@fixed}% - \expandafter\data@dimen\pgfmathresult pt - \pgfplots@loop@CONTINUEfalse - \ifdim\data@tmp<1500pt % a multiplication with '10' results in max = 15000 which is the upper limit. - \ifdim\data@dimen<100pt % I guess if max-min = O(100), we have quite good accuracy - \ifdim\data@dimen<0.0001pt - \else - \advance\data@EXPONENT by1 - \pgfplots@loop@CONTINUEtrue + \ifdim\data@tmp<0pt + % I need absolute values here: + \multiply\data@tmp by-1\relax + \fi + \pgfmathsubtract@{\pgfplots@max@fixed}{\pgfplots@min@fixed}% + \data@dimen=\pgfmathresult pt + \pgfplots@loop@CONTINUEfalse + \ifdim\data@tmp<1500pt % a multiplication with '10' results in max = 15000 which is the upper limit. + \ifdim\data@dimen<100pt % I guess if max-min = O(100), we have quite good accuracy + \ifdim\data@dimen<0.0001pt + \else + \advance\data@EXPONENT by1 + \pgfplots@loop@CONTINUEtrue + \fi \fi \fi - \fi - %-------------------------------------------------- - % \ifdim\data@dimen>1200pt% FIXME : is this here ok!? CHECK IT! - % \ifdim\data@dimen>7999pt - % \advance\data@EXPONENT by-2 - % \else - % \advance\data@EXPONENT by-1 - % \fi - % \pgfplots@loop@CONTINUEfalse - % \fi - %-------------------------------------------------- - \pgfutil@repeat - \xdef\pgfplots@glob@TMPa{\csname pgfplots@data@scale@trafo@EXPONENT@#1\endcsname}% - \xdef\pgfplots@glob@TMPb{\pgfplots@min@fixed}% - \endgroup -%\message{Initialising the data scale transformation in direction #1 to 10^\pgfplots@glob@TMPa*#1 - \pgfplots@glob@TMPb...}% - % COMPLETE INITIALISATION: - \ifpgfplots@disabledatascaling - % this here is a waste of time, I know it. One could really - % safe a lot of CPU time when disabledatascaling is enabled... - % but it requires so much extra cases; I really don't want - % that! - \gdef\pgfplots@glob@TMPa{0}% - \gdef\pgfplots@glob@TMPb{0}% + %-------------------------------------------------- + % \ifdim\data@dimen>1200pt% FIXME : is this here ok!? CHECK IT! + % \ifdim\data@dimen>7999pt + % \advance\data@EXPONENT by-2 + % \else + % \advance\data@EXPONENT by-1 + % \fi + % \pgfplots@loop@CONTINUEfalse + % \fi + %-------------------------------------------------- + \pgfutil@repeat + \xdef\pgfplots@glob@TMPa{\the\data@EXPONENT}% + \xdef\pgfplots@glob@TMPb{\pgfplots@min@fixed}% + \endgroup \fi - \expandafter\let\csname pgfplots@data@scale@trafo@EXPONENT@#1\endcsname\pgfplots@glob@TMPa - \expandafter\let\csname pgfplots@data@scale@trafo@SHIFT@#1\endcsname\pgfplots@glob@TMPb% + % COMPLETE INITIALISATION: +%\message{Initialising the data scale transformation in direction #1 to 10^\pgfplots@glob@TMPa*#1 - \pgfplots@glob@TMPb...}% + \pgfplotscoordmath{#1}{datascaletrafo set params}{\pgfplots@glob@TMPa}{\pgfplots@glob@TMPb}% % % ... and apply transformation to any user input % % Transform axis limits: %\message{#1- display limits BEFORE data transformation: [\csname pgfplots@#1min\endcsname:\csname pgfplots@#1max\endcsname]}% - \expandafter\expandafter\csname pgfplots@datascaletrafo@#1\endcsname\expandafter{\csname pgfplots@#1min\endcsname}% + \pgfplotscoordmath{#1}{datascaletrafo}{\csname pgfplots@#1min\endcsname}% \expandafter\global\expandafter\let\csname pgfplots@#1min\endcsname=\pgfmathresult % - \expandafter\expandafter\csname pgfplots@datascaletrafo@#1\endcsname\expandafter{\csname pgfplots@#1max\endcsname}% + \pgfplotscoordmath{#1}{datascaletrafo}{\csname pgfplots@#1max\endcsname}% \expandafter\global\expandafter\let\csname pgfplots@#1max\endcsname=\pgfmathresult %\message{#1- display limits after data transformation: [\csname pgfplots@#1min\endcsname:\csname pgfplots@#1max\endcsname]}% % Transform tick limits (if they are set): %\message{#1- display tick limits BEFORE data transformation: [\csname pgfplots@#1tickmin\endcsname:\csname pgfplots@#1tickmax\endcsname]}% \expandafter\ifx\csname pgfplots@#1tickmin\endcsname\pgfutil@empty \else - \expandafter\expandafter\csname pgfplots@datascaletrafo@#1\endcsname\expandafter{\csname pgfplots@#1tickmin\endcsname}% + \pgfplotscoordmath{#1}{datascaletrafo}{\csname pgfplots@#1tickmin\endcsname}% \expandafter\global\expandafter\let\csname pgfplots@#1tickmin\endcsname=\pgfmathresult \fi % \expandafter\ifx\csname pgfplots@#1tickmax\endcsname\pgfutil@empty \else - \expandafter\expandafter\csname pgfplots@datascaletrafo@#1\endcsname\expandafter{\csname pgfplots@#1tickmax\endcsname}% + \pgfplotscoordmath{#1}{datascaletrafo}{\csname pgfplots@#1tickmax\endcsname}% \expandafter\global\expandafter\let\csname pgfplots@#1tickmax\endcsname=\pgfmathresult \fi %\message{#1- display tick limits after data transformation: [\csname pgfplots@#1tickmin\endcsname:\csname pgfplots@#1tickmax\endcsname]}% @@ -4357,7 +4711,6 @@ % this here should also work with 'xtick=\pgfutil@empty', the "No tick" command. \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \t@pgfplots@tokc=\expandafter{\csname pgfplots@datascaletrafo@#1\endcsname}% \def\pgfplots@loc@TMPb{data}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb % we have #1tick = data @@ -4367,15 +4720,19 @@ \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@firstplot@coords@#1\endcsname \expandafter\pgfplotsutil@unify@short@csv@list\expandafter{\pgfplots@loc@TMPa}% \t@pgfplots@toka=\expandafter{\pgfplotsretval}% - \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@toka}\the\t@pgfplots@tokc}% - \expandafter\pgfplots@apply@data@scale@trafo@to@user@ticks@isfloat\pgfplots@loc@TMPa\to\pgfplots@loc@TMPc + \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@toka}}% + \expandafter\pgfplots@apply@data@scale@trafo@to@user@ticks@isfloat\pgfplots@loc@TMPa + {\pgfplotscoordmath{#1}{datascaletrafo}}% + \to\pgfplots@loc@TMPc % clear structure: \expandafter\global\expandafter\let\csname pgfplots@firstplot@coords@#1\endcsname=\pgfutil@empty \else \t@pgfplots@toka=\expandafter{\pgfplots@loc@TMPa}% %\message{Converting #1tick='\csname pgfplots@#1tick\endcsname'}% - \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@toka}\the\t@pgfplots@tokc}% - \expandafter\pgfplots@apply@data@scale@trafo@to@user@ticks\pgfplots@loc@TMPa\to\pgfplots@loc@TMPc + \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@toka}}% + \expandafter\pgfplots@apply@data@scale@trafo@to@user@ticks\pgfplots@loc@TMPa + {\pgfplotscoordmath{#1}{datascaletrafo}}% + \to\pgfplots@loc@TMPc \fi \expandafter\let\csname pgfplots@#1tick\endcsname=\pgfplots@loc@TMPc \fi @@ -4384,17 +4741,29 @@ \edef\pgfplots@loc@TMPa{\csname pgfplots@extra@#1tick\endcsname}% \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \t@pgfplots@tokc=\expandafter{\csname pgfplots@datascaletrafo@#1\endcsname}% - \edef\pgfplots@loc@TMPa{{\csname pgfplots@extra@#1tick\endcsname}\the\t@pgfplots@tokc}% - \expandafter\pgfplots@apply@data@scale@trafo@to@user@ticks\pgfplots@loc@TMPa\to\pgfplots@loc@TMPc + \edef\pgfplots@loc@TMPa{{\csname pgfplots@extra@#1tick\endcsname}}% + \expandafter\pgfplots@apply@data@scale@trafo@to@user@ticks\pgfplots@loc@TMPa + {\pgfplotscoordmath{#1}{datascaletrafo}}% + \to\pgfplots@loc@TMPc \expandafter\let\csname pgfplots@extra@#1tick\endcsname=\pgfplots@loc@TMPc \fi % + % Convert any minor tick lists in the same way. + \pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \edef\pgfplots@loc@TMPa{{\pgfplots@loc@TMPa}}% + \expandafter\pgfplots@apply@data@scale@trafo@to@user@ticks\pgfplots@loc@TMPa + {\pgfplotscoordmath{#1}{datascaletrafo}}% + \to\pgfplots@loc@TMPc + \pgfkeyslet{/pgfplots/minor #1tick}\pgfplots@loc@TMPc + \fi + % % Transform any explicit axis unit scalings: % WILL BE DONE LATER! }{% % case apply trafo == false: - \expandafter\def\csname pgfplots@data@scale@trafo@SHIFT@#1\endcsname{0}% + \pgfplotscoordmath{#1}{datascaletrafo set params}{0}{0}% \def\pgfplots@loc@TMPb{data}% \expandafter\ifx\csname pgfplots@#1tick\endcsname\pgfplots@loc@TMPb \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@firstplot@coords@#1\endcsname @@ -4412,31 +4781,26 @@ \newif\ifpgfplots@determinedefaultvalues@needs@check@uniformtick \newif\ifpgfplots@limits@are@computed +\def\pgfplots@handle@invalid@range@defaultlimits{% + \pgfplotscoordmath{x}{parsenumber}{0}% + \global\let\pgfplots@xmin=\pgfmathresult + \pgfplotscoordmath{x}{parsenumber}{1}% + \global\let\pgfplots@xmax=\pgfmathresult + \global\let\pgfplots@data@xmin=\pgfplots@xmin + \global\let\pgfplots@data@xmax=\pgfplots@xmax + % + \pgfplotscoordmath{y}{parsenumber}{0}% + \global\let\pgfplots@ymin=\pgfmathresult + \pgfplotscoordmath{y}{parsenumber}{1}% + \global\let\pgfplots@ymax=\pgfmathresult + \global\let\pgfplots@data@ymin=\pgfplots@ymin + \global\let\pgfplots@data@ymax=\pgfplots@ymax +} \def\pgfplots@handle@invalid@range{% % COMPLETELY EMPTY AXIS: \pgfplots@warning{You have an axis with empty range. Replacing it with a default range and clearing all plots.}% - \ifpgfplots@xislinear - \pgfmathfloatcreate{0}{0.0}{0}% - \global\let\pgfplots@xmin=\pgfmathresult - \pgfmathfloatcreate{1}{1.0}{0}% - \global\let\pgfplots@xmax=\pgfmathresult - \global\let\pgfplots@data@xmin=\pgfplots@xmin - \global\let\pgfplots@data@xmax=\pgfplots@xmax - \else - \gdef\pgfplots@xmin{0}% - \gdef\pgfplots@xmax{1}% - \fi - \ifpgfplots@yislinear - \pgfmathfloatcreate{0}{0.0}{0}% - \global\let\pgfplots@ymin=\pgfmathresult - \pgfmathfloatcreate{1}{1.0}{0}% - \global\let\pgfplots@ymax=\pgfmathresult - \global\let\pgfplots@data@ymin=\pgfplots@ymin - \global\let\pgfplots@data@ymax=\pgfplots@ymax - \else - \gdef\pgfplots@ymin{0}% - \gdef\pgfplots@ymax{1}% - \fi + \pgfplots@handle@invalid@range@defaultlimits + % \pgfplots@threedimfalse \def\pgfplots@xtick{}% \def\pgfplots@ytick{}% @@ -4492,20 +4856,20 @@ \else % there is a rare change that min > max. % Handle that ... - \pgfplotsmathfloatmin{\pgfplots@xmin}{\pgfplots@xmax}% + \pgfplotscoordmath{x}{min}{\pgfplots@xmin}{\pgfplots@xmax}% \global\let\pgfplots@xmin=\pgfmathresult - \pgfplotsmathfloatmax{\pgfplots@xmin}{\pgfplots@xmax}% + \pgfplotscoordmath{x}{max}{\pgfplots@xmin}{\pgfplots@xmax}% \global\let\pgfplots@xmax=\pgfmathresult % - \pgfplotsmathfloatmin{\pgfplots@ymin}{\pgfplots@ymax}% + \pgfplotscoordmath{y}{min}{\pgfplots@ymin}{\pgfplots@ymax}% \global\let\pgfplots@ymin=\pgfmathresult - \pgfplotsmathfloatmax{\pgfplots@ymin}{\pgfplots@ymax}% + \pgfplotscoordmath{y}{max}{\pgfplots@ymin}{\pgfplots@ymax}% \global\let\pgfplots@ymax=\pgfmathresult % \ifpgfplots@threedim - \pgfplotsmathfloatmin{\pgfplots@zmin}{\pgfplots@zmax}% + \pgfplotscoordmath{z}{min}{\pgfplots@zmin}{\pgfplots@zmax}% \global\let\pgfplots@zmin=\pgfmathresult - \pgfplotsmathfloatmax{\pgfplots@zmin}{\pgfplots@zmax}% + \pgfplotscoordmath{z}{max}{\pgfplots@zmin}{\pgfplots@zmax}% \global\let\pgfplots@zmax=\pgfmathresult \fi \fi @@ -4532,31 +4896,6 @@ \def\pgfplots@determinedefaultvalues{% \pgfplots@check@invalid@range % - %-------------------------------------------------- - %FIXME - % \ifpgfplots@float@numerics@mode@x - % \pgfplotsmathfloatmin{\pgfplots@xmin}{\pgfplots@xmax}% - % \let\pgfplots@xmin=\pgfmathresult - % \pgfplotsmathfloatmax{\pgfplots@xmin}{\pgfplots@xmax}% - % \let\pgfplots@xmax=\pgfmathresult - % \else - % \pgfplotsmathmin{\pgfplots@xmin}{\pgfplots@xmax}% - % \let\pgfplots@xmin=\pgfmathresult - % \pgfplotsmathmax{\pgfplots@xmin}{\pgfplots@xmax}% - % \let\pgfplots@xmax=\pgfmathresult - % \fi - % \ifpgfplots@float@numerics@mode@y - % \pgfplotsmathfloatmin{\pgfplots@ymin}{\pgfplots@ymax}% - % \let\pgfplots@ymin=\pgfmathresult - % \pgfplotsmathfloatmax{\pgfplots@ymin}{\pgfplots@ymax}% - % \let\pgfplots@ymax=\pgfmathresult - % \else - % \pgfplotsmathmin{\pgfplots@ymin}{\pgfplots@ymax}% - % \let\pgfplots@ymin=\pgfmathresult - % \pgfplotsmathmax{\pgfplots@ymin}{\pgfplots@ymax}% - % \let\pgfplots@ymax=\pgfmathresult - % \fi - %-------------------------------------------------- %\message{untransformed: x = [\pgfplots@xmin:\pgfplots@xmax] y = [\pgfplots@ymin:\pgfplots@ymax]. }% % % @@ -4578,200 +4917,146 @@ % % From now on, we can always work with pgfmath. % We simply need to apply the data scaling trafo before doing so. - \pgfkeysgetvalue{/pgfplots/minor x tick num}\pgfplots@minor@xtick@num - \ifpgfplots@xislinear - \ifnum\pgfplots@minor@xtick@num=0\relax - \pgfplots@xminorticksfalse - \pgfplots@xminorgridsfalse - \else - \pgfplots@xminortickstrue - \fi - \fi - % \pgfplots@enlarge@limit@ifconfigured x \pgfplots@avoid@empty@axis@range@for x% % - \pgfkeysgetvalue{/pgfplots/minor y tick num}\pgfplots@minor@ytick@num - \ifpgfplots@yislinear - \ifnum\pgfplots@minor@ytick@num=0\relax - \pgfplots@yminorticksfalse - \pgfplots@yminorgridsfalse - \else - \pgfplots@yminortickstrue - \fi - \fi \pgfplots@enlarge@limit@ifconfigured y \pgfplots@avoid@empty@axis@range@for y% \ifpgfplots@threedim - \pgfkeysgetvalue{/pgfplots/minor z tick num}\pgfplots@minor@ztick@num - \ifpgfplots@zislinear - \ifnum\pgfplots@minor@ztick@num=0\relax - \pgfplots@zminorticksfalse - \pgfplots@zminorgridsfalse - \else - \pgfplots@zminortickstrue - \fi - \fi \pgfplots@enlarge@limit@ifconfigured z \pgfplots@avoid@empty@axis@range@for z% \fi % - % \pgfplots@initsizes % + \pgfplots@limits@ready + \pgfplotspoint@initialisation + % % \pgfplots@BEGIN@prepare@description@styles % % + \pgfplots@init@ticks@for x% + \pgfplots@init@ticks@for y% + \ifpgfplots@threedim + \pgfplots@init@ticks@for z% + \fi + \pgfplots@init@ticks@ready + % + % + \pgfplots@prepare@ZERO@coordinates % + \pgfplots@decide@which@figure@surfaces@are@drawn + \pgfplots@init@ticklabelaxisspec + % + \pgfplots@define@threedim@marks + % + \pgfplots@clippath@prepare + % + \pgfplots@ticklabel@maxtickdimen@reset x% + \pgfplots@ticklabel@maxtickdimen@reset y% + \pgfplots@ticklabel@maxtickdimen@reset z% +} +\def\pgfplots@init@ticks@ready{}% +\def\pgfplots@init@ticks@for#1{% \pgfplots@isuniformticktrue \pgfplots@determinedefaultvalues@needs@check@uniformticktrue - \ifx\pgfplots@xtick\pgfutil@empty - \pgfplots@assign@default@tick@foraxis{x}% + \expandafter\ifx\csname pgfplots@#1tick\endcsname\pgfutil@empty + \pgfplots@assign@default@tick@foraxis{#1}% \fi \ifpgfplots@determinedefaultvalues@needs@check@uniformtick - \ifpgfplots@xislinear - \expandafter\pgfplots@checkisuniformLINEARtick\expandafter{\pgfplots@xtick}{\pgfplots@tick@distance@x}% - \else - \expandafter\pgfplots@checkisuniformLOGtick\expandafter{\pgfplots@xtick}% - \fi + \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1tick\endcsname + \pgfplots@if{pgfplots@#1islinear}{% + \def\pgfplots@loc@TMPb{\expandafter\pgfplots@checkisuniformLINEARtick\expandafter{\pgfplots@loc@TMPa}}% + \expandafter\pgfplots@loc@TMPb\csname pgfplots@tick@distance@#1\endcsname% + }{% + \expandafter\pgfplots@checkisuniformLOGtick\expandafter{\pgfplots@loc@TMPa}% + }% \fi + \pgfplots@check@for@minor@ticks{#1}% \ifpgfplots@isuniformtick \else - \pgfplots@xminorticksfalse - \pgfplots@xminorgridsfalse + \pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@loc@TMPb + \ifx\pgfplots@loc@TMPb\pgfutil@empty + \csname pgfplots@#1minorticksfalse\endcsname + \csname pgfplots@#1minorgridsfalse\endcsname + \fi \fi % - \if0\pgfplots@xaxislinesnum\else - % axis x line* != box - \let\pgfplots@xticklabel@pos=\pgfutil@empty - \fi - \if0\pgfplots@yaxislinesnum\else - % axis y line* != box - \let\pgfplots@yticklabel@pos=\pgfutil@empty + \expandafter\ifx\csname pgfplots@#1ticklabel\endcsname\pgfutil@empty + \pgfplots@if{pgfplots@#1islinear}{% + \expandafter\def\csname pgfplots@#1ticklabel\endcsname{\axisdefaultticklabel}% + }{% + \expandafter\def\csname pgfplots@#1ticklabel\endcsname{\axisdefaultticklabellog}% + }% \fi - \if0\pgfplots@zaxislinesnum\else - % axis y line* != box - \let\pgfplots@zticklabel@pos=\pgfutil@empty + \expandafter\ifx\csname pgfplots@extra@#1ticklabel\endcsname\pgfutil@empty + \pgfutil@namelet{pgfplots@extra@#1ticklabel}{pgfplots@#1ticklabel}% \fi % - \ifx\pgfplots@xticklabel@pos\pgfutil@empty - \def\pgfplots@xticklabel@pos{% - \if3\pgfplots@xtickposnum% right - u% - \else - l% - \fi - }% + \if0\csname pgfplots@#1axislinesnum\endcsname\else + % axis x line* != box + \expandafter\let\csname pgfplots@#1ticklabel@pos\endcsname=\pgfutil@empty \fi - \ifx\pgfplots@yticklabel@pos\pgfutil@empty - \def\pgfplots@yticklabel@pos{% - \if3\pgfplots@ytickposnum% right + \expandafter\ifx\csname pgfplots@#1ticklabel@pos\endcsname\pgfutil@empty + \expandafter\def\csname pgfplots@#1ticklabel@pos\endcsname{% + \if3\csname pgfplots@#1tickposnum\endcsname% right u% \else l% \fi }% \fi - \ifx\pgfplots@zticklabel@pos\pgfutil@empty - \def\pgfplots@zticklabel@pos{% - \if3\pgfplots@ztickposnum% right - u% - \else - l% +}% + +\def\pgfplots@check@for@minor@ticks#1{% + \pgfkeysgetvalue{/pgfplots/minor #1 tick num}\pgfplots@loc@TMPa + \pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@loc@TMPb + \pgfplots@if{pgfplots@#1islinear}{% + \ifnum\pgfplots@loc@TMPa=0\relax + \ifx\pgfplots@loc@TMPb\pgfutil@empty + \csname pgfplots@#1minorticksfalse\endcsname + \csname pgfplots@#1minorgridsfalse\endcsname \fi - }% - \fi - % - \ifx\pgfplots@xticklabel\pgfutil@empty - \ifpgfplots@xislinear - \def\pgfplots@xticklabel{\axisdefaultticklabel}% \else - \def\pgfplots@xticklabel{\axisdefaultticklabellog}% + \csname pgfplots@#1minortickstrue\endcsname \fi - \fi - \ifx\pgfplots@extra@xticklabel\pgfutil@empty - \let\pgfplots@extra@xticklabel=\pgfplots@xticklabel - \fi - % - % - % - \pgfplots@isuniformticktrue - \pgfplots@determinedefaultvalues@needs@check@uniformticktrue - \ifx\pgfplots@ytick\pgfutil@empty - \pgfplots@assign@default@tick@foraxis{y}% - \fi - \ifpgfplots@determinedefaultvalues@needs@check@uniformtick - \ifpgfplots@yislinear - \expandafter\pgfplots@checkisuniformLINEARtick\expandafter{\pgfplots@ytick}{\pgfplots@tick@distance@y}% - \else - \expandafter\pgfplots@checkisuniformLOGtick\expandafter{\pgfplots@ytick}% - \fi - \fi - \ifpgfplots@isuniformtick + }{% + }% + \ifx\pgfplots@loc@TMPb\pgfutil@empty \else - \pgfplots@yminorticksfalse - \pgfplots@yminorgridsfalse - \fi - % - \ifx\pgfplots@yticklabel\pgfutil@empty - \ifpgfplots@yislinear - \def\pgfplots@yticklabel{\axisdefaultticklabel}% - \else - \def\pgfplots@yticklabel{\axisdefaultticklabellog}% - \fi - \fi - \ifx\pgfplots@extra@yticklabel\pgfutil@empty - \let\pgfplots@extra@yticklabel=\pgfplots@yticklabel + \csname pgfplots@#1minortickstrue\endcsname \fi - % +} + +% Invoked as soon as all axis limits are ready and final (in TeX +% number range, all data scaling is applied at this point). +\def\pgfplots@limits@ready{% + \pgfplots@limits@ready@tostring{x}{min}% + \pgfplots@limits@ready@tostring{x}{max}% + \pgfplots@limits@ready@tostring{y}{min}% + \pgfplots@limits@ready@tostring{y}{max}% \ifpgfplots@threedim - \pgfplots@isuniformticktrue - \pgfplots@determinedefaultvalues@needs@check@uniformticktrue - \ifx\pgfplots@ztick\pgfutil@empty - \pgfplots@assign@default@tick@foraxis{z}% - \fi - \ifpgfplots@determinedefaultvalues@needs@check@uniformtick - \ifpgfplots@zislinear - \expandafter\pgfplots@checkisuniformLINEARtick\expandafter{\pgfplots@ztick}{\pgfplots@tick@distance@z}% - \else - \expandafter\pgfplots@checkisuniformLOGtick\expandafter{\pgfplots@ztick}% - \fi - \fi - \ifpgfplots@isuniformtick - \else - \pgfplots@zminorticksfalse - \pgfplots@zminorgridsfalse - \fi - % - \ifx\pgfplots@zticklabel\pgfutil@empty - \ifpgfplots@zislinear - \def\pgfplots@zticklabel{\axisdefaultticklabel}% - \else - \def\pgfplots@zticklabel{\axisdefaultticklabellog}% - \fi - \fi - \ifx\pgfplots@extra@zticklabel\pgfutil@empty - \let\pgfplots@extra@zticklabel=\pgfplots@zticklabel - \fi + \pgfplots@limits@ready@tostring{z}{min}% + \pgfplots@limits@ready@tostring{z}{max}% \fi - % - % - \pgfplots@prepare@ZERO@coordinates - % - \pgfplotspoint@initialisation - % - \pgfplots@decide@which@figure@surfaces@are@drawn - % - \pgfplots@define@threedim@marks - % - \pgfplots@clippath@prepare - % - \pgfplots@ticklabel@maxtickdimen@reset x% - \pgfplots@ticklabel@maxtickdimen@reset y% - \pgfplots@ticklabel@maxtickdimen@reset z% -} +}% + +% write a limit into /pgfplots/#1#2 +% #1: either x,y or z +% #2: either 'min' or 'max' +% +% \pgfplots@limits@ready@tostring{x}{min} +\def\pgfplots@limits@ready@tostring#1#2{% + \pgfplots@if{pgfplots@apply@datatrafo@#1}{% + \pgfplotscoordmath{#1}{datascaletrafo inverse}{\csname pgfplots@#1#2\endcsname}% + }{% + \edef\pgfmathresult{\csname pgfplots@#1#2\endcsname}% + }% + \pgfplotscoordmath{#1}{tostring}{\pgfmathresult}% + \pgfkeyslet{/pgfplots/#1#2}\pgfmathresult +}% % Defines \pgfmathresult to be the desired width without axis labels. % @@ -4833,11 +5118,13 @@ {\pgf@sys@tonumber\pgf@xa}% {\pgf@sys@tonumber\pgf@xb}% }% -%\pgfplots@message{pgfplots.sty: Computing 'x' such that 'width = c + x*(xmax-xmin)'; -% c=estimated, -% width-c =\the\pgf@xa, -% x*(xmax[=\the\pgfplots@xcoordmaxTEX] - xmin[=\the\pgfplots@xcoordminTEX)]) = \the\pgf@xb -% -> x-scale =#2 }% +%-------------------------------------------------- +% \message{pgfplots.sty: Computing 'x' such that 'width = c + x*(xmax-xmin)'; +% c=estimated, +% width-c =\the\pgf@xa, +% x*(xmax - xmin)]) = \the\pgf@xb +% -> x-scale =\pgfmathresult }% +%-------------------------------------------------- \pgfmath@smuggleone\pgfmathresult \endgroup \let#2=\pgfmathresult @@ -4900,7 +5187,7 @@ \fi \fi \ifpgfplots@avoid@emptyrange@@range@is@approx@equal - \pgfplots@warning{Axis range for axis #1 is approximately empty; enlargeing it.}% + \pgfplots@warning{Axis range for axis #1 is approximately empty; enlarging it.}% % the case \pgfplots@@min ~= \pgfplots@@max % % enlarge \pgfplots@@max and shrink \min: @@ -4930,39 +5217,45 @@ % -> we need to enlarge limits in floating % point arithmetics. % - \pgfmathfloatcreate{0}{0.0}{0}% + \pgfplotscoordmath{#1}{parsenumber}{0}% \let\pgfplotsmath@zero=\pgfmathresult % \ifx\max@unscaled\pgfplotsmath@zero % max == 0 - \pgfmathfloatcreate{1}{1.0}{0}% + \pgfplotscoordmath{#1}{parsenumber}{1}% \let\max@unscaled=\pgfmathresult - \pgfmathfloatcreate{2}{1.0}{0}% + \pgfplotscoordmath{#1}{parsenumber}{-1}% \let\min@unscaled=\pgfmathresult \else % - \pgfmathfloatcreate{1}{1.2}{0}% + \pgfplotscoordmath{#1}{parsenumber}{1.2}% \let\pgfplotsmath@scalea=\pgfmathresult - \pgfmathfloatcreate{1}{8.0}{-1}% + \pgfplotscoordmath{#1}{parsenumber}{8e-1}% \let\pgfplotsmath@scaleb=\pgfmathresult % - \pgfmathfloatlessthan@{\pgfplotsmath@zero}{\max@unscaled}% - \ifpgfmathfloatcomparison - % 0 < max - \pgfmathfloatmultiply@{\max@unscaled}{\pgfplotsmath@scalea}% - \let\max@unscaled=\pgfmathresult - \pgfmathfloatmultiply@{\min@unscaled}{\pgfplotsmath@scaleb}% - \let\min@unscaled=\pgfmathresult - \else - \pgfmathfloatmultiply@{\max@unscaled}{\pgfplotsmath@scaleb}% - \let\max@unscaled=\pgfmathresult - \pgfmathfloatmultiply@{\min@unscaled}{\pgfplotsmath@scalea}% - \let\min@unscaled=\pgfmathresult - \fi + \pgfplotscoordmath{#1}{if less than} + {\pgfplotsmath@zero}{\max@unscaled}% + {% + % 0 < max + \pgfplotscoordmath{#1}{op}{multiply} + {{\max@unscaled}{\pgfplotsmath@scalea}}% + \let\max@unscaled=\pgfmathresult + \pgfplotscoordmath{#1}{op}{multiply} + {{\min@unscaled}{\pgfplotsmath@scaleb}}% + \let\min@unscaled=\pgfmathresult + }% + {% + \pgfplotscoordmath{#1}{op}{multiply} + {{\max@unscaled}{\pgfplotsmath@scaleb}}% + \let\max@unscaled=\pgfmathresult + \pgfplotscoordmath{#1}{op}{multiply} + {{\min@unscaled}{\pgfplotsmath@scalea}}% + \let\min@unscaled=\pgfmathresult + }% \fi - \csname pgfplots@datascaletrafo@#1\endcsname{\min@unscaled}% + \pgfplotscoordmath{#1}{datascaletrafo}{\min@unscaled}% \let\pgfplots@@min=\pgfmathresult - \csname pgfplots@datascaletrafo@#1\endcsname{\max@unscaled}% + \pgfplotscoordmath{#1}{datascaletrafo}{\max@unscaled}% \let\pgfplots@@max=\pgfmathresult \min@d=\pgfplots@@min pt \max@d=\pgfplots@@max pt @@ -5013,89 +5306,102 @@ \pgfkeysgetvalue{/pgfplots/x}{\pgfplots@x}% \pgfkeysgetvalue{/pgfplots/y}{\pgfplots@y}% \pgfkeysgetvalue{/pgfplots/z}{\pgfplots@z}% + %\pgfkeysgetvalue{/pgfplots/viewdir}{\pgfplots@viewdir}% \pgfkeysgetvalue{/pgfplots/width}{\pgfplots@width}% \pgfkeysgetvalue{/pgfplots/height}{\pgfplots@height}% \ifx\pgfplots@width\pgfutil@empty + \def\pgfplots@user@provided@width{0}% \else + \def\pgfplots@user@provided@width{1}% \pgfmathparse{\pgfplots@width}% \edef\pgfplots@width{\pgfmathresult pt}% \fi \ifx\pgfplots@height\pgfutil@empty + \def\pgfplots@user@provided@height{0}% \else + \def\pgfplots@user@provided@height{1}% \pgfmathparse{\pgfplots@height}% \edef\pgfplots@height{\pgfmathresult pt}% \fi % % CASES: - % hasx := 'x' option non-empty - % hasy := 'y' option non-empty % W := 'width' option non-empty % H := 'height' option non-empty % - % hasx = 1 -> width is not interesting; we use 'x' option. - % hasx = 0 -> determine final width: % W H % 0 0 -> \axisdefaultwidth % 0 1 -> determine width out of H and the default aspect ratio % 1 X -> ok, use the user parameter. - % - % hasy = 1 -> height is not interesting, we use 'y' option. - % hasy = 0 -> determine final height: - % W H - % 0 0 -> \axisdefaultheight - % X 1 -> ok, use the user parameter - % 1 0 -> determine height out of W and the default aspect ratio - % - \ifx\pgfplots@x\pgfutil@empty - \ifx\pgfplots@y\pgfutil@empty - % hasx=0, hasy=0 - % - % -> KEEP ASPECT RATIO if just one W, or H is given! - \ifx\pgfplots@width\pgfutil@empty - \ifx\pgfplots@height\pgfutil@empty - % The case hasx=0, hasy=0, W=0 H=0: - \let\pgfplots@width=\axisdefaultwidth - \let\pgfplots@height=\axisdefaultheight - \else - % The case hasx=0, hasy=0, W=0 H=1: - \pgfplots@compute@default@aspect@ratio - \expandafter\pgfmath@y\pgfplots@height - \pgfmathlog@invoke@expanded\pgfmathmultiply@{% - {\pgf@sys@tonumber{\pgfmath@y}}% - {\pgfplots@default@aspect@ratio}% - }% - \edef\pgfplots@width{\pgfmathresult pt}% - \fi - \else - \ifx\pgfplots@height\pgfutil@empty - % The case hasx=0, hasy=0, W=1 H=0: - \pgfplots@compute@default@aspect@ratio - \expandafter\pgfmath@x\pgfplots@width - \pgfmathlog@invoke@expanded\pgfmathdivide@{% - {\pgf@sys@tonumber{\pgfmath@x}}% - {\pgfplots@default@aspect@ratio}% - }% - \edef\pgfplots@height{\pgfmathresult pt}% - \else - % The case hasx=0, hasy=0, W=1 H=1: - \fi - \fi + % -> KEEP ASPECT RATIO if just one W, or H is given! + \ifx\pgfplots@width\pgfutil@empty + \ifx\pgfplots@height\pgfutil@empty + % The case W=0 H=0: + \let\pgfplots@width=\axisdefaultwidth + \let\pgfplots@height=\axisdefaultheight \else - % hasx=0, hasy=1, W=0: - \ifx\pgfplots@width\pgfutil@empty - \let\pgfplots@width=\axisdefaultwidth - \fi + % The case W=0 H=1: + \pgfplots@compute@default@aspect@ratio + \expandafter\pgfmath@y\pgfplots@height + \pgfmathlog@invoke@expanded\pgfmathmultiply@{% + {\pgf@sys@tonumber{\pgfmath@y}}% + {\pgfplots@default@aspect@ratio}% + }% + \edef\pgfplots@width{\pgfmathresult pt}% \fi \else - \ifx\pgfplots@y\pgfutil@empty - % hasx=1, hasy=0, H=0 - \ifx\pgfplots@height\pgfutil@empty - \let\pgfplots@height=\axisdefaultheight - \fi + \ifx\pgfplots@height\pgfutil@empty + % The case W=1 H=0: + \pgfplots@compute@default@aspect@ratio + \expandafter\pgfmath@x\pgfplots@width + \pgfmathlog@invoke@expanded\pgfmathdivide@{% + {\pgf@sys@tonumber{\pgfmath@x}}% + {\pgfplots@default@aspect@ratio}% + }% + \edef\pgfplots@height{\pgfmathresult pt}% + \else + % The case W=1 H=1: \fi \fi \pgfkeyslet{/pgfplots/width}{\pgfplots@width}% \pgfkeyslet{/pgfplots/height}{\pgfplots@height}% + % + \ifpgfplots@threedim + \pgfplots@set@default@size@options@threedim + \fi +} +\def\pgfplots@set@default@size@options@threedim{% + \pgfplots@loc@tmpfalse + \ifx\pgfplots@x\pgfutil@empty + \else + \pgfplots@loc@tmptrue + \fi + \ifx\pgfplots@y\pgfutil@empty + \else + \pgfplots@loc@tmptrue + \fi + \ifx\pgfplots@z\pgfutil@empty + \else + \pgfplots@loc@tmptrue + \fi + \ifpgfplots@loc@tmp + % oh - we have at least one of the [xyz] unit vectors! + % make sure all of them are there + \ifx\pgfplots@x\pgfutil@empty + \pgfplots@set@default@size@options@threedim@{x}{(1pt,0pt)}% + \fi + \ifx\pgfplots@y\pgfutil@empty + \pgfplots@set@default@size@options@threedim@{y}{(0pt,1pt)}% + \fi + \ifx\pgfplots@z\pgfutil@empty + \pgfplots@set@default@size@options@threedim@{z}{(0pt,1pt)}% + \fi + \pgfkeyslet{/pgfplots/view/az}\pgfutil@empty + \pgfkeyslet{/pgfplots/view/el}\pgfutil@empty + \fi +} +\def\pgfplots@set@default@size@options@threedim@#1#2{% + \pgfplots@error{Sorry, a 3D axis needs either NONE or ALL of "x,y,z". I found partial information, but (at least) '#1' is lacking... please add '#1'}% + \expandafter\def\csname pgfplots@#1\endcsname{#2}% } % A helper method for \pgfplots@initsizes which @@ -5138,7 +5444,11 @@ \ifdim\pgfplots@loc@TMPa=0pt \def\pgfmathresult{0}% \else - \pgfmathveclen{\csname pgf@#1x\endcsname}{\csname pgf@#1y\endcsname}% + \edef\pgf@marshal{% + {\expandafter\pgf@sys@tonumber\csname pgf@#1x\endcsname}% + {\expandafter\pgf@sys@tonumber\csname pgf@#1y\endcsname}% + }% + \expandafter\pgfmathveclen\pgf@marshal \fi \fi % The numbers 1/||e_x|| and 1/||e_y|| are used by the tick @@ -5170,17 +5480,18 @@ \def#4{0}% we DON'T have (#1,0) or (0,#1). At least I think so. % %\message{Setting unitvector(#1) to non-standard \csname pgfplots@#1\endcsname ...}% - % FIXME : that's wrong for 3D axes! \def\pgfplots@loc@TMPa(##1,##2){% - \pgfmathparse{##1}% + \pgfplotscoordmath{default}{parse}{##1}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% \let\pgfplots@loc@TMPb=\pgfmathresult - \pgfmathparse{##2}% + \pgfplotscoordmath{default}{parse}{##2}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% \let\pgfplots@loc@TMPc=\pgfmathresult % \pgfplots@if{pgfplots@apply@datatrafo@#1}{% - \csname pgfplots@inverse@datascaletrafo@tofixed@#1@noshift\endcsname{\pgfplots@loc@TMPb}% + \pgfplotscoordmath{#1}{datascaletrafo noshift inverse to fixed}{\pgfplots@loc@TMPb}% \let\pgfplots@loc@TMPb=\pgfmathresult - \csname pgfplots@inverse@datascaletrafo@tofixed@#1@noshift\endcsname{\pgfplots@loc@TMPc}% + \pgfplotscoordmath{#1}{datascaletrafo noshift inverse to fixed}{\pgfplots@loc@TMPc}% \let\pgfplots@loc@TMPc=\pgfmathresult }{}% \csname pgfset#1vec\endcsname{% @@ -5190,12 +5501,17 @@ }% \expandafter\pgfplots@loc@TMPa\pgfplots@loc@TMPb% % - \pgfmathveclen{\csname pgf@#1x\endcsname}{\csname pgf@#1y\endcsname}% + \edef\pgf@marshal{% + {\expandafter\pgf@sys@tonumber\csname pgf@#1x\endcsname}% + {\expandafter\pgf@sys@tonumber\csname pgf@#1y\endcsname}% + }% + \expandafter\pgfmath@basic@veclen@\pgf@marshal + % \expandafter\let\csname pgfplots@#1@veclength\endcsname=\pgfmathresult \pgfplotsmath@ifzero{\pgfmathresult}{% \expandafter\def\csname pgfplots@#1@inverseveclength\endcsname{infty}% }{% - \expandafter\pgfmathreciprocal@\expandafter{\pgfmathresult}% + \expandafter\pgfmath@basic@reciprocal@\expandafter{\pgfmathresult}% \expandafter\let\csname pgfplots@#1@inverseveclength\endcsname=\pgfmathresult }% \else @@ -5203,8 +5519,9 @@ \def#4{1}% we have (#1,0) or (0,#1) %\message{Setting unitvector(#1) to \csname pgfplots@#1\endcsname * e_{#2}...}% \pgfplots@if{pgfplots@apply@datatrafo@#1}{% - \pgfmathparse{\csname pgfplots@#1\endcsname}% - \expandafter\expandafter\csname pgfplots@inverse@datascaletrafo@tofixed@#1@noshift\endcsname\expandafter{\pgfmathresult}% + \pgfplotscoordmath{default}{parse}{\csname pgfplots@#1\endcsname}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \pgfplotscoordmath{#1}{datascaletrafo noshift inverse to fixed}{\pgfmathresult}% \edef\pgfplots@loc@TMPb{\pgfmathresult pt}% }{\relax}% \begingroup @@ -5216,28 +5533,32 @@ \endgroup \ifcase#2\relax \pgfsetxvec{\pgfqpoint{\pgfplots@loc@TMPb}{0pt}}% - \pgfmathabs@{\pgfplots@glob@TMPb}% + \pgfmath@basic@abs@{\pgfplots@glob@TMPb}% \or \pgfsetyvec{\pgfqpoint{0pt}{\pgfplots@loc@TMPb}}% - \pgfmathabs@{\pgfplots@glob@TMPb}% + \pgfmath@basic@abs@{\pgfplots@glob@TMPb}% \or \pgfsetzvec{\pgfqpoint{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPb}}% \ifdim\pgfplots@loc@TMPb=0pt \def\pgfmathresult{0}% \else - \pgfmathveclen{\csname pgf@#1x\endcsname}{\csname pgf@#1y\endcsname}% + \edef\pgf@marshal{% + {\expandafter\pgf@sys@tonumber\csname pgf@#1x\endcsname}% + {\expandafter\pgf@sys@tonumber\csname pgf@#1y\endcsname}% + }% + \expandafter\pgfmath@basic@veclen@\pgf@marshal \fi \fi \expandafter\let\csname pgfplots@#1@veclength\endcsname=\pgfmathresult \pgfplotsmath@ifzero{\pgfmathresult}{% \expandafter\def\csname pgfplots@#1@inverseveclength\endcsname{infty}% }{% - \expandafter\pgfmathreciprocal@\expandafter{\pgfmathresult}% + \expandafter\pgfmath@basic@reciprocal@\expandafter{\pgfmathresult}% \expandafter\let\csname pgfplots@#1@inverseveclength\endcsname=\pgfmathresult }% \fi \fi -%\message{-> got unitvector(#1) = (\the\csname pgf@#1x\endcsname, \the\csname pgf@#1y\endcsname).}% +%\message{-> got unitvector(#1) = (\the\csname pgf@#1x\endcsname, \the\csname pgf@#1y\endcsname).^^J}% }% % Applies the 'axis equal' feature. @@ -5256,142 +5577,337 @@ % transformation. All unit vector length above are only meaningful in % the UNTRANSFORMED range, so we have to mingle with the scaling % transformation. -\def\pgfplots@axis@equal@apply{% - % Step 1: compute the unit vector which STAYS CONSTANT. - % - % All other ones will be scaled to fit its length. - \ifpgfplots@threedim - \def\pgfplots@axis@equal@apply@reference{x}% - \pgfplots@if@unitveclenlessthan@untransformed xy{% - \pgfplots@if@unitveclenlessthan@untransformed xz{% - \def\pgfplots@axis@equal@apply@reference{x}% - }{}% - }{}% - \pgfplots@if@unitveclenlessthan@untransformed yx{% - \pgfplots@if@unitveclenlessthan@untransformed yz{% - \def\pgfplots@axis@equal@apply@reference{y}% - }{}% - }{}% - \pgfplots@if@unitveclenlessthan@untransformed zx{% - \pgfplots@if@unitveclenlessthan@untransformed zy{% - \def\pgfplots@axis@equal@apply@reference{z}% - }{}% - }{}% +\def\pgfplots@apply@unit@ratio{% + \pgfkeysgetvalue{/pgfplots/unit vector ratio}\pgfplots@unit@vector@ratio + \ifx\pgfplots@unit@vector@ratio\pgfutil@empty \else - \pgfplots@if@unitveclenlessthan@untransformed xy{% - \def\pgfplots@axis@equal@apply@reference{x}% - }{% - \def\pgfplots@axis@equal@apply@reference{y}% - }% - \fi -%\message{USING REFERENCE UNIT VECTOR FROM \pgfplots@axis@equal@apply@reference.}% - \if x\pgfplots@axis@equal@apply@reference - \else - \pgfplots@axis@equal@apply@for x - \fi - \if y\pgfplots@axis@equal@apply@reference - \else - \pgfplots@axis@equal@apply@for y - \fi - \ifpgfplots@threedim - \if z\pgfplots@axis@equal@apply@reference - \else - \pgfplots@axis@equal@apply@for z + \edef\pgfplots@unit@vector@ratio{\pgfplots@unit@vector@ratio\space1 1 }% + % + % Step 1: compute the unit vector which STAYS CONSTANT. + % + \pgfkeysgetvalue{/pgfplots/unit vector ratio axis}\pgfplots@apply@unit@ratio@reference + \ifx\pgfplots@apply@unit@ratio@reference\pgfutil@empty + \pgfplots@apply@unit@ratio@find@reference% + \fi + % + % FIXME : I could spent some attention here to save work: + % both, unit ratios and the resulting scales are computed at + % least twice (once in \pgfplots@apply@unit@ratio@find@reference and once in the + % following). + \expandafter\pgfplots@apply@unit@ratio@prepareratios\pgfplots@unit@vector@ratio\pgfplots@EOI + % +%\message{USING REFERENCE UNIT VECTOR FROM \pgfplots@apply@unit@ratio@reference; ratio \pgfplots@unit@ratio@x\space \pgfplots@unit@ratio@y\space \pgfplots@unit@ratio@z.^^J}% + % + % Step 2: apply the scaling: + \pgfplots@rescale@unit@vector@reltoreference{x}{\pgfplots@unit@ratio@x}% + \pgfplots@rescale@unit@vector@reltoreference{y}{\pgfplots@unit@ratio@y}% + \ifpgfplots@threedim + \pgfplots@rescale@unit@vector@reltoreference{z}{\pgfplots@unit@ratio@z}% \fi \fi }% -% Scales unit vector '#1' such that it has the same length as the unit -% vector in direction \pgfplots@axis@equal@apply@reference. +% This macro determines the reference axis for unit vector rescaling. +% The reference axis remains unscaled (it gets scaling factor 1 if you +% want it this way). +% +% The other axes are scaled such that the desired unit vector ratios +% are fulfilled. % -% The data limits for '#1' will be enlarged as well (for 'axis -% equal'). -\def\pgfplots@axis@equal@apply@for#1{% - \pgfmathmultiply@ - {\csname pgfplots@\pgfplots@axis@equal@apply@reference @veclength\endcsname} - {\csname pgfplots@#1@inverseveclength\endcsname}% - \global\let\pgfplots@glob@TMPa=\pgfmathresult - \pgfmathmultiply@ - {\csname pgfplots@\pgfplots@axis@equal@apply@reference @inverseveclength\endcsname} - {\csname pgfplots@#1@veclength\endcsname}% - \global\let\pgfplots@glob@TMPb=\pgfmathresult - % - % If the datascaling transformation is active (which is almost - % everytime the case here), we need to respect it here. +% The idea to select a reference axis is as follows: +% 1. Every unit vector scaling factor s should fulfill s <= 1. +% 2. Choose the reference axis such that the minimal amount of scaling +% is performed. +% +% The motivation for (1) is: if all involved scaling factors are at +% most 1, the resulting picture will only become *smaller*. +% Consequently, we can simply enlarge axis limits to restore the +% original width/height! +% +% The motivation for (2) is: a huge amount of scaling might reduce the +% size of the image too much. Of course, the figure will be enlarged +% to fit the original width/height, but most of it will be empty. So, +% use the smallest scaling. +% +% @POSTCONDITION The reference axis is stored in +% \pgfplots@apply@unit@ratio@reference . +% +% @see the key 'unit vector ratio axis=y' which allows to manually +% select the reference axis. This will illustrate what happens here. +\def\pgfplots@apply@unit@ratio@find@reference{% % - % We only need to respect the SCALING, translations (shifts) are - % not interesting. + \begingroup + \let\pgfplots@ONE=\pgf@x + \global\pgfplots@ONE=1.002pt % - % We want that || T^{-1} e_ref || = || T^{-1} E_#1 ||. + \def\pgfplots@optimum@sofar@axis{}% + \let\pgfplots@optimum@sofar@value=\pgf@y + \global\pgfplots@optimum@sofar@value=16000pt % - % So: T^{-1} E_#1 := s* T^{-1} e_#1 where - % s = ||T^{-1} e_ref|| / || T^{-1} e_#1 || - % = |10^{scale_ref}| / |10^{scale_#1}| * || e_ref|| / ||e_#1||. - % - % Then, E_#1 = T ( T^{-1} E_#1 ) = s * e_#1. + %\pgfplots@apply@unit@ratio@find@reference@checkexplicitlimits % - % -> compute 's'! We already have the quotient of unit vectors. - % Now, acquire the scale quotients. + \ifx\pgfplots@optimum@sofar@axis\pgfutil@empty + \ifpgfplots@threedim + % 3D is more complicated than 2D: + % for every fixed reference axis, we have to check *two* + % scaling factors. + % + % Furthermore, the optimality condition (2) needs to be + % performed on the maximum max{1-s_a, 1-s_b} provided both of + % these numbers are positive. + % + \def\pgfplots@check@##1##2{% + % PRECONDITION: \pgfplots@apply@unit@ratio@reference is defined. + % + % renormalize \pgfplots@unit@[xyz] : + \expandafter\pgfplots@apply@unit@ratio@prepareratios\pgfplots@unit@vector@ratio\pgfplots@EOI + % + % compute s_a : + \pgfplots@getscale@unit@vector@reltoreference ##1{\csname pgfplots@unit@ratio@##1\endcsname}% + \let\pgfplots@scale@a=\pgfmathresult + % + % compute s_b : + \pgfplots@getscale@unit@vector@reltoreference ##2{\csname pgfplots@unit@ratio@##2\endcsname}% + \let\pgfplots@scale@b=\pgfmathresult + % + % check if the actual choice of + % \pgfplots@apply@unit@ratio@reference is FEASIBLE. + % That is the case if s_a <= 1 && s_b <= 1. + % We check + % (1 - s_a >= 0 ) && ( 1 - s_b >= 0 ) + % instead, since I need the value + % max( 1-s_a, 1-s_b ) + % anyway. + \def\pgfplots@ref@is@feasible{1}% + \pgf@xa=\pgfplots@ONE \advance\pgf@xa by-\pgfplots@scale@a pt + \ifdim\pgf@xa<0sp + \def\pgfplots@ref@is@feasible{0}% + \else + \pgf@xb=\pgfplots@ONE \advance\pgf@xb by-\pgfplots@scale@b pt + \ifdim\pgf@xb<0sp + \def\pgfplots@ref@is@feasible{0}% + \fi + \fi + % compute max(1-s_a,1-s_b) into \pgf@xa: + % pgf@xa= max(pgf@xa,pgf@xb): + \ifdim\pgf@xb>\pgf@xa \pgf@xa=\pgf@xb \fi + \if1\pgfplots@ref@is@feasible + \ifdim\pgf@xa<\pgfplots@optimum@sofar@value + % Ah, ok. The actual choice is BETTER as it + % involves less scaling. + % + % Remember it! + \let\pgfplots@optimum@sofar@axis=\pgfplots@apply@unit@ratio@reference + \global\pgfplots@optimum@sofar@value=\pgf@xa + \fi + \fi +%\message{^^Junit vector ratio 3D searching reference: checking \pgfplots@apply@unit@ratio@reference. feasable=\pgfplots@ref@is@feasible. \if1\pgfplots@ref@is@feasible max=\the\pgf@xa. \fi Optimum so far: value =\the\pgfplots@optimum@sofar@value\space for axis \pgfplots@optimum@sofar@axis.^^J}% + }% + % + % Check 'x' as reference : + \def\pgfplots@apply@unit@ratio@reference{x}% + \pgfplots@check@ yz% + % + % Check 'y' as reference : + \def\pgfplots@apply@unit@ratio@reference{y}% + \pgfplots@check@ xz% + % + % Check 'z' as reference : + \def\pgfplots@apply@unit@ratio@reference{z}% + \pgfplots@check@ xy% + % + \else + % 2D is much simpler: find the scale s which fulfills s <= 1. + % One of them MUST fulfill it. + % + % try 'x' axis as reference: + \def\pgfplots@apply@unit@ratio@reference{x}% + % + % renormalize: + \expandafter\pgfplots@apply@unit@ratio@prepareratios\pgfplots@unit@vector@ratio\pgfplots@EOI + % + % compute scaling factor: + \pgfplots@getscale@unit@vector@reltoreference y\pgfplots@unit@ratio@y% + % +%\message{^^Junit vector ratio 2D searching reference: checking \pgfplots@apply@unit@ratio@reference. feasable=\pgfmathresult < 1: \ifdim\pgfmathresult pt <\pgfplots@ONE YES-> use x\else NO->use y\fi^^J}% + % and check (1). The condition (2) is irrelevant; it is met + % anyway. + \ifdim\pgfmathresult pt<\pgfplots@ONE + \def\pgfplots@optimum@sofar@axis{x}% + \else + \def\pgfplots@optimum@sofar@axis{y}% + \fi + \fi + \else +%\message{^^Junit vector ratio chose \pgfplots@optimum@sofar@axis\space to fulfill explicitly provided limits (at least partially).^^J}% + \fi % - \begingroup - \def\pgfplots@tmp@exponentref{0}% - \def\pgfplots@tmp@exponentK{0}% - \pgfplots@if{pgfplots@apply@datatrafo@\pgfplots@axis@equal@apply@reference}{% - \pgfplots@letcsname{pgfplots@tmp@exponentref}={pgfplots@data@scale@trafo@EXPONENT@\pgfplots@axis@equal@apply@reference}% - }{}% - \pgfplots@if{pgfplots@apply@datatrafo@#1}{% - \pgfplots@letcsname{pgfplots@tmp@exponentK}={pgfplots@data@scale@trafo@EXPONENT@#1}% - }{}% - \c@pgf@counta=\pgfplots@tmp@exponentref - \advance\c@pgf@counta by-\pgfplots@tmp@exponentK - \ifnum\c@pgf@counta=0 + \ifx\pgfplots@optimum@sofar@axis\pgfutil@empty + \ifpgfplots@threedim + \def\pgfplots@optimum@sofar@axis{z}% \else - \pgfplotsmathmultiplypowten@{\pgfplots@glob@TMPa}{\c@pgf@counta}% - \global\let\pgfplots@glob@TMPa=\pgfmathresult - \pgfplotsmathmultiplypowten@{\pgfplots@glob@TMPb}{-\c@pgf@counta}% - \global\let\pgfplots@glob@TMPb=\pgfmathresult + \def\pgfplots@optimum@sofar@axis{y}% \fi - \xdef\pgfplots@glob@TMPc{\the\c@pgf@counta}% + \pgfplots@warning{The algorithm to realize 'unit vector ratio' failed! It could not determine the axis which shall be scaled and decided to use 'unit vector ratio axis=\pgfplots@optimum@sofar@axis'.}% + \fi + \let\pgfplots@apply@unit@ratio@reference=\pgfplots@optimum@sofar@axis + \pgfmath@smuggleone\pgfplots@apply@unit@ratio@reference \endgroup +}% +\def\pgfplots@apply@unit@ratio@find@reference@checkexplicitlimits{% + \ifpgfplots@autocompute@ymax \else \def\pgfplots@optimum@sofar@axis{y}\fi + \ifpgfplots@autocompute@ymin \else \def\pgfplots@optimum@sofar@axis{y}\fi + \ifpgfplots@autocompute@xmax \else \def\pgfplots@optimum@sofar@axis{x}\fi + \ifpgfplots@autocompute@xmin \else \def\pgfplots@optimum@sofar@axis{x}\fi + \ifpgfplots@threedim + \ifpgfplots@autocompute@zmax \else \def\pgfplots@optimum@sofar@axis{z}\fi + \ifpgfplots@autocompute@zmin \else \def\pgfplots@optimum@sofar@axis{z}\fi + \fi +}% + +\def\pgfplots@apply@unit@ratio@prepareratios#1 #2 #3 #4\pgfplots@EOI{% + \def\pgfplots@unit@ratio@x{#1}% + \def\pgfplots@unit@ratio@y{#2}% + \def\pgfplots@unit@ratio@z{#3}% % - \if x#1 - \pgfsetxvec{\pgfplotsqpointxy{\pgfplots@glob@TMPa}{0}}% + % 'unit vector ratio' is measured relative to the y axis for 2d + % and relative to the z axis for 3d plots. + % renormalize such that it is relative to + % \pgfplots@apply@unit@ratio@reference. + % + % Furthermore, renormalize such that + % unit@ratio@\pgfplots@apply@unit@ratio@reference is 1. + \pgfmathreciprocal@{\csname pgfplots@unit@ratio@\pgfplots@apply@unit@ratio@reference\endcsname}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \ifpgfplots@threedim + \if z\pgfplots@apply@unit@ratio@reference + \else + \pgfmathmultiply@{\pgfplots@loc@TMPa}{\pgfplots@unit@ratio@z}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \fi + % + \pgfmathmultiply@{\pgfplots@loc@TMPa}{\pgfplots@unit@ratio@x}% + \let\pgfplots@unit@ratio@x=\pgfmathresult + % + \pgfmathmultiply@{\pgfplots@loc@TMPa}{\pgfplots@unit@ratio@y}% + \let\pgfplots@unit@ratio@y=\pgfmathresult + % + \pgfmathmultiply@{\pgfplots@loc@TMPa}{\pgfplots@unit@ratio@z}% + \let\pgfplots@unit@ratio@z=\pgfmathresult \else - \if y#1 - \pgfsetyvec{\pgfplotsqpointxy{0}{\pgfplots@glob@TMPa}}% + \if y\pgfplots@apply@unit@ratio@reference \else - \if z#1 - \pgfsetzvec{\pgfplotsqpointxyz{0}{0}{\pgfplots@glob@TMPa}}% - \fi + \pgfmathmultiply@{\pgfplots@loc@TMPa}{\pgfplots@unit@ratio@y}% + \let\pgfplots@loc@TMPa=\pgfmathresult \fi + % + \pgfmathmultiply@{\pgfplots@loc@TMPa}{\pgfplots@unit@ratio@x}% + \let\pgfplots@unit@ratio@x=\pgfmathresult + % + \pgfmathmultiply@{\pgfplots@loc@TMPa}{\pgfplots@unit@ratio@y}% + \let\pgfplots@unit@ratio@y=\pgfmathresult + % + \def\pgfplots@unit@ratio@z{<unused>}% \fi % - % - % Update auxiliary data members: - % This is only complicated due to the scaling transformation. If we would not have the scaling trafo, the following - % code would simply copy the vector length and inverse vectors length from the reference axis. - \pgfplotsmathmultiplypowten@{\csname pgfplots@\pgfplots@axis@equal@apply@reference @veclength\endcsname}{\pgfplots@glob@TMPc}% - \expandafter\let\csname pgfplots@#1@veclength\endcsname=\pgfmathresult - \pgfplotsmathmultiplypowten@{\csname pgfplots@\pgfplots@axis@equal@apply@reference @inverseveclength\endcsname}{-\pgfplots@glob@TMPc}% - \expandafter\let\csname pgfplots@#1@inverseveclength\endcsname=\pgfmathresult - % - % - \ifpgfplots@axis@equal@image +}% + + +% Computes a new unit vector E_#1 for direction #1 such that +% ||E_#1|| = #2 * ||e_reference||. +% Here, #2 is a scaling factor and e_reference is a reference axis. +% The reference axis is stored in +% \pgfplots@apply@unit@ratio@reference, the macro contains one of +% {x,y,z}. +% +% The data limits for '#1' will be enlarged as well (for 'unit rescale +% keep size'). +% +% #1 is the axis which should be scaled (i.e. #1 in {x,y,z}). +% It is allowed if #1 = \pgfplots@apply@unit@ratio@reference. In this +% case, you can provide a scale '#2' to rescale the axis. +% +% #2 is a desired scale, relative to +% \pgfplots@apply@unit@ratio@reference. #2 should be a number without +% unit. +% +% The parameter \pgfplots@apply@unit@ratio@reference is also one of +% {x,y,z}. +% +\def\pgfplots@rescale@unit@vector@reltoreference#1#2{% + \def\pgfplots@loc@TMPa{0}% + \if#1\pgfplots@apply@unit@ratio@reference + \pgfplotsmath@ifapproxequal@dim{#2pt}{1pt}{0.0002pt}{% + }{% + \def\pgfplots@loc@TMPa{1}% + }% \else + \def\pgfplots@loc@TMPa{1}% + \fi + \if1\pgfplots@loc@TMPa % - % Ok, now update the axis limits such that the axis' dimensions - % stay the same. + \pgfplots@getscale@unit@vector@reltoreference{#1}{#2}% + \global\let\pgfplots@glob@TMPa=\pgfmathresult % - % My idea is to add half of the new range to 'max' and - % subtract the other half from 'min': - % 1/s( xmax - xmin) = (xmax+0.5d) - (xmin-0.5d) = xmax - xmin +d - % with d = 1/s (xmax-xmin) - (xmax-xmin) = (1/s - 1) (xmax-xmin) +%\message{Rescaling '#1' by \pgfplots@glob@TMPa.^^J}% + \if x#1 + \pgfsetxvec{\pgfplotsqpointxy{\pgfplots@glob@TMPa}{0}}% + \else + \if y#1 + \pgfsetyvec{\pgfplotsqpointxy{0}{\pgfplots@glob@TMPa}}% + \else + \if z#1 + \pgfsetzvec{\pgfplotsqpointxyz{0}{0}{\pgfplots@glob@TMPa}}% + \fi + \fi + \fi + % + \pgfmathmultiply@{\csname pgfplots@#1@veclength\endcsname}{\pgfplots@glob@TMPa}% + \expandafter\let\csname pgfplots@#1@veclength\endcsname=\pgfmathresult + % + \pgfmathreciprocal@\pgfplots@glob@TMPa + \global\let\pgfplots@glob@TMPb=\pgfmathresult + % + \pgfmathmultiply@{\csname pgfplots@#1@inverseveclength\endcsname}{\pgfplots@glob@TMPb}% + \expandafter\let\csname pgfplots@#1@inverseveclength\endcsname=\pgfmathresult % -%\message{'axis equal': Resizing data range for #1: from \csname pgfplots@#1min\endcsname:\csname pgfplots@#1max\endcsname\ to}% + % + \pgfplots@apply@unit@vector@rescale@keep@size{#1}{\pgfplots@glob@TMPb}% + % + \fi +} + +% Updates the #1 axis limits such that the axis' dimensions +% stay the same after scaling the #1 unit vector by a scale 's'. +% +% PRECONDITION: +% - the #1 unit vector has been rescaled by a factor s. +% For example, e_xnew := e_x * 0.5 . +% +% POSTCONDITION: +% - the axis limits are enlarged by a factor 1/s such that +% 1/s (#1max - #1min) * e_xnew = (#1max- #1min) * e_x. +% +% In other words, the unit vector rescale is componensated by +% modifying the axis limits. +% +% My idea is to add half of the new range to 'max' and +% subtract the other half from 'min': +% 1/s( xmax - xmin) = (xmax+0.5d) - (xmin-0.5d) = xmax - xmin +d +% with d = 1/s (xmax-xmin) - (xmax-xmin) = (1/s - 1) (xmax-xmin) +% +% #1: either x, y or z. It denotes the direction which has been +% modified. +% #2: the INVERSE of the scaling factor, #2 = 1/s . +% +\def\pgfplots@apply@unit@vector@rescale@keep@size#1#2{% + \ifpgfplots@unit@vector@rescale@keep@size + % +%\message{'unit rescale keep size': Resizing data range for #1: from \csname pgfplots@#1min\endcsname:\csname pgfplots@#1max\endcsname\ to}% \pgfmathsubtract@{\csname pgfplots@#1max\endcsname}{\csname pgfplots@#1min\endcsname}% \begingroup \pgf@xa=\pgfmathresult pt - \pgfmathsubtract@{\pgfplots@glob@TMPb}{1.0}% + \pgfmathsubtract@{#2}{1.0}% \pgf@xa=\pgfmathresult \pgf@xa \divide\pgf@xa by2 \xdef\pgfplots@glob@TMPb{\pgf@sys@tonumber{\pgf@xa}}% @@ -5405,6 +5921,85 @@ % Update auxiliary data members: \pgfplots@visphase@notify@changeofcanvaslimits{#1}% \fi +}% + +% #1: an axis which should be scaled +% #2: the desired final ratio ||e_#1||/||e_ref|| +\def\pgfplots@getscale@unit@vector@reltoreference#1#2{% + % + % If the datascaling transformation is active (which is almost + % everytime the case here), we have a transformation + % T^{-1}(x)= 10^scale * x + % with different scales for every axis. + % + % If the datascaling transformation is NOT active, scale is 0 + % and T^{-1} = Identity. + % + % Note that the datascaling transformation also has + % translations (shifts). These are not important here. + % + % Goal: + % compute E_#1 such that + % #2* || T^{-1} e_ref || = || T^{-1} E_#1 || + % where T^{-1} is the data scaling transformation and e_ref the + % reference unit vector. Keep in mind that there are + % *different* data scaling transformations for each axis. + % + % We are given e_ref and e_#1 and the desired aspect ratio + % between e_ref and E_#1, which is available as #2. + % + % So: T^{-1} E_#1 := s* T^{-1} e_#1 where + % s = #2 * ||T^{-1} e_ref|| / || T^{-1} e_#1 || + % = |10^{scale_ref}| / |10^{scale_#1}| * #2 * || e_ref|| / ||e_#1||. + % + % Then, E_#1 = T ( T^{-1} E_#1 ) = s * e_#1. + % + % -> compute 's'! + % + % Part 1: compute + % #2 * ||e_ref|| / ||e_#1||. + % + \pgfmathmultiply@ + {\csname pgfplots@\pgfplots@apply@unit@ratio@reference @veclength\endcsname} + {\csname pgfplots@#1@inverseveclength\endcsname}% + \pgfmathmultiply@ + {\pgfmathresult}% + {#2}% + \global\let\pgfplots@glob@TMPa=\pgfmathresult + % + % also compute 1/s, required as temporary value: + %\pgfmathmultiply@ + % {\csname pgfplots@\pgfplots@apply@unit@ratio@reference @inverseveclength\endcsname} + % {\csname pgfplots@#1@veclength\endcsname}% + %\ifdim#2pt=1pt + %\else + % \pgfmathdivide@{\pgfmathresult}{#2}% + %\fi + %\global\let\pgfplots@glob@TMPb=\pgfmathresult + % + % Part 2: handle data scaling trafo scales: + \begingroup + \def\pgfplots@tmp@exponentref{0}% + \def\pgfplots@tmp@exponentK{0}% + \pgfplots@if{pgfplots@apply@datatrafo@\pgfplots@apply@unit@ratio@reference }{% + \pgfplots@letcsname{pgfplots@tmp@exponentref}={pgfplots@data@scale@trafo@EXPONENT@\pgfplots@apply@unit@ratio@reference }% + }{}% + \pgfplots@if{pgfplots@apply@datatrafo@#1}{% + \pgfplots@letcsname{pgfplots@tmp@exponentK}={pgfplots@data@scale@trafo@EXPONENT@#1}% + }{}% + \c@pgf@counta=\pgfplots@tmp@exponentref\relax + \advance\c@pgf@counta by-\pgfplots@tmp@exponentK\relax + \ifnum\c@pgf@counta=0 + \else + \pgfplotsmathmultiplypowten@{\pgfplots@glob@TMPa}{\c@pgf@counta}% + \global\let\pgfplots@glob@TMPa=\pgfmathresult + % \pgfplotsmathmultiplypowten@{\pgfplots@glob@TMPb}{-\c@pgf@counta}% + % \global\let\pgfplots@glob@TMPb=\pgfmathresult + \fi + \xdef\pgfplots@glob@TMPc{\the\c@pgf@counta}% + \endgroup + \let\pgfmathresult=\pgfplots@glob@TMPa +%\message{\string\pgfplots@getscale@unit@vector@reltoreference{#1}{#2} (reference \pgfplots@apply@unit@ratio@reference) = \pgfmathresult.^^J}% } % should be invoked whenever \pgfplots@#1min or \pgfplots@#1max have @@ -5414,18 +6009,32 @@ \csname pgfplots@#1min@reg\endcsname=\csname pgfplots@#1min\endcsname pt % \csname pgfplots@#1max@reg\endcsname=\csname pgfplots@#1max\endcsname pt % \pgfplots@if{pgfplots@apply@datatrafo@#1}{% - \csname pgfplots@inverse@datascaletrafo@#1\endcsname{\csname pgfplots@#1min\endcsname}% + \pgfplotscoordmath{#1}{datascaletrafo inverse}{\csname pgfplots@#1min\endcsname}% \expandafter\let\csname pgfplots@#1min@unscaled@as@float\endcsname=\pgfmathresult - \csname pgfplots@inverse@datascaletrafo@#1\endcsname{\csname pgfplots@#1max\endcsname}% + \pgfplotscoordmath{#1}{datascaletrafo inverse}{\csname pgfplots@#1max\endcsname}% \expandafter\let\csname pgfplots@#1max@unscaled@as@float\endcsname=\pgfmathresult }{}% }% -% Invokes #3 if +% Invokes #3 if ||D_#1||_CANVAS < ||D_#2||_CANVAS and #4 if that is not the case. +% Here D_x = (1,0,0) , D_y = (0,1,0) and D_z=(0,0,1). +% +% Due to the data scaling transformation, +% ||D_a|| = || T(1) * e_a|| +% where e_x, e_y, e_z are the lowlevel, transformed unit vectors. +% We have +% ||D_a|| = T(1) * veclen_a. +% Note that the shift in T is not of interest, we only deal with +% T_a(x) = 10^{s_a} x. +% +% Thus, this routine invokes #3 if % ( 10^{s1} * veclen1 < 10^{s2} * veclen2 ) % <=> % ( 10^{s1-s2} * veclen1 < veclen2 ). % +% Here s1/s2 are the respective scales of the data scaling +% transformation. +% % If the condition is false, '#4' is invoked. \def\pgfplots@if@unitveclenlessthan@untransformed#1#2#3#4{% \def\pgfplots@loc@TMPa{0}% @@ -5437,15 +6046,19 @@ \pgfplots@letcsname{pgfplots@loc@TMPb}={pgfplots@data@scale@trafo@EXPONENT@#2}% }{}% \begingroup +%\message{[comparison: [#1] < [#2]: 10^\pgfplots@loc@TMPa\space * \csname pgfplots@#1@veclength\endcsname < 10^\pgfplots@loc@TMPb\space * \csname pgfplots@#2@veclength\endcsname]^^J}% \pgf@xb=\csname pgfplots@#2@veclength\endcsname pt + % \c@pgf@counta=\pgfplots@loc@TMPa \advance\c@pgf@counta by-\pgfplots@loc@TMPb + % \ifnum\c@pgf@counta=0 \pgf@xa=\csname pgfplots@#1@veclength\endcsname pt \else \pgfplotsmathmultiplypowten@{\csname pgfplots@#1@veclength\endcsname}{\c@pgf@counta}% \pgf@xa=\pgfmathresult pt \fi + % \ifdim\pgf@xa<\pgf@xb \gdef\pgfplots@glob@TMPc{1}% \else @@ -5483,14 +6096,6 @@ \pgfplots@zmax@reg=\pgfplots@zmax pt % \fi % - \pgfpointdiff - {\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}} - {\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}}% - % only used temporarily in this macro to compute the correct - % length for unit vectors: - \edef\pgfplots@initsizes@axisdiag@x{\the\pgf@x}% - \edef\pgfplots@initsizes@axisdiag@y{\the\pgf@y}% - % % %----------------------------------------- % PROCESS THE 'width' and 'height' options @@ -5506,13 +6111,24 @@ % FIXME \let\pgfplots@view@el=\pgfutil@empty \let\pgfplots@view@az=\pgfutil@empty - \def\pgfplots@view@dir@threedim@x{0}% - \def\pgfplots@view@dir@threedim@y{0}% - \def\pgfplots@view@dir@threedim@z{1}% \fi \ifx\pgfplots@view@az\pgfutil@empty + % Note that in presence of "x,y,z" options, the + % \pgfplots@set@default@size@options RESETS /pgfplots/view/az. + % %\let\pgfplots@rectangle@width=\pgfutil@empty %\let\pgfplots@rectangle@height=\pgfutil@empty + \def\pgfplots@view@dir@threedim@x{0}% + \def\pgfplots@view@dir@threedim@y{0}% + \def\pgfplots@view@dir@threedim@z{1}% + % + \pgfpointdiff + {\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}} + {\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}}% + % only used temporarily in this macro to compute the correct + % length for unit vectors: + \edef\pgfplots@initsizes@axisdiag@x{\the\pgf@x}% + \edef\pgfplots@initsizes@axisdiag@y{\the\pgf@y}% % \ifx\pgfplots@x\pgfutil@empty \ifx\pgfplots@width\pgfutil@empty @@ -5545,17 +6161,26 @@ \pgfplots@initsizes@setunitvector{x}{0}{\pgfplots@tmpXscale}{\pgfplots@tmp@xisaxisparallel}% \pgfplots@initsizes@setunitvector{y}{1}{\pgfplots@tmpYscale}{\pgfplots@tmp@yisaxisparallel}% \pgfplots@initsizes@setunitvector{z}{2}{\pgfplots@tmpZscale}{\pgfplots@loc@TMPc}% + \ifcase\pgfplots@scale@mode@choice\relax + % scale mode=auto : do nothing in this context. + \else + \pgfplots@scale@axisbox@to@widthheight + \fi + \ifpgfplots@threedim + \pgfplotsgetnormalforcurrentview + \fi \else - % 3D case is currently always initialised by `view': + % 3D case by `view': \let\pgfplots@x=\pgfutil@empty \let\pgfplots@y=\pgfutil@empty \let\pgfplots@z=\pgfutil@empty + % this invokes \pgfplots@scale@plotbox@to@widthheight automatically. \pgfplotssetaxesfromazel{\pgfplots@view@az}{\pgfplots@view@el}{\pgfplots@tmp@xisaxisparallel}% \if1\pgfplots@tmp@xisaxisparallel% \def\pgfplots@tmp@yisaxisparallel{1}% \fi \fi -%\message{Pgfplots debug: initialised unit vectors to x=(\the\pgf@xx,\the\pgf@xy), y=(\the\pgf@yx,\the\pgf@yy), z=(\the\pgf@zx,\the\pgf@zy). }% +%\message{Pgfplots debug: initialised unit vectors to x=(\the\pgf@xx,\the\pgf@xy), y=(\the\pgf@yx,\the\pgf@yy), z=(\the\pgf@zx,\the\pgf@zy), n = (\pgfplots@view@dir@threedim@x,\pgfplots@view@dir@threedim@y,\pgfplots@view@dir@threedim@z).^^J }% % \let\pgfplotsmathfloatviewdepthxyz@=\pgfplotsmathfloatviewdepthxyz@infigure \let\pgfplotsmathviewdepthxyz@=\pgfplotsmathviewdepthxyz@infigure @@ -5573,124 +6198,33 @@ \fi \fi \fi - \ifpgfplots@axis@equal@image - \pgfplots@axis@equaltrue - \fi - \ifpgfplots@axis@equal - \pgfplots@axis@equal@apply - \fi - % - % Determine final rectangle dimensions. - % There are the following cases: - % 1. the user really wants a fixed dimension, - % i.e. he used 'scale only axis'. - % Then, we have to work to get the correct dimension! - % - % Up to now, the scaling mechanism looses to many significant - % digits such that the final width/height differs by 1-2 pt. - % - % If I am not mistaken, this does ONLY affect the final size, - % not the relative plot precision. - % - % FIXME : really compute the plot precision! - % - % 2. The use specified width and/or height, but not 'scale only - % axis'. Accept inaccurate final widths/heights (see above). - % - % 3. The user supplied 'x' and or 'y'. Simply use them, its - % accurate. + \pgfplots@apply@unit@ratio % - \begingroup + \pgfplots@axis@apply@post@scale x + \pgfplots@axis@apply@post@scale y \ifpgfplots@threedim - \def\pgfplotspointmaxminmin{\pgfplotsqpointxyz{\pgfplots@xmax}{\pgfplots@ymin}{\pgfplots@zmin}}% - \def\pgfplotspointminmaxmin{\pgfplotsqpointxyz{\pgfplots@xmin}{\pgfplots@ymax}{\pgfplots@zmin}}% - \pgfplotsqpointxyz{\pgfplots@xmin}{\pgfplots@ymin}{\pgfplots@zmin}% - \else - \def\pgfplotspointmaxminmin{\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymin}}% - \def\pgfplotspointminmaxmin{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymax}}% - \pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}% + \pgfplots@axis@apply@post@scale z \fi - \xdef\pgfplotspointminminmin{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% - % ATTENTION: I re-use registers here! Make sure they won't be - % overwritten! \pgfpointdiff and \pgfplotsqpointxy are ok in this respect. - \let\pgfplots@xcoordminTEX=\pgf@xb - \let\pgfplots@ycoordminTEX=\pgf@yb - \pgfplots@xcoordminTEX=\pgf@x - \pgfplots@ycoordminTEX=\pgf@y - % - %-------------------------------------------------- - % FIXME : WHAT IS THIS HERE FOR? - % \pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}% - % \ifx\pgfplots@rectangle@width\pgfutil@empty - % \def\pgfplots@tmp@xmax@ymin{\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymin}}% - % \else - % % this 'if' here should only make a difference of about - % % 1-2pt, not more. - % % - % % and I am quite sure that this inaccuracy (and this - % % work-around) only affects the - % % final size, not the relative plot accuracy. - % \pgf@x=\pgfplots@xcoordminTEX - % \advance\pgf@x by\pgfplots@width - % \edef\pgfplots@tmp@xmax@ymin{\noexpand\pgfqpoint{\the\pgf@x}{\noexpand\pgfplots@ycoordminTEX}}% - % \fi - % \ifx\pgfplots@rectangle@height\pgfutil@empty - % \def\pgfplots@tmp@xmin@ymax{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymax}}% - % \else - % \pgf@x=\pgfplots@ycoordminTEX - % \advance\pgf@x\pgfplots@height - % \edef\pgfplots@tmp@xmin@ymax{\noexpand\pgfqpoint{\noexpand\pgfplots@xcoordminTEX}{\the\pgf@x}}% - % \fi - %-------------------------------------------------- - \pgfpointdiff - {\pgfqpoint{\pgfplots@xcoordminTEX}{\pgfplots@ycoordminTEX}} - {\pgfplotspointmaxminmin}% - \xdef\pgfplotspointxaxis{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% - \pgfmathveclen{\pgf@x}{\pgf@y}% - \xdef\pgfplotspointxaxislength{\pgfmathresult pt}% - % - \pgfpointdiff - {\pgfqpoint{\pgfplots@xcoordminTEX}{\pgfplots@ycoordminTEX}} - {\pgfplotspointminmaxmin}% - \xdef\pgfplotspointyaxis{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% - \pgfmathveclen{\pgf@x}{\pgf@y}% - \xdef\pgfplotspointyaxislength{\pgfmathresult pt}% +} +\def\pgfplots@axis@apply@post@scale#1{% % - \ifpgfplots@threedim - \pgfpointdiff - {\pgfqpoint{\pgfplots@xcoordminTEX}{\pgfplots@ycoordminTEX}} - {\pgfplotsqpointxyz{\pgfplots@xmin}{\pgfplots@ymin}{\pgfplots@zmax}}% - \xdef\pgfplotspointzaxis{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% - \pgfmathveclen{\pgf@x}{\pgf@y}% - \xdef\pgfplotspointzaxislength{\pgfmathresult pt}% - % - \pgfpointscale - {0.5}% - {\pgfplotspointxaxis - \pgf@xa=\pgf@x - \pgf@xb=\pgf@y - \pgfplotspointyaxis% - \advance\pgf@xa by\pgf@x - \advance\pgf@xb by\pgf@y - \pgfplotspointzaxis% - \advance\pgf@xa by\pgf@x - \advance\pgf@xb by\pgf@y - \global\pgf@x=\pgf@xa - \global\pgf@y=\pgf@xb - }% - \xdef\pgfplotspointcenter{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% + \pgfkeysgetvalue{/pgfplots/#1 post scale}\pgfmathresult + \ifx\pgfmathresult\pgfutil@empty \else - \global\let\pgfplotspointzaxis=\pgfpointorigin - \gdef\pgfplotspointzaxislength{0pt}% - \pgfpointscale - {0.5}% - {\pgfpointadd - \pgfplotspointxaxis% - \pgfplotspointyaxis% - }% - \xdef\pgfplotspointcenter{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% + \pgfmathparse{\pgfmathresult}% + \ifdim\pgfmathresult pt=1pt + \else + \let\pgfplots@loc@TMPa=\pgfmathresult + \csname pgf@#1x\endcsname=\pgfmathresult\csname pgf@#1x\endcsname + \csname pgf@#1y\endcsname=\pgfmathresult\csname pgf@#1y\endcsname + % + \pgfmathmultiply@{\csname pgfplots@#1@veclength\endcsname}{\pgfplots@loc@TMPa}% + \expandafter\let\csname pgfplots@#1@veclength\endcsname=\pgfmathresult + % + \pgfmathdivide@{\csname pgfplots@#1@inverseveclength\endcsname}{\pgfplots@loc@TMPa}% + \expandafter\let\csname pgfplots@#1@inverseveclength\endcsname=\pgfmathresult + \fi \fi - \endgroup } % This here is a low-weight node. It can ONLY be used during axis @@ -5980,14 +6514,28 @@ %% %% \anchorborder{% - % Call a function that computes a border point. Since this - % function will modify dimensions like \pgf@x, we must move them to - % other dimensions. - \pgfutil@tempdima=\pgf@x - \pgfutil@tempdimb=\pgf@y - \pgfpointborderrectangle% - {\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdimb}}% - {\upperrightcorner}% + % remember the input coords: + \edef\pgfplots@loc@TMPa{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + % + % I want to use \pgfpointborderrectangle which expects that + % (0,0) is the CENTER. + % Ok, then: shift it: + \pgfpointadd + {\lowerleftinnercorner}% + {\pgfpointscale + {0.5} + {\innerdiagonal}}% + \edef\pgfplots@loc@center{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + \pgfpointadd{% + \pgfpointborderrectangle% + {\pgfplots@loc@TMPa}% + {\pgfpointscale + {0.5} + {\innerdiagonal}}% + }{% + % and add the center to undo the local shift: + \pgfplots@loc@center + }% }% \backgroundpath{% \pgfkeysvalueof{/pgfplots/@backgroundpath@hook/.@cmd}\pgfeov @@ -6249,6 +6797,65 @@ }{}% }% + +% Defines a new axis type `#1' with initialization code `#2'. +% +% The name #1 will be available as value for 'axis type=#1' and +% furthermore, an environment '\begin{#1axis}' will be available. +% +% For ConTeXt, the \start#1axis and \stop#1axis commands will be +% available. +% +% #1: the axis type name +% #2: initialization TeX code. +% +% OPTIONAL: you can provide the expected axis coordinate system in +% square brackets. +% +% \pgfplotsdefineaxistype{rectangle}{...} +% \pgfplotsdefineaxistype[polar]{polar}{...} +\def\pgfplotsdefineaxistype{\pgfutil@ifnextchar[{\pgfplotsdefineaxistype@}{\pgfplotsdefineaxistype@[cart]}}% +\def\pgfplotsdefineaxistype@[#1]#2#3{% + \expandafter\def\csname pgfplots@axistype@#2\endcsname{% + \pgfkeyssetvalue{/pgfplots/@expected axis cs}{#1}% + #3% + }% + \expandafter\def\csname pgfplots@environment@#2axis\endcsname{% + \pgfutil@ifnextchar[% + {\csname pgfplots@environment@#2axis@\endcsname}% + {\csname pgfplots@environment@#2axis@\endcsname[]}% + }% + \expandafter\long\expandafter\def\csname pgfplots@environment@#2axis@\endcsname[##1]{% + \begin{axis}[% + ##1,% + data cs=#1,% assume that coordinates provided by \addplot are in the correct coordsystem + axis type=#2% active the correct axis type + ]% + }% + \expandafter\def\csname endpgfplots@environment@#2axis\endcsname{\end{axis}}% + \edef\pgfplots@glob@TMPc{\expandafter\noexpand\csname #2axis\endcsname\expandafter\noexpand\csname pgfplots@environment@#2axis\endcsname}% + \expandafter + \tikzaddtikzonlycommandshortcutlet\pgfplots@glob@TMPc + % + \edef\pgfplots@glob@TMPc{\expandafter\noexpand\csname end#2axis\endcsname\expandafter\noexpand\csname endpgfplots@environment@#2axis\endcsname}% + \expandafter + \tikzaddtikzonlycommandshortcutlet\pgfplots@glob@TMPc + % + % ConTeXt compatibility: + \t@pgfplots@toka=\expandafter{\csname #2axis\endcsname}% + \t@pgfplots@tokb=\expandafter{\csname end#2axis\endcsname}% + \expandafter\edef\csname start#2axis\endcsname{\the\t@pgfplots@toka}% + \expandafter\edef\csname stop#2axis\endcsname{\the\t@pgfplots@tokb}% +}% + +\def\pgfplotssetaxistype#1{% + \pgfutil@ifundefined{pgfplots@axistype@#1}{% + \pgfplots@error{Sorry, 'axis type=#1' is unknown. Maybe you need to load a proper library first or you misspelled the name? Ignoring it}% + }{% + \csname pgfplots@axistype@#1\endcsname + }% +}% + % A command which has to be invoked BEFORE \pgfplots@draw@axis to % prepare everything. \def\pgfplots@draw@axis@pre{% @@ -6285,6 +6892,8 @@ \fi } +\def\pgfplots@draw@axis@is@prepared{}% + % PRECONDITION: % \pgfplots@draw@axis@pre has been called. \def\pgfplots@draw@axis{% @@ -6341,8 +6950,8 @@ %\fi \else % Just use the 2d-point commands (assuming Z=0) - \let\pgfplotspointonorientedsurfaceabsetupforxyz=\pgfplotspointonorientedsurfaceabsetupforxy - \let\pgfplotspointonorientedsurfaceabsetupforyxz=\pgfplotspointonorientedsurfaceabsetupforyx + \let\pgfplotspointonorientedsurfaceabsetupfor@@xyz=\pgfplotspointonorientedsurfaceabsetupfor@@xy + \let\pgfplotspointonorientedsurfaceabsetupfor@@yxz=\pgfplotspointonorientedsurfaceabsetupfor@@yx \pgfplots@draw@axis@insurface@symmetric xyz \fi }% @@ -6614,10 +7223,33 @@ \expandafter\def\csname pgfplots@surfviewdepth@vv0\endcsname{b}% \expandafter\def\csname pgfplots@surfviewdepth@vv1\endcsname{f}% \fi + \else + % FIXME : it might be better to implement that stuff here + % implicilty using the 3D algorithms. + % + % this here is the only important one: + \expandafter\def\csname pgfplots@surfviewdepth@vv0\endcsname{b}% + % + \expandafter\def\csname pgfplots@surfviewdepth@0vv\endcsname{b}% + \expandafter\def\csname pgfplots@surfviewdepth@1vv\endcsname{f}% + \expandafter\def\csname pgfplots@surfviewdepth@v0v\endcsname{b}% + \expandafter\def\csname pgfplots@surfviewdepth@v1v\endcsname{f}% + \expandafter\def\csname pgfplots@surfviewdepth@vv1\endcsname{f}% + \def\pgfplotsifaxislineisonconvexhull##1##2##3{##2}% ALWAYS TRUE + \def\pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn@##1##2##3{##2}% ALWAYS TRUE + % + \fi +} + +% Initialises the 'pgfplots@[xyz]ticklabelaxisspecs' macro according to +% the foreground/background situation of the axis and the '[xyz]ticklabel pos' +% keys. +\def\pgfplots@init@ticklabelaxisspec{% + \ifpgfplots@threedim % % % Now, determine which axis line shall get tick labels. - % The strategie is as follows: + % The strategy is as follows: % - only lines on the convex hull of the 2D projected axis % rectangle can get tick labels, % - for each axis, there are two such choices in the general @@ -6635,20 +7267,6 @@ % \pgfplots@init@ticklabelaxisspecfor zx% \else - % FIXME : it might be better to implement that stuff here - % implicilty using the 3D algorithms. - % - % this here is the only important one: - \expandafter\def\csname pgfplots@surfviewdepth@vv0\endcsname{b}% - % - \expandafter\def\csname pgfplots@surfviewdepth@0vv\endcsname{b}% - \expandafter\def\csname pgfplots@surfviewdepth@1vv\endcsname{f}% - \expandafter\def\csname pgfplots@surfviewdepth@v0v\endcsname{b}% - \expandafter\def\csname pgfplots@surfviewdepth@v1v\endcsname{f}% - \expandafter\def\csname pgfplots@surfviewdepth@vv1\endcsname{f}% - \def\pgfplotsifaxislineisonconvexhull##1##2##3{##2}% ALWAYS TRUE - \def\pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn@##1##2##3{##2}% ALWAYS TRUE - % \pgfplotspointcenter \edef\pgfplots@tmp@centerx{\the\pgf@x}% \edef\pgfplots@tmp@centery{\the\pgf@y}% @@ -6657,10 +7275,10 @@ % \pgfplots@init@ticklabelaxisspec@twodim@for yx% \fi -} +}% % A helper method which is to be invoked ONLY inside of -% \pgfplots@decide@which@figure@surfaces@are@drawn. +% \pgfplots@init@ticklabelaxisspec. % It does NOT work outside of it. % % It initialises the 'pgfplots@#1ticklabelaxisspec' macro according to @@ -6677,7 +7295,6 @@ % % POSTCONDITION: % - pgfplots@#1ticklabelaxisspec is set, -% - pgfplots@#1ticklabel@suggested@anchor is set % % @see also \pgfplots@init@ticklabelaxisspec@twodim@for \def\pgfplots@init@ticklabelaxisspecfor#1#2{% @@ -6783,7 +7400,7 @@ % #3 : the direction which is currently fixed. \def\pgfplots@draw@axis@insurface#1#2#3{% \pgfplots@if{pgfplots@hide@#1}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \pgfplots@drawgridlines@onorientedsurf % \pgfplots@drawticklines@onorientedsurf @@ -6796,7 +7413,7 @@ \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@extra@#1tick\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \expandafter\pgfplots@draw@extra@ticks@onorientedsurf\expandafter{\pgfplots@loc@TMPa}% \fi }% @@ -6808,32 +7425,32 @@ % with slightly optimized execution sequence. \def\pgfplots@draw@axis@insurface@symmetric#1#2#3{% \pgfplots@if{pgfplots@hide@#1}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \pgfplots@drawgridlines@onorientedsurf }% \pgfplots@if{pgfplots@hide@#2}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#2#1#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #2#1#3% \pgfplots@drawgridlines@onorientedsurf }% % \pgfplots@if{pgfplots@hide@#1}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \pgfplots@drawticklines@onorientedsurf }% \pgfplots@if{pgfplots@hide@#2}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#2#1#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #2#1#3% \pgfplots@drawticklines@onorientedsurf }% % \ifpgfplots@separate@axis@lines \pgfplots@if{pgfplots@hide@#1}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \pgfplots@drawaxis@outerlines@separate@onorientedsurf#1#2% \pgfplots@drawaxis@innerlines@onorientedsurf#1#2#3% }% % \pgfplots@if{pgfplots@hide@#2}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#2#1#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #2#1#3% \pgfplots@drawaxis@outerlines@separate@onorientedsurf#2#1% \pgfplots@drawaxis@innerlines@onorientedsurf#2#1#3% }% @@ -6844,11 +7461,11 @@ \fi % \pgfplots@if{pgfplots@hide@#1}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \pgfplots@drawticklabels@onorientedsurf }% \pgfplots@if{pgfplots@hide@#2}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#2#1#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #2#1#3% \pgfplots@drawticklabels@onorientedsurf }% % @@ -6856,7 +7473,7 @@ \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@extra@#1tick\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \expandafter\pgfplots@draw@extra@ticks@onorientedsurf\expandafter{\pgfplots@loc@TMPa}% \fi }% @@ -6864,7 +7481,7 @@ \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@extra@#2tick\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \csname pgfplotspointonorientedsurfaceabsetupfor#2#1#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #2#1#3% \expandafter\pgfplots@draw@extra@ticks@onorientedsurf\expandafter{\pgfplots@loc@TMPa}% \fi }% @@ -6872,7 +7489,7 @@ \def\pgfplots@draw@axis@insurface@onlyticksandgrid#1#2#3{% \pgfplots@if{pgfplots@hide@#1}{\relax}{% - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \pgfplots@drawgridlines@onorientedsurf \pgfplots@drawticklines@onorientedsurf % @@ -6881,7 +7498,7 @@ \else \begingroup \let\pgfplots@drawticklabels@onorientedsurf=\relax - \csname pgfplotspointonorientedsurfaceabsetupfor#1#2#3\endcsname + \pgfplotspointonorientedsurfaceabsetupfor #1#2#3% \expandafter\pgfplots@draw@extra@ticks@onorientedsurf\expandafter{\pgfplots@loc@TMPa}% \endgroup \fi @@ -6944,7 +7561,9 @@ \endgroup \expandafter\pgfsettransformentries\pgfplots@glob@TMPa{0pt}{0pt}% % + % \pgfplots@draw@axis@pre + \pgfplots@draw@axis@is@prepared \scope % \pgfkeysifdefined{/pgfplots/axis background/.@cmd}{% @@ -6962,26 +7581,26 @@ \pgfplotspointbb@assertvaluesexist% } -% Defines \pgfplots@clippath@install. -% @PRECONDITION the axis limits must be ready. -\def\pgfplots@clippath@prepare{% - \def\pgfplots@clippath@use@##1{% - \ifx\pgfplotspoint@bb@@@\relax - % remember the axis dimensions as well: - \ifdim\pgf@pathmaxx=-16000pt - \else - \begingroup - \pgf@xa=\pgf@pathmaxx - \advance\pgf@xa by-\pgf@pathminx - \pgf@ya=\pgf@pathmaxy - \advance\pgf@ya by-\pgf@pathminy - \xdef\pgfplots@glob@TMPa{{\the\pgf@pathminx}{\the\pgf@pathminy}{\the\pgf@xa}{\the\pgf@ya}}% - \endgroup - \global\let\pgfplotspoint@bb@@@=\pgfplots@glob@TMPa - \fi +% something which is invoked after a clippath segment is complete. +% #1 should be something like \pgfusepath{clip} +\def\pgfplots@clippath@use@#1{% + \ifx\pgfplotspoint@bb@@@\relax + % remember the axis dimensions: + \ifdim\pgf@pathmaxx=-16000pt + \else + \begingroup + \pgf@xa=\pgf@pathmaxx + \advance\pgf@xa by-\pgf@pathminx + \pgf@ya=\pgf@pathmaxy + \advance\pgf@ya by-\pgf@pathminy + \xdef\pgfplots@glob@TMPa{{\the\pgf@pathminx}{\the\pgf@pathminy}{\the\pgf@xa}{\the\pgf@ya}}% + \endgroup + \global\let\pgfplotspoint@bb@@@=\pgfplots@glob@TMPa \fi - ##1% - }% + \fi + #1% +}% +\def\pgfplots@clippath@prepare@for@axistype{% \ifpgfplots@threedim % FIXME : this can't be done in three dimensions. :-( % -> for 3d, I need to clip at least the 2d projection. @@ -7212,18 +7831,60 @@ \endgroup \let\pgfplots@clippath@install=\pgfplots@glob@TMPa \fi - % FIXME : workaround clear path sizes at beginning! This shouldn't - % be necessary! - \expandafter\def - \expandafter\pgfplots@clippath@install - \expandafter##% - \expandafter1% - \expandafter{% - \expandafter\pgf@resetpathsizes - \pgfplots@clippath@install{##1}% - }% +}% +% Defines \pgfplots@clippath@install. +% @PRECONDITION the axis limits must be ready. +\def\pgfplots@clippath@prepare{% + \pgfplots@clippath@prepare@for@axistype + % now, the \pgfplots@clippath@install routine should be ready. + % + % it is used to compute the bounding box. prepare that: \global\let\pgfplotspoint@bb@@@=\relax + % + % Now, I SET the clip path temporarily and record the low level + % protocol. + % This low level protocol is used to create a highly optimized + % clip path routine; it will be used quite often. + % + \let\pgfplots@clippath@install@pathcmd=\pgfplots@clippath@install + \pgf@resetpathsizes% FIXME: this here should not be necessary! + \pgfsysprotocol@getcurrentprotocol\pgfplots@loc@TMPa% + \begingroup + % when I do this work, I can as well compute the bounding + % box (done in \pgfplots@clippath@use@) + \pgfinterruptboundingbox + \pgf@relevantforpicturesizetrue + % + \pgfsysprotocol@bufferedtrue% + \pgfsysprotocol@setcurrentprotocol\pgfutil@empty% + % \pgfplots@clippath@install@pathcmd{\pgfusepath{clip}}% + \pgfsysprotocol@getcurrentprotocol\pgfplots@loc@TMPa% + \global\let\pgfplots@glob@TMPa=\pgfplots@loc@TMPa + \endpgfinterruptboundingbox + \endgroup + \let\pgfplots@clippath@install@clip@protocolled=\pgfplots@glob@TMPa + \pgfsysprotocol@setcurrentprotocol\pgfplots@loc@TMPa% + % + % Replace \pgfplots@clippath@install by one which makes use of the + % optimized version (if ##1=\pgfusepath{clip}) + \def\pgfplots@clippath@install##1{% + \def\pgfplots@loc@TMPa{##1}% + \ifx\pgfplots@loc@TMPa\pgfplots@clippath@install@test + % the 'clip' path has been precomputed because it is often + % used: + \expandafter\pgfsys@invoke\expandafter{\pgfplots@clippath@install@clip@protocolled}% + % as far as I can see, this here is the only command which + % can't be protocolled: + \pgf@relevantforpicturesizefalse + \else + \pgf@resetpathsizes% FIXME: this here should not be necessary! + \pgfplots@clippath@install@pathcmd{##1}% + \fi + }% + % }% +\def\pgfplots@clippath@install@test{\pgfusepath{clip}X}% + \def\pgfplotspointbb@assertvaluesexist{% \ifx\pgfplotspoint@bb@@@\relax % (RE)COMPUTE: @@ -7295,7 +7956,7 @@ \def\pgfplots@filter@input@ticks@with@log#1#2{% \let\pgfplots@glob@TMPa=\pgfutil@empty \foreach \pgfplots@loc@TMPb in {#1} {% - \csname pgfplotsmathlog@#2@\endcsname{\pgfplots@loc@TMPb}% + \pgfplotscoordmath{#2}{log}{\pgfplots@loc@TMPb}% \ifx\pgfplots@glob@TMPa\pgfutil@empty \xdef\pgfplots@glob@TMPa{\pgfmathresult}% \else @@ -7321,14 +7982,17 @@ \let\pgfmathresult=\pgfplots@glob@TMPa } +% definition of 'axis cs': \tikzdeclarecoordinatesystem{axis}{\edef\pgfplots@loc@TMPa{#1}\expandafter\pgfplots@evalute@tikz@coord@system@interface\pgfplots@loc@TMPa\pgfplots@coord@end} \def\pgfplotspointaxisxy#1#2{\pgfplots@evalute@tikz@coord@system@interface#1,#2\pgfplots@coord@end}% \def\pgfplotspointaxisxyz#1#2#3{\pgfplots@evalute@tikz@coord@system@interface#1,#2,#3\pgfplots@coord@end}% +% rel axis cs: \tikzdeclarecoordinatesystem{rel axis}{\edef\pgfplots@loc@TMPa{#1}\expandafter\pgfplots@evalute@tikz@coord@system@interface@rel\pgfplots@loc@TMPa\pgfplots@coord@end} \def\pgfplotspointrelaxisxy#1#2{\pgfplots@evalute@tikz@coord@system@interface@rel#1,#2\pgfplots@coord@end}% \def\pgfplotspointrelaxisxyz#1#2#3{\pgfplots@evalute@tikz@coord@system@interface@rel#1,#2,#3\pgfplots@coord@end}% +% axis description cs: \tikzdeclarecoordinatesystem{axis description}{\edef\pgfplots@loc@TMPa{#1}\expandafter\pgfplots@evalute@tikz@coord@system@interface@axis@description\pgfplots@loc@TMPa\pgfplots@coord@end} \def\pgfplots@evalute@tikz@coord@system@interface@axis@description#1,#2\pgfplots@coord@end{\pgfplotspointdescriptionxy{#1}{#2}} @@ -7347,10 +8011,11 @@ \let\pgfplots@loc@TMPc=\pgfmathresult% FIXME: is that necessary? I doubt it... but just to make sure... \csname ifpgfplots@#1islinear\endcsname \pgfplots@if{pgfplots@apply@datatrafo@#1}{% - \csname pgfplots@datascaletrafo@fromfixed@#1\endcsname{\pgfplots@loc@TMPc}% + \pgfplotscoordmath{#1}{parsenumber}{\pgfplots@loc@TMPc}% + \pgfplotscoordmath{#1}{datascaletrafo}{\pgfmathresult}% }{}% \else - \pgfmathlog@{\pgfplots@loc@TMPc}% + \pgfplotscoordmath{#1}{log}{\pgfplots@loc@TMPc}% \fi } @@ -7469,7 +8134,6 @@ % See also: % \pgfplots@check@and@apply@datatrafo@for \def\pgfplots@prepare@coord@filtering@for#1{% - \expandafter\let\csname pgfplotsmathlogtologten@#1@\endcsname=\pgfmathlogtologten@ \pgfkeysgetvalue{/pgfplots/#1 coord trafo/.@cmd}\pgfplots@loc@TMPc \expandafter\let\csname pgfplots@highlevel@trafo@#1\endcsname=\pgfplots@loc@TMPc \ifx\pgfplots@loc@TMPc\pgfplots@empty@command@key @@ -7527,6 +8191,7 @@ \expandafter\edef\csname pgfplots@#1tick\endcsname{\pgfmathresult}% \fi \fi + % \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@extra@#1tick\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else @@ -7534,6 +8199,12 @@ \expandafter\edef\csname pgfplots@extra@#1tick\endcsname{\pgfmathresult}% \fi % + \pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \expandafter\pgfplots@filter@input@ticks@with@highleveltrafo\expandafter{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPc}% + \pgfkeyslet{/pgfplots/minor #1tick}\pgfmathresult + \fi \fi % \pgfkeysgetvalue{/pgfplots/#1filter}\pgfplots@loc@TMPa @@ -7545,6 +8216,7 @@ \pgfkeys{/pgfplots/#1 filter/.code={\csname pgfplots@#1filter@backwcompat\endcsname{##1}\to\pgfmathresult}}% \fi \csname ifpgfplots@#1islinear\endcsname + \pgfplotssetcoordmathfor{#1}{float}% \csname pgfplots@apply@datatrafo@#1true\endcsname \pgfplots@apply@datatrafotrue \ifpgfplots@apply@datatrafo @@ -7552,37 +8224,31 @@ \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1min\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \expandafter\pgfmathfloatparsenumber\expandafter{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{parsenumber}{\pgfplots@loc@TMPa}% \expandafter\global\expandafter\let\csname pgfplots@#1min\endcsname=\pgfmathresult \fi \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1max\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \expandafter\pgfmathfloatparsenumber\expandafter{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{parsenumber}{\pgfplots@loc@TMPa}% \expandafter\global\expandafter\let\csname pgfplots@#1max\endcsname=\pgfmathresult \fi % Check for any existing tick limits: \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1tickmin\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \expandafter\pgfmathfloatparsenumber\expandafter{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{parsenumber}{\pgfplots@loc@TMPa}% \expandafter\global\expandafter\let\csname pgfplots@#1tickmin\endcsname=\pgfmathresult \fi \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1tickmax\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \expandafter\pgfmathfloatparsenumber\expandafter{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{parsenumber}{\pgfplots@loc@TMPa}% \expandafter\global\expandafter\let\csname pgfplots@#1tickmax\endcsname=\pgfmathresult \fi \fi \else - \expandafter\let\csname pgfplotsmathlog@#1@\endcsname=\pgfmathlog@ - \expandafter\let\csname pgfplotsmathlogi@#1\endcsname=\logi - \expandafter\let\csname pgfplotsmathlog@#1@float\endcsname=\pgfmathlog@float - \expandafter\let\csname pgfplots@log@scale@todisplaylog@#1\endcsname=\logten - \expandafter\let\csname pgfplots@log@scale@todisplaylog@#1@inv\endcsname=\reciproclogten - \expandafter\def\csname pgfplotsmathlogscale@#1\endcsname{1}% - \expandafter\def\csname pgfplotsmathlogscale@#1@inv\endcsname{1}% + \pgfplotssetcoordmathfor{#1}{pgfbasic}% % % This here could be done using a high level coord trafo as % well! However, I don't want to risk accidentally overwritten @@ -7596,38 +8262,10 @@ % log basis x={} (initial setting:) \else % use a different basis. - % - % - \pgfmathlog@{\pgfplots@loc@TMPa}% - \let\pgfplots@loc@TMPa=\pgfmathresult - \pgfmathparse{1/\pgfplots@loc@TMPa}% - \expandafter\let\csname pgfplotsmathlogscale@#1\endcsname=\pgfplots@loc@TMPa - \expandafter\let\csname pgfplotsmathlogscale@#1@inv\endcsname=\pgfmathresult - % - \expandafter\edef\csname pgfplotsmathlog@#1@\endcsname##1{% - \noexpand\pgfmathlog@{##1}% - \noexpand\ifx\noexpand\pgfmathresult\noexpand\pgfutil@empty - \noexpand\else - \noexpand\expandafter\noexpand\pgfmath@basic@multiply@\noexpand\expandafter - {\noexpand\pgfmathresult}% - {\pgfmathresult}% - \noexpand\fi - }% - \expandafter\edef\csname pgfplotsmathlog@#1@float\endcsname##1{% - \noexpand\pgfmathlog@float{##1}% - \noexpand\ifx\noexpand\pgfmathresult\noexpand\pgfutil@empty - \noexpand\else - \noexpand\expandafter\noexpand\pgfmath@basic@multiply@\noexpand\expandafter - {\noexpand\pgfmathresult}% - {\pgfmathresult}% - \noexpand\fi - }% + \pgfplotscoordmath{#1}{set log basis}{\pgfplots@loc@TMPa}% % % generate default ticks in the 'log basis', not base 10: - \expandafter\def\csname pgfplots@log@scale@todisplaylog@#1\endcsname{1}% - \expandafter\def\csname pgfplots@log@scale@todisplaylog@#1@inv\endcsname{1}% \pgfplotsset{/pgfplots/log basis ticks=#1}% - % % \ifdim\pgfkeysvalueof{/pgfplots/log basis #1}pt=10pt \else @@ -7638,39 +8276,6 @@ \expandafter\def\csname pgfplots@#1minorgridstrue\endcsname{\pgfplots@error{Sorry, minor grid lines are not supported for this log basis.}}% \fi \pgfkeyslet{/pgfplots/log basis #1/.@cmd}\pgfplots@cant@set@in@this@context - % - % recompute logtologten for this axis: - \pgfmath@basic@multiply@{\reciproclogten}{\pgfplots@loc@TMPa}% - \expandafter\edef\csname pgfplotsmathlogtologten@#1@\endcsname##1{% - \noexpand\pgfmath@basic@multiply@{##1}{\pgfmathresult}% - }% - \begingroup - % recompute \logi for the new basis. - \dimen1=\logi1pt \dimen1=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen1 - \dimen2=\logi2pt \dimen2=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen2 - \dimen3=\logi3pt \dimen3=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen3 - \dimen4=\logi4pt \dimen4=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen4 - \dimen5=\logi5pt \dimen5=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen5 - \dimen6=\logi6pt \dimen6=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen6 - \dimen7=\logi7pt \dimen7=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen7 - \dimen8=\logi8pt \dimen8=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen8 - \dimen9=\logi9pt \dimen9=\csname pgfplotsmathlogscale@#1@inv\endcsname\dimen9 - \xdef\pgfplots@glob@TMPa##1{% - \noexpand\ifcase##1 - \noexpand\or0 - \noexpand\or\pgf@sys@tonumber{\dimen1 }% - \noexpand\or\pgf@sys@tonumber{\dimen2 }% - \noexpand\or\pgf@sys@tonumber{\dimen3 }% - \noexpand\or\pgf@sys@tonumber{\dimen4 }% - \noexpand\or\pgf@sys@tonumber{\dimen5 }% - \noexpand\or\pgf@sys@tonumber{\dimen6 }% - \noexpand\or\pgf@sys@tonumber{\dimen7 }% - \noexpand\or\pgf@sys@tonumber{\dimen8 }% - \noexpand\or\pgf@sys@tonumber{\dimen9 }% - \noexpand\fi - }% - \endgroup - \expandafter\let\csname pgfplotsmathlogi@#1\endcsname=\pgfplots@glob@TMPa %%% % Ok, now, I have prepared everything for the new % log basis! @@ -7680,13 +8285,13 @@ \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1min\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \csname pgfplotsmathlog@#1@\endcsname{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{log}{\pgfplots@loc@TMPa}% \expandafter\global\expandafter\let\csname pgfplots@#1min\endcsname=\pgfmathresult \fi \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1max\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \csname pgfplotsmathlog@#1@\endcsname{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{log}{\pgfplots@loc@TMPa}% \expandafter\global\expandafter\let\csname pgfplots@#1max\endcsname=\pgfmathresult \fi % @@ -7694,13 +8299,13 @@ \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1tickmin\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \csname pgfplotsmathlog@#1@\endcsname{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{log}{\pgfplots@loc@TMPa}% \expandafter\global\expandafter\let\csname pgfplots@#1tickmin\endcsname=\pgfmathresult \fi \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1tickmax\endcsname \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \csname pgfplotsmathlog@#1@\endcsname{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{log}{\pgfplots@loc@TMPa}% \expandafter\global\expandafter\let\csname pgfplots@#1tickmax\endcsname=\pgfmathresult \fi % @@ -7723,26 +8328,26 @@ \expandafter\edef\csname pgfplots@extra@#1tick\endcsname{\pgfmathresult}% \fi % + \pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \expandafter\pgfplots@filter@input@ticks@with@log\expandafter{\pgfplots@loc@TMPa}{#1}% + \pgfkeyslet{/pgfplots/minor #1tick}\pgfmathresult + \fi + % % append logarithm to prepare coord. % \t@pgfplots@toka={% \ifx\pgfmathresult\pgfutil@empty \else \pgfplots@if{pgfplots@disablelogfilter@#1}{% - \pgfmathfloatparsenumber{\pgfmathresult}% - \expandafter\pgfmathfloat@decompose@F\pgfmathresult\relax\c@pgf@counta - \ifnum\c@pgf@counta>2 % this clears nan, inf and -inf points. - \let\pgfmathresult=\pgfutil@empty - \def\pgfplots@unbounded@dir{#1}% - \else - \pgfmathfloattofixed{\pgfmathresult}% - \fi + \pgfplotscoordmath{#1}{parsenumber}{\pgfmathresult}% + % FIXME : check for unbounded arguments! }{% - \csname pgfplotsmathlog@#1@\endcsname{\pgfmathresult}% - \ifx\pgfmathresult\pgfutil@empty - % detect unbounded coords: + \pgfplotscoordmath{#1}{log}{\pgfmathresult}% + \pgfplotscoordmath{#1}{if is bounded}{\pgfmathresult}{}{% \def\pgfplots@unbounded@dir{#1}% - \fi + }% }% \fi }% @@ -7777,6 +8382,7 @@ } \def\pgfplots@create@axis@descriptions@{% + \begingroup \ifpgfplots@hide@x \else \ifpgfplots@units@use% @@ -7815,6 +8421,7 @@ \fi \fi \fi + \endgroup % \pgfkeysgetvalue{/pgfplots/title}\pgfplots@loc@TMPa \ifx\pgfplots@loc@TMPa\pgfutil@empty @@ -7827,215 +8434,6 @@ % } -\def\pgfplots@datascaletrafo@undoshift@x#1{% - \pgfmathsubtract@{#1}{\pgfplots@data@scale@trafo@SHIFT@x}% -}% -\def\pgfplots@datascaletrafo@redoshift@x#1{% - \pgfmathadd@{#1}{\pgfplots@data@scale@trafo@SHIFT@x}% -}% -\def\pgfplots@datascaletrafo@undoshift@y#1{% - \pgfmathsubtract@{#1}{\pgfplots@data@scale@trafo@SHIFT@y}% -}% -\def\pgfplots@datascaletrafo@redoshift@y#1{% - \pgfmathadd@{#1}{\pgfplots@data@scale@trafo@SHIFT@y}% -}% -\def\pgfplots@datascaletrafo@undoshift@z#1{% - \pgfmathsubtract@{#1}{\pgfplots@data@scale@trafo@SHIFT@z}% -}% -\def\pgfplots@datascaletrafo@redoshift@z#1{% - \pgfmathadd@{#1}{\pgfplots@data@scale@trafo@SHIFT@z}% -}% - -% DATA TRANSFORMATION T(x) = X - xmin -% -% Input: -% a number in the original data range, given in **floating** point representation -% Output: -% a fixed point number in transformed range -% stored in \pgfmathresult -% @see -% \pgfplots@datascaletrafo@fromfixed@x -\def\pgfplots@datascaletrafo@x#1{% - \pgfmathfloatshift@{#1}{\pgfplots@data@scale@trafo@EXPONENT@x}% - \pgfmathfloattofixed{\pgfmathresult}% - \expandafter\pgfmathsubtract@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@SHIFT@x}% -} -\def\pgfplots@datascaletrafo@x@noshift#1{% - \pgfmathfloatshift@{#1}{\pgfplots@data@scale@trafo@EXPONENT@x}% - \pgfmathfloattofixed{\pgfmathresult}% -} - -% Overloaded function. -% Input: -% a FIXED point number instead of a floating point one. -% @see \pgfplots@datascaletrafo@x -\def\pgfplots@datascaletrafo@fromfixed@x#1{% - \pgfmathfloatparsenumber{#1}% - \pgfplots@datascaletrafo@x{\pgfmathresult}% -} - -\def\pgfplots@datascaletrafo@y#1{% - \pgfmathfloatshift@{#1}{\pgfplots@data@scale@trafo@EXPONENT@y}% - \pgfmathfloattofixed{\pgfmathresult}% - \expandafter\pgfmathsubtract@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@SHIFT@y}% -} -\def\pgfplots@datascaletrafo@fromfixed@y#1{% - \pgfmathfloatparsenumber{#1}% - \pgfplots@datascaletrafo@y{\pgfmathresult}% -} -\def\pgfplots@datascaletrafo@y@noshift#1{% - \pgfmathfloatshift@{#1}{\pgfplots@data@scale@trafo@EXPONENT@y}% - \pgfmathfloattofixed{\pgfmathresult}% -} -\def\pgfplots@datascaletrafo@z#1{% - \pgfmathfloatshift@{#1}{\pgfplots@data@scale@trafo@EXPONENT@z}% - \pgfmathfloattofixed{\pgfmathresult}% - \expandafter\pgfmathsubtract@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@SHIFT@z}% -} -\def\pgfplots@datascaletrafo@fromfixed@z#1{% - \pgfmathfloatparsenumber{#1}% - \pgfplots@datascaletrafo@z{\pgfmathresult}% -} -\def\pgfplots@datascaletrafo@z@noshift#1{% - \pgfmathfloatshift@{#1}{\pgfplots@data@scale@trafo@EXPONENT@z}% - \pgfmathfloattofixed{\pgfmathresult}% -} - -% INVERSE transformation x = T^{-1}( X ) -% Input: -% a fixed point number in transformed domain -% Output: -% a number in the data domain, given in floating point -% representation -% -% If the input number is approximately X=0, we will return x=0 as -% well. -% -% This allows to handle rounding inaccuracies and should not pose any -% problems. -\def\pgfplots@inverse@datascaletrafo@x#1{% - \begingroup - \pgfmathadd@{#1}{\pgfplots@data@scale@trafo@SHIFT@x}% - \let\pgfplots@inverse@datascaletrafo@@shifted=\pgfmathresult - \pgfmathapproxequalto@{\pgfplots@inverse@datascaletrafo@@shifted}{0.0}% - \ifpgfmathcomparison - \pgfmathfloatcreate{0}{0.0}{0}% - \else - \pgfmathfloatparsenumber{\pgfplots@inverse@datascaletrafo@@shifted}% - \edef\pgfplots@data@scale@trafo@EXPONENT@x{-\pgfplots@data@scale@trafo@EXPONENT@x}% - \expandafter\pgfmathfloatshift@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@EXPONENT@x}% - \fi - \pgfmath@smuggleone\pgfmathresult - \endgroup -} -\def\pgfplots@inverse@datascaletrafo@x@noshift#1{% - \begingroup - \pgfmathapproxequalto@{#1}{0.0}% - \ifpgfmathcomparison - \pgfmathfloatcreate{0}{0.0}{0}% - \else - \pgfmathfloatparsenumber{#1}% - \edef\pgfplots@data@scale@trafo@EXPONENT@x{-\pgfplots@data@scale@trafo@EXPONENT@x}% - \expandafter\pgfmathfloatshift@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@EXPONENT@x}% - \fi - \pgfmath@smuggleone\pgfmathresult - \endgroup -} - -\def\pgfplots@inverse@datascaletrafo@y#1{% - \begingroup - \pgfmathadd@{#1}{\pgfplots@data@scale@trafo@SHIFT@y}% - \let\pgfplots@inverse@datascaletrafo@@shifted=\pgfmathresult - \pgfmathapproxequalto@{\pgfplots@inverse@datascaletrafo@@shifted}{0.0}% - \ifpgfmathcomparison - \pgfmathfloatcreate{0}{0.0}{0}% - \else - \pgfmathfloatparsenumber{\pgfplots@inverse@datascaletrafo@@shifted}% - \edef\pgfplots@data@scale@trafo@EXPONENT@y{-\pgfplots@data@scale@trafo@EXPONENT@y}% - \expandafter\pgfmathfloatshift@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@EXPONENT@y}% - \fi - \pgfmath@smuggleone\pgfmathresult - \endgroup -} -% Overloaded function. This one does only apply the scaling, no shift. -\def\pgfplots@inverse@datascaletrafo@y@noshift#1{% - \begingroup - \pgfmathapproxequalto@{#1}{0.0}% - \ifpgfmathcomparison - \pgfmathfloatcreate{0}{0.0}{0}% - \else - \pgfmathfloatparsenumber{#1}% - \edef\pgfplots@data@scale@trafo@EXPONENT@y{-\pgfplots@data@scale@trafo@EXPONENT@y}% - \expandafter\pgfmathfloatshift@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@EXPONENT@y}% - \fi - \pgfmath@smuggleone\pgfmathresult - \endgroup -} - -\def\pgfplots@inverse@datascaletrafo@z#1{% - \begingroup - \pgfmathadd@{#1}{\pgfplots@data@scale@trafo@SHIFT@z}% - \let\pgfplots@inverse@datascaletrafo@@shifted=\pgfmathresult - \pgfmathapproxequalto@{\pgfplots@inverse@datascaletrafo@@shifted}{0.0}% - \ifpgfmathcomparison - \pgfmathfloatcreate{0}{0.0}{0}% - \else - \pgfmathfloatparsenumber{\pgfplots@inverse@datascaletrafo@@shifted}% - \edef\pgfplots@data@scale@trafo@EXPONENT@z{-\pgfplots@data@scale@trafo@EXPONENT@z}% - \expandafter\pgfmathfloatshift@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@EXPONENT@z}% - \fi - \pgfmath@smuggleone\pgfmathresult - \endgroup -} -% Overloaded function. This one does only apply the scaling, no shift. -\def\pgfplots@inverse@datascaletrafo@z@noshift#1{% - \begingroup - \pgfmathapproxequalto@{#1}{0.0}% - \ifpgfmathcomparison - \pgfmathfloatcreate{0}{0.0}{0}% - \else - \pgfmathfloatparsenumber{#1}% - \edef\pgfplots@data@scale@trafo@EXPONENT@z{-\pgfplots@data@scale@trafo@EXPONENT@z}% - \expandafter\pgfmathfloatshift@\expandafter{\pgfmathresult}{\pgfplots@data@scale@trafo@EXPONENT@z}% - \fi - \pgfmath@smuggleone\pgfmathresult - \endgroup -} - -% Overloaded function. -% -% In contrast to \pgfplots@inverse@datascaletrafo@x, this method -% returns a number in FIXED point representation. -% @see \pgfplots@inverse@datascaletrafo@x -\def\pgfplots@inverse@datascaletrafo@tofixed@x#1{% - \pgfplots@inverse@datascaletrafo@x{#1}% - \expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}% -} -\def\pgfplots@inverse@datascaletrafo@tofixed@y#1{% - \pgfplots@inverse@datascaletrafo@y{#1}% - \expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}% -} -\def\pgfplots@inverse@datascaletrafo@tofixed@z#1{% - \pgfplots@inverse@datascaletrafo@z{#1}% - \expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}% -} - -% Overloaded function. -% -% This one does only apply the scale, no shift. -\def\pgfplots@inverse@datascaletrafo@tofixed@x@noshift#1{% - \pgfplots@inverse@datascaletrafo@x@noshift{#1}% - \expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}% -} -\def\pgfplots@inverse@datascaletrafo@tofixed@y@noshift#1{% - \pgfplots@inverse@datascaletrafo@y@noshift{#1}% - \expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}% -} -\def\pgfplots@inverse@datascaletrafo@tofixed@z@noshift#1{% - \pgfplots@inverse@datascaletrafo@z@noshift{#1}% - \expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}% -} - % Invokes '#1' foreach key which should be saved by a color bar. % % The current key name is available as '##1', the macro under which @@ -8150,9 +8548,9 @@ \fi % % normalize format: - \pgfmathfloattosci\pgfplots@colorbar@src@metamin + \pgfplotscoordmath{meta}{tostring}{\pgfplots@colorbar@src@metamin}% \global\let\pgfplots@colorbar@src@metamin=\pgfmathresult - \pgfmathfloattosci\pgfplots@colorbar@src@metamax + \pgfplotscoordmath{meta}{tostring}{\pgfplots@colorbar@src@metamax}% \global\let\pgfplots@colorbar@src@metamax=\pgfmathresult % \pgfplots@assemble@ref@picture @@ -8176,9 +8574,12 @@ \noexpand\pgfkeyssetvalue{/pgfplots/parent axis height}{\pgfkeysvalueof{/pgfplots/parent axis height}}% \noexpand\pgfkeyssetvalue{/pgfplots/colorbar/width}{\pgfkeysvalueof{/pgfplots/colorbar/width}}% \noexpand\pgfkeyssetvalue{/pgfplots/colorbar addplot}{\the\toks2 }% + \noexpand\def\noexpand\pgfplots@colormap@access{\pgfplots@colormap@access}% \noexpand\pgfkeyssetvalue{/pgfplots/colorbar pos*}{\pgfkeysvalueof{/pgfplots/colorbar pos*}}% + % just to make sure that colorbar sampled respects it: + \noexpand\pgfkeyssetvalue{/pgfplots/mark list fill}{\pgfkeysvalueof{/pgfplots/mark list fill}}% \noexpand\pgfplots@colorbar@define@hook% - \noexpand\pgfkeysvalueof{/pgfplots/colorbar/draw/.@cmd}\noexpand\pgfeov + \noexpand\pgfplots@colorbar@draw@ \ifx\pgfplots@colorbar@toname\pgfutil@empty \noexpand\pgfnodealias{current colorbar axis}{current axis}% \noexpand\pgfnodealias{current axis}{parent axis}% @@ -8200,6 +8601,44 @@ \pgfplots@label{\pgfplots@colorbar@toname}{pgfplots@colorbar@to@name@}% \fi }% + +\newif\ifpgfplotscolorbarCMYKworkaround +\pgfplotscolorbarCMYKworkaroundtrue + +\def\pgfplots@colorbar@draw@{% + \ifpgfplotscolorbarCMYKworkaround + % the default implementation for colorbars is based on + % \pgfplotscolormaptoshadingspec. + % This, in turn, does NOT work for CMYK. + % + % This here detects that case and switches to the (visually) + % equivalent 'colorbar sampled={surf,shader=interp}' style. + \if1\pgfplotscolormaptoshadingspectorgb + \pgfkeysgetvalue{/pgfplots/colorbar/draw/.@cmd}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfplots@colorbar@draw@defaultimpl + \pgfkeysgetvalue{/pgfplots/colormap name}\pgfplots@loc@TMPb + \pgfplotscolormapgetcolorspace{\pgfplots@loc@TMPb}% + \def\pgfplots@loc@TMPa{cmyk}% + \ifx\pgfplots@loc@TMPa\pgfplotsretval + \pgfutil@ifundefined{pgfplots@colorbar@CMYK@\pgfplots@loc@TMPb}{% + \pgfplots@warning{colorbar: The colormap '\pgfplots@loc@TMPb' has a CMYK colorspace which is not (yet) supported by PGF. I switched colorbar styles automatically to 'colorbar sampled={surf,shader=interp}' to generate a proper CMYK colorbar. Use \string\pgfplotscolorbarCMYKworkaroundfalse\space to disable this improvement. [This message won't be replicated for '\pgfplots@loc@TMPb']}% + \expandafter\gdef\csname pgfplots@colorbar@CMYK@\pgfplots@loc@TMPb\endcsname{1}% + }{}% + \pgfplotsset{colorbar sampled={surf,shader=interp}}% + \fi + \fi + \fi + \fi + % + % FIXME : the semicolon after ';' has a fixed catcode, namely + % the one assigned while pgfplots.code.tex has been read. + % + % The \pgfplots@checkandpreparefor@active@semicolon gets + % confused if the catcodes change... this here is a + % work-around for babel support. + \let\pgfplots@checkandpreparefor@active@semicolon\relax + \pgfkeysvalueof{/pgfplots/colorbar/draw/.@cmd}\pgfeov +} \pgfkeysdef{/pgfplots/colorbar to name/at}{% % automatically search-and-replace 'parent axis' which % is not defined for a detached colorbar: @@ -8444,6 +8883,8 @@ {#1}% \let\pgfplots@remaining@input=\pgfplots@rmopts % + \pgfplotssetaxistype{\pgfkeysvalueof{/pgfplots/axis type}}% + % % Step 2: parse any pgfplots options out of styles. \pgfkeysactivatefamily{/pgfplots/style commands}% %\pgfkeysinstallkeyfilter{/pgf/key filters/active families or descendants of}{/pgfplots} @@ -8455,6 +8896,8 @@ \pgfplots@set@keys@from@tikz@style{every axis}% \pgfkeysdeactivatefamily{/pgfplots/scale}% % + \pgfplots@set@keys@from@tikz@style@append@to{every \pgfkeysvalueof{/pgfplots/axis type} axis}{every axis}% + % \ifpgfplots@xislinear \ifpgfplots@yislinear \pgfplots@set@keys@from@tikz@style@append@to{every linear axis}{every axis}% @@ -8609,8 +9052,11 @@ \pgfkeysalso{/pgfplots/.search also=/tikz}% % \pgfplots@set@options@sanitize + \pgfplots@notify@options@are@set } +\def\pgfplots@notify@options@are@set{}% + \def\pgfplots@install@abbrev@commands{ \let\pgfplots@orig@path=\path \let\pgfplots@orig@plot=\plot @@ -8639,7 +9085,7 @@ \or2.197224 \fi }% - \def\axisdefaultticklabel{$\pgfmathprintnumber{\tick}$}% + \def\axisdefaultticklabel{\pgfmathprintnumber{\tick}}% \def\axisdefaultticklabellog{% \pgfkeysgetvalue{/pgfplots/log number format code/.@cmd}\pgfplots@log@label@style \expandafter\pgfplots@log@label@style\tick\pgfeov @@ -8651,6 +9097,13 @@ \let\addlegendentryexpanded=\pgfplots@addlegendentryexpanded } +\let\pgfplots@late@options=\pgfutil@empty +\def\pgfplotssetlateoptions#1{% + \t@pgfplots@toka=\expandafter{\pgfplots@late@options}% + \t@pgfplots@tokb={#1}% + \xdef\pgfplots@late@options{\the\t@pgfplots@toka,\the\t@pgfplots@tokb}% +}% + \def\pgfplots@environment{% \pgfutil@ifnextchar[{% \pgfplots@environment@opt @@ -8681,11 +9134,19 @@ % \pgfplots@stored@current@cmd % \pgfplots@stored@current@data % \pgfplots@stored@current@postcmd -\def\pgfplots@stored@plotlist@EXTRACTENTRY#1#2#3#4{% - \def\pgfplots@stored@current@precmd{#1}% - \def\pgfplots@stored@current@cmd{#2}% +\long\def\pgfplots@stored@plotlist@EXTRACTENTRY#1#2#3#4{% + % the token register stuff allows '#' inside of arguments. + \t@pgfplots@tokc={#1}% + \edef\pgfplots@stored@current@precmd{\the\t@pgfplots@tokc}% + % + \t@pgfplots@tokc={#2}% + \edef\pgfplots@stored@current@cmd{\the\t@pgfplots@tokc}% + % \def\pgfplots@stored@current@data{#3}% - \def\pgfplots@stored@current@postcmd{#4}% + % + \t@pgfplots@tokc={#4}% + \edef\pgfplots@stored@current@postcmd{\the\t@pgfplots@tokc}% + % } \def\pgfplots@init@cleared@structures{% @@ -8776,6 +9237,7 @@ \noexpand\def\noexpand\pgfplots@draw@image{% \noexpand\def\noexpand\tikz@plot@handler{\the\toks3}% \noexpand\pgfkeysdef{/pgfplots/legend image code}{\the\toks0}% + \noexpand\pgfkeyssetvalue{/pgfplots/mark list fill}{\pgfkeysvalueof{/pgfplots/mark list fill}}% \ifx\pgfplots@stylekey\pgfutil@empty \else \noexpand\pgfkeysdef{#2}{\the\toks4}% @@ -8803,21 +9265,32 @@ % % THIS IS INCOMPATIBLE WITH plain TeX and ConTeXt! Don't use it, it % doesn't hurt. -\def\pgfplots@plot@label{\pgfutil@ifnextchar[{\pgfplots@plot@label@}{\pgfplots@plot@label@[]}}% -\def\pgfplots@plot@label@[#1]#2{% +\def\pgfplots@plot@label{% + \pgfutil@ifnextchar<{% + \pgfplots@plot@label@beamer@mode + }{% + \pgfutil@ifnextchar[{\pgfplots@plot@label@{}}{\pgfplots@plot@label@{}[]}% + }% +}% +\def\pgfplots@plot@label@beamer@mode<#1>{ + \pgfutil@ifnextchar[{\pgfplots@plot@label@{<#1>}}{\pgfplots@plot@label@{<#1>}[]}% +} +% #1: optional prefix options, used to support +% \label<...>{<name>} of beamer package +\def\pgfplots@plot@label@#1[#2]#3{% \ifpgfplots@has@label@information \begingroup - \expandafter\let\expandafter\pgfplots@loc@TMPb\csname pgfplots@last@plot@style@#1\endcsname + \expandafter\let\expandafter\pgfplots@loc@TMPb\csname pgfplots@last@plot@style@#2\endcsname \expandafter\pgfplots@export@legend@image@to@macro\expandafter{\pgfplots@loc@TMPb}{/pgfplots/every crossref picture}% % \t@pgfplots@toka=\expandafter{\pgfplotsretval}% \t@pgfplots@tokb=\expandafter{\pgfplotsretvalb}% - % 1. prepare /pgfplots/refstyle={#2}: + % 1. prepare /pgfplots/refstyle={#3}: \pgfplots@auxwrite{% \noexpand\expandafter\noexpand\gdef - \noexpand\csname pgfplots@labelstyle@#2\noexpand\endcsname{\the\t@pgfplots@tokb}% + \noexpand\csname pgfplots@labelstyle@#3\noexpand\endcsname{\the\t@pgfplots@tokb}% }% - % 2. prepare \ref{#2} and \pageref{#2}: + % 2. prepare \ref{#3} and \pageref{#3}: % % There are several nasty things to consider: % a) macro expansion. Use \string to allow a safe \write @@ -8827,20 +9300,20 @@ % a "moving argument" like \caption or so, we need to use % proper '\protect'ion. % - % this here is the low-level implementation of \ref{#2}. Write it into + % this here is the low-level implementation of \ref{#3}. Write it into % the .aux file: \pgfplots@auxwrite{% \noexpand\expandafter\noexpand\gdef - \noexpand\csname pgfplots@show@ref@#2\noexpand\endcsname{% + \noexpand\csname pgfplots@show@ref@#3\noexpand\endcsname{% \the\t@pgfplots@toka }% }% % create the \label command: \let\label=\pgfplots@original@LaTeX@label - \pgfplots@label{#2}{pgfplots@show@ref@}% + \pgfplots@label[#1]{#3}{pgfplots@show@ref@}% \endgroup \else - \pgfplots@error{Can't create \string\label{#2}: it needs to be called after \string\addplot.}% + \pgfplots@error{Can't create \string\label{#3}: it needs to be called after \string\addplot.}% \fi }% @@ -8869,6 +9342,8 @@ % \pgfkeysdef{/pgfplots/colorbar source}{}% make it NO-OP here. It has already been processed. % + \pgfplots@install@local@bar@handlers% see its docs. + % % set both, pgfplots and tikz keys: % the draw is important since \addplot visualizes its stuff % with \path coordinates ... @@ -8886,6 +9361,8 @@ \let\pgfplots@drawoptions=\tikz@options \let\pgfplots@drawmodes=\tikz@mode % + \pgfplots@check@for@default@plot@mark% + % % As of February 22, the final plot processing uses % foreach stored \addplot command : % \scope[current plot style] @@ -8901,26 +9378,45 @@ % inside of this scope, so we can check for that particular % case: \pgfkeys{/tikz/every path/.append code={% - \pgfutil@ifundefined{pgfplots@drawmodes}% - {\relax}% - {% - \let\tikz@mode=\pgfplots@drawmodes -% \let\tikz@options=\pgfplots@drawoptions - }% + \pgfplots@restore@drawmodes }% }% }% }% +\newif\ifpgfplots@drawmodes@append + +\def\pgfplots@restore@drawmodes{% + \pgfutil@ifundefined{pgfplots@drawmodes}% + {\relax}% + {% + \ifpgfplots@drawmodes@append + \t@pgfplots@toka=\expandafter{\tikz@mode}% + \t@pgfplots@tokb=\expandafter{\pgfplots@drawmodes}% + \edef\tikz@mode{\the\t@pgfplots@tokb\the\t@pgfplots@toka}% + \else + \let\tikz@mode=\pgfplots@drawmodes + \fi +% \let\tikz@options=\pgfplots@drawoptions + }% +}% + +\long\def\pgfplotsifissurveyphase#1#2{% + \if\pgfplots@phase@name s% + #1\relax + \else + #2\relax + \fi +}% +\long\def\pgfplotsifisvisualizationphase#1#2{\pgfplotsifissurveyphase{#2}{#1}} +\def\pgfplots@phase@name{X} + % Invokes #1 if the statement occurs within \begin{axis}...\end{axis} % and #2 if not. \long\def\pgfplotsifinaxis#1#2{% \pgfutil@ifundefined{pgfplots@is@in@axis}{#2}{#1}% }% -\pgfutil@ifundefined{label}{\relax}{% -}% - % % \begin{axis}[#1] : % @@ -9046,15 +9542,21 @@ % \def\pgfplots@environment@opt[#1]{% \begingroup - \pgfutil@ifundefined{pgfplots@is@in@axis}{}{% + \pgfplotsifinaxis{% \pgfplots@error{% Sorry, nested axis environments are not supported. Please move the inner axis environment below \string\end{axis} and use alignment options (for example named nodes, see manual) to place it at the desired position}% - }% + }{}% \def\pgfplots@is@in@axis{1}% + \let\pgfpointxy@orig=\pgfpointxy + \let\pgfqpointxy@orig=\pgfqpointxy + \let\pgfpointxyz@orig=\pgfpointxyz + \let\pgfqpointxyz@orig=\pgfqpointxyz + \global\let\pgfplots@late@options=\pgfutil@empty \pgfplots@checkandpreparefor@active@semicolon + % \pgfplots@install@abbrev@commands \pgfplots@stacked@initialise % @@ -9072,6 +9574,8 @@ % \pgfplots@set@options{#1}% % + % + % % -------------------- % Allocations: % -------------------- @@ -9089,36 +9593,16 @@ \pgfplots@datascaletrafo@initialisedtrue% there is no trafo. \fi % - \ifpgfplots@xislinear - \pgfmathfloatcreate{1}{1.0}{2147483645}% - \let\pgfplots@invalidrange@xmin=\pgfmathresult - \pgfmathfloatcreate{2}{1.0}{2147483645}% - \let\pgfplots@invalidrange@xmax=\pgfmathresult - \else - \def\pgfplots@invalidrange@xmin{16300}% - \def\pgfplots@invalidrange@xmax{-16300}% - \fi - \ifpgfplots@yislinear - \pgfmathfloatcreate{1}{1.0}{2147483645}% - \let\pgfplots@invalidrange@ymin=\pgfmathresult - \pgfmathfloatcreate{2}{1.0}{2147483645}% - \let\pgfplots@invalidrange@ymax=\pgfmathresult - \else - \def\pgfplots@invalidrange@ymin{16300}% - \def\pgfplots@invalidrange@ymax{-16300}% - \fi - \ifpgfplots@zislinear - \pgfmathfloatcreate{1}{1.0}{2147483645}% - \let\pgfplots@invalidrange@zmin=\pgfmathresult - \pgfmathfloatcreate{2}{1.0}{2147483645}% - \let\pgfplots@invalidrange@zmax=\pgfmathresult - \else - \def\pgfplots@invalidrange@zmin{16300}% - \def\pgfplots@invalidrange@zmax{-16300}% - \fi - \pgfmathfloatcreate{1}{1.0}{2147483645}% + \pgfplotsutilforeachcommasep{x,y,z}\as\pgfplots@loc@TMPa{% + \pgfplotscoordmath \pgfplots@loc@TMPa{min limit}% + \expandafter\let\csname pgfplots@invalidrange@\pgfplots@loc@TMPa max\endcsname=\pgfmathresult + \pgfplotscoordmath \pgfplots@loc@TMPa{max limit}% + \expandafter\let\csname pgfplots@invalidrange@\pgfplots@loc@TMPa min\endcsname=\pgfmathresult + }% + % + \pgfplotscoordmath{meta}{max limit}% \let\pgfplots@invalidrange@metamin=\pgfmathresult - \pgfmathfloatcreate{2}{1.0}{2147483645}% + \pgfplotscoordmath{meta}{min limit}% \let\pgfplots@invalidrange@metamax=\pgfmathresult % % These numbers will ONLY be filled for linear axis! @@ -9179,7 +9663,7 @@ \def\pgfplots@axiswide@metamin@autocompute{1}% \else \def\pgfplots@axiswide@metamin@autocompute{0}% - \expandafter\pgfmathfloatparsenumber\expandafter{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{meta}{parsenumber}{\pgfplots@loc@TMPa}% \global\let\pgfplots@axiswide@metamin=\pgfmathresult \fi \pgfkeysgetvalue{/pgfplots/point meta max}\pgfplots@loc@TMPa @@ -9187,7 +9671,7 @@ \def\pgfplots@axiswide@metamax@autocompute{1}% \else \def\pgfplots@axiswide@metamax@autocompute{0}% - \expandafter\pgfmathfloatparsenumber\expandafter{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{meta}{parsenumber}{\pgfplots@loc@TMPa}% \global\let\pgfplots@axiswide@metamax=\pgfmathresult \fi % @@ -9217,6 +9701,12 @@ % Use \axispath instead: \let\path=\pgfplots@replacement@for@tikz@path \let\closedcycle=\pgfplots@path@closed@cycle + % + % defines \pgfplotsaxisupdatelimitsforcoordinate etc. + \pgfplots@prepare@axis@API + \pgfkeysvalueof{/pgfplots/execute at begin axis}% + \def\pgfplots@phase@name{s}% + % \let\pgfplots@orig@scope=\scope \let\pgfplots@orig@endscope=\endscope \let\scope=\pgfplots@replacement@for@scope @@ -9229,12 +9719,14 @@ % This command actually takes all collected (global) variables, % creates an axis and performs all postponed drawing operations. \def\endpgfplots@environment@opt{% + \def\pgfplots@phase@name{v}% \pgfutil@ifundefined{label}{\relax}{% % restore. \let\label=\pgfplots@original@LaTeX@label }% \xdef\numplots{\the\pgfplots@numplots}% \pgfkeysvalueof{/pgfplots/before end axis/.@cmd}\pgfeov% + \pgfkeysvalueof{/pgfplots/execute at end axis}% % % restore old \path command: \let\path=\pgfplots@orig@path @@ -9244,12 +9736,17 @@ % \pgfplotssurveyphase@setactiveplothandlers % + \expandafter\pgfplotsset\expandafter{\pgfplots@late@options}% + % %\end{axis}: % + \begingroup + \pgfplots@sys@beforenode % create a leight-weight 'current axis' node for anchor references % (which may happen during both, the axis descriptions or any % path/plot commands). \pgfmultipartnode{pgfplots@low@level@shape@INNER}{image}{current axis}{\pgfusepath{discard}}% + \endgroup % % -------------------- % All plotting commands have been read. @@ -9257,23 +9754,30 @@ % -------------------- \pgfplots@BEGIN@init@and@draw@axis \pgfplots@stacked@initialise - \pgfplots@install@local@bar@handlers \global\pgfplotslistnewempty\pgfplots@stored@markerlist \ifpgfplots@stacked@reverse % This here applies any scaling trafos and assembles a % NEW \pgfplots@stored@plotlist! \pgfplots@stacked@finalize@stored@plots \fi - \pgfplotslistforeach\pgfplots@stored@plotlist\as\pgfplots@loc@TMPa{% + \pgfplotslistforeachungrouped\pgfplots@stored@plotlist\as\pgfplots@loc@TMPa{% \expandafter\pgfplots@stored@plotlist@EXTRACTENTRY\pgfplots@loc@TMPa -%\message{Processing stored plot with precommand '\meaning\pgfplots@stored@current@precmd'; pgfplots@plotcmd '\meaning\pgfplots@stored@current@cmd' postcommand '\meaning\pgfplots@stored@current@postcmd'}% +%\message{^^JProcessing stored plot with precommand '\meaning\pgfplots@stored@current@precmd';^^J pgfplots@plotcmd '\meaning\pgfplots@stored@current@cmd'^^J postcommand '\meaning\pgfplots@stored@current@postcmd'^^J}% +%\message{DATA: '\meaning\pgfplots@stored@current@data';^^J}% % The precmd sets all required variables needed to % finalize a plot. - % @see the stream preparation routines. - \pgfplots@stored@current@precmd \ifx\pgfplots@stored@current@cmd\pgfutil@empty \pgfplots@stored@current@data% \else + \begingroup + % @see the stream preparation routines. + \pgfplots@stored@current@precmd + \pgfkeysvalueof{/pgfplots/execute at begin plot visualization}% + \ifpgfplots@threedim + \else + % axis = 2d and plot=3d is forbidden here. + \pgfplots@curplot@threedimfalse + \fi % % this code here means we REALLY have a plotting % command! @@ -9292,8 +9796,10 @@ \expandafter\pgfplots@coord@stream@finalize@storedcoords@START\pgfplots@stored@current@data\pgfplots@EOI \fi \endscope + \pgfkeysvalueof{/pgfplots/execute at end plot visualization}% + \pgfplots@stored@current@postcmd + \endgroup \fi - \pgfplots@stored@current@postcmd }% \global\pgfplotslistnewempty\pgfplots@stored@plotlist% delete contents. % @@ -9371,12 +9877,16 @@ \def\pgfplots@anchorname{image}% that means: no shift! }{}% % + \begingroup + \pgfplots@sys@beforenode + % \ifpgfplots@deprecated@anchors \pgfplots@restore@deprecated@lowlevel@shape \pgfmultipartnode{\pgfplots@shapename}{\pgfplots@anchorname}{\tikz@fig@name}{\pgfusepath{discard}}% \else \pgfmultipartnode{\pgfplots@shapename}{\pgfplots@anchorname}{\tikz@fig@name}{\pgfusepath{discard}}% \fi + \endgroup \pgfplots@fig@alias \pgfnodealias{current axis}{\tikz@fig@name}% % @@ -9504,5 +10014,8 @@ \tikzaddtikzonlycommandshortcutlet\loglogaxis\pgfplots@environment@loglogaxis \tikzaddtikzonlycommandshortcutlet\endloglogaxis\endpgfplots@environment@loglogaxis +\pgfplotsdefineaxistype{rectangle}{% + % do nothing, this is the default anyway. +}% \catcode`\;=\pgfplots@oldcatcodesemicolon diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex index 6abd1948238..e1bcc0a53d0 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex @@ -1,3 +1,3 @@ \def\pgfplotsrevision{% -1.4.1-1-g64c9e95 +1.5-1-gcc2f2d2 } diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessing.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessing.code.tex index 1331a3f284b..996dce22550 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessing.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessing.code.tex @@ -7,7 +7,7 @@ % % It is based on Till Tantau's PGF package. % -% Copyright 2007/2008 by Christian Feuersänger. +% Copyright 2007-2010 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 @@ -63,10 +63,15 @@ \pgf@zx=0pt \pgf@zy=0pt }% - \let\pgfpointxy@orig=\pgfpointxy - \let\pgfqpointxy@orig=\pgfqpointxy - \let\pgfpointxyz@orig=\pgfpointxyz - \let\pgfqpointxyz@orig=\pgfqpointxyz + % + % + \edef\pgfplotsplothandlerpointxyz##1##2##3{% + \ifpgfplots@curplot@threedim + \noexpand\pgfplotsqpointxyz{##1}{##2}{##3}% + \else + \noexpand\pgfplotsqpointxy{##1}{##2}% + \fi + }% % % A point command such that (0,0) is the 'south west' and (1,1) % the 'north east' point of an axis. @@ -97,17 +102,9 @@ {\pgfqpointxy@orig{##1}{##2}}% }% }% - \edef\pgfplotspointunitx{\global\pgf@x=\the\pgf@xx\space\global\pgf@y=\the\pgf@xy\space}% - \edef\pgfplotspointunity{\global\pgf@x=\the\pgf@yx\space\global\pgf@y=\the\pgf@yy\space}% - \let\pgfplotsunitxlength=\pgfplots@x@veclength - \let\pgfplotsunitylength=\pgfplots@y@veclength - \let\pgfplotsunitxinvlength=\pgfplots@x@inverseveclength - \let\pgfplotsunityinvlength=\pgfplots@y@inverseveclength - \ifpgfplots@threedim - \edef\pgfplotspointunitz{\global\pgf@x=\the\pgf@zx\space\global\pgf@y=\the\pgf@zy\space}% - \let\pgfplotsunitzlength=\pgfplots@z@veclength - \let\pgfplotsunitzinvlength=\pgfplots@z@inverseveclength - \fi + \pgfplotspoint@initialisation@axes + \pgfplotspoint@initialisation@units + \pgfplotspoint@initialisation@center % % declare the '[xyz]ticklabel cs' \tikzdeclarecoordinatesystem{xticklabel}{\pgfplotspointticklabelcs{x}{##1}}% @@ -119,12 +116,167 @@ \pgfplotsdeclareborderanchorforticklabelaxis{y}{near yticklabel}% \pgfplotsdeclareborderanchorforticklabelaxis{z}{near zticklabel}% % - \pgfkeysdef{/tikz/sloped like x axis}{\tikz@addtransform{\pgfplotstransformtoaxisdirection{x}}}% - \pgfkeysdef{/tikz/sloped like y axis}{\tikz@addtransform{\pgfplotstransformtoaxisdirection{y}}}% - \pgfkeysdef{/tikz/sloped like z axis}{\tikz@addtransform{\pgfplotstransformtoaxisdirection{z}}}% + \pgfkeysdef{/tikz/sloped like x axis}{\tikz@addtransform{\pgfplotstransformtoaxisdirection[##1]{x}}}% + \pgfkeysdef{/tikz/sloped like y axis}{\tikz@addtransform{\pgfplotstransformtoaxisdirection[##1]{y}}}% + \pgfkeysdef{/tikz/sloped like z axis}{\tikz@addtransform{\pgfplotstransformtoaxisdirection[##1]{z}}}% % }% +% Determine final axes this does also fix the axis' dimension. +% There are the following cases: +% 1. the user really wants a fixed dimension, +% i.e. he used 'scale only axis'. +% Then, we have to work to get the correct dimension! +% +% Up to now, the scaling mechanism looses to many significant +% digits such that the final width/height differs by 1-2 pt. +% +% If I am not mistaken, this does ONLY affect the final size, +% not the relative plot precision. +% +% FIXME : really compute the plot precision! +% +% 2. The use specified width and/or height, but not 'scale only +% axis'. Accept inaccurate final widths/heights (see above). +% +% 3. The user supplied 'x' and or 'y'. Simply use them, its +% accurate. +% POSTCONDITION: the macros +% \pgfplotspointminminmin +% \pgfplotspoint[xyz]axis +% \pgfplotspoint[xyz]axislength +% are defined (globally). +% +\def\pgfplotspoint@initialisation@axes{% + \begingroup + \ifpgfplots@threedim + \def\pgfplotspointmaxminmin{\pgfplotsqpointxyz{\pgfplots@xmax}{\pgfplots@ymin}{\pgfplots@zmin}}% + \def\pgfplotspointminmaxmin{\pgfplotsqpointxyz{\pgfplots@xmin}{\pgfplots@ymax}{\pgfplots@zmin}}% + \pgfplotsqpointxyz{\pgfplots@xmin}{\pgfplots@ymin}{\pgfplots@zmin}% + \else + \def\pgfplotspointmaxminmin{\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymin}}% + \def\pgfplotspointminmaxmin{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymax}}% + \pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}% + \fi + \xdef\pgfplotspointminminmin{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + % ATTENTION: I re-use registers here! Make sure they won't be + % overwritten! \pgfpointdiff and \pgfplotsqpointxy are ok in this respect. + \let\pgfplots@xcoordminTEX=\pgf@xb + \let\pgfplots@ycoordminTEX=\pgf@yb + \pgfplots@xcoordminTEX=\pgf@x + \pgfplots@ycoordminTEX=\pgf@y + % + %-------------------------------------------------- + % FIXME : WHAT IS THIS HERE FOR? + % \pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}% + % \ifx\pgfplots@rectangle@width\pgfutil@empty + % \def\pgfplots@tmp@xmax@ymin{\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymin}}% + % \else + % % this 'if' here should only make a difference of about + % % 1-2pt, not more. + % % + % % and I am quite sure that this inaccuracy (and this + % % work-around) only affects the + % % final size, not the relative plot accuracy. + % \pgf@x=\pgfplots@xcoordminTEX + % \advance\pgf@x by\pgfplots@width + % \edef\pgfplots@tmp@xmax@ymin{\noexpand\pgfqpoint{\the\pgf@x}{\noexpand\pgfplots@ycoordminTEX}}% + % \fi + % \ifx\pgfplots@rectangle@height\pgfutil@empty + % \def\pgfplots@tmp@xmin@ymax{\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymax}}% + % \else + % \pgf@x=\pgfplots@ycoordminTEX + % \advance\pgf@x\pgfplots@height + % \edef\pgfplots@tmp@xmin@ymax{\noexpand\pgfqpoint{\noexpand\pgfplots@xcoordminTEX}{\the\pgf@x}}% + % \fi + %-------------------------------------------------- + \pgfpointdiff + {\pgfqpoint{\pgfplots@xcoordminTEX}{\pgfplots@ycoordminTEX}} + {\pgfplotspointmaxminmin}% + \xdef\pgfplotspointxaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \xdef\pgfplotspointxaxislength{\pgfmathresult pt}% + % + \pgfpointdiff + {\pgfqpoint{\pgfplots@xcoordminTEX}{\pgfplots@ycoordminTEX}} + {\pgfplotspointminmaxmin}% + \xdef\pgfplotspointyaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \xdef\pgfplotspointyaxislength{\pgfmathresult pt}% + % + \ifpgfplots@threedim + \pgfpointdiff + {\pgfqpoint{\pgfplots@xcoordminTEX}{\pgfplots@ycoordminTEX}} + {\pgfplotsqpointxyz{\pgfplots@xmin}{\pgfplots@ymin}{\pgfplots@zmax}}% + \xdef\pgfplotspointzaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \xdef\pgfplotspointzaxislength{\pgfmathresult pt}% + \else + \global\let\pgfplotspointzaxis=\pgfpointorigin + \gdef\pgfplotspointzaxislength{0pt}% + \fi + \endgroup + % +} + +% PRECONDITION: called after \pgfplotspoint@initialisation@axes +% POSTCONDITION: +% \pgfplotspointcenter is defined. +\def\pgfplotspoint@initialisation@center{% + \begingroup + % + % + \ifpgfplots@threedim + % + \pgfpointscale + {0.5}% + {\pgfplotspointxaxis + \pgf@xa=\pgf@x + \pgf@xb=\pgf@y + \pgfplotspointyaxis% + \advance\pgf@xa by\pgf@x + \advance\pgf@xb by\pgf@y + \pgfplotspointzaxis% + \advance\pgf@xa by\pgf@x + \advance\pgf@xb by\pgf@y + \pgf@x=\pgf@xa + \pgf@y=\pgf@xb + }% + \xdef\pgfplotspointcenter{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \else + \pgfpointscale + {0.5}% + {\pgfpointadd + \pgfplotspointxaxis% + \pgfplotspointyaxis% + }% + \xdef\pgfplotspointcenter{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \fi + \endgroup +} + +% PRECONDITION: +% the unit vectors are set up +% +% POSTCONDITION: +% \pgfplotspointunit[xyz] +% \pgfplotspointunit[xyz]length +% \pgfplotspointunit[xyz]invlength +% are all set up. +\def\pgfplotspoint@initialisation@units{% + \edef\pgfplotspointunitx{\pgf@x=\the\pgf@xx\space\pgf@y=\the\pgf@xy\space}% + \edef\pgfplotspointunity{\pgf@x=\the\pgf@yx\space\pgf@y=\the\pgf@yy\space}% + \let\pgfplotsunitxlength=\pgfplots@x@veclength + \let\pgfplotsunitylength=\pgfplots@y@veclength + \let\pgfplotsunitxinvlength=\pgfplots@x@inverseveclength + \let\pgfplotsunityinvlength=\pgfplots@y@inverseveclength + \ifpgfplots@threedim + \edef\pgfplotspointunitz{\pgf@x=\the\pgf@zx\space\pgf@y=\the\pgf@zy\space}% + \let\pgfplotsunitzlength=\pgfplots@z@veclength + \let\pgfplotsunitzinvlength=\pgfplots@z@inverseveclength + \fi +}% + % The idea here is the following: % % 1. A point coordinate (<x>,<y>) without units should use @@ -253,7 +405,7 @@ % \pgfplotspointonorientedsurfaceN. % % Example: -% \pgfplotspointonorientedsurfaceabsetupforxyz +% \pgfplotspointonorientedsurfaceabsetupfor xyz % \pgfplotspointonorientedsurfaceabsetupforsetz{<lower z limit>}{0} % % -> @@ -264,7 +416,7 @@ % \pgfplotspointonorientedsurfacespecunordered = {vv0} % \pgfplotspointonorientedsurfaceab{3}{4} =\pgfqpointxyz{3}{4}{<lower z limit>} % -% \pgfplotspointonorientedsurfaceabsetupforyxz +% \pgfplotspointonorientedsurfaceabsetupfor yxz % \pgfplotspointonorientedsurfaceabsetupforsetz{<lower z limit>}{0} % -> % \pgfplotspointonorientedsurfaceA = y @@ -274,11 +426,32 @@ % \pgfplotspointonorientedsurfacespecunordered = {vv0} % \pgfplotspointonorientedsurfaceab{3}{4} =\pgfqpointxyz{4}{3}{<lower z limit>} % -% @see \pgfplotspointonorientedsurfaceabsetupforxyz +% @see \pgfplotspointonorientedsurfaceabsetupfor xyz \def\pgfplotspointonorientedsurfaceab#1#2{% - \pgfplots@error{Internal logic error: \string\pgfplotspointonorientedsurfaceab\ used although surface has not been declared! You need to call \string\pgfplotspointonorientedsurfaceabsetupforxyz\ or its friends to do so.}% + \pgfplots@error{Internal logic error: \string\pgfplotspointonorientedsurfaceab\ used although surface has not been declared! You need to call \string\pgfplotspointonorientedsurfaceabsetupfor xyz\ or its friends to do so.}% }% +% This is a shortcut for +% \pgfpointadd +% {\pgfplotspointonorientedsurfaceab{#1}{#2}} +% {<shift in B direction of #3>} +% +% where #3 is a dimension (a number with unit). +\def\pgfplotspointonorientedsurfaceabwithbshift#1#2#3{% + \begingroup + \pgf@xa=#3\relax + \ifdim\pgf@xa=0pt + \else + \pgf@xa=\csname pgfplots@\pgfplotspointonorientedsurfaceB @inverseveclength\endcsname\pgf@xa + \fi + \advance\pgf@xa by#2pt + \edef\pgfplots@loc@b{\pgf@sys@tonumber\pgf@xa}% + \pgf@process{\pgfplotspointonorientedsurfaceab{#1}{\pgfplots@loc@b}}% + \endgroup +} + +\pgfkeyssetvalue{/pgfplots/oriented surf installed}{} + % This macro will be defined after % \pgfplotspointonorientedsurfaceabsetupfor... % routines. It expands to a three-character string @@ -308,65 +481,78 @@ % fixed. \def\pgfplotspointonorientedsurfacespecsymbol{\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol} +\def\pgfplotspointonorientedsurfaceabsetupfor#1#2#3{% + \pgfutil@ifundefined{pgfplotspointonorientedsurfaceabsetupfor@@#1#2#3}{% + \pgfplots@error{Sorry, \string\pgfplotspointonorientedsurfaceabsetupfor\space#1#2#3 is not yet implemented.}% + }{ + \csname pgfplotspointonorientedsurfaceabsetupfor@@#1#2#3\endcsname + }% +}% +% % Initialises \pgfplotspointonorientedsurfaceab such that 'a' is the x % axis and 'b' is the y axis and the z coordinate has been fixed with % \pgfplotspointonorientedsurfaceabsetupforsetz{}. % % The Z value needs to be fixed with % \pgfplotspointonorientedsurfaceabsetupforsetz . -% -\def\pgfplotspointonorientedsurfaceabsetupforxyz{% - \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{##1}{##2}{\pgfplotspointonorientedsurfaceabsetupfor@fixedZ}}% +\def\pgfplotspointonorientedsurfaceabsetupfor@@xyz{% + \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{##1}{##2}{\pgfplotspointonorientedsurfaceabsetupfor@fixedz}}% \def\pgfplotspointonorientedsurfaceA{x}% \def\pgfplotspointonorientedsurfaceB{y}% \def\pgfplotspointonorientedsurfaceN{z}% \edef\pgfplotspointonorientedsurfacespec{ab\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol}% \edef\pgfplotspointonorientedsurfacespecunordered{vv\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol}% + \pgfkeysvalueof{/pgfplots/oriented surf installed}% }% -\def\pgfplotspointonorientedsurfaceabsetupforyxz{% - \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{##2}{##1}{\pgfplotspointonorientedsurfaceabsetupfor@fixedZ}}% +\def\pgfplotspointonorientedsurfaceabsetupfor@@yxz{% + \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{##2}{##1}{\pgfplotspointonorientedsurfaceabsetupfor@fixedz}}% \def\pgfplotspointonorientedsurfaceA{y}% \def\pgfplotspointonorientedsurfaceB{x}% \def\pgfplotspointonorientedsurfaceN{z}% \edef\pgfplotspointonorientedsurfacespec{ba\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol}% \edef\pgfplotspointonorientedsurfacespecunordered{vv\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol}% + \pgfkeysvalueof{/pgfplots/oriented surf installed}% }% -\def\pgfplotspointonorientedsurfaceabsetupforxzy{% - \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{##1}{\pgfplotspointonorientedsurfaceabsetupfor@fixedY}{##2}}% +\def\pgfplotspointonorientedsurfaceabsetupfor@@xzy{% + \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{##1}{\pgfplotspointonorientedsurfaceabsetupfor@fixedy}{##2}}% \def\pgfplotspointonorientedsurfaceA{x}% \def\pgfplotspointonorientedsurfaceB{z}% \def\pgfplotspointonorientedsurfaceN{y}% \edef\pgfplotspointonorientedsurfacespec{a\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol b}% \edef\pgfplotspointonorientedsurfacespecunordered{v\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol v}% + \pgfkeysvalueof{/pgfplots/oriented surf installed}% }% -\def\pgfplotspointonorientedsurfaceabsetupforzxy{% - \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{##2}{\pgfplotspointonorientedsurfaceabsetupfor@fixedY}{##1}}% +\def\pgfplotspointonorientedsurfaceabsetupfor@@zxy{% + \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{##2}{\pgfplotspointonorientedsurfaceabsetupfor@fixedy}{##1}}% \def\pgfplotspointonorientedsurfaceA{z}% \def\pgfplotspointonorientedsurfaceB{x}% \def\pgfplotspointonorientedsurfaceN{y}% \edef\pgfplotspointonorientedsurfacespec{b\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol a}% \edef\pgfplotspointonorientedsurfacespecunordered{v\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol v}% + \pgfkeysvalueof{/pgfplots/oriented surf installed}% }% -\def\pgfplotspointonorientedsurfaceabsetupforyzx{% - \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{\pgfplotspointonorientedsurfaceabsetupfor@fixedX}{##1}{##2}}% +\def\pgfplotspointonorientedsurfaceabsetupfor@@yzx{% + \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{\pgfplotspointonorientedsurfaceabsetupfor@fixedx}{##1}{##2}}% \def\pgfplotspointonorientedsurfaceA{y}% \def\pgfplotspointonorientedsurfaceB{z}% \def\pgfplotspointonorientedsurfaceN{x}% \edef\pgfplotspointonorientedsurfacespec{\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol ab}% \edef\pgfplotspointonorientedsurfacespecunordered{\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol vv}% + \pgfkeysvalueof{/pgfplots/oriented surf installed}% }% -\def\pgfplotspointonorientedsurfaceabsetupforzyx{% - \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{\pgfplotspointonorientedsurfaceabsetupfor@fixedX}{##2}{##1}}% +\def\pgfplotspointonorientedsurfaceabsetupfor@@zyx{% + \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxyz{\pgfplotspointonorientedsurfaceabsetupfor@fixedx}{##2}{##1}}% \def\pgfplotspointonorientedsurfaceA{z}% \def\pgfplotspointonorientedsurfaceB{y}% \def\pgfplotspointonorientedsurfaceN{x}% \edef\pgfplotspointonorientedsurfacespec{\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol ba}% \edef\pgfplotspointonorientedsurfacespecunordered{\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol vv}% + \pgfkeysvalueof{/pgfplots/oriented surf installed}% }% % Fixes 'x' to #1 for use in -% \pgfplotspointonorientedsurfaceabsetupforzyx and -% \pgfplotspointonorientedsurfaceabsetupforyzx. +% \pgfplotspointonorientedsurfaceabsetupfor zyx and +% \pgfplotspointonorientedsurfaceabsetupfor yzx. % % #1: The fixed value for 'x' (a coordinate in transformed range). % #2: a one-character symbol describing 'x'. @@ -375,21 +561,21 @@ % 1 : x is the upper x-axis range. % 2 : other. \def\pgfplotspointonorientedsurfaceabsetupforsetx#1#2{% - \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedX{#1}% + \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedx{#1}% \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol{#2}% }% \def\pgfplotspointonorientedsurfaceabsetupforsety#1#2{% - \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedY{#1}% + \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedy{#1}% \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol{#2}% }% \def\pgfplotspointonorientedsurfaceabsetupforsetz#1#2{% - \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedZ{#1}% + \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedz{#1}% \edef\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol{#2}% }% % Helper methods which should be used if no Z component exists (pure % 2d plots). -\def\pgfplotspointonorientedsurfaceabsetupforxy{% +\def\pgfplotspointonorientedsurfaceabsetupfor@@xy{% \def\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol{0}% \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxy{##1}{##2}}% \def\pgfplotspointonorientedsurfaceA{x}% @@ -397,8 +583,9 @@ \def\pgfplotspointonorientedsurfaceN{z}% \edef\pgfplotspointonorientedsurfacespec{ab\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol}% \edef\pgfplotspointonorientedsurfacespecunordered{vv\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol}% + \pgfkeysvalueof{/pgfplots/oriented surf installed}% }% -\def\pgfplotspointonorientedsurfaceabsetupforyx{% +\def\pgfplotspointonorientedsurfaceabsetupfor@@yx{% \def\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol{0}% \def\pgfplotspointonorientedsurfaceab##1##2{\pgfplotsqpointxy{##2}{##1}}% \def\pgfplotspointonorientedsurfaceA{y}% @@ -406,6 +593,7 @@ \def\pgfplotspointonorientedsurfaceN{z}% \edef\pgfplotspointonorientedsurfacespec{ba\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol}% \edef\pgfplotspointonorientedsurfacespecunordered{vv\pgfplotspointonorientedsurfaceabsetupfor@fixedsymbol}% + \pgfkeysvalueof{/pgfplots/oriented surf installed}% }% @@ -439,7 +627,7 @@ % (three-char-string). % % Example: -% \pgfplotspointonorientedsurfaceabsetupforxyz +% \pgfplotspointonorientedsurfaceabsetupfor xyz % \pgfplotspointonorientedsurfaceabsetupforsetz{<lower z limit>}{0} % -> the oriented surface is 'ab0' % ... @@ -734,22 +922,22 @@ % % Example: % \pgfplotspointonorientedsurfaceabsetupforsetz{\zmax}{1} -% \pgfplotspointonorientedsurfaceabsetupforyxz +% \pgfplotspointonorientedsurfaceabsetupfor yxz % \pgfplotspointonorientedsurfaceabmatchaxisline{v01}{\result} % -> \result will be 'v' because 'x=v' in '{v01} % % \pgfplotspointonorientedsurfaceabsetupforsety{\ymin}{0} -% \pgfplotspointonorientedsurfaceabsetupforxzy +% \pgfplotspointonorientedsurfaceabsetupfor xzy % \pgfplotspointonorientedsurfaceabmatchaxisline{v01}{\result} % -> \result will be '1' because 'z=1' in '{v01} % % \pgfplotspointonorientedsurfaceabsetupforsety{\ymax}{1} -% \pgfplotspointonorientedsurfaceabsetupforxzy +% \pgfplotspointonorientedsurfaceabsetupfor xzy % \pgfplotspointonorientedsurfaceabmatchaxisline{v01}{\result} % -> \result will be empty because 'y=0' in '{v01} % % \pgfplotspointonorientedsurfaceabsetupforsetx{\xmax}{1} -% \pgfplotspointonorientedsurfaceabsetupforyzx +% \pgfplotspointonorientedsurfaceabsetupfor yzx % \pgfplotspointonorientedsurfaceabmatchaxisline{10v}{\result} % -> \result will be 'v' because 'z=v' in '{10v} \def\pgfplotspointonorientedsurfaceabmatchaxisline#1#2{% @@ -835,11 +1023,17 @@ \let\pgfplots@loc@TMPa=\pgfutil@empty \fi \else - \pgfplots@error{The character '#1' is no valid element for a three-character axis line or surface description!}% + % return TRUE. + % I admit I am not sure at all if this works in all + % cases + \pgfplotspointonorientedsurfaceabmatchaxisline@warn{#1}% \fi \fi \fi }% +\def\pgfplotspointonorientedsurfaceabmatchaxisline@warn#1{% + \pgfplots@warning{The internal implementation is suspicious that something is wrong: \string\pgfplotspointonorientedsurfaceabmatchaxisline@warn: the character '#1' in a three-character axis line or surface description might not be fully supported...}% +}% % Provides a point on an arbitrary axis (identified by a % three-character-string) which can take any value on that axis and @@ -931,7 +1125,17 @@ % % The returned normal vector has length 1 (computed with % \pgfpointnormalised). +% +% NOTE: some specialized axis types support non-linear axes (for +% example, polar axes). In that case, the outer normal vector *varies* +% along the `v' direction (of the three-character-string `#1'). +% The value of `v' can be set using +% \pgfplotspointouternormalvectorofaxissetv{<axis three char string>}{<transformed coordinate>} \def\pgfplotspointouternormalvectorofaxis#1{% + \pgfplotspointouternormalvectorofaxis@ifdependson@v{#1}{% + \expandafter\global\expandafter\let\csname pgfplotspointouternormalvectorofaxis@cache@#1\endcsname\relax + }{% + }% \expandafter\ifx\csname pgfplotspointouternormalvectorofaxis@cache@#1\endcsname\relax \begingroup \edef\pgfplots@loc@TMPa{#1}% @@ -943,6 +1147,60 @@ \fi }% +% Fixes the "v" value for successive calls to +% \pgfplotspointouternormalvectorofaxis{#1}. +% +% #1 the three-character-string of an axis or the empty string. +% If #1 is empty, the actual configuration of oriented surfaces may be +% used to check which normal vector is intented. +% +% #2 the "v" value to store. It should be a transformed coordinate. +\def\pgfplotspointouternormalvectorofaxissetv#1#2{% + \edef\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \expandafter\edef\csname pgfplotspointouternormalvectorofaxis@v@\pgfplotspointonorientedsurfaceA\endcsname{#2}% + \else + \expandafter\edef\csname pgfplotspointouternormalvectorofaxis@v@#1\endcsname{#2}% + \fi +}% + +% Defines \pgfplotsretval to contain the 'v' value for an outer normal +% vector (if there is one known). If there is no such value, +% \pgfplotsretval will be empty. +% #1 a three-character-string +\def\pgfplotspointouternormalvectorofaxisgetv#1{% + \edef\pgfplots@loc@TMPa{#1}% + \expandafter\pgfplotspointouternormalvectorofaxisgetv@\pgfplots@loc@TMPa\relax\relax\relax\relax +} +\def\pgfplotspointouternormalvectorofaxisgetv@#1#2#3\relax{% + \pgfutil@ifundefined{pgfplotspointouternormalvectorofaxis@v@#1#2#3}{% + % no value found so far. + \if#1v% + \def\pgfplotsretval{x}% + \else + \if#2v% + \def\pgfplotsretval{y}% + \else + \def\pgfplotsretval{z}% + \fi + \fi + \pgfutil@ifundefined{pgfplotspointouternormalvectorofaxis@v@\pgfplotsretval}{% + \let\pgfplotsretval\pgfutil@empty + }{% + \edef\pgfplotsretval{\csname pgfplotspointouternormalvectorofaxis@v@\pgfplotsretval\endcsname}% + }% + }{% + \edef\pgfplotsretval{\csname pgfplotspointouternormalvectorofaxis@v@#1#2#3\endcsname}% + }% +}% + +% invokes #2 if the outer normal for the axis #1 (identified by a +% three-character-string) depends on a coordinate on that axis and #3 +% otherwise. +% +% Overwrite in subclasses if necessary. +\def\pgfplotspointouternormalvectorofaxis@ifdependson@v#1#2#3{#3} + % FIXME : this doesn't work if one of the three characters is '2' (for % center) \def\pgfplotspointouternormalvectorofaxis@#1#2#3\relax{% @@ -1032,39 +1290,39 @@ % #5: the shift along the outer unit normal. \def\pgfplotspointoutsideofaxis@#1#2#3\relax#4#5{% \if v#1% - \def\pgfplots@loc@point@orthogonal@to@v{% - \pgfplotspointoutsideofaxis@plug@trafo{x}{#4}\let\pgfplots@loc@TMPa=\pgfmathresult - \pgfplotspointoutsideofaxis@plug@getlimit{y}{#2}\let\pgfplots@loc@TMPb=\pgfmathresult + \pgfplotspointoutsideofaxis@plug@getlimit{y}{#2}\let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotspointonorientedsurfaceabsetupforsety{\pgfplots@loc@TMPa}{#2}% + % + \pgfplotspointonorientedsurfaceabsetupfor xzy% + \pgfplotspointoutsideofaxis@plug@trafo{x}{#4}\let\pgfplots@loc@A=\pgfmathresult + \ifpgfplots@threedim + \pgfplotspointoutsideofaxis@plug@getlimit{z}{#3}\let\pgfplots@loc@B=\pgfmathresult + \else + \def\pgfplots@loc@B{0}% + \fi + \else + \if v#2% \ifpgfplots@threedim - \pgfplotspointoutsideofaxis@plug@getlimit{z}{#3}\let\pgfplots@loc@TMPc=\pgfmathresult + \pgfplotspointoutsideofaxis@plug@getlimit{z}{#3}\let\pgfplots@loc@TMPa=\pgfmathresult \else - \def\pgfplots@loc@TMPc{0}% + \def\pgfplots@loc@TMPa{0}% \fi - \pgfplotsqpointxyz{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPc}% - }% - \else - \if v#2% - \def\pgfplots@loc@point@orthogonal@to@v{% - \pgfplotspointoutsideofaxis@plug@trafo{y}{#4}\let\pgfplots@loc@TMPa=\pgfmathresult - \pgfplotspointoutsideofaxis@plug@getlimit{x}{#1}\let\pgfplots@loc@TMPb=\pgfmathresult - \ifpgfplots@threedim - \pgfplotspointoutsideofaxis@plug@getlimit{z}{#3}\let\pgfplots@loc@TMPc=\pgfmathresult - \else - \def\pgfplots@loc@TMPc{0}% - \fi - \pgfplotsqpointxyz{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPc}% - }% + \pgfplotspointonorientedsurfaceabsetupforsetz{\pgfplots@loc@TMPa}{#3}% + % + \pgfplotspointonorientedsurfaceabsetupfor yxz% + \pgfplotspointoutsideofaxis@plug@trafo{y}{#4}\let\pgfplots@loc@A=\pgfmathresult + \pgfplotspointoutsideofaxis@plug@getlimit{x}{#1}\let\pgfplots@loc@B=\pgfmathresult \else - \def\pgfplots@loc@point@orthogonal@to@v{% - \ifpgfplots@threedim - \pgfplotspointoutsideofaxis@plug@trafo{z}{#4}\let\pgfplots@loc@TMPa=\pgfmathresult - \else - \def\pgfplots@loc@TMPa{0}% - \fi - \pgfplotspointoutsideofaxis@plug@getlimit{x}{#1}\let\pgfplots@loc@TMPb=\pgfmathresult - \pgfplotspointoutsideofaxis@plug@getlimit{y}{#2}\let\pgfplots@loc@TMPc=\pgfmathresult - \pgfplotsqpointxyz{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPc}{\pgfplots@loc@TMPa}% - }% + \pgfplotspointoutsideofaxis@plug@getlimit{x}{#1}\let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotspointonorientedsurfaceabsetupforsetx{\pgfplots@loc@TMPa}{#1}% + % + \pgfplotspointonorientedsurfaceabsetupfor zyx% + \ifpgfplots@threedim + \pgfplotspointoutsideofaxis@plug@trafo{z}{#4}\let\pgfplots@loc@A=\pgfmathresult + \else + \def\pgfplots@loc@A{0}% + \fi + \pgfplotspointoutsideofaxis@plug@getlimit{y}{#2}\let\pgfplots@loc@B=\pgfmathresult \fi \fi % @@ -1076,8 +1334,9 @@ % \pgf@process{% \pgfpointadd - {\pgfplots@loc@point@orthogonal@to@v} + {\pgfplotspointonorientedsurfaceab{\pgfplots@loc@A}{\pgfplots@loc@B}} {% + \pgfplotspointouternormalvectorofaxissetv{#1#2#3}{\pgfplots@loc@A}% \pgfqpointscale {\pgfplots@loc@distalong@normal}% {\pgfplotspointouternormalvectorofaxis{#1#2#3}}% @@ -1085,10 +1344,67 @@ }% \endgroup }% +%-------------------------------------------------- +% \def\pgfplotspointoutsideofaxis@#1#2#3\relax#4#5{% +% \if v#1% +% \def\pgfplots@loc@point@orthogonal@to@v{% +% \pgfplotspointoutsideofaxis@plug@trafo{x}{#4}\let\pgfplots@loc@TMPa=\pgfmathresult +% \pgfplotspointoutsideofaxis@plug@getlimit{y}{#2}\let\pgfplots@loc@TMPb=\pgfmathresult +% \ifpgfplots@threedim +% \pgfplotspointoutsideofaxis@plug@getlimit{z}{#3}\let\pgfplots@loc@TMPc=\pgfmathresult +% \else +% \def\pgfplots@loc@TMPc{0}% +% \fi +% \pgfplotsqpointxyz{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPc}% +% }% +% \else +% \if v#2% +% \def\pgfplots@loc@point@orthogonal@to@v{% +% \pgfplotspointoutsideofaxis@plug@trafo{y}{#4}\let\pgfplots@loc@TMPa=\pgfmathresult +% \pgfplotspointoutsideofaxis@plug@getlimit{x}{#1}\let\pgfplots@loc@TMPb=\pgfmathresult +% \ifpgfplots@threedim +% \pgfplotspointoutsideofaxis@plug@getlimit{z}{#3}\let\pgfplots@loc@TMPc=\pgfmathresult +% \else +% \def\pgfplots@loc@TMPc{0}% +% \fi +% \pgfplotsqpointxyz{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPc}% +% }% +% \else +% \def\pgfplots@loc@point@orthogonal@to@v{% +% \ifpgfplots@threedim +% \pgfplotspointoutsideofaxis@plug@trafo{z}{#4}\let\pgfplots@loc@TMPa=\pgfmathresult +% \else +% \def\pgfplots@loc@TMPa{0}% +% \fi +% \pgfplotspointoutsideofaxis@plug@getlimit{x}{#1}\let\pgfplots@loc@TMPb=\pgfmathresult +% \pgfplotspointoutsideofaxis@plug@getlimit{y}{#2}\let\pgfplots@loc@TMPc=\pgfmathresult +% \pgfplotsqpointxyz{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPc}{\pgfplots@loc@TMPa}% +% }% +% \fi +% \fi +% % +% % read dimen argument #5: +% \afterassignment\pgfplots@gobble@until@relax +% \pgf@xa=#5pt\relax +% \edef\pgfplots@loc@distalong@normal{\pgf@sys@tonumber\pgf@xa}% +% % +% % +% \pgf@process{% +% \pgfpointadd +% {\pgfplots@loc@point@orthogonal@to@v} +% {% +% \pgfqpointscale +% {\pgfplots@loc@distalong@normal}% +% {\pgfplotspointouternormalvectorofaxis{#1#2#3}}% +% }% +% }% +% \endgroup +% }% +%-------------------------------------------------- % Helper method for \pgfplotsqpointoutsideofaxis and its variants. % #1: an axis (x,y or z) -% #2: one of '0', '1' or '2' where +% #2: o(\pgfplots@loc@TMPa - \pgfplots@loc@TMPb) ne of '0', '1' or '2' where % 0 == add lower #1 axis limit, % 1 == add upper #1 axis limit, % 2 == add nothing. @@ -1103,29 +1419,65 @@ \fi }% +\newif\ifpgfplots@sloped +\pgfplots@slopedtrue % its only purpose is to *DEACTIVATE* the sloped transformation after it has been activated. +\newif\ifpgfplots@sloped@resets@nontranslations +\newif\ifpgfplots@sloped@allowupsidedown +\pgfkeys{ + /pgfplots/sloped/true/.code={\pgfplots@slopedtrue}, + /pgfplots/sloped/false/.code={\pgfplots@slopedfalse}, + /pgfplots/sloped/allow upside down/.is if=pgfplots@sloped@allowupsidedown, + /pgfplots/sloped/allow upside down/.default=true, + /pgfplots/sloped/execute for upside down/.initial=, + /pgfplots/sloped/reset nontranslations/.is if=pgfplots@sloped@resets@nontranslations, + /pgfplots/sloped/reset nontranslations/.default=true, +} % Installs a rotation transformation matrix such that labels or % whatever are aligned precisely in direction of one of the two/three % coordinate directions. % -% #1: the coordinate direction (one of x,y or z) +% \pgfplotstransformtoaxisdirection[<options>]{<axis char>} +% +% <axis char>: the coordinate direction (one of x,y or z) % % The code is pretty much the same as \pgftransformlineattime, except % that the computation is considerably simpler as axis directions are % a well known quantity. % -% This command assumes \ifpgfallowupsidedownattime = false and -% \ifpgfresetnontranslationattime = true -\def\pgfplotstransformtoaxisdirection#1{% - \pgftransformresetnontranslations +% This command uses \ifpgfplots@sloped@allowupsidedown (=false) and +% \ifpgfplots@sloped@resets@nontranslations (= true). The default +% setting is reinitialised before options are processed +\def\pgfplotstransformtoaxisdirection{% + \pgfutil@ifnextchar[{\pgfplotstransformtoaxisdirection@}{\pgfplotstransformtoaxisdirection@[]}% +}% +\def\pgfplotstransformtoaxisdirection@[#1]#2{% + \pgfplots@sloped@allowupsidedownfalse + \pgfplots@sloped@resets@nontranslationstrue + % + \def\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \pgfqkeys{/pgfplots/sloped}{#1}% + \fi + \ifpgfplots@sloped + % + \ifpgfplots@sloped@resets@nontranslations + \pgftransformresetnontranslations + \fi % % compute unit length vector pointing into the direction of % '#1#2#3': - \pgfqpointscale{\csname pgfplotsunit#1invlength\endcsname}{\csname pgfplotspointunit#1\endcsname}% + \pgfqpointscale{\csname pgfplotsunit#2invlength\endcsname}{\csname pgfplotspointunit#2\endcsname}% % - % do not allow upside down labels: \ifdim\pgf@x<0pt% - \global\pgf@x=-\pgf@x% - \global\pgf@y=-\pgf@y% + % oh. upside down. + \pgfkeysvalueof{/pgfplots/sloped/execute for upside down}% + \ifpgfplots@sloped@allowupsidedown + \else + % do not allow upside down labels: + \global\pgf@x=-\pgf@x% + \global\pgf@y=-\pgf@y% + \fi \fi% % \pgf@ya=-\pgf@y% @@ -1136,6 +1488,7 @@ \pgftransformcm% {\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}% {\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}% + \fi } @@ -1194,6 +1547,10 @@ }% % this does the work for \pgfplotsdeclareborderanchorforaxis. +% +% It depends on \pgfplotspointunit[xyz] and +% \pgfplotspointouternormalvectorofaxis +% % #1: either x,y or z the direction which varies % #2: a three-char-string uniquely identifying the axis line. % The parameter '#1' is redundand: it is the same as the 'v' @@ -1310,31 +1667,48 @@ \pgf@ya=\pgf@y \pgf@pos@transform\pgf@xa\pgf@ya % - \edef\pgfplots@LEQ{% - % solve linear system - {\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@xa}% - {\pgf@sys@tonumber\pgf@yb}{\pgf@sys@tonumber\pgf@ya}% - }% - % - % apply inverse matrix to right-hand-side (and compute RHS): - \pgf@sh@reanchor{#3}{center}% - \edef\pgfplots@loc@center{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% - \pgfpointdiff% {<start>}{<end>} -> computes <end> - <start> - {\pgfplots@loc@center}% - {\pgf@sh@reanchor{#3}{\pgfplots@anchor}}% - \edef\pgfplots@RHS{{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}}% - % - \pgfutilsolvetwotwoleq{\pgfplots@LEQ}{\pgfplots@RHS}% - \def\pgfplots@extract##1##2{% - \def\pgfplots@r{##1}% - }% - \expandafter\pgfplots@extract\pgfmathresult - % GOT IT! - % - % compute x_c + r*n: - \pgfpointadd - {\pgfplots@loc@center}% - {\pgfqpointscale{\pgfplots@r}{\pgfplots@tmp@normaldir}}% + % verify that |n^T d | + \pgf@xc=\pgf@sys@tonumber\pgf@xa\pgf@xb + \advance\pgf@xc by\pgf@sys@tonumber\pgf@ya\pgf@yb + \ifdim\pgf@xc<0pt \pgf@xc=-\pgf@xc \fi + \ifdim\pgf@xc<0.8pt + % ok. 'n' and 'd' are not parallel. + % + \edef\pgfplots@LEQ{% + % solve linear system + % a11 a12 + % a21 a22 + {\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@xa}% + {\pgf@sys@tonumber\pgf@yb}{\pgf@sys@tonumber\pgf@ya}% + }% + % + \pgf@sh@reanchor{#3}{center}% + \edef\pgfplots@loc@center{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}% + % + % apply inverse matrix to right-hand-side (and compute RHS): + \pgfpointdiff% {<start>}{<end>} -> computes <end> - <start> + {\pgfplots@loc@center}% + {\pgf@sh@reanchor{#3}{\pgfplots@anchor}}% + \edef\pgfplots@RHS{{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}}% + % + \pgfutilsolvetwotwoleq{\pgfplots@LEQ}{\pgfplots@RHS}% + \def\pgfplots@extract##1##2{% + \def\pgfplots@r{##1}% + }% + \expandafter\pgfplots@extract\pgfmathresult + % GOT IT! + % + % compute x_c + r*n: + \pgfpointadd + {\pgfplots@loc@center}% + {\pgfqpointscale{\pgfplots@r}{\pgfplots@tmp@normaldir}}% + \else + \message{^^JPGFPlots warning: The ticklabel anchor cannot be determined, the normal vector -(\the\pgf@xb,\the\pgf@yb) and the unit #1 vector (\the\pgf@xa,\the\pgf@ya) are almost parallel (abs(cos(angle)) = \the\pgf@xc)!^^J}% + % Something went awry: normal and unit#1 are almost parallel!? + % just use the determined anchor. + \def\pgfplots@r{0}% + \pgf@sh@reanchor{#3}{\pgfplots@anchor}% + \fi %\message{==========>>>>>>>>>> I got finally (\the\pgf@x,\the\pgf@y). <<<<<<<<<===================}% \pgf@process{}% <- transport outside of group \endgroup @@ -1439,13 +1813,38 @@ \xdef\pgfplots@glob@TMPc{\noexpand\pgfqpointscale{-1}{\the\t@pgfplots@toka}}% \fi % + % Process 'plot box ratio': \def\pgfplots@extract@plot@box@ratio##1##2##3##4\pgfplots@EOI{% \pgfmathparse{##1}\let\pgfplots@plotboxratio@x=\pgfmathresult \pgfmathparse{##2}\let\pgfplots@plotboxratio@y=\pgfmathresult \pgfmathparse{##3}\let\pgfplots@plotboxratio@z=\pgfmathresult }% + \def\pgfplots@extract@plot@box@ratio@spaces##1 ##2 ##3 ##4\pgfplots@EOI{% + \pgfplots@extract@plot@box@ratio{##1}{##2}{##3}{##4}\pgfplots@EOI + }% \pgfkeysgetvalue{/pgfplots/plot box ratio}\pgfplots@loc@TMPa - \expandafter\pgfplots@extract@plot@box@ratio\pgfplots@loc@TMPa{1}{1}{1}\pgfplots@EOI + % Auto-determine input format which is either '{x}{y}{z}' or 'x y z' + \def\pgfplots@loc@TMPb{% + \pgfutil@ifnextchar\bgroup{% + \pgfplots@loc@tmptrue + \pgfplots@gobble@until@EOI + }{% + \pgfplots@loc@tmpfalse + \pgfplots@gobble@until@EOI + }% + }% + \expandafter\pgfplots@loc@TMPb\pgfplots@loc@TMPa\pgfplots@EOI + \ifpgfplots@loc@tmp + % Ah- braces format. + \edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa{1}{1}{1}}% + \expandafter\pgfplots@extract@plot@box@ratio\pgfplots@loc@TMPa\pgfplots@EOI + \else + % Ah- space-separated + \edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa\space 1 1 1}% + \expandafter\pgfplots@extract@plot@box@ratio@spaces\pgfplots@loc@TMPa\pgfplots@EOI + \fi + % + % process it: \ifdim\pgfplots@plotboxratio@x pt=1pt \else \t@pgfplots@toka=\expandafter{\pgfplots@glob@TMPa}% @@ -1468,7 +1867,7 @@ \pgfmathmultiply@{\cosaz}{\cosel}% \xdef\pgfplots@glob@TMPd{{\pgfmathresultNx}{\pgfmathresult}{\sinel}}% \endgroup -%\message{Setting x,y and z from {#1}{#2} to x = \meaning\pgfplots@glob@TMPa, y = \meaning\pgfplots@glob@TMPb, z = \meaning\pgfplots@glob@TMPc...n = \pgfplots@glob@TMPd.}% +%\message{Setting x,y and z from {#1}{#2} to^^J x = \meaning\pgfplots@glob@TMPa,^^J y = \meaning\pgfplots@glob@TMPb,^^J z = \meaning\pgfplots@glob@TMPc,^^J n = \pgfplots@glob@TMPd.^^J}% \pgfsetxvec{\pgfplots@glob@TMPa}% \pgfsetyvec{\pgfplots@glob@TMPb}% \pgfsetzvec{\pgfplots@glob@TMPc}% @@ -1479,16 +1878,60 @@ }% \expandafter\pgfplots@loc@TMPa\pgfplots@glob@TMPd\relax \def#3{0}% + \pgfplots@scale@plotbox@to@widthheight +}% + +\def\message@pgfplots@units{% + \begingroup + \pgfmathparse{veclen(\pgf@zx,\pgf@zy)}\let\Z=\pgfmathresult + \ifdim\Z pt=0pt + \def\Z{1}% + \fi + \pgfmathparse{veclen(\pgf@xx,\pgf@xy)/\Z}\let\X=\pgfmathresult + \pgfmathparse{veclen(\pgf@yx,\pgf@yy)/\Z}\let\Y=\pgfmathresult + \message{^^J + x = (\the\pgf@xx,\the\pgf@xy),^^J + y =(\the\pgf@yx,\the\pgf@yy),^^J + z = (\the\pgf@zx,\the\pgf@zy),^^J + \expandafter\ifx\csname pgfplots@view@dir@threedim@x\endcsname\relax + \else + n = (\pgfplots@view@dir@threedim@x,\pgfplots@view@dir@threedim@y,\pgfplots@view@dir@threedim@z),^^J + \fi + unit vector ratio=[\X\space\Y\space 1],^^J}% + \endgroup +}% + +% Takes the current plot box, defined by the actual PGF x,y and z unit +% vectors, and re-scales it such that it fits into the +% width and height of the axis (as they have been provided by the +% user). +% +% @see \pgfplots@scale@axisbox@to@widthheight +% @see\pgfplots@scaleaxes@to@BB +\def\pgfplots@scale@plotbox@to@widthheight{% \pgfplots@initsizes@get@width@withoutlabels \let\pgfplots@loc@TMPa=\pgfmathresult \pgfplots@initsizes@get@height@withoutlabels \edef\pgfplots@loc@TMPa{{\pgfplots@loc@TMPa}{\pgfmathresult}}% + \let\pgfplots@BB@for@plotbox=\pgfplots@BB@for@plotbox@relative + \let\pgfplots@BB@for@plotbox@compute@post@scales=\pgfplots@BB@for@plotbox@compute@post@scales@relative \expandafter\pgfplots@scaleaxes@to@BB\pgfplots@loc@TMPa -%\message{After scaling: -% x = (\the\pgf@xx,\the\pgf@xy), -% y = (\the\pgf@yx,\the\pgf@yy), -% z = (\the\pgf@zx,\the\pgf@zy).}% -}% +} + + +% A variant of \pgfplots@scale@plotbox@to@widthheight which does not +% use the given x,y,z vectors to define the plot box. Instead, it uses +% the lower and upper axis limits. +\def\pgfplots@scale@axisbox@to@widthheight{% + \pgfplots@initsizes@get@width@withoutlabels + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplots@initsizes@get@height@withoutlabels + \edef\pgfplots@loc@TMPa{{\pgfplots@loc@TMPa}{\pgfmathresult}}% + \let\pgfplots@BB@for@plotbox=\pgfplots@BB@for@plotbox@computelimits + \let\pgfplots@BB@for@plotbox@compute@post@scales=\pgfplots@BB@for@plotbox@compute@post@scales@NOP + \expandafter\pgfplots@scaleaxes@to@BB\pgfplots@loc@TMPa +} + % Takes the current PGF x,y and z unit vectors and scales them such % that the bounding box of the final image has width #1 and height #2. @@ -1513,10 +1956,27 @@ % - the @veclength and @inverseveclength have been re-scaled as % well. \def\pgfplots@scaleaxes@to@BB#1#2{% - \begingroup - \pgfinterruptboundingbox - % STEP 1: compute the bounding box for UNITS. We just need the - % relative sizes: +%\message{before scaling:}\message@pgfplots@units + \if0\pgfplots@scale@mode@choice + % scale mode=auto + \def\pgfplots@scale@mode@choice{2}% stretch to fill + \fi + \if1\pgfplots@scale@mode@choice + % scale mode=none + \else + \pgfplots@scaleaxes@to@BB@{#1}{#2}% + \fi + % FIXME + % I suppose I should call \pgfplotsgetnormalforcurrentview now? + \pgfplots@computeunitvectorlengths +%\message{after scaling:}\message@pgfplots@units +}% +\def\pgfplots@BB@for@plotbox@relative{% + % We just need the + % relative sizes, i.e. + % "0" == lower axis limit + % "1" == upper axis limit + % \ifpgfplots@threedim \pgfpathmoveto{\pgfqpointxyz000}% \pgfpathmoveto{\pgfqpointxyz001}% @@ -1532,6 +1992,63 @@ \pgfpathmoveto{\pgfqpointxy10}% \pgfpathmoveto{\pgfqpointxy11}% \fi +}% +\let\pgfplots@BB@for@plotbox=\pgfplots@BB@for@plotbox@relative +\def\pgfplots@BB@for@plotbox@compute@post@scales@relative#1#2#3{% + % Consequently, we have to multiply with 1/(max-min): + \pgfmathsubtract@{\pgfplots@xmax}{\pgfplots@xmin}% + % compute 1/(xmax - xmin) in float for more recent versions (see /pgfplots/compat/scaling). + % I observed that it is much more accurate + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{parsenumber}{\pgfmathresult}% + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{op}{reciprocal}{{\pgfmathresult}}% + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{tofixed}{\pgfmathresult}% + \let#1=\pgfmathresult + % + \pgfmathsubtract@{\pgfplots@ymax}{\pgfplots@ymin}% + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{parsenumber}{\pgfmathresult}% + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{op}{reciprocal}{{\pgfmathresult}}% + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{tofixed}{\pgfmathresult}% + \let#2=\pgfmathresult + % + \ifpgfplots@threedim + \pgfmathsubtract@{\pgfplots@zmax}{\pgfplots@zmin}% + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{parsenumber}{\pgfmathresult}% + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{op}{reciprocal}{{\pgfmathresult}}% + \pgfplotscoordmath{\pgfplots@compat@scaling@coordmath}{tofixed}{\pgfmathresult}% + \else + \def\pgfmathresult{1}% + \fi + \let#3=\pgfmathresult +}% +\let\pgfplots@BB@for@plotbox@compute@post@scales=\pgfplots@BB@for@plotbox@compute@post@scales@relative +\def\pgfplots@BB@for@plotbox@computelimits{% + \ifpgfplots@threedim + \pgfpathmoveto{\pgfqpointxyz\pgfplots@xmin\pgfplots@ymin\pgfplots@zmin}% + \pgfpathmoveto{\pgfqpointxyz\pgfplots@xmin\pgfplots@ymin\pgfplots@zmax}% + \pgfpathmoveto{\pgfqpointxyz\pgfplots@xmin\pgfplots@ymax\pgfplots@zmin}% + \pgfpathmoveto{\pgfqpointxyz\pgfplots@xmin\pgfplots@ymax\pgfplots@zmax}% + \pgfpathmoveto{\pgfqpointxyz\pgfplots@xmax\pgfplots@ymin\pgfplots@zmin}% + \pgfpathmoveto{\pgfqpointxyz\pgfplots@xmax\pgfplots@ymin\pgfplots@zmax}% + \pgfpathmoveto{\pgfqpointxyz\pgfplots@xmax\pgfplots@ymax\pgfplots@zmin}% + \pgfpathmoveto{\pgfqpointxyz\pgfplots@xmax\pgfplots@ymax\pgfplots@zmax}% + \else + \pgfpathmoveto{\pgfqpointxy\pgfplots@xmin\pgfplots@ymin}% + \pgfpathmoveto{\pgfqpointxy\pgfplots@xmin\pgfplots@ymax}% + \pgfpathmoveto{\pgfqpointxy\pgfplots@xmax\pgfplots@ymin}% + \pgfpathmoveto{\pgfqpointxy\pgfplots@xmax\pgfplots@ymax}% + \fi +}% +\def\pgfplots@BB@for@plotbox@compute@post@scales@NOP#1#2#3{% + \let#1=\pgfutil@empty + \let#2=\pgfutil@empty + \let#3=\pgfutil@empty +}% +\def\pgfplots@scaleaxes@to@BB@#1#2{% + \begingroup + \pgfinterruptboundingbox + % STEP 1: compute the bounding box for the plot box. + \pgfplots@BB@for@plotbox + % % TMPa = width \pgf@xa=\pgf@pathmaxx \advance\pgf@xa by-\pgf@pathminx @@ -1541,62 +2058,156 @@ \pgf@ya=#1\relax \pgf@yb=#2\relax %\message{PGFPLOTS: the current unit vectors result in a UNIT BB of (\the\pgf@xa,\the\pgf@xb). Scaling it to (\the\pgf@ya,\the\pgf@yb)...}% - % STEP 2: compute the scales for x and y such - % that the UNIT-BB will have size #1,#2: - \pgfplotsutil@edef@invoke\pgfmathdivide@{% - {\pgf@sys@tonumber\pgf@ya}% - {\pgf@sys@tonumber\pgf@xa}% - }% - % TMPa = scalex - \global\let\pgfplots@glob@TMPa=\pgfmathresult - \pgfplotsutil@edef@invoke\pgfmathdivide@{% - {\pgf@sys@tonumber\pgf@yb}% - {\pgf@sys@tonumber\pgf@xb}% - }% - % TMPb = scaley - \global\let\pgfplots@glob@TMPb=\pgfmathresult + \ifcase\pgfplots@scale@mode@choice + % scale mode=auto does not happen here + \or + % scale mode=none does not happen here + \or + % scale mode=stretch to fill + % Compute individual scaling factors for X and Y + % such that the UNIT-BB will have size #1,#2: + \pgfplotsutil@edef@invoke\pgfmathdivide@{% + {\pgf@sys@tonumber\pgf@ya}% + {\pgf@sys@tonumber\pgf@xa}% + }% + % TMPa = scalex + \global\let\pgfplots@glob@TMPa=\pgfmathresult + \pgfplotsutil@edef@invoke\pgfmathdivide@{% + {\pgf@sys@tonumber\pgf@yb}% + {\pgf@sys@tonumber\pgf@xb}% + }% + % TMPb = scaley + \global\let\pgfplots@glob@TMPb=\pgfmathresult + \global\let\pgfplots@glob@TMPc=\relax + \or + % scale mode=scale uniformly + % compute ONE common scale for both, X and Y. + % + \pgfplotsutil@edef@invoke\pgfmathdivide@{% + {\pgf@sys@tonumber\pgf@ya}% + {\pgf@sys@tonumber\pgf@xa}% + }% + \global\let\pgfplots@glob@TMPa=\pgfmathresult + \global\let\pgfplots@glob@TMPb=\pgfplots@glob@TMPa + \global\let\pgfplots@glob@TMPc=\relax + \ifdim\pgf@zy=0pt + \ifdim\pgf@yx=0pt + \pgfplots@prepare@vertical@rescaling@for@scale@uniformly@in@dir{y}\returninto\pgfplots@glob@TMPc + \else + \pgfplots@error@scale@uniformly@failed + \fi + \else + \ifdim\pgf@zx=0pt + \pgfplots@prepare@vertical@rescaling@for@scale@uniformly@in@dir{z}\returninto\pgfplots@glob@TMPc + \else + \pgfplots@error@scale@uniformly@failed + \fi + \fi + \fi \pgfusepath{discard}% \endpgfinterruptboundingbox \endgroup -%\message{got scalex = \pgfplots@glob@TMPa\space and scaley = \pgfplots@glob@TMPb.}% - \pgfmathsubtract@{\pgfplots@xmax}{\pgfplots@xmin}% - % compute 1/(xmax - xmin) in float. - % I observed that it is much more accurate (lead to scaling differences of up to 10pt!) - \pgfmathfloatparsenumber\pgfmathresult - \pgfmathfloatreciprocal@\pgfmathresult - \pgfmathfloattofixed\pgfmathresult - %\expandafter\pgfmath@basic@reciprocal@\expandafter{\pgfmathresult}% -%\message{and 1/(xmax-xmin) = 1/(\pgfplots@xmax-\pgfplots@xmin) = \pgfmathresult.}% + % Ok, we know the W,H scalings now. + % + % But remember that we have worked with RELATIVE scales up to now. + % We have to convert them now, by interpreting "1 == upper limit" + % and "0 == lower limit" for every direction. + % + \pgfplots@BB@for@plotbox@compute@post@scales{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPc}% + % + % ok. Now apply all scalings. + % Let's hope all these temporary macros are still valid! +%\message{got scaleW = \pgfplots@glob@TMPa\space and scaleH = \pgfplots@glob@TMPb; scalex=\pgfplots@loc@TMPa, scaley=\pgfplots@loc@TMPb, scalez=\pgfplots@loc@TMPc.}% \pgf@xx=\pgfplots@glob@TMPa\pgf@xx \pgf@xy=\pgfplots@glob@TMPb\pgf@xy - \pgf@xx=\pgfmathresult\pgf@xx - \pgf@xy=\pgfmathresult\pgf@xy + \pgf@xx=\pgfplots@loc@TMPa\pgf@xx + \pgf@xy=\pgfplots@loc@TMPa\pgf@xy % - \pgfmathsubtract@{\pgfplots@ymax}{\pgfplots@ymin}% - \pgfmathfloatparsenumber\pgfmathresult - \pgfmathfloatreciprocal@\pgfmathresult - \pgfmathfloattofixed\pgfmathresult - %\expandafter\pgfmath@basic@reciprocal@\expandafter{\pgfmathresult}% -%\message{and 1/(ymay-ymin) = 1/(\pgfplots@ymax-\pgfplots@ymin) = \pgfmathresult.}% \pgf@yx=\pgfplots@glob@TMPa\pgf@yx \pgf@yy=\pgfplots@glob@TMPb\pgf@yy - \pgf@yx=\pgfmathresult\pgf@yx - \pgf@yy=\pgfmathresult\pgf@yy + \pgf@yx=\pgfplots@loc@TMPb\pgf@yx + \pgf@yy=\pgfplots@loc@TMPb\pgf@yy % \ifpgfplots@threedim - \pgfmathsubtract@{\pgfplots@zmax}{\pgfplots@zmin}% - \pgfmathfloatparsenumber\pgfmathresult - \pgfmathfloatreciprocal@\pgfmathresult - \pgfmathfloattofixed\pgfmathresult - %\expandafter\pgfmath@basic@reciprocal@\expandafter{\pgfmathresult}% -%\message{and 1/(zmaz-zmin) = 1/(\pgfplots@zmax-\pgfplots@zmin) = \pgfmathresult.}% \pgf@zx=\pgfplots@glob@TMPa\pgf@zx \pgf@zy=\pgfplots@glob@TMPb\pgf@zy - \pgf@zx=\pgfmathresult\pgf@zx - \pgf@zy=\pgfmathresult\pgf@zy - \fi - \pgfplots@computeunitvectorlengths -}% + \pgf@zx=\pgfplots@loc@TMPc\pgf@zx + \pgf@zy=\pgfplots@loc@TMPc\pgf@zy + \fi + \pgfplots@glob@TMPc +}% + +\def\pgfplots@error@scale@uniformly@failed{% + \pgfplots@error{Sorry, 'scale uniformly' failed because its actual implementation works only if y_x = 0 (for 2d axes) or if z_x = 0 (for 3d axes). The result will not fill the prescribed dimensions. For 2d axes, you may also want to consider the 'unit vector ratio' key}% +}% +\def\pgfplots@prepare@vertical@rescaling@for@scale@uniformly@in@dir#1\returninto#2{% + % The strategy is as follows: + % 1. I want to fit the axis into width #1 (\pgf@ya) and + % height #1 (\pgf@yb). + % 2. I want to MAINTAIN the unit vector ratio. + % 3. I want to MAINTAIN the unit vector directions. + % + % I already know the scaling factor to fit the width (it + % is stored in \pgfplots@glob@TMPa = \pgfplots@glob@TMPb). + % Let's call it "s". + % + % Consequently, a uniform scaling by "s" leads the image + % height + % h = s* (r_x * e_xy + r_y * e_yy + r_z * e_zy) + % where r_i = (imax - imin). This here is essentially the + % same as the bounding box computation above (at least for + % standart orthographic 3D axes). + % + % What I want now is to enlarge the limits such that I + % have BOTH, width #1 AND height #2, without obscuring the + % unit vector ratio. Recall that width #1 is already + % given. + % + % In my opinion the ONLY way to achieve this goal is to + % modify axis limits for an axis whose unit vector is + % parallel to the canvas y axis, i.e. e_i = (0,*). To see + % this, remember that a rescaling of the other limits will + % also modify the width. + % + % That means I have to introduce a SECOND scale s_z which + % applies only to the Z unit vector (since e_z = (0,*) ). + % If H = #2 is the desired height, I find the target + % equation for s_z, + % + % H = s* r_x e_xy + s * r_y e_yy + s_z * s * r_z * e_zy + % => + % s_z = ( H- s*r_x e_xy - s*r_y e_yy) / ( s * r_z * e_zy). + % + % Remember that + % s = \pgfplots@glob@TMPa + % and + % \pgfplots@glob@TMPa * \pgf@xb = s*h + % + \pgf@xc=\csname pgfplots@#1max\endcsname\csname pgf@#1y\endcsname% FIXME : what if we are working with relative coords? + \advance\pgf@xc by -\csname pgfplots@#1min\endcsname\csname pgf@#1y\endcsname + % + \advance\pgf@xb by-\pgf@xc + \pgf@xb=\pgfplots@glob@TMPa\pgf@xb + \advance\pgf@yb by-\pgf@xb + \pgf@xb=\pgfplots@glob@TMPa\pgf@xc + \pgfplotsutil@edef@invoke\pgfmathdivide@{% + {\pgf@sys@tonumber\pgf@yb}% + {\pgf@sys@tonumber\pgf@xb}% + }% + % Now, s_z = \pgfmathresult . + % + % Now, adjust the z limits. + % Note that \pgfplots@apply@unit@vector@rescale@keep@size + % has a slightly different context; it assumes that the + % unit vector has been rescaled, not the axis limits. + % Consequently, the inverse of the scaling factor enters. + % Since \pgfplots@apply@unit@vector@rescale@keep@size + % expects the inverse of the scale, we can provide + % \pgfmathresult: + \xdef#2{% + \noexpand\pgfplots@apply@unit@vector@rescale@keep@size{#1}{\pgfmathresult}% + }% +} \def\pgfplots@computeunitvectorlengths{% \pgfplotsutil@edef@invoke\pgfmathveclen@{% @@ -1641,6 +2252,746 @@ \fi }% +% Defines \pgfplots@view@dir@threedim@[xyz] according to the actual +% configuration of x,y,z (2d) unit vectors, assuming the associated +% unit vectors form a right-handed-system. +% +% The algorithm works for standard three dimensional axes. It works as +% follows: +% +% First, observe that we have a normal direction N if all its +% multiples are on the mapped onto the same point in 2D canvas +% coordinates. In other words: all 3D coordinates which are mapped +% onto an arbitrary point in 2D canvas coordinates (take, for example, +% the origin (0,0) ) are on a line in direction of N. +% +% We use this observation to compute the normal axis, i.e. we search +% for all points which are mapped onto the 2D canvas coordinate (0,0): +% N_x e_xx + N_y e_yx + N_z e_zx = 0 +% N_x e_xy + N_y e_yy + N_z e_zy = 0. +% All solutions make up a linear space of dimension 1 (up to special +% cases). In the general case, we can chose an arbitrary N_z != 0 +% and reduce the linear system to +% N_x e_xx + N_y e_yx = - N_z e_zx +% N_x e_xy + N_y e_yy = - N_z e_zy. +% Choosing *any* N_z != 0, say, N_z=-1 (which corresponds to view +% from above) will lead to a vector parallel to the normal direction. +% But it might have the wrong sign. +% +% To find the correct sign for N, I have made several case +% distinctions to identify the cases when we have to multiply with -1. +% The key idea is to assume a right-handed-system of unit vectors; +% this is the condition which allows to determine the sign. +% +% Furthermore, I assume that e_z points to the top, i.e. that e_zy >0. +% Then, there are (mainly) four conditions on the signs of e_x and e_y +% which indicate that we are viewing from below and should switch the +% sign of N (keep in mind that our initial choice was N_z =-1, see above). +% +% The conditions can be identified by drawing a 3D box and +% identifying the corner which represents the lower left 3D limits. +% +% You can visualize these cases using +%-------------------------------------------------- +% \pgfplotsset{ +% separate axis lines, +% every outer x axis line/.append style= {-stealth}, +% every outer y axis line/.append style= {-stealth}, +% every outer z axis line/.append style= {-stealth}, +% samples=2,shader=interp,title={view=\h,\v}, +% domain=0:1, +% enlargelimits=false, +% view=\h\v,xlabel=x,ylabel=y, +% extra description/.code={% +% \node[draw,fill=white] at (axis cs:0,0,0) {}; +% }, +% } +% +% \def\v{30} +% \foreach \h in {30,120,210,300} { +% \message{VIEW={\h}{\v}^^J} +% \begin{tikzpicture} +% \begin{axis} +% \addplot3[surf] {x}; +% \end{axis} +% \end{tikzpicture} +% +% } +% +% \def\v{-30} +% \foreach \h in {30,120,210,300} { +% \message{VIEW={\h}{\v}^^J} +% \begin{tikzpicture} +% \begin{axis} +% \addplot3[surf] {x}; +% \end{axis} +% \end{tikzpicture} +% +% } +%-------------------------------------------------- +% The precise formulas can be found below in the source code. +% +% You can override this function by the /pgfplots/view dir key. +\def\pgfplotsgetnormalforcurrentview{% + \pgfkeysgetvalue{/pgfplots/view dir}\pgfplots@loc@TMPc + \ifx\pgfplots@loc@TMPc\pgfutil@empty + \begingroup + \xdef\pgfplots@view@dir@threedim@z{-1}% hold it at some arbitrary value + \pgf@xa=-\pgfplots@view@dir@threedim@z\pgf@zx + \pgf@ya=-\pgfplots@view@dir@threedim@z\pgf@zy + \edef\pgfplots@loc@TMPa{% + {% + {\pgf@sys@tonumber\pgf@xx}{\pgf@sys@tonumber\pgf@yx}% + {\pgf@sys@tonumber\pgf@xy}{\pgf@sys@tonumber\pgf@yy}% + }% + {% + {\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@ya}% + }% + }% + \expandafter\pgfutilsolvetwotwoleq\pgfplots@loc@TMPa + \def\pgfplots@loc@TMPb##1##2{% + \xdef\pgfplots@view@dir@threedim@x{##1}% + \xdef\pgfplots@view@dir@threedim@y{##2}% + }% + \expandafter\pgfplots@loc@TMPb\pgfmathresult + % + % Identify if we need to switch the sign. + % To verify that these cases are useful, I suggest visualizing + % that stuff using the TeX code from above... + % + % I guess it is correct up to collapsing views (as you see, I + % did not properly identify the cases with "=0" ) + \def\pgfplots@scale{1}% + \ifdim\pgf@xx>0pt + \ifdim\pgf@yx>0pt + % + \ifdim\pgf@xy>0pt + \ifdim\pgf@yy<0pt + \def\pgfplots@scale{-1}% + \fi + \fi + % + \fi + \else + \ifdim\pgf@xx<0pt + \ifdim\pgf@yx<0pt + % + \ifdim\pgf@xy<0pt + \ifdim\pgf@yy>0pt + \def\pgfplots@scale{-1}% + \fi + \fi + % + \fi + \fi + \fi + \ifdim\pgf@xy>0pt + \ifdim\pgf@yy>0pt + % + \ifdim\pgf@xx<0pt + \ifdim\pgf@yx>0pt + \def\pgfplots@scale{-1}% + \fi + \fi + % + \fi + \else + \ifdim\pgf@xy<0pt + \ifdim\pgf@yy<0pt + % + \ifdim\pgf@xx>0pt + \ifdim\pgf@yx<0pt + \def\pgfplots@scale{-1}% + \fi + \fi + % + \fi + \fi + \fi + \pgfmathmultiply@{\pgfplots@scale}{\pgfplots@view@dir@threedim@x}% + \global\let\pgfplots@view@dir@threedim@x\pgfmathresult + \pgfmathmultiply@{\pgfplots@scale}{\pgfplots@view@dir@threedim@y}% + \global\let\pgfplots@view@dir@threedim@y\pgfmathresult + \pgfmathmultiply@{\pgfplots@scale}{\pgfplots@view@dir@threedim@z}% + \global\let\pgfplots@view@dir@threedim@z\pgfmathresult + \endgroup + \else + \def\pgfplots@loc@TMPb##1##2##3{% + \xdef\pgfplots@view@dir@threedim@x{##1}% + \xdef\pgfplots@view@dir@threedim@y{##2}% + \xdef\pgfplots@view@dir@threedim@z{##3}% + }% + \expandafter\pgfplots@loc@TMPb\pgfplots@loc@TMPc + \fi +%\message{\string\pgfplotsgetnormalforcurrentview: got (\pgfplots@view@dir@threedim@x,\pgfplots@view@dir@threedim@y,\pgfplots@view@dir@threedim@z)^^J}% +}% + +% ================================================================================== +% +% COORDINATE MATH. +% +% ================================================================================== + +% Declares a new "subclass" to perform coordinate math. +% +% Coordinate math usually needs a more powerful number format than the pgf +% basic layer, or at least a powerful mapping into the pgf basic +% layer. Both cases are realized by the coordinate math class. +% +% Different coordinates can use different instances, and it is also +% possible to use yet a further instance for point meta (or whatever). +% +% Coordinate math is used to compute axis limits and to map the range +% into the pgf number format. +% +% It is *not* necessarily used for \pgfmathparse, since switching +% the number format of \pgfmathparse is quite involved (at the time of +% this writing). Instead, it is used for *single* operations (like +% max, min, multiply, add). +% +% #1: the name of the coord math class +% #2: methods to override the default. +% +% The available methods are documented and shown below in the +% \pgfqkeys listing. +% +% @see the predefined examples, also shown below. +\def\pgfplotsdeclarecoordmath#1#2{% + \edef\pgfplotsdeclarecoordmath@{@#1@}% + \pgfqkeys{/pgfplots/@declare coord math}{% + initialise=, + parse=\pgfmathparse{##1}, + parsenumber=\pgfmathfloatparsenumber{##1}\pgfmathfloattofixed{##1},% + zero= \pgfplotscoordmath{\pgfplotscoordmathid}{parsenumber}{0}, + one= \pgfplotscoordmath{\pgfplotscoordmathid}{parsenumber}{1}, + log e= \pgfmathlog@{##1},% + log to display log=\pgfmath@basic@multiply@{##1}{2.3025851},% * log(10) + log from display log=\pgfmath@basic@multiply@{##1}{0.434294},% / log(10) + log unsigned int={% + \edef\pgfmathresult{% + \ifcase##1 + \or0 + \or0.693147 + \or1.098612 + \or1.386294 + \or1.60943791 + \or1.7917594 + \or1.94591014 + \or2.07944154 + \or2.197224 + \fi + }% + }, + set log basis=\edef\pgfmathresult{{#1}{##1}}\expandafter\pgfplotscoordmath@log@set@basis\pgfmathresult, + exp e={% + % make sure the exponential can be represented, i.e. use + % 'float' in the default repr: + \pgfmathfloatparsenumber{##1}% + \pgfmathfloatexp@\pgfmathresult% + \pgfplotscoordmath{\pgfplotscoordmathid}{parsenumber}{\pgfmathresult}% + }, + tofixed= \edef\pgfmathresult{##1},% + tostring= \edef\pgfmathresult{##1},% + max= \pgfplotsmathmax{##1}{##2},% + min= \pgfplotsmathmin{##1}{##2},% + min limit= \def\pgfmathresult{-16300},% + max limit= \def\pgfmathresult{16300},% + if less than= {\pgfplotsmathlessthan{##1}{##2}\ifpgfmathfloatcomparison ##3\else ##4\fi}, + if is= {% + \if##20 + \ifdim##1pt=0pt ##2\else ##3\fi + \else + \if##2+\ifdim##1pt>0pt ##2\else ##3\fi + \else + \if##2-\ifdim##1pt<0pt ##2\else ##3\fi + \else + \def\pgfplots@loc@TMPd{##1}\ifx\pgfplots@loc@TMPd\pgfutil@empty ##2\else ##3\fi + \fi + \fi + \fi + },% + if is bounded=\edef\pgfplotsretval{##1}\ifx\pgfplotsretval\pgfutil@empty ##3\else ##2\fi, + suffix= #1,% + datascaletrafo set params=, + datascaletrafo get params= \def\pgfmathresult{{}{}}, + datascaletrafo= \edef\pgfmathresult{##1}, + datascaletrafo inverse= \edef\pgfmathresult{##1}, + datascaletrafo noshift inverse= \edef\pgfmathresult{##1}, + datascaletrafo inverse to fixed= \edef\pgfmathresult{##1}, + datascaletrafo noshift inverse to fixed= \edef\pgfmathresult{##1}, + datascaletrafo noshift= \edef\pgfmathresult{##1}, + datascaletrafo noshift= \edef\pgfmathresult{##1}, + datascaletrafo undo shift= \edef\pgfmathresult{##1}, + datascaletrafo redo shift= \edef\pgfmathresult{##1}, + #2% + }% + \expandafter\edef\csname pgfpmth\pgfplotsdeclarecoordmath@ op\endcsname##1##2{% + \noexpand\edef\noexpand\pgfplotscoordmath@{##2}% + \noexpand\expandafter\noexpand\expandafter\noexpand\csname pgfmath\csname pgfpmth@#1@suffix\endcsname ##1@\noexpand\endcsname\noexpand\pgfplotscoordmath@ + }% + % + % + % these log function depend on the first argument of + % \pgfplotscoordmath{}, which is available as + % \pgfplotscoordmathid. + \pgfplotsutilforeachcommasep{% + exp,% + log,% + log to display log,% + log from display log,% + log to log 10,% + log unsigned int}\as\pgfplots@loc@TMPa + {% + \expandafter\edef\csname pgfpmth\pgfplotsdeclarecoordmath@\pgfplots@loc@TMPa\endcsname{% + % invoke \pgfpmth@#1@@<name>@<function> + % for example + % \pgfpmth@pgfbasic@@y@log + \noexpand\csname pgfpmth\pgfplotsdeclarecoordmath@ @\noexpand\pgfplotscoordmathid @\pgfplots@loc@TMPa\noexpand\endcsname + }% + }% + % + \pgfutil@ifundefined{pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log}{% + \pgfutil@namelet + {pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log} + {pgfpmth\pgfplotsdeclarecoordmath@ log e}% + }{}% + \pgfutil@ifundefined{pgfpmth\pgfplotsdeclarecoordmath@ tmpl@exp}{% + \pgfutil@namelet + {pgfpmth\pgfplotsdeclarecoordmath@ tmpl@exp} + {pgfpmth\pgfplotsdeclarecoordmath@ exp e}% + }{}% + \pgfplotscoordmath@def@log@to@log@ten{#1}{}{tmpl}% empty arg + % +}% +\pgfqkeys{/pgfplots/@declare coord math}{% + initialise/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ initialise\endcsname{#1% + \pgfplotscoordmath@initialise@logs + }},% + % takes a number literal as input and defines \pgfmathresult to be + % the parsed result. + parsenumber/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ parsenumber\endcsname##1{#1}},% + % + zero/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ zero\endcsname{#1}},% + one/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ one\endcsname{#1}},% + % + % Calls pgfmathparse. Note that this might need to switch to the + % required math library (which is not necessarily cheap) + parse/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ parse\endcsname##1{#1}},% + % + % takes a parsed number and returns a fixed point number: + tofixed/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ tofixed\endcsname##1{#1}},% + % + % chooses a human readable string (which can be processed by parsenumber): + tostring/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ tostring\endcsname##1{#1}},% + % + % defines a max routine which returns the max of *exactly* two numbers: + max/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ max\endcsname##1##2{#1}},% + % + % counterpart for max: + min/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ min\endcsname##1##2{#1}},% + % + % defines \pgfmathresult to be the largest supported number. + max limit/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ max limit\endcsname{#1}},% + % + % defines \pgfmathresult to be the smallest supported number. + min limit/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ min limit\endcsname{#1}},% + % + % computes ##1 < ##2 and invokes ##3 in the true case and ##4 in + % the false case. + if less than/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ if less than\endcsname##1##2##3##4{#1}},% + % checks if ##1 is 0, positive, negative or unbounded + % ##1: the number to check + % ##2: either 0 or + or - or u (u = unbounded) + % ##3: true code + % ##4: false code + if is/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ if is\endcsname##1##2##3##4{#1}},% + % + % Checks if the argument ##1 is bounded and invokes ##2 in that + % case. IF the argument is unbounded, it invokes #3. + if is bounded/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ if is bounded\endcsname##1##2##3{#1}},% + % + % applies the natural logarithm. If the log is not defined, the + % argument is "unbounded", see 'if is bounded' + % + % 'log' is special in that it accepts a number literal which may + % be OUTSIDE of the accepted number format. The result, however, is + % then in the accepted number format. + log e/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ log e\endcsname##1{#1}},% + % + % Similar, but the log basis can be set with 'set log basis'. + % This allows \pgfplotscoordmath{x}{log}{} to use a different log + % basis thatn \pgfplotscoordmath{y}{log}{} (with special handling) + log/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log\endcsname##1{#1}},% + % applies a *scale* from the actual log basis to the actual + % *display* log basis. The display log basis is usually 10, unless + % the log basis has been changed. + log to display log/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log to display log\endcsname##1{#1}},% + % applies a *scale* from the displau log basis to the actual + % log basis (the inverse of `log to display log'). + log from display log/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log from display log\endcsname##1{#1}},% + log to log 10/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log to log 10\endcsname##1{#1}},% + % returns log(i) where i \in {1,2,3,...,basis-1} + % currently, it is only invoked for log basis 10 + log unsigned int/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log unsigned int\endcsname##1{#1}},% + % sets (changes) the actual log basis. + set log basis/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ set log basis\endcsname##1{#1}},% + % + % The inverse to 'log e '. + exp e/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ exp e\endcsname##1{#1}},% + % + % The inverse to 'log'. It also uses the correct log basis. + exp/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ tmpl@exp\endcsname##1{#1}},% + % + % A macro taking two parameters: + % #1: the EXPONENT (as integer) + % #2: the SHIFT (as fixed point number) + % + % After any change, \pgfplotscoordmathnotifydatascalesetfor{<id>} will be + % invoked where <id> is the argument to + % \pgfplotscoordmath{<id>}... + datascaletrafo set params/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo set params\endcsname##1##2{% + #1\relax\pgfplotscoordmathnotifydatascalesetfor{\pgfplotscoordmathid}% + }},% + datascaletrafo set shift/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo set shift\endcsname##1{% + #1\relax\pgfplotscoordmathnotifydatascalesetfor{\pgfplotscoordmathid}% + }},% + % + % Defines \pgfmathresult to contain the two parameters required + % for 'datascaletrafo set params'. + datascaletrafo get params/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo get params\endcsname{#1}},% + datascaletrafo/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo\endcsname##1{#1}},% + datascaletrafo inverse/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo inverse\endcsname##1{#1}},% + datascaletrafo noshift inverse/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo noshift inverse\endcsname##1{#1}},% + datascaletrafo inverse to fixed/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo inverse to fixed\endcsname##1{#1}},% + datascaletrafo noshift inverse to fixed/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo noshift inverse to fixed\endcsname##1{#1}},% + datascaletrafo noshift/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo noshift\endcsname##1{#1}},% + datascaletrafo noshift/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo noshift\endcsname##1{#1}},% + datascaletrafo undo shift/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo undo shift\endcsname##1{#1}},% + datascaletrafo redo shift/.code= + {\expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ datascaletrafo redo shift\endcsname##1{#1}},% + % + % defines a suffix such that + % \csname pgfmath<suffix><op>@\endcsname + % exists. Example: <suffix>=float --> \pgfmathfloatmultiply@ for <op>=multiply + suffix/.code= + {\expandafter\edef\csname pgfpmth\pgfplotsdeclarecoordmath@ suffix\endcsname{#1}},% +}% + +\def\pgfplotscoordmath@initialise@logs{% + \edef\pgfplotsdeclarecoordmath@{@\pgfplotscoordmathclassfor{\pgfplotscoordmathid}@}% + \pgfutil@ifundefined{pgfpmth\pgfplotsdeclarecoordmath@ @\pgfplotscoordmathid @log}{% + \pgfplotsutilforeachcommasep{% + exp,% + log,% + log to display log,% + log from display log,% + log to log 10,% + log unsigned int}\as\pgfplots@loc@TMPa + {% + \pgfutil@namelet + {pgfpmth\pgfplotsdeclarecoordmath@ @\pgfplotscoordmathid @\pgfplots@loc@TMPa} + {pgfpmth\pgfplotsdeclarecoordmath@ tmpl@\pgfplots@loc@TMPa}% + }% + }{}% +}% + +% shared implementation for 'set log basis' It works for every +% subclass. +\def\pgfplotscoordmath@log@set@basis#1#2{% + \edef\pgfplotsdeclarecoordmath@{@#1@}% + % + \pgfplotscoordmath{\pgfplotscoordmathid}{log e}{#2}% + \let\pgfplots@loc@TMPa=\pgfmathresult% TMPa = log_e(#2) + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{reciprocal}{{\pgfmathresult}}% + \let\pgfplots@loc@TMPb=\pgfmathresult% TMPb = 1/log_e(#2) + % + \expandafter\edef\csname pgfpmth\pgfplotsdeclarecoordmath@ @\pgfplotscoordmathid @log\endcsname##1{% + \noexpand\pgfplotscoordmath{\pgfplotscoordmathid}{log e}{##1}% + \noexpand\ifx\noexpand\pgfmathresult\noexpand\pgfutil@empty + \noexpand\else + \noexpand\pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{% + {\noexpand\pgfmathresult}% + {\pgfplots@loc@TMPb}% + }% + \noexpand\fi + }% + \expandafter\edef\csname pgfpmth\pgfplotsdeclarecoordmath@ @\pgfplotscoordmathid @exp\endcsname##1{% + \noexpand\edef\noexpand\pgfmathresult{##1}% + \noexpand\ifx\noexpand\pgfmathresult\noexpand\pgfutil@empty + \noexpand\else + \noexpand\pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{% + {\noexpand\pgfmathresult}% + {\pgfplots@loc@TMPa}% + }% + \noexpand\pgfplotscoordmath{\pgfplotscoordmathid}{exp e}{\noexpand\pgfmathresult}% + \noexpand\fi + }% + \expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ @\pgfplotscoordmathid @log to display log\endcsname##1{\edef\pgfmathresult{##1}}% + \expandafter\def\csname pgfpmth\pgfplotsdeclarecoordmath@ @\pgfplotscoordmathid @log from display log\endcsname##1{\edef\pgfmathresult{##1}}% + % + % compute 'log unsigned int' for the new basis. + % + % Idea: re-scale the old implementation (of basis e for i = 1,...,9) + % and re-compute i>=10 : + \begingroup + \expandafter\let\expandafter\logi\csname pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log unsigned int\endcsname + \let\logscale=\pgfplots@loc@TMPb + % + \logi{1}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@1\endcsname=\pgfmathresult + % + \logi{2}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@2\endcsname=\pgfmathresult + % + \logi{3}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@3\endcsname=\pgfmathresult + % + \logi{4}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@4\endcsname=\pgfmathresult + % + \logi{5}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@5\endcsname=\pgfmathresult + % + \logi{6}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@6\endcsname=\pgfmathresult + % + \logi{7}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@7\endcsname=\pgfmathresult + % + \logi{8}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@8\endcsname=\pgfmathresult + % + \logi{9}% + \pgfplotscoordmath{\pgfplotscoordmathid}{op}{multiply}{{\pgfmathresult}{\logscale}}% + \expandafter\let\csname logi@@9\endcsname=\pgfmathresult + % + \xdef\pgfplots@glob@TMPa##1{% + \noexpand\ifcase##1 + \noexpand\def\noexpand\pgfmathresult{}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@1\endcsname}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@2\endcsname}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@3\endcsname}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@4\endcsname}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@5\endcsname}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@6\endcsname}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@7\endcsname}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@8\endcsname}% + \noexpand\or\noexpand\def\noexpand\pgfmathresult{\csname logi@@9\endcsname}% + \noexpand\else + \noexpand\pgfplotscoordmath{\pgfplotscoordmathid}{log}{##1}% + \noexpand\fi + }% + \endgroup + \expandafter\let\csname pgfpmth\pgfplotsdeclarecoordmath@ @\pgfplotscoordmathid @log unsigned int\endcsname=\pgfplots@glob@TMPa + \pgfplotscoordmath@def@log@to@log@ten{#1}\pgfplots@loc@TMPa{\pgfplotscoordmathid}% + % + \pgfutil@namelet + {pgfpmth\pgfplotsdeclarecoordmath@ @\pgfplotscoordmathid @log to log 10} + {pgfpmth\pgfplotsdeclarecoordmath@ tmpl@log to log 10}% +}% +% #1: the coord math class +% #2: either empty (basis e) or 1/ln(basis) +% #3: either 'tmpl' or '\pgfplotscoordmathid. It defines the target +% macro name (see the source code) +\def\pgfplotscoordmath@def@log@to@log@ten#1#2#3{% + \csname pgfpmth@#1@parsenumber\endcsname{0.434294}% + \edef\pgfplots@loc@TMPa{#2}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + % log basis e ---> log basis 10 + % log_10 x = log x / log(10) + \else + % log basis a ---> log basis 10 + % + % log_a x = log x / log a + % log_10 x = log_a x * log a / log(10) = log x / log(10) [OK] + \csname pgfpmth@#1@op\endcsname{multiply}{{#2}{\pgfmathresult}}% + \fi + \expandafter\edef\csname pgfpmth@#1@#3@log to log 10\endcsname##1{% + \noexpand\pgfplotscoordmath{\noexpand\pgfplotscoordmathid}{op}{multiply}{{##1}{\pgfmathresult}}% + }% +}% + +\pgfplotsdeclarecoordmath{pgfbasic}{% + parsenumber=\pgfmathfloatparsenumber{#1}\pgfmathfloattofixed\pgfmathresult, + suffix=@basic@, + zero=\def\pgfmathresult{0}, + one=\def\pgfmathresult{1}, +} +\pgfplotsdeclarecoordmath{float}{% + initialise= + \pgfutil@ifundefined{pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid}{% + \expandafter\edef\csname pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid\endcsname{0}% + \expandafter\edef\csname pgfplots@data@scale@trafo@SHIFT@\pgfplotscoordmathid\endcsname{0}% + }{}, + parsenumber=\pgfmathfloatparsenumber{#1}, + parse=\begingroup \pgfkeys{/pgf/fpu}\pgfmathparse{#1}\pgfmath@smuggleone\pgfmathresult\endgroup, + zero=\pgfmathfloatcreate{0}{0.0}{0},% + one=\pgfmathfloatcreate{1}{1.0}{0},% + tofixed=\pgfmathfloattofixed{#1}, + tostring=\pgfmathfloattosci{#1}, + max=\pgfplotsmathfloatmax{#1}{#2},% + min=\pgfplotsmathfloatmin{#1}{#2},% + max limit=\pgfmathfloatcreate{1}{1.0}{2147483645},% + min limit=\pgfmathfloatcreate{2}{1.0}{2147483645},% + log e=\pgfmathfloatparsenumber{#1}\pgfmathfloatln@{\pgfmathresult},% + if less than=\pgfmathfloatlessthan@{#1}{#2}\ifpgfmathfloatcomparison #3\else #4\fi, + if is bounded=% + \expandafter\pgfmathfloatgetflagstomacro\expandafter{#1}\pgfplotsretval + \ifnum\pgfplotsretval>2 #3\else #2\fi, + if is=% + \pgfmathfloatifflags{#1}{#2}{#3}{#4}, + log=\pgfmathlog@float{#1},% + datascaletrafo set params={% + \expandafter\edef\csname pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid\endcsname{#1}% + \expandafter\edef\csname pgfplots@data@scale@trafo@SHIFT@\pgfplotscoordmathid\endcsname{#2}% + },% + datascaletrafo set shift={% + \expandafter\edef\csname pgfplots@data@scale@trafo@SHIFT@\pgfplotscoordmathid\endcsname{#1}% + },% + datascaletrafo get params={% + \edef\pgfmathresult{% + {\csname pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid\endcsname}% + {\csname pgfplots@data@scale@trafo@SHIFT@\pgfplotscoordmathid\endcsname}% + }% + },% + datascaletrafo={% + \edef\pgfmathresult{#1}% + \pgfmathfloatshift@\pgfmathresult{\csname pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid\endcsname}% + \pgfmathfloattofixed\pgfmathresult + \expandafter\pgfmath@basic@subtract@\expandafter{\pgfmathresult}{\csname pgfplots@data@scale@trafo@SHIFT@\pgfplotscoordmathid\endcsname}% + },% + datascaletrafo noshift={% + \edef\pgfmathresult{#1}% + \pgfmathfloatshift@\pgfmathresult{\csname pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid\endcsname}% + \pgfmathfloattofixed{\pgfmathresult}% + },% + datascaletrafo undo shift= + \pgfmath@basic@subtract@{#1}{\csname pgfplots@data@scale@trafo@SHIFT@\pgfplotscoordmathid\endcsname},% + datascaletrafo redo shift=\pgfmath@basic@add@{#1}{\csname pgfplots@data@scale@trafo@SHIFT@\pgfplotscoordmathid\endcsname},% + datascaletrafo inverse={% + \pgfplotscoordmath@float@datascaletrafo@inverse{#1}% + },% + datascaletrafo inverse to fixed={% + \pgfplotscoordmath@float@datascaletrafo@inverse{#1}% + \pgfmathfloattofixed\pgfmathresult + },% + datascaletrafo noshift inverse={% + \pgfmathfloatparsenumber{#1}% + \pgfmathfloatshift@{\pgfmathresult}{-\csname pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid\endcsname}% + },% + datascaletrafo noshift inverse to fixed={% + \pgfmathfloatparsenumber{#1}% + \pgfmathfloatshift@{\pgfmathresult}{-\csname pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid\endcsname}% + \pgfmathfloattofixed\pgfmathresult + },% +} + +\def\pgfplotscoordmath@float@datascaletrafo@inverse#1{% + \pgfmath@basic@add@{#1}{\csname pgfplots@data@scale@trafo@SHIFT@\pgfplotscoordmathid\endcsname}% + \let\pgfplots@inverse@datascaletrafo@@shifted=\pgfmathresult + \pgfmathapproxequalto@{\pgfplots@inverse@datascaletrafo@@shifted}{0.0}% + \ifpgfmathcomparison + \pgfmathfloatcreate{0}{0.0}{0}% + \else + \pgfmathfloatparsenumber{\pgfplots@inverse@datascaletrafo@@shifted}% + \pgfmathfloatshift@{\pgfmathresult}{-\csname pgfplots@data@scale@trafo@EXPONENT@\pgfplotscoordmathid\endcsname}% + \fi +}% + +% Invokes a coordinate math routine. +% +% #1: the axis (x,y or z) +% #2: a method name declared by \pgfplotsdeclarecoordmath (one of +% 'op', 'parsenumber', 'tofixed' etc) +% #3-#9: any further arguments required to perform the call to '#2'. +% +% \pgfplotscoordmath {x}{op}{multiply}{{<a>}{<b>}} +% \pgfplotscoordmath {x}{parsenumber}{<a>} +\def\pgfplotscoordmath#1#2{% + \edef\pgfplotscoordmathid{#1}% + \csname pgfpmth@\csname pgfcrdmth@#1\endcsname @#2\endcsname}% + +\def\pgfplotscoordmathclassfor#1{\csname pgfcrdmth@#1\endcsname}% + +\def\pgfplotscoordmathnotifydatascalesetfor#1{}% + +% Enables a particular coordinate math class for the label `#1'. +% +% #1 a label (usually x,y or z) +% #2 the coordinate math class (one prepare by +% \pgfplotsdeclarecoordmath) +% +% From this point on, any call to \pgfplotscoordmath{#1}{...} +% will use the selected math class. +\def\pgfplotssetcoordmathfor#1#2{% + \pgfutil@ifundefined{pgfpmth@#2@initialise}{% + \pgfplotsthrow{invalid argument}{\pgfplots@loc@TMPa}{Sorry, \string\pgfplotssetcoordmathfor{#1}{#2} failed since `#2' is unknown. Maybe you misspelled it?}\pgfeov% + }{% + \expandafter\edef\csname pgfcrdmth@#1\endcsname{#2}% + \pgfplotscoordmath{#1}{initialise}% + }% +}% + +% Defines \pgfplotsretval to be the coordmath id for #1 +\def\pgfplotsgetcoordmathfor#1{% + \pgfutil@ifundefined{pgfcrdmth@#1}{% + \pgfplotsthrow{invalid argument}{\pgfplots@loc@TMPa}{Sorry, \string\pgfplotsgetcoordmathfor{#1} failed since `#1' is unknown. Maybe you misspelled it?}\pgfeov% + }{% + \pgfutil@namelet{pgfplotsretval}{pgfcrdmth@#1}% + }% +}% +\pgfplotssetcoordmathfor{pgfbasic}{pgfbasic}% +\pgfplotssetcoordmathfor{float}{float}% +\pgfplotssetcoordmathfor{meta}{float}% +\pgfplotssetcoordmathfor{default}{float}% + + + +% ================================================================================== + + % #1 the name of an input method for point meta. It must have been % declared by \pgfplotsdeclarepointmetasource first. @@ -1654,59 +3005,55 @@ % Expands to the current value of 'point meta'. \def\pgfplotspointmetainputhandler{} +\def\pgfplotsaxisifhaspointmeta#1#2{% + \ifx\pgfplotspointmetainputhandler\pgfutil@empty #2\else #1\fi +}% + +% Invokes '#1' if the axis contains the coordinate designated by +% \pgfplots@current@point@[xyz] and '#2' if not. +\def\pgfplotsaxisifcontainspoint#1#2{% + \pgf@xa=\pgfplots@current@point@x pt % FIXME : SCOPE REGISTERS!? + \pgf@ya=\pgfplots@current@point@y pt % + \ifpgfplots@curplot@threedim + \pgf@yb=\pgfplots@current@point@z pt % + \fi + \def\pgfplots@loc@TMPa{#2}% + % + % I assume that \pgfplots@[xyz]min@reg and min@reg are registers + % containing the limits. + \ifdim\pgf@xa<\pgfplots@xmin@reg + \else + \ifdim\pgf@xa>\pgfplots@xmax@reg + \else + \ifdim\pgf@ya<\pgfplots@ymin@reg + \else + \ifdim\pgf@ya>\pgfplots@ymax@reg + \else + \ifpgfplots@curplot@threedim + \ifdim\pgf@yb<\pgfplots@zmin@reg + \else + \ifdim\pgf@yb>\pgfplots@zmax@reg + \else + \def\pgfplots@loc@TMPa{#1}% + \fi + \fi + \else + \def\pgfplots@loc@TMPa{#1}% + \fi + \fi + \fi + \fi + \fi + \pgfplots@loc@TMPa% +} + % Declares a routine which can be used to get point meta input. % % Such a routine is invoked in a context where point coordinates are % processed, i.e. during 'plot coordinates', 'plot table' or the like. % -% The routine is called `#1'. It consists of several methods: -% - \csname pgfpmeta@#1@assign\endcsname{} -% During the survey phase, this macro is expected to assign -% \pgfplots@current@point@meta -% if it is a numeric input method, it should return a -% floating point number. -% It is allowed to return an empty string to say "there is no point -% meta". -% PRECONDITION for '@assign': -% - the coordinate input method has already assigned its -% '\pgfplots@current@point@meta' (probably as raw input string). -% - the other input coordinates are already read. -% POSTCONDITION for '@assign': -% - \pgfplots@current@point@meta is ready for use: -% - EITHER a parsed floating point number -% - OR an empty string, -% - OR a symbolic string (if the issymbolic boolean is true) -% The default implementation is -% \let\pgfplots@current@point@meta=\pgfutil@empty -% -% - \csname pgfpmeta@#1@issymbolic\endcsname -> expands to either '1' or '0' -% A numeric source will be processed numerically in float -% arithmetics. Thus, the output of the @assign routine should be -% a macro \pgfplots@current@point@meta in float format. -% -% The output of a numeric point meta source will result in meta -% limit updates and the final map to [0,1000] will be -% initialised automatically. -% -% A symbolic input routine won't be processed. -% Default is '0' -% -% - \csname pgfpmeta@#1@explicitinput\endcsname -> expands to either -% '1' or '0'. In case '1', it expects explicit input from the -% coordinate input routines. For example, 'plot file' will look for -% further input after the x,y,z coordinates. -% Default is '0' -% -% - \csname pgfpmeta@#1@initfor\endcsname##1{....} -% a macro used to initialise the point meta source when it is -% selected. -% This macro body is invoked by pgfplots when someone types -% 'point meta=x' -> will invoke 'pgfpmeta@x@initfor{}'. -% The first argument to initfor can be supplied by the user. -% PRECONDITION for 'initfor': -% - it will be invoked just before -% '\pgfplotspointmetainputhandler' will be changed. -% Default is to do nothing. +% The routine is called `#1'. It consists of several methods, which +% are described below, in the key definitions. % % #1: the name of the input routine. % #2: a sequence of key-value pairs which can be used to overwrite @@ -1722,16 +3069,66 @@ \pgfqkeys{/pgfplots/@declare point meta src}{#2}% }% \pgfqkeys{/pgfplots/@declare point meta src}{% - assign/.code= - {\expandafter\def\csname pgfpmeta@\pgfplotsdeclarepointmetasource@ @assign\endcsname{#1}},% + % + % a macro used to initialise the point meta source when it is + % selected. + % This macro body is invoked by pgfplots when someone types + % 'point meta=x' -> will invoke 'pgfpmeta@x@initfor{}'. + % The first argument to initfor can be supplied by the user. + % PRECONDITION for 'initfor': + % - it will be invoked just before + % '\pgfplotspointmetainputhandler' will be changed. + % Default is to do nothing. initfor/.code= {\expandafter\def\csname pgfpmeta@\pgfplotsdeclarepointmetasource@ @initfor\endcsname##1{#1}},% + % % Called during the survey phase before the first 'assign' call. % It is usually empty. activate/.code= {\expandafter\def\csname pgfpmeta@\pgfplotsdeclarepointmetasource@ @activate\endcsname{#1}},% + % + % During the survey phase, this macro is expected to assign + % \pgfplots@current@point@meta + % if it is a numeric input method, it should return a + % floating point number. + % It is allowed to return an empty string to say "there is no point + % meta". + % PRECONDITION for '@assign': + % - the coordinate input method has already assigned its + % '\pgfplots@current@point@meta' (probably as raw input string). + % - the other input coordinates are already read. + % POSTCONDITION for '@assign': + % - \pgfplots@current@point@meta is ready for use: + % - EITHER a parsed floating point number + % - OR an empty string, + % - OR a symbolic string (if the issymbolic boolean is true) + % The default implementation is + % \let\pgfplots@current@point@meta=\pgfutil@empty + % + assign/.code= + {\expandafter\def\csname pgfpmeta@\pgfplotsdeclarepointmetasource@ @assign\endcsname{#1}},% + % + % expands to either '1' or '0' + % A numeric source will be processed numerically in float + % arithmetics. Thus, the output of the @assign routine should be + % a macro \pgfplots@current@point@meta in float format. + % + % The output of a numeric point meta source will result in meta + % limit updates and the final map to [0,1000] will be + % initialised automatically. + % + % A symbolic input routine won't be processed. + % Default is '0' + % issymbolic/.code= {\expandafter\def\csname pgfpmeta@\pgfplotsdeclarepointmetasource@ @issymbolic\endcsname{#1}},% + % + % expands to either + % '1' or '0'. In case '1', it expects explicit input from the + % coordinate input routines. For example, 'plot file' will look for + % further input after the x,y,z coordinates. + % Default is '0' + % explicitinput/.code= {\expandafter\def\csname pgfpmeta@\pgfplotsdeclarepointmetasource@ @explicitinput\endcsname{#1}},% }% @@ -1741,31 +3138,25 @@ \pgfplotsdeclarepointmetasource{}{} \pgfplotsdeclarepointmetasource{x}{assign={% \let\pgfplots@current@point@meta=\pgfplots@current@point@x - \ifpgfplots@xislinear - \else - \pgfmathfloatparsenumber{\pgfplots@current@point@meta}% - \let\pgfplots@current@point@meta=\pgfmathresult - \fi}} + \pgfplotscoordmath{meta}{parsenumber}{\pgfplots@current@point@meta}% + \let\pgfplots@current@point@meta=\pgfmathresult + }} \pgfplotsdeclarepointmetasource{y}{assign={% \let\pgfplots@current@point@meta=\pgfplots@current@point@y - \ifpgfplots@yislinear - \else - \pgfmathfloatparsenumber{\pgfplots@current@point@meta}% - \let\pgfplots@current@point@meta=\pgfmathresult - \fi}} + \pgfplotscoordmath{meta}{parsenumber}{\pgfplots@current@point@meta}% + \let\pgfplots@current@point@meta=\pgfmathresult + }} \pgfplotsdeclarepointmetasource{z}{assign={% \let\pgfplots@current@point@meta=\pgfplots@current@point@z - \ifpgfplots@zislinear - \else - \pgfmathfloatparsenumber{\pgfplots@current@point@meta}% - \let\pgfplots@current@point@meta=\pgfmathresult - \fi}} + \pgfplotscoordmath{meta}{parsenumber}{\pgfplots@current@point@meta}% + \let\pgfplots@current@point@meta=\pgfmathresult + }} \pgfplotsdeclarepointmetasource{explicit}{% assign={% \ifx\pgfplots@current@point@meta\pgfutil@empty \else - \pgfmathfloatparsenumber{\pgfplots@current@point@meta}% + \pgfplotscoordmath{meta}{parsenumber}{\pgfplots@current@point@meta}% \let\pgfplots@current@point@meta=\pgfmathresult \fi }, @@ -1785,6 +3176,7 @@ \ifx\pgfplots@loc@TMPa\pgfutil@empty \else \pgfmathparse{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{meta}{parsenumber}{\pgfmathresult}% \let\pgfplots@current@point@meta=\pgfmathresult \fi },% @@ -1813,13 +3205,12 @@ }, }% - \pgfplotsdeclarepointmetasource{TeX code}{% assign={% \begingroup \let\pgfplotspointmeta=\pgfutil@empty \pgfplots@invoke@pgfkeyscode{/pgfplots/point meta/code/.@cmd}{}% - \pgfmathfloatparsenumber{\pgfplotspointmeta}% + \pgfplotscoordmath{meta}{parsenumber}{\pgfplotspointmeta}% \let\pgfplots@current@point@meta=\pgfmathresult \pgfmath@smuggleone\pgfplots@current@point@meta \endgroup @@ -1859,15 +3250,7 @@ % copy operations. That experiment was not successfull (it was not % faster :-( ). However, the streaming methods still assign their % things globally... -\newif\ifpgfplots@coord@stream@isfirst \def\pgfplots@coord@stream@start{% - \global\pgfplots@coord@stream@isfirsttrue - \global\let\pgfplots@currentplot@firstcoord@x=\pgfutil@empty - \global\let\pgfplots@currentplot@firstcoord@y=\pgfutil@empty - \global\let\pgfplots@currentplot@firstcoord@z=\pgfutil@empty - \global\let\pgfplots@currentplot@lastcoord@x=\pgfutil@empty - \global\let\pgfplots@currentplot@lastcoord@y=\pgfutil@empty - \global\let\pgfplots@currentplot@lastcoord@z=\pgfutil@empty \let\pgfplots@current@point@x=\pgfutil@empty \let\pgfplots@current@point@y=\pgfutil@empty \let\pgfplots@current@point@z=\pgfutil@empty @@ -1888,15 +3271,24 @@ % \pgfplots@current@point@meta \def\pgfplots@coord@stream@coord{% \pgfplots@coord@stream@coord@% +}% +\def\pgfplotscoordstream@firstlast@init{% + \global\let\pgfplots@currentplot@firstcoord@x=\pgfutil@empty + \global\let\pgfplots@currentplot@firstcoord@y=\pgfutil@empty + \global\let\pgfplots@currentplot@firstcoord@z=\pgfutil@empty + \global\let\pgfplots@currentplot@lastcoord@x=\pgfutil@empty + \global\let\pgfplots@currentplot@lastcoord@y=\pgfutil@empty + \global\let\pgfplots@currentplot@lastcoord@z=\pgfutil@empty +}% +\def\pgfplotscoordstream@firstlast@update{% \ifx\pgfplots@current@point@x\pgfutil@empty % only one \if is enough as ONE empty coordinate results all % others to be reset as well. \else - \ifpgfplots@coord@stream@isfirst + \ifx\pgfplots@currentplot@firstcoord@x\pgfutil@empty \global\let\pgfplots@currentplot@firstcoord@x=\pgfplots@current@point@x \global\let\pgfplots@currentplot@firstcoord@y=\pgfplots@current@point@y \global\let\pgfplots@currentplot@firstcoord@z=\pgfplots@current@point@z - \global\pgfplots@coord@stream@isfirstfalse \fi \global\let\pgfplots@currentplot@lastcoord@x=\pgfplots@current@point@x \global\let\pgfplots@currentplot@lastcoord@y=\pgfplots@current@point@y @@ -1906,34 +3298,54 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% Scanline management. The idea is to allow a simple syntax -% to provide matrix input - by means of scanlines. +% Scanline management. The idea is to handle complete sequences of +% input coordinates, which are usually separated by a blank line. +% +% This allows a simple syntax to provide matrix input - by means of scanlines. +% Furthermore, 2d plots can use it to interrupt the display. % % An empty line in 'addplot coordinates {}' indicates the end of a % scan line. Similarly, an empty line in 'addplot file' or 'table' % also indicates the end of a scan line. % -% The following methods allow to update the scanline computation. +% The steps taken whenever a scan line is complete depend on the +% configuration of the /pgfplots/empty line choice key (queried in +% \pgfplotsscanlinelengthinitzero). +% +% +% The following methods constitute the scanline interface. % % Usage: % % \pgfplotsscanlinelengthinitzero % % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinecomplete % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinecomplete % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinelengthincrease +% <process point> % \pgfplotsscanlinecomplete % % \pgfplotsscanlinelengthcleanup % +% In other words, the \pgfplotsscanlinelengthincrease routine is +% invoked *before* the point is processed. That's important. +% % Now, \pgfplotsscanlinelength expands to either % a) a negative number in which case there is no % unique scanline length. @@ -1942,13 +3354,72 @@ % had different lengths. % b) the scanline length. \def\pgfplotsscanlinelengthinitzero{% + \def\pgfplotsscanlinelength{-1}% + \pgfkeysgetvalue{/pgfplots/empty line}\pgfplots@loc@TMPa% + \edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa}% + \def\pgfplots@loc@TMPb{auto}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb + \pgfplotsdetermineemptylinehandler + \pgfkeysgetvalue{/pgfplots/empty line}\pgfplots@loc@TMPa% + \fi + \def\pgfplots@loc@TMPb{jump}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb + \def\pgfplots@loc@TMPa{nan}% alias for jump + \fi + \def\pgfplots@loc@TMPb{no op}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb + \def\pgfplots@loc@TMPa{none}% alias for no op + \fi + \pgfutil@ifundefined{pgfplotsscanlinelength@\pgfplots@loc@TMPa @initzero}{% + \pgfplots@error{Sorry, the choice `empty line=\pgfkeysvalueof{/pgfplots/empty line}' is unknown. Maybe you misspelled it}% + }{}% + \expandafter\let\expandafter\pgfplotsscanlinelength@initzero \csname pgfplotsscanlinelength@\pgfplots@loc@TMPa @initzero\endcsname + \expandafter\let\expandafter\pgfplotsscanlinelengthincrease \csname pgfplotsscanlinelength@\pgfplots@loc@TMPa @increase\endcsname + \edef\pgfplotsscanlinecomplete{% + \expandafter\noexpand\csname pgfplotsscanlinelength@\pgfplots@loc@TMPa @complete\endcsname + \noexpand\pgfplotsplothandlernotifyscanlinecomplete + }% + \expandafter\let\expandafter\pgfplotsscanlinelengthcleanup \csname pgfplotsscanlinelength@\pgfplots@loc@TMPa @cleanup\endcsname + \pgfplotsscanlinelength@initzero +}% + +\newif\ifpgfplots@emptyline@compat + +% Invoked for 'empty line=auto'. +% +% @POSTCONDITION: '/pgfplots/empty line' is set to something useful +% (not auto) +\def\pgfplotsdetermineemptylinehandler{% + \if n\pgfplots@meshmode + % no mesh/surf plot: + \pgfkeyssetvalue{/pgfplots/empty line}{jump}% + \ifpgfplots@emptyline@compat + \pgfkeyssetvalue{/pgfplots/empty line}{none}% do nothing for backwards compatibility with 2D processing. + \fi + \else + % it is a mesh or surf plot; use scanline: + \pgfkeyssetvalue{/pgfplots/empty line}{scanline}% + \fi +}% +\def\pgfplotsscanlinedisablechanges{% + \let\pgfplotsscanlinecomplete=\relax + \let\pgfplotsscanlinelengthincrease=\relax + \let\pgfplotsscanlinelengthcleanup=\relax + \let\pgfplotsscanlinelengthinitzero=\relax + \let\pgfplotsscanlineendofinput=\relax +}% + +% ------------------------------------------------------------------------------- +% empty line=scanline +% class: +\def\pgfplotsscanlinelength@scanline@initzero{% \c@pgfplots@scanlineindex=0 \def\pgfplots@scanlinelength{-1}% } -\def\pgfplotsscanlinelengthincrease{% +\def\pgfplotsscanlinelength@scanline@increase{% \advance\c@pgfplots@scanlineindex by1 } -\def\pgfplotsscanlinecomplete{% +\def\pgfplotsscanlinelength@scanline@complete{% \ifnum\pgfplots@scanlinelength>0 \ifnum\c@pgfplots@scanlineindex=0 % @@ -1973,7 +3444,7 @@ \fi \c@pgfplots@scanlineindex=0 } -\def\pgfplotsscanlinelengthcleanup{% +\def\pgfplotsscanlinelength@scanline@cleanup{% \ifnum\c@pgfplots@scanlineindex=0 % I assume the last scan line is already complete. \else @@ -1981,12 +3452,58 @@ \fi \let\pgfplotsscanlinelength=\pgfplots@scanlinelength } -\def\pgfplotsscanlinedisablechanges{% - \let\pgfplotsscanlinecomplete=\relax - \let\pgfplotsscanlinelengthincreas=\relax - \let\pgfplotsscanlinelengthcleanup=\relax - \let\pgfplotsscanlinelengthinitzero=\relax +% ------------------------------------------------------------------------------- +% +% empty line=none class: +% +\let\pgfplotsscanlinelength@none@initzero=\pgfutil@empty +\let\pgfplotsscanlinelength@none@increase=\relax +\let\pgfplotsscanlinelength@none@complete=\relax +\let\pgfplotsscanlinelength@none@cleanup=\relax +% ------------------------------------------------------------------------------- +% +% empty line=nan class: +\def\pgfplotsscanlinelength@nan@initzero{% + \def\pgfplotsscanlinelength@nan@isfirst{1}% + \let\pgfplotsscanlinelength@nan@pendingwork=\relax + \pgfplotsifinaxis{}{\let\pgfplotsaxisserializedatapoint=\relax}% +}% +\def\pgfplotsscanlinelength@nan@increase{% + \def\pgfplotsscanlinelength@nan@isfirst{0}% + \pgfplotsscanlinelength@nan@pendingwork +}% +\def\pgfplotsscanlinelength@nan@complete{% + \if1\pgfplotsscanlinelength@nan@isfirst + \else + \def\pgfplotsscanlinelength@nan@pendingwork{% + % this will be executed when the next point has been + % found. + \def\pgfplots@current@point@x{}% + \def\pgfplots@current@point@y{}% + \def\pgfplots@current@point@z{}% + % simply serialize an empty point. That works -- the + % visualization phase checks if the coordinates are empty and + % visualizes them as "jump" + % + % Note that \pgfplotsplothandlersurveypoint is not a good + % choice here unless one employs its 'unbounded coords=jump' + % feature + \def\pgfplotsaxisplothasjumps{1}% + \pgfplotsaxisserializedatapoint + % + \let\pgfplotsscanlinelength@nan@pendingwork=\relax + }% + \fi + \def\pgfplotsscanlinelength@nan@isfirst{1}% }% +\let\pgfplotsscanlinelength@nan@cleanup=\relax +% +% ------------------------------------------------------------------------------- + + +\def\pgfplotsaxisfilteredcoordsaway{0}% +\def\pgfplotsaxisplothasjumps{0}% +\newif\ifpgfplotsaxisparsecoordinateok % Initialises % \pgfplots@coord@stream@start @@ -2046,235 +3563,26 @@ % be as deep as necessary - as long as all operations have the % same level of scoping. % +% @see the detailed documentation in pgfplotsplothandlers.code.tex \long\def\pgfplots@PREPARE@COORD@STREAM#1{% \ifpgfplots@curplot@threedim \global\pgfplots@threedimtrue \fi + \def\pgfplotsaxisfilteredcoordsaway{0}% + \def\pgfplotsaxisplothasjumps{0}% % + \ifpgfplots@curplot@threedim + \let\pgfplotsaxisupdatelimitsforcoordinate=\pgfplotsaxisupdatelimitsforcoordinatethreedim + \let\pgfplotsaxisparsecoordinate=\pgfplotsaxisparsecoordinatethreedim + \else + \let\pgfplotsaxisupdatelimitsforcoordinate=\pgfplotsaxisupdatelimitsforcoordinatetwodim + \let\pgfplotsaxisparsecoordinate=\pgfplotsaxisparsecoordinatetwodim + \fi \begingroup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \let\E=\noexpand % - % Setup Just-In-Time-Macro Compilation: - % I compile a set of macros which is highly optimized for this - % particular plot. - % - % 1.\pgfplots@update@limits@for@one@point - % Updates the current x and y limits for point (#1,#2). - % - % To eliminate all those case distinctions, it is created with - % 'edef' and a lot of '\noexpand' calls here: - % - % - % The point coordinates may be given in floating point format, see - % below. - % - % Please note that if user specified limits are given, automatic - % limits are only applied to points which fall into the user specified - % clipping region. - % - % PRECONDITIONS: - % - the input coordinates have been parsed correctly (floating point - % format for linear axis, log applied for logarithmic ones) - % - % Arguments: - % \pgfplots@current@point@[xyz] - \xdef\pgfplots@update@limits@for@one@point{% -%\E\tracingmacros=2\E\tracingcommands=2 -%\E\pgfplots@message{Updating limits for (\E\pgfplots@current@point@x,\E\pgfplots@current@point@y) ...}% - % - % VIM SEARCH PATTERN: - % [^E]\zs\\\ze[^E] - % -> this finds '\' which is neither '\E' nor is it prefixed - % by 'E'. - % - % - % - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDfalse - % check whether we need to clip limits: - \ifpgfplots@clip@limits - \ifpgfplots@autocompute@xmin - \else - \ifpgfplots@xislinear - \E\pgfmathfloatlessthan@{\E\pgfplots@current@point@x}{\E\pgfplots@xmin}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \else - \E\pgfplotsmathlessthan{\E\pgfplots@current@point@x}{\E\pgfplots@xmin}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \fi - \fi - \ifpgfplots@autocompute@xmax - \else - \ifpgfplots@xislinear - \E\pgfmathfloatlessthan@{\E\pgfplots@xmax}{\E\pgfplots@current@point@x}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \else - \E\pgfplotsmathlessthan{\E\pgfplots@xmax}{\E\pgfplots@current@point@x}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \fi - \fi - \ifpgfplots@autocompute@ymin - \else - \ifpgfplots@yislinear - \E\pgfmathfloatlessthan@{\E\pgfplots@current@point@y}{\E\pgfplots@ymin}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \else - \E\pgfplotsmathlessthan{\E\pgfplots@current@point@y}{\E\pgfplots@ymin}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \fi - \fi - \ifpgfplots@autocompute@ymax - \else - \ifpgfplots@yislinear - \E\pgfmathfloatlessthan@{\E\pgfplots@ymax}{\E\pgfplots@current@point@y}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \else - \E\pgfplotsmathlessthan{\E\pgfplots@ymax}{\E\pgfplots@current@point@y}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \fi - \fi - \ifpgfplots@curplot@threedim - \ifpgfplots@autocompute@zmin - \else - \ifpgfplots@zislinear - \E\pgfmathfloatlessthan@{\E\pgfplots@current@point@z}{\E\pgfplots@zmin}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \else - \E\pgfplotsmathlessthan{\E\pgfplots@current@point@z}{\E\pgfplots@zmin}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \fi - \fi - \ifpgfplots@autocompute@zmax - \else - \ifpgfplots@zislinear - \E\pgfmathfloatlessthan@{\E\pgfplots@zmax}{\E\pgfplots@current@point@z}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \else - \E\pgfplotsmathlessthan{\E\pgfplots@zmax}{\E\pgfplots@current@point@z}% - \E\ifpgfmathfloatcomparison - \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue - \E\fi - \fi - \fi - \fi - \fi - % - % - % - % Update limits: - \E\ifpgfplots@update@limits@for@one@point@ISCLIPPED - \E\else - \ifpgfplots@autocompute@xmin - \ifpgfplots@xislinear - \E\pgfplotsmathfloatmin{\E\pgfplots@xmin}{\E\pgfplots@current@point@x}% - \E\global\E\let\E\pgfplots@xmin=\E\pgfmathresult - \else - \E\pgfplotsmathmin{\E\pgfplots@xmin}{\E\pgfplots@current@point@x}% - \E\global\E\let\E\pgfplots@xmin=\E\pgfmathresult - \fi - \fi - \ifpgfplots@autocompute@xmax - \ifpgfplots@xislinear - \E\pgfplotsmathfloatmax{\E\pgfplots@xmax}{\E\pgfplots@current@point@x}% - \E\global\E\let\E\pgfplots@xmax=\E\pgfmathresult - \else - \E\pgfplotsmathmax{\E\pgfplots@xmax}{\E\pgfplots@current@point@x}% - \E\global\E\let\E\pgfplots@xmax=\E\pgfmathresult - \fi - \fi - \ifpgfplots@autocompute@ymin - \ifpgfplots@yislinear - \E\pgfplotsmathfloatmin{\E\pgfplots@ymin}{\E\pgfplots@current@point@y}% - \E\global\E\let\E\pgfplots@ymin=\E\pgfmathresult - \else - \E\pgfplotsmathmin{\E\pgfplots@ymin}{\E\pgfplots@current@point@y}% - \E\global\E\let\E\pgfplots@ymin=\E\pgfmathresult - \fi - \fi - \ifpgfplots@autocompute@ymax - \ifpgfplots@yislinear - \E\pgfplotsmathfloatmax{\E\pgfplots@ymax}{\E\pgfplots@current@point@y}% - \E\global\E\let\E\pgfplots@ymax=\E\pgfmathresult - \else - \E\pgfplotsmathmax{\E\pgfplots@ymax}{\E\pgfplots@current@point@y}% - \E\global\E\let\E\pgfplots@ymax=\E\pgfmathresult - \fi - \fi - \ifpgfplots@curplot@threedim - \ifpgfplots@autocompute@zmin - \ifpgfplots@zislinear - \E\pgfplotsmathfloatmin{\E\pgfplots@zmin}{\E\pgfplots@current@point@z}% - \E\global\E\let\E\pgfplots@zmin=\E\pgfmathresult - \else - \E\pgfplotsmathmin{\E\pgfplots@zmin}{\E\pgfplots@current@point@z}% - \E\global\E\let\E\pgfplots@zmin=\E\pgfmathresult - \fi - \fi - \ifpgfplots@autocompute@zmax - \ifpgfplots@zislinear - \E\pgfplotsmathfloatmax{\E\pgfplots@zmax}{\E\pgfplots@current@point@z}% - \E\global\E\let\E\pgfplots@zmax=\E\pgfmathresult - \else - \E\pgfplotsmathmax{\E\pgfplots@zmax}{\E\pgfplots@current@point@z}% - \E\global\E\let\E\pgfplots@zmax=\E\pgfmathresult - \fi - \fi - \fi - \E\fi - % - % Compute data range: - \ifpgfplots@autocompute@all@limits - % the data range will be acquired simply from the axis - % range, see below! - \else - % Attention: it is only done for linear axis! - \ifpgfplots@xislinear - \E\pgfplotsmathfloatmin{\E\pgfplots@data@xmin}{\E\pgfplots@current@point@x}% - \E\global\E\let\E\pgfplots@data@xmin=\E\pgfmathresult - \E\pgfplotsmathfloatmax{\E\pgfplots@data@xmax}{\E\pgfplots@current@point@x}% - \E\global\E\let\E\pgfplots@data@xmax=\E\pgfmathresult - \fi - \ifpgfplots@yislinear - \E\pgfplotsmathfloatmin{\E\pgfplots@data@ymin}{\E\pgfplots@current@point@y}% - \E\global\E\let\E\pgfplots@data@ymin=\E\pgfmathresult - \E\pgfplotsmathfloatmax{\E\pgfplots@data@ymax}{\E\pgfplots@current@point@y}% - \E\global\E\let\E\pgfplots@data@ymax=\E\pgfmathresult - \fi - \ifpgfplots@curplot@threedim - \ifpgfplots@zislinear - \E\pgfplotsmathfloatmin{\E\pgfplots@data@zmin}{\E\pgfplots@current@point@z}% - \E\global\E\let\E\pgfplots@data@zmin=\E\pgfmathresult - \E\pgfplotsmathfloatmax{\E\pgfplots@data@zmax}{\E\pgfplots@current@point@z}% - \E\global\E\let\E\pgfplots@data@zmax=\E\pgfmathresult - \fi - \fi - \fi -%\E\pgfplots@message{Updated limits: (\E\pgfplots@xmin,\E\pgfplots@ymin) rectangle (\E\pgfplots@xmax,\E\pgfplots@ymax).}% -%\E\tracingmacros=0\E\tracingcommands=0 - }% -%\message{Assembled update-limits \ifpgfplots@curplot@threedim 3D\else 2D\fi macro to {\meaning\pgfplots@update@limits@for@one@point}}% +%\message{Assembled update-limits \ifpgfplots@curplot@threedim 3D\else 2D\fi macro to {\meaning\pgfplotsaxisupdatelimitsforcoordinate}}% \ifpgfplots@bb@isactive \else % we are inside of @@ -2282,205 +3590,107 @@ % .. % \endpgfinterruptboundingbox % -> don't change data limits! - \global\let\pgfplots@update@limits@for@one@point=\relax + \gdef\pgfplotsaxisupdatelimitsforcoordinate##1##2##3{}% \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % - % This here is the MAIN code of \pgfplots@process@one@point . - % It is inserted below into the right, into one of two prepared - % places. - \def\pgfplots@loc@surveypoint{% - \ifpgfplots@apply@datatrafo - \ifpgfplots@datascaletrafo@initialised - % apply data transformation directly. - \ifpgfplots@apply@datatrafo@x - \E\pgfplots@datascaletrafo@x\E\pgfplots@current@point@x - \E\let\E\pgfplots@current@point@x=\E\pgfmathresult - \fi - \ifpgfplots@apply@datatrafo@y - \E\pgfplots@datascaletrafo@y\E\pgfplots@current@point@y - \E\let\E\pgfplots@current@point@y=\E\pgfmathresult - \fi - \ifpgfplots@curplot@threedim - \ifpgfplots@apply@datatrafo@z - \E\pgfplots@datascaletrafo@z\E\pgfplots@current@point@z - \E\let\E\pgfplots@current@point@z=\E\pgfmathresult - \fi - \fi - \fi - \fi - % All following routines (limit updating/stacking/error - % bars) will use float numerics if necessary (controlled - % by ifs). - \ifpgfplots@stackedmode - \E\pgfplots@stacked@preparepoint@inmacro% - \ifpgfplots@datascaletrafo@initialised% is also true if there is no scale trafo. - \E\pgfplots@stacked@finishpoint - \else - % the finishpoint routine will be invoked at - % \endaxis. - \fi - \fi - % - % Prepare \pgfplots@current@point@meta (see the preparation - % routine above): - \E\pgfplots@set@perpointmeta - % - % update also axis / data limits: - % Arguments: \pgfplots@current@point@[xy] - \E\pgfplots@update@limits@for@one@point - \ifpgfplots@errorbars@enabled - % This thing gets the 'current@point@...' context, - % that means - % \pgfplots@current@point@[xy] - % \pgfplots@current@point@[xy]@error - % \pgfplots@current@point@[xy]@unfiltered - \E\pgfplots@PREPARE@errorbar@process@x% - \E\pgfplots@PREPARE@errorbar@process@y% - \E\pgfplots@PREPARE@errorbar@process@z% - \fi - % - \ifpgfplots@collect@firstplot@astick - \ifnum\pgfplots@numplots=0 - \E\ifx\E\pgfplots@firstplot@coords@x\E\pgfutil@empty - \E\t@pgfplots@tokc={}% - \E\else - \E\t@pgfplots@tokc=\E\expandafter{\E\pgfplots@firstplot@coords@x,}% - \E\fi - \E\xdef\E\pgfplots@firstplot@coords@x{\E\the\E\t@pgfplots@tokc\E\pgfplots@current@point@x}% - \E\ifx\E\pgfplots@firstplot@coords@y\E\pgfutil@empty - \E\t@pgfplots@tokc={}% - \E\else - \E\t@pgfplots@tokc=\E\expandafter{\E\pgfplots@firstplot@coords@y,}% - \E\fi - \E\xdef\E\pgfplots@firstplot@coords@y{\E\the\E\t@pgfplots@tokc\E\pgfplots@current@point@y}% - % - \ifpgfplots@curplot@threedim - \E\ifx\E\pgfplots@firstplot@coords@z\E\pgfutil@empty - \E\t@pgfplots@tokc={}% - \E\else - \E\t@pgfplots@tokc=\E\expandafter{\E\pgfplots@firstplot@coords@z,}% - \E\fi - \E\xdef\E\pgfplots@firstplot@coords@z{\E\the\E\t@pgfplots@tokc\E\pgfplots@current@point@z}% - \fi + % + % Takes a coordinate which is already parsed and applies steps + % such that it becomes its final values. + % + % This implements the stacked plot feature currently. + % + % PRECONDITION: + % \pgfplotsaxisparsecoordinate has already been called. + % + % POSTCONDITION: + % the point has its final coordinates; the axis won't change it + % anymore. + \xdef\pgfplotsaxispreparecoordinate{% + \E\ifpgfplotsaxisparsecoordinateok + % All following routines (limit updating/stacking/error + % bars) will use float numerics if necessary (controlled + % by ifs). + \E\pgfplotsaxistransformfromdatacs + \ifpgfplots@stackedmode + \E\pgfplots@stacked@preparepoint@inmacro% \fi - \fi - % - }% - \def\pgfplots@loc@performserizalization{% - % Store normalized point for list: - % We need - % xi,yi,zi,mi; - % where zi and mi may be empty. mi is the per-point meta - % information. It is used for per-coordinate marker - % modifications (like colormaps for scatter plots). - \E\edef\E\pgfplots@loc@TMPa{\E\pgfplots@current@point@x,\E\pgfplots@current@point@y,\E\pgfplots@current@point@z,\E\pgfplots@current@point@meta;}% - \E\expandafter\E\pgfplotsapplistXXpushback\E\expandafter{\E\pgfplots@loc@TMPa}% + \E\fi }% - % The following code assembles the command which is executed for - % each coordinate. % - % To eliminate all those case distinctions, it is created with - % 'edef' and a lot of '\noexpand' calls here: + % A macro which should be called once for every data point during the + % survey phase. % - % Arguments: - % \pgfplots@current@point@[xyz] - % \pgfplots@current@point@[xyz]@error (if in argument list) - \xdef\pgfplots@process@one@point{% - % These things are necessary for error bars and are available - % as public results in math parser invocations (for meta and - % filters) - \E\let\E\pgfplots@current@point@x@unfiltered=\E\pgfplots@current@point@x - \E\let\E\pgfplots@current@point@y@unfiltered=\E\pgfplots@current@point@y - \E\let\E\pgfplots@current@point@z@unfiltered=\E\pgfplots@current@point@z - \E\def\E\pgfplots@unbounded@dir{}% - % - \E\pgfplots@prepare@xcoord{\E\pgfplots@current@point@x}% - \E\expandafter\E\pgfplots@invoke@filter\E\expandafter{\E\pgfmathresult}{x}% - \E\let\E\pgfplots@current@point@x=\E\pgfmathresult - % - \E\pgfplots@prepare@ycoord{\E\pgfplots@current@point@y}% - \E\expandafter\E\pgfplots@invoke@filter\E\expandafter{\E\pgfmathresult}{y}% - \E\let\E\pgfplots@current@point@y=\E\pgfmathresult - % - \ifpgfplots@curplot@threedim - \E\pgfplots@prepare@zcoord{\E\pgfplots@current@point@z}% - \E\expandafter\E\pgfplots@invoke@filter\E\expandafter{\E\pgfmathresult}{z}% - \E\let\E\pgfplots@current@point@z=\E\pgfmathresult - \fi - % - \E\pgfplots@invoke@filter@xyz - % - \ifpgfplots@xislinear - % NOTE: this handling of unbounded coords in the case of - % LOG coords is performed directly by - % \pgfplots@prepare@ycoord! - \E\ifx\E\pgfplots@current@point@x\E\pgfutil@empty - \E\else - \E\pgfmathfloatparsenumber{\E\pgfplots@current@point@x}% - \E\expandafter\E\pgfmathfloat@decompose@F\E\pgfmathresult\E\relax\E\c@pgf@counta - \E\ifnum\E\c@pgf@counta>2 % this clears nan, inf and -inf points. - \E\let\E\pgfplots@current@point@x=\E\pgfutil@empty - \E\def\E\pgfplots@unbounded@dir{x}% - \E\else - \E\let\E\pgfplots@current@point@x=\E\pgfmathresult - \E\fi - \E\fi - \fi - % - \ifpgfplots@yislinear - \E\ifx\E\pgfplots@current@point@y\E\pgfutil@empty - \E\else - \E\pgfmathfloatparsenumber{\E\pgfplots@current@point@y}% - \E\expandafter\E\pgfmathfloat@decompose@F\E\pgfmathresult\E\relax\E\c@pgf@counta - \E\ifnum\E\c@pgf@counta>2 - \E\let\E\pgfplots@current@point@y=\E\pgfutil@empty - \E\def\E\pgfplots@unbounded@dir{y}% - \E\else - \E\let\E\pgfplots@current@point@y=\E\pgfmathresult - \E\fi - \E\fi - \fi - % - \ifpgfplots@curplot@threedim + % The caller is the plot handler's point survey routine. + % + % A data point might be a complicated thing which contains + % multiple coordinates. You need to invoke + % \pgfplotsaxisparsecoordinate and + % \pgfplotsaxispreparecoordinate for each of them. But + % \pgfplotsaxisdatapointsurveyed is invoked once for the complete + % set. + % + % @PRECONDITION + % - \pgfplots@current@point@[xyz] contain final coordinates + % (i.e. output of \pgfplotsaxispreparecoordinate) + % + % @POSTCONDITION + % - stacked plot things, + % - error bars, + % - xtick=data + % are all processed. + % + \xdef\pgfplotsaxisdatapointsurveyed{% + \E\ifpgfplotsaxisparsecoordinateok + % All following routines (limit updating/stacking/error + % bars) will use float numerics if necessary (controlled + % by ifs). % - \ifpgfplots@zislinear - \E\ifx\E\pgfplots@current@point@z\E\pgfutil@empty - \E\else - \E\pgfmathfloatparsenumber{\E\pgfplots@current@point@z}% - \E\expandafter\E\pgfmathfloat@decompose@F\E\pgfmathresult\E\relax\E\c@pgf@counta - \E\ifnum\E\c@pgf@counta>2 - \E\let\E\pgfplots@current@point@z=\E\pgfutil@empty - \E\def\E\pgfplots@unbounded@dir{z}% + % Prepare \pgfplots@current@point@meta (see the preparation + % routine above): + \E\pgfplots@set@perpointmeta + % + \ifpgfplots@errorbars@enabled + % This thing gets the 'current@point@...' context, + % that means + % \pgfplots@current@point@[xy] + % \pgfplots@current@point@[xy]@error + % \pgfplots@current@point@[xy]@unfiltered + \E\pgfplots@PREPARE@errorbar@process@x% + \E\pgfplots@PREPARE@errorbar@process@y% + \E\pgfplots@PREPARE@errorbar@process@z% + \fi + % + \ifpgfplots@collect@firstplot@astick + \ifnum\pgfplots@numplots=0 + \E\ifx\E\pgfplots@firstplot@coords@x\E\pgfutil@empty + \E\t@pgfplots@tokc={}% \E\else - \E\let\E\pgfplots@current@point@z=\E\pgfmathresult + \E\t@pgfplots@tokc=\E\expandafter{\E\pgfplots@firstplot@coords@x,}% \E\fi - \E\fi - \fi - \fi - % - % check if coordinates are bounded: - \E\pgfplots@loc@tmptrue - \E\ifx\E\pgfplots@current@point@x\E\pgfutil@empty - \E\pgfplots@loc@tmpfalse - \E\else - \E\ifx\E\pgfplots@current@point@y\E\pgfutil@empty - \E\pgfplots@loc@tmpfalse - \E\else - \ifpgfplots@curplot@threedim - \E\ifx\E\pgfplots@current@point@z\E\pgfutil@empty - \E\pgfplots@loc@tmpfalse + \E\xdef\E\pgfplots@firstplot@coords@x{\E\the\E\t@pgfplots@tokc\E\pgfplots@current@point@x}% + \E\ifx\E\pgfplots@firstplot@coords@y\E\pgfutil@empty + \E\t@pgfplots@tokc={}% + \E\else + \E\t@pgfplots@tokc=\E\expandafter{\E\pgfplots@firstplot@coords@y,}% \E\fi + \E\xdef\E\pgfplots@firstplot@coords@y{\E\the\E\t@pgfplots@tokc\E\pgfplots@current@point@y}% + % + \ifpgfplots@curplot@threedim + \E\ifx\E\pgfplots@firstplot@coords@z\E\pgfutil@empty + \E\t@pgfplots@tokc={}% + \E\else + \E\t@pgfplots@tokc=\E\expandafter{\E\pgfplots@firstplot@coords@z,}% + \E\fi + \E\xdef\E\pgfplots@firstplot@coords@z{\E\the\E\t@pgfplots@tokc\E\pgfplots@current@point@z}% + \fi \fi - \E\fi - \E\fi - % - \E\ifpgfplots@loc@tmp - % coordinate is bounded AND non-empty, ok. - % insert the main 2d/3d code here: - \pgfplots@loc@surveypoint - \pgfplots@loc@performserizalization + \fi + \E\pgfplotscoordstream@firstlast@update + \E\pgfplotsaxisserializedatapoint \E\else + % COORDINATE HAS BEEN FILTERED AWAY: + % % make ALL empty to simplify special case checking: \E\let\E\pgfplots@current@point@x=\E\pgfutil@empty \E\let\E\pgfplots@current@point@y=\E\pgfutil@empty @@ -2488,6 +3698,7 @@ % check whether we have UNBOUNDED or just unfiltered % coords: \if\pgfplots@unbounded@handler d% unbounded coords=discard + \E\def\E\pgfplotsaxisfilteredcoordsaway{1}% \ifpgfplots@warn@for@filter@discards \E\pgfplots@message{% NOTE: coordinate (\E\pgfplots@current@point@x@unfiltered,\E\pgfplots@current@point@y@unfiltered\ifpgfplots@curplot@threedim,\E\pgfplots@current@point@z@unfiltered\fi) @@ -2502,6 +3713,7 @@ \else % unbounded coords=jump \E\ifx\E\pgfplots@unbounded@dir\E\pgfutil@empty + \E\def\E\pgfplotsaxisfilteredcoordsaway{1}% \ifpgfplots@warn@for@filter@discards \E\pgfplots@message{% NOTE: coordinate (\E\pgfplots@current@point@x@unfiltered,\E\pgfplots@current@point@y@unfiltered\ifpgfplots@curplot@threedim,\E\pgfplots@current@point@z@unfiltered\fi) @@ -2509,7 +3721,8 @@ }% \fi \E\else - \pgfplots@loc@performserizalization + \E\def\E\pgfplotsaxisplothasjumps{1}% + \E\pgfplotsaxisserializedatapoint \E\fi \fi \E\fi @@ -2517,13 +3730,21 @@ % increase \pgfplots@current@point@coordindex: \E\advance\E\c@pgfplots@coordindex by1 }% + % + % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endgroup -%\message{Prepared macro \string\pgfplots@update@limits@for@one@point: {\meaning\pgfplots@update@limits@for@one@point}}% + % + \def\pgfplotsaxissurveysetpointmeta{\pgfplots@set@perpointmeta}% + % +%\message{Prepared macro \string\pgfplots@update@limits@for@one@point: {\meaning\pgfplotsaxisupdatelimitsforcoordinate}}% %\message{Prepared macro \string\pgfplots@process@one@point: {\meaning\pgfplots@process@one@point}}% % \let\pgfplots@coord@stream@start@=\pgfplots@PREPARE@COORD@STREAM@start@ - \let\pgfplots@coord@stream@coord@=\pgfplots@process@one@point + \def\pgfplots@coord@stream@coord@{% + \def\pgfplots@set@perpointmeta@done{0}% + \pgfplotsplothandlersurveypoint + }% \def\pgfplots@coord@stream@end@{\pgfplots@PREPARE@COORD@STREAM@end@{#1}}% }% @@ -2539,6 +3760,16 @@ % optimized 'applistXX' structure: \pgfplotsapplistXXnewempty % + \csname pgfpmeta@\pgfplotspointmetainputhandler @activate\endcsname + \pgfplotsplothandlersurveystart + \pgfplotscoordstream@firstlast@init + % + \pgfkeyssetvalue{/data point/x}{\pgfplots@current@point@x}% + \pgfkeyssetvalue{/data point/y}{\pgfplots@current@point@y}% + \pgfkeyssetvalue{/data point/z}{\pgfplots@current@point@z}% + \pgfkeyssetvalue{/data point/meta}{\pgfplots@current@point@meta}% + % + \pgfplots@prepare@visualization@dependencies % \ifpgfplots@errorbars@enabled % prepare error bar processing. @@ -2577,17 +3808,21 @@ \pgfplotsmathdeclarepseudoconstant{meta}{% \let\pgfmathresult=\pgfplots@current@point@meta \ifx\pgfmathresult\pgfutil@empty - \pgfmathfloatcreate{0}{0.0}{0}% + \pgfplotscoordmath{meta}{parsenumber}{0}% \fi }% - \csname pgfpmeta@\pgfplotspointmetainputhandler @activate\endcsname % % %%%%%%%%%%%%%% % % Define \pgfplots@set@perpointmeta properly: \def\pgfplots@set@perpointmeta{% - \csname pgfpmeta@\pgfplotspointmetainputhandler @assign\endcsname + \if0\pgfplots@set@perpointmeta@done + \csname pgfpmeta@\pgfplotspointmetainputhandler @assign\endcsname + \def\pgfplots@set@perpointmeta@done{1}% + \pgfplots@set@perpointmeta@limits + \fi }% + % append limit updating to \pgfplots@set@perpointmeta : \if0\csname pgfpmeta@\pgfplotspointmetainputhandler @issymbolic\endcsname % We need to work with per point meta data. % So, also compute the data range on a per-plot basis! @@ -2597,37 +3832,43 @@ \ifx\pgfplots@metamin\pgfutil@empty \global\let\pgfplots@metamin=\pgfplots@invalidrange@metamin \t@pgfplots@tokb=\expandafter{\the\t@pgfplots@tokb - \pgfplotsmathfloatmin{\pgfplots@metamin}{\pgfplots@current@point@meta}% + \pgfplotscoordmath{meta}{min}{\pgfplots@metamin}{\pgfplots@current@point@meta}% \global\let\pgfplots@metamin=\pgfmathresult }% \else - \pgfmathfloatparsenumber{\pgfplots@metamin}% + \pgfplotscoordmath{meta}{parsenumber}{\pgfplots@metamin}% \global\let\pgfplots@metamin=\pgfmathresult \fi \pgfkeysgetvalue{/pgfplots/point meta max}\pgfplots@metamax \ifx\pgfplots@metamax\pgfutil@empty \global\let\pgfplots@metamax=\pgfplots@invalidrange@metamax \t@pgfplots@tokb=\expandafter{\the\t@pgfplots@tokb - \pgfplotsmathfloatmax{\pgfplots@metamax}{\pgfplots@current@point@meta}% + \pgfplotscoordmath{meta}{max}{\pgfplots@metamax}{\pgfplots@current@point@meta}% \global\let\pgfplots@metamax=\pgfmathresult }% \else - \pgfmathfloatparsenumber{\pgfplots@metamax}% + \pgfplotscoordmath{meta}{parsenumber}{\pgfplots@metamax}% \global\let\pgfplots@metamax=\pgfmathresult \fi % - \t@pgfplots@toka=\expandafter{\pgfplots@set@perpointmeta}% - \edef\pgfplots@set@perpointmeta{% - \the\t@pgfplots@toka + \edef\pgfplots@set@perpointmeta@limits{% \noexpand\ifx\noexpand\pgfplots@current@point@meta\noexpand\pgfutil@empty \noexpand\else \the\t@pgfplots@tokb \noexpand\fi }% + \def\pgfplotsaxisupdatelimitsforpointmeta##1{% + \begingroup + \def\pgfplots@current@point@meta{##1}% + \pgfplots@set@perpointmeta@limits + \endgroup + }% \else % there is no point meta: \global\let\pgfplots@metamin=\pgfutil@empty \global\let\pgfplots@metamax=\pgfutil@empty + \let\pgfplots@set@perpointmeta@limits=\relax + \def\pgfplotsaxisupdatelimitsforpointmeta##1{}% \fi }% % This is the \pgfplots@coord@stream@end@ routine which is invoked by @@ -2644,14 +3885,17 @@ % % #1,#2: see \pgfplots@PREPARE@COORD@STREAM \def\pgfplots@PREPARE@COORD@STREAM@end@#1{% + \pgfkeysvalueof{/pgfplots/execute at end survey}% + \pgfkeyssetvalue{/pgfplots/mesh/num points}{\pgfplots@current@point@coordindex}% + \pgfplotsplothandlersurveyend \ifx\pgfplots@metamin\pgfutil@empty \else \if\pgfplots@axiswide@metamin@autocompute1% - \pgfplotsmathfloatmin{\pgfplots@axiswide@metamin}{\pgfplots@metamin}% + \pgfplotscoordmath{meta}{min}{\pgfplots@axiswide@metamin}{\pgfplots@metamin}% \global\let\pgfplots@axiswide@metamin=\pgfmathresult \fi \if\pgfplots@axiswide@metamax@autocompute1% - \pgfplotsmathfloatmax{\pgfplots@axiswide@metamax}{\pgfplots@metamax}% + \pgfplotscoordmath{meta}{max}{\pgfplots@axiswide@metamax}{\pgfplots@metamax}% \global\let\pgfplots@axiswide@metamax=\pgfmathresult \fi \fi @@ -2677,7 +3921,7 @@ \ifpgfplots@stackedmode \pgfplots@stacked@endplot \fi - \ifpgfplots@coord@stream@isfirst + \ifx\pgfplots@currentplot@firstcoord@x\pgfutil@empty \pgfplots@warning{the current plot has no coordinates (or all have been filtered away)}% \else % Idea: use @@ -2688,10 +3932,12 @@ % to share plot specifications between error bars and plot % coordinates. Unfortunately, it is NOT sufficient to use % \tikzset - \pgfkeyssetvalue{/pgfplots/mesh/num points}{\pgfplots@current@point@coordindex}% \pgfplotspreparemeshkeydefaults% \pgfplots@PREPARE@COORD@STREAM@end@determinecoordsorting x% \pgfplots@PREPARE@COORD@STREAM@end@determinecoordsorting y% + \t@pgfplots@tokc=\expandafter{\pgfplots@addplot@survey@@optionlist,% + /pgfplots/.cd,/pgfplots/every axis plot post}% + \edef\pgfplots@addplot@survey@@optionlist{\the\t@pgfplots@tokc}% \ifpgfplots@curplot@isirrelevant % for \label commands: \expandafter\pgfplots@rememberplotspec@for@label\expandafter{\pgfplots@addplot@survey@@optionlist}% @@ -2703,12 +3949,8 @@ \t@pgfplots@toka=\expandafter{\pgfplots@addplot@survey@@optionlist}% % ATTENTION: do NOT call list macros from here on! % - \ifpgfplots@datascaletrafo@initialised - \pgfplots@addplot@get@named@startendpoints@command\pgfplots@loc@TMPa - \t@pgfplots@tokc=\expandafter{\pgfplots@loc@TMPa}% - \else - \t@pgfplots@tokc={}% - \fi + \pgfplotsplothandlerserializestateto\pgfplots@loc@TMPa + \t@pgfplots@tokb=\expandafter{\pgfplots@loc@TMPa}% % SERIALIZE RESULT: % % everything which has been accumulated so far (including the @@ -2745,18 +3987,21 @@ \noexpand\pgfkeyssetvalue{/pgfplots/samples at}{\pgfplots@plot@samples@at}% \noexpand\pgfkeyssetvalue{/pgfplots/mesh/rows}{\pgfkeysvalueof{/pgfplots/mesh/rows}}% \noexpand\pgfkeyssetvalue{/pgfplots/mesh/cols}{\pgfkeysvalueof{/pgfplots/mesh/cols}}% + \noexpand\pgfkeyssetvalue{/pgfplots/mesh/num points}{\pgfkeysvalueof{/pgfplots/mesh/num points}}% % either '+' or '-' : \noexpand\pgfkeyssetvalue{/pgfplots/x coord sorting}{\pgfkeysvalueof{/pgfplots/x coord sorting}}% \noexpand\pgfkeyssetvalue{/pgfplots/y coord sorting}{\pgfkeysvalueof{/pgfplots/y coord sorting}}% % \noexpand\pgfplots@initzerolevelhandler - \the\t@pgfplots@tokc% named start/end points (if already available) \noexpand\pgfplots@define@currentplotstyle@as{\the\t@pgfplots@toka}% remember 'current plot style' % per-point meta data ranges which apply only to % this plot: \noexpand\xdef\noexpand\pgfplots@metamin{\pgfplots@metamin}% \noexpand\xdef\noexpand\pgfplots@metamax{\pgfplots@metamax}% \noexpand\def\noexpand\pgfplotspointmetainputhandler{\pgfplotspointmetainputhandler}% + \noexpand\def\noexpand\pgfplots@serialized@state@plothandler{\the\t@pgfplots@tokb}% + \noexpand\def\noexpand\pgfplotsaxisfilteredcoordsaway{\pgfplotsaxisfilteredcoordsaway}% + \noexpand\def\noexpand\pgfplotsaxisplothasjumps{\pgfplotsaxisplothasjumps}% }% {% draw command: \noexpand\path% @@ -2803,234 +4048,363 @@ \pgfplots@end@plot }% -% PRECONDITION: must be called inside of -% \pgfplots@PREPARE@COORD@STREAM@end@. + +% A routine which transforms the current set of +% \pgfplots@current@point@[xyz] values to the coordinate system +% accepted by the actual axis. +\def\pgfplotsaxistransformfromdatacs{% + \pgfkeyslet{/data point/x}\pgfplots@current@point@x + \pgfkeyslet{/data point/y}\pgfplots@current@point@y + \pgfkeyslet{/data point/z}\pgfplots@current@point@z + \pgfplotsaxistransformcs + {\pgfkeysvalueof{/pgfplots/data cs}} + {\pgfkeysvalueof{/pgfplots/@expected axis cs}}% + \pgfkeysgetvalue{/data point/x}\pgfplots@current@point@x + \pgfkeysgetvalue{/data point/y}\pgfplots@current@point@y + \pgfkeysgetvalue{/data point/z}\pgfplots@current@point@z +}% + +% Changes '/data point/[xyz]' to the new coordinate system +% (cs) designated by '#2'. % -% POSTCONDITION: -% assigns '/pgfplots/#1 coord sorting=[+-]' -% i.e. whether #1 (x or y or z) coordinates are in ascending (+) ordering or in -% descending order (-). -\def\pgfplots@PREPARE@COORD@STREAM@end@determinecoordsorting#1{% - \pgfplots@if{pgfplots@#1islinear}{% - \pgfmathfloatlessthan@ - {\csname pgfplots@currentplot@firstcoord@#1\endcsname} - {\csname pgfplots@currentplot@lastcoord@#1\endcsname}% - }{% - \pgfplotsmathlessthan - {\csname pgfplots@currentplot@firstcoord@#1\endcsname} - {\csname pgfplots@currentplot@lastcoord@#1\endcsname}% - }% - \ifpgfmathfloatcomparison - \pgfkeyssetvalue{/pgfplots/#1 coord sorting}{+}% +% #1: the actual coordinate system's name +% #2: the desired coordinate system's name +% +% PRECONDITION: '/data point/[xyz]' contain the current +% point's coordinates in the '#1' system. The z coordinate is ignored for 2d plots (or +% for coordinate systems which are inherently two-dimensional). +% +% POSTCONDITION: 'data point/[xyz]' contain same point as +% before, but represented in the '#2' system. +% +% The coordinate system transformations must be defined, +% see \pgfplotsdefinecstransform. +% +% Example: +% \pgfkeyssetvalue{/data point/x}{90} +% \pgfkeyssetvalue{/data point/y}{1} +% \pgfplotsaxistransformcs{polar}{cart} +% --> +% \pgfkeysvalueof{/data point/x}= 0 +% \pgfkeysvalueof{/data point/y}= 1 +\def\pgfplotsaxistransformcs#1#2{% + \edef\pgfplots@loc@TMPa{#1}% + \edef\pgfplots@loc@TMPb{#2}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb + % nothing to do \else - \pgfkeyssetvalue{/pgfplots/#1 coord sorting}{-}% + \pgfutil@ifundefined{pgfp@transform@\pgfplots@loc@TMPa @to@\pgfplots@loc@TMPb}{% + \pgfutil@ifundefined{pgfp@transform@\pgfplots@loc@TMPa @to@cart}{% + \pgfplotsaxistransformcs@error + }{% + \pgfplotsaxistransformcs{#1}{cart}% + \pgfplotsaxistransformcs{cart}{#2}% + }% + }{% + \csname pgfp@transform@\pgfplots@loc@TMPa @to@\pgfplots@loc@TMPb\endcsname + }% \fi }% -% Assigns default values to 'rows' and 'cols' in case -% their values are empty. +% Defines a new coordinate transformation for use in +% \pgfplotsaxistransformcs. +% #1: the source coordinate system +% #2: the target coordinate system +% #3: the transformation code. % -% PRECONDITION: -% The values of -% - '/pgfplots/mesh/rows' -% - '/pgfplots/mesh/cols' -% - '/pgfplots/mesh/num points' -% - \pgfplotsscanlinelength -% - '/pgfplots/mesh/ordering' -% are assigned properly. +% @see \pgfplotsaxistransformcs for what #3 should do. % -% POSTCONDITION: -% 'rows' and 'cols' now incorporates \pgfplotsscanlinelength if -% their values had been empty. However, there may still be empty -% values. -% -% @see \pgfplotsautocompletemeshkeys -\def\pgfplotspreparemeshkeydefaults{% - \pgfplots@autocomplete@meshkeys0% +% This does also declare a coordinate system for use in 'data cs'. +% The minimal requirements are to define the transformations from and +% to "cart" (cartesian coordinates). +% +\def\pgfplotsdefinecstransform#1#2#3{% + \expandafter\def\csname pgfp@transform@#1@to@#2\endcsname{#3}% +}% + +\pgfplotsdefinecstransform{polar}{cart}{% + \pgfplotscoordmath{default}{parsenumber}{\pgfkeysvalueof{/data point/x}}% + \let\pgfplots@current@point@x=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{\pgfkeysvalueof{/data point/y}}% + \let\pgfplots@current@point@y=\pgfmathresult + \pgfplotsmathpoltocart\pgfplots@current@point@x\pgfplots@current@point@y\pgfplots@current@point@x@\pgfplots@current@point@y@ + \pgfplotscoordmath{x}{parsenumber}{\pgfplots@current@point@x@}% + \pgfkeyslet{/data point/x}\pgfmathresult + \pgfplotscoordmath{y}{parsenumber}{\pgfplots@current@point@y@}% + \pgfkeyslet{/data point/y}\pgfmathresult +}% +\pgfplotsdefinecstransform{cart}{polar}{% + \pgfplotscoordmath{default}{parsenumber}{\pgfkeysvalueof{/data point/x}}% + \let\pgfplots@current@point@x=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{\pgfkeysvalueof{/data point/y}}% + \let\pgfplots@current@point@y=\pgfmathresult + \pgfplotsmathcarttopol\pgfplots@current@point@x\pgfplots@current@point@y\pgfplots@current@point@x@\pgfplots@current@point@y@ + \pgfplotscoordmath{x}{parsenumber}{\pgfplots@current@point@x@}% + \pgfkeyslet{/data point/x}\pgfmathresult + \pgfplotscoordmath{y}{parsenumber}{\pgfplots@current@point@y@}% + \pgfkeyslet{/data point/y}\pgfmathresult +}% + +\pgfplotsdefinecstransform{polarrad}{polar}{% + \pgfplotsgetcoordmathfor{default}\let\pgfplots@coordmath@id=\pgfplotsretval + \pgfutil@ifundefined{pgfp@polarradscale@\pgfplots@coordmath@id}{% + \pgfplotscoordmath{default}{parsenumber}{57.2957795130823}% + \expandafter\global\expandafter\let\csname pgfp@polarradscale@\pgfplots@coordmath@id\endcsname=\pgfmathresult + }{}% + % + \pgfplotscoordmath{default}{parsenumber}{\pgfkeysvalueof{/data point/x}}% + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\csname pgfp@polarradscale@\pgfplots@coordmath@id\endcsname}}% + \pgfkeyslet{/data point/x}\pgfmathresult +}% +\pgfplotsdefinecstransform{polar}{polarrad}{% + \pgfplotsgetcoordmathfor{default}\let\pgfplots@coordmath@id=\pgfplotsretval + \pgfutil@ifundefined{pgfp@polarradiscale@\pgfplots@coordmath@id}{% + \pgfplotscoordmath{default}{parsenumber}{0.0174532925199433}% + \expandafter\global\expandafter\let\csname pgfp@polarradiscale@\pgfplots@coordmath@id\endcsname=\pgfmathresult + }{}% + % + \pgfplotscoordmath{default}{parsenumber}{\pgfkeysvalueof{/data point/x}}% + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\csname pgfp@polarradiscale@\pgfplots@coordmath@id\endcsname}}% +}% +\pgfplotsdefinecstransform{polarrad}{cart}{% + \pgfplotsaxistransformcs{polarrad}{polar}% + \pgfplotsaxistransformcs{polar}{cart}% +}% +\pgfplotsdefinecstransform{cart}{polarrad}{% + \pgfplotsaxistransformcs{cart}{polar}% + \pgfplotsaxistransformcs{polar}{polarrad}% }% -% Completes and sanitizes 'mesh/rows' and 'mesh/cols' such that they -% have useful integer values afterwards. -% -% This method works similarly to \pgfplotspreparemeshkeydefaults. -% However, it really completes values and issues error messages if -% that proves to be impossible. +\def\pgfplotsaxistransformcs@error{% + \pgfplotsthrow{invalid argument}{\pgfplots@loc@TMPa}{Sorry, I do not know how to transform the coordinate system '\pgfplots@loc@TMPa' to '\pgfplots@loc@TMPb'. Maybe you misspelled the 'data cs'? Or perhaps the feature is not yet implemented?}\pgfeov% +}% + +\def\pgfplotsaxisserializedatapoint{% + \pgfplotsplothandlerserializepointto\pgfplotsaxisserializedatapoint@val + \pgfplotsaxisserializedatapoint@private + \t@pgfplots@toka=\expandafter{\pgfplotsaxisserializedatapoint@val}% + \t@pgfplots@tokb=\expandafter{\pgfplotsretval}% + \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@tokb;\the\t@pgfplots@toka}}% + \expandafter\pgfplotsapplistXXpushback\expandafter{\pgfplots@loc@TMPa}% +}% +\def\pgfplotsaxisserializedatapoint@private{% + \let\pgfplotsretval=\pgfplots@current@point@meta +}% +\def\pgfplotsaxisdeserializedatapointfrom@private#1{% + \def\pgfplots@current@point@meta{#1}% +}% +% Restores the variables serialized in '#1'. % -% PRECONDITION: -% The values of -% - '/pgfplots/mesh/rows' -% - '/pgfplots/mesh/cols' -% - '/pgfplots/mesh/num points' -% - '/pgfplots/mesh/ordering' -% are assigned properly. -% If -% - \pgfplotsscanlinelength -% exists and is positive, it may also be used. +% As a side--effect, the macro +% \pgfplotsaxisdeserializedatapointfrom@private@lastvalue will contain +% the serialized part which is specific to pgfplots (i.e. the private +% parts which can be read with +% \pgfplotsaxisdeserializedatapointfrom@private) +\def\pgfplotsaxisdeserializedatapointfrom#1{% + \expandafter\pgfplotsaxisdeserializedatapointfrom@#1\pgfplots@EOI +}% +\def\pgfplotsaxisdeserializedatapointfrom@#1;#2\pgfplots@EOI{% + \def\pgfplotsaxisdeserializedatapointfrom@private@lastvalue{#1}% + \pgfplotsaxisdeserializedatapointfrom@private{#1}% + \pgfplotsplothandlerdeserializepointfrom{#2}% +}% + +% Handle User-defined parts which should be serialized as well. +% This preparation tool should be called at the start of both, survey +% and visualization phase. +% +% @PRECONDITION +% - the macros +% \pgfplotsaxisserializedatapoint@private +% \pgfplotsaxisdeserializedatapointfrom@private +% are known and valid. +% - '/pgfplots/visualization depends on' contains its correct value. % -% POSTCONDITION: -% 'rows' and 'cols' have useful integer values. -\def\pgfplotsautocompletemeshkeys{% - \pgfplots@autocomplete@meshkeys1% -}% -\def\pgfplots@autocomplete@meshkeys#1{% - \pgfkeysgetvalue{/pgfplots/mesh/rows}\pgfplotsplothandlermesh@rows - \pgfkeysgetvalue{/pgfplots/mesh/cols}\pgfplotsplothandlermesh@cols - \pgfkeysgetvalue{/pgfplots/mesh/num points}\pgfplotsplothandlermesh@numpoints - \edef\pgfplotsplothandlermesh@numpoints{\pgfplotsplothandlermesh@numpoints}% - \edef\pgfplotsplothandlermesh@cols{\pgfplotsplothandlermesh@cols}% - \edef\pgfplotsplothandlermesh@rows{\pgfplotsplothandlermesh@rows}% - \ifpgfplots@curplot@threedim - \ifx\pgfplotsplothandlermesh@rows\pgfutil@empty - \ifx\pgfplotsplothandlermesh@cols\pgfutil@empty - \pgfutil@ifundefined{pgfplotsscanlinelength}{\def\pgfplotsscanlinelength{-1}}{}% - \ifpgfplots@scanline@verbose - \ifnum\pgfplotsscanlinelength>0 - % we have scanlinelength set! Use it: - \message{PGFPlots: Scanline length is \pgfplotsscanlinelength.}% - \else - \ifnum\pgfplotsscanlinelength=-2 - \message{PGFPlots: Scanline length could not be determined since multiple, different scan line lengths have been found.}% - \else - \message{PGFPlots: No end-of-scanline marker found in input stream.}% - \fi - \fi - \fi - \ifnum\pgfplotsscanlinelength>0 - % we have scanlinelength set! Use it: - \if\pgfplots@plot@mesh@ordering0% - % ordering = x varies= rowwise -> scanline is cols! - \edef\pgfplotsplothandlermesh@cols{\pgfplotsscanlinelength}% - \else - % ordering = y varies = colwise: scanline is rows! - \edef\pgfplotsplothandlermesh@rows{\pgfplotsscanlinelength}% - \fi - \else - \if1#1% - % try to get reasonable values: - \ifx\pgfplotsplothandlermesh@numpoints\pgfutil@empty - \pgfplots@error{Sorry, 'plot mesh' needs either '[mesh/rows=<N>]' or '[mesh/cols=<N>]' set - or at least '[mesh/num points=<N>]'. But it did not find any of them...}% - \def\pgfplotsplothandlermesh@cols{5}% - \def\pgfplotsplothandlermesh@rows{5}% - \else - % We don't have rows/cols. Well, try using - % sqrt(num points) for both of them! - \ifnum\pgfplotsplothandlermesh@numpoints<16380 - \pgfmath@basic@sqrt@{\pgfplotsplothandlermesh@numpoints}% - \else - \pgfmathfloatparsenumber{\pgfplotsplothandlermesh@numpoints}% - \pgfmathfloatsqrt@{\pgfmathresult}% - \pgfmathfloattofixed{\pgfmathresult}% - \fi - \begingroup - % Try whether this rows*rows yields numpoints: - \afterassignment\pgfplots@gobble@until@relax - \c@pgf@counta=\pgfmathresult\relax - \c@pgf@countb=\c@pgf@counta - \multiply\c@pgf@counta by\c@pgf@counta - \def\pgfplotsretval{1}% - \ifnum\c@pgf@counta=\pgfplotsplothandlermesh@numpoints\relax - % ok, rows*rows = numpoints. - \xdef\pgfplots@glob@TMPa{\the\c@pgf@countb}% - \else - % oh. Did not work. Check for rounding errors: - \c@pgf@counta=\c@pgf@countb - \advance\c@pgf@counta by1 - \c@pgf@countb=\c@pgf@counta - \multiply\c@pgf@counta by\c@pgf@counta - \ifnum\c@pgf@counta=\pgfplotsplothandlermesh@numpoints - % ok, (rows+1)*(rows+1) = numpoints. - \xdef\pgfplots@glob@TMPa{\the\c@pgf@countb}% - \else - % no... did not work. num points doesn't - % appear to be a squared number. - \def\pgfplotsretval{0}% - \xdef\pgfplots@glob@TMPa{5}% - \fi - \fi - \if\pgfplotsretval1 - \pgfplots@warning{% - 'plot mesh' did not find '[mesh/rows=<N>]' or '[mesh/cols=<N>]'. - Assuming [mesh/rows=\pgfplots@glob@TMPa,mesh/cols=\pgfplots@glob@TMPa] - as sqrt(num points) = sqrt(\pgfplotsplothandlermesh@numpoints) [ = \pgfmathresult].}% - \else - \pgfplots@error{Sorry, 'plot mesh' needs either '[mesh/rows=<N>]' or '[mesh/cols=<N>]' set, - but it did not find any of them. - I also tried rows = sqrt(num points) = sqrt(\pgfplotsplothandlermesh@numpoints) = \pgfmathresult\space without success.}% - \fi - \endgroup - \let\pgfplotsplothandlermesh@rows=\pgfplots@glob@TMPa - \let\pgfplotsplothandlermesh@cols=\pgfplots@glob@TMPa - \fi - \else - % #1=0 -> leave them empty. - \fi - \fi - \fi - \fi - \if1#1% - \ifx\pgfplotsplothandlermesh@rows\pgfutil@empty - \ifx\pgfplotsplothandlermesh@cols\pgfutil@empty - \else - % Compute 'rows' out of 'num points' and 'cols': - \ifx\pgfplotsplothandlermesh@numpoints\pgfutil@empty - \pgfplots@error{Sorry, matrix input needs a valid '[mesh/num points=<N>]' variable if only one of '[mesh/rows=<N>]' or '[mesh/cols=<N>]' is given.}% - \def\pgfplotsplothandlermesh@numpoints{100}% - \fi - \begingroup - \c@pgf@counta=\pgfplotsplothandlermesh@numpoints\relax - \divide\c@pgf@counta by\pgfplotsplothandlermesh@cols\relax - \xdef\pgfplots@glob@TMPa{\the\c@pgf@counta}% - \endgroup - \let\pgfplotsplothandlermesh@rows=\pgfplots@glob@TMPa - \fi +% @POSTCONDITION +% Both, +% \pgfplotsaxisserializedatapoint@private +% and +% \pgfplotsaxisdeserializedatapointfrom@private +% have been patched to incorporate the '/pgfplots/visualization +% depends on' feature. +% +\def\pgfplots@prepare@visualization@dependencies{% + \pgfkeysgetvalue{/pgfplots/visualization depends on/list}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + % SERIALIZATION format: + % visualization depends on={{value1}\as \macro1, {<value2>}\as \macro2,...} + % -> + % {<original private data>}<\macro1>{<value1>}<\macro2>{<value2>}...<\macroN>{<valueN>} + % + % prepare + % \t@pgfplots@tokb={<\macro1>{<value1>}<\macro2>{<value2>}...<\macroN>{<valueN>}} + \t@pgfplots@tokb={}% + % + % prepare + % \t@pgfplots@tokc={<\macro1><\macro2><\macro3>...} + \t@pgfplots@tokc={}% + \expandafter\pgfplotsutilforeachcommasep\expandafter{\pgfplots@loc@TMPa}\as\pgfplots@loc@TMPa{% + \ifx\pgfplots@loc@TMPa\pgfutil@empty \else - \ifx\pgfplotsplothandlermesh@cols\pgfutil@empty - % Compute 'cols' out of 'num points' and 'rows': - \ifx\pgfplotsplothandlermesh@numpoints\pgfutil@empty - \pgfplots@error{Sorry, matrix input needs a valid '[mesh/num points=<N>]' variable if only one of '[mesh/cols=<N>]' or '[mesh/rows=<N>]' is given.}% - \def\pgfplotsplothandlermesh@numpoints{100}% - \fi + \expandafter\pgfplots@prepare@visualization@depends@on\pgfplots@loc@TMPa\pgfplots@EOI% + \fi + }% + % Step 1: modify the SERIALIZATION method: + \t@pgfplots@toka=\expandafter{\pgfplotsaxisserializedatapoint@private}% + \edef\pgfplotsaxisserializedatapoint@private{% + \the\t@pgfplots@tokc + \the\t@pgfplots@toka + % nothing is expanded here, only \t@pgfplots@tokb + \noexpand\t@pgfplots@toka=\noexpand\expandafter{\noexpand\pgfplotsretval}% + \noexpand\edef\noexpand\pgfplotsretval{{\noexpand\the\t@pgfplots@toka},\the\t@pgfplots@tokb}% + }% + % Step 2: modify the DESERIALIZATION method: + \let\pgfplotsaxisdeserializedatapointfrom@private@orig=\pgfplotsaxisdeserializedatapointfrom@private + \let\pgfplotsaxisdeserializedatapointfrom@private=\pgfplotsaxisdeserializedatapointfrom@private@withdeplist + \fi + % + \pgfkeysgetvalue{/pgfplots/execute for finished point}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfplots@empty@command@key + \else + \expandafter\def\expandafter\pgfplotsaxisserializedatapoint@private\expandafter{% + \pgfplotsaxisserializedatapoint@private + \pgfkeysvalueof{/pgfplots/execute for finished point}% + }% + \fi +}% +\def\pgfplots@prepare@visualization@depends@on#1\pgfplots@EOI{% + \pgfutil@in@\as{#1}% + \ifpgfutil@in@ + % ok, we have the '<content>\as<\macro>' syntax: + \pgfplots@prepare@visualization@depends@on@#1\pgfplots@EOI + \else + \pgfplots@prepare@visualization@depends@on@preparetype@checkvalue#1value\pgfplots@EOI + \ifpgfutil@in@ + % ok, then it should be 'value <\macro>'. + % extract the <\macro>: + \def\pgfplots@loc@TMPa value{\pgfplots@loc@TMPb}% + \def\pgfplots@loc@TMPb##1{\pgfplots@loc@TMPc ##1}% this step should remove leading white spaces + \def\pgfplots@loc@TMPc##1\pgfplots@EOI{% + % sanitize: check if ##1 is a defined macro: + \begingroup + \escapechar=-1 + \xdef\pgfplots@glob@TMPa{\string##1}% + \endgroup + \pgfutil@ifundefined{\pgfplots@glob@TMPa}{% \begingroup - \c@pgf@counta=\pgfplotsplothandlermesh@numpoints\relax - \divide\c@pgf@counta by\pgfplotsplothandlermesh@rows\relax - \xdef\pgfplots@glob@TMPa{\the\c@pgf@counta}% + \t@pgfplots@toka={##1}% + \pgfplotsthrow{invalid argument} + {\pgfplots@loc@TMPa}% + {Sorry, `visualization depends on=value <\string\macro>' expected a defined control sequence name instead of `\the\t@pgfplots@toka'. Please make sure `\the\t@pgfplots@toka' is a properly defined macro or use the `visualization depends on=value <content> \string\as <\string\macro>' syntax instead}% + \pgfeov \endgroup - \let\pgfplotsplothandlermesh@cols=\pgfplots@glob@TMPa - \fi - \fi - \ifx\pgfplotsplothandlermesh@numpoints\pgfutil@empty - \c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@rows\relax - \multiply\c@pgfplots@scanlineindex by \pgfplotsplothandlermesh@cols\relax - \edef\pgfplotsplothandlermesh@numpoints{\the\c@pgfplots@scanlineindex}% - \fi - % - \c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@rows\relax - \multiply\c@pgfplots@scanlineindex by\pgfplotsplothandlermesh@cols\relax - \ifnum\c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@numpoints\relax - \else - \ifcase\pgfplots@mesh@checkmode\relax - % mesh/check=false - \def\pgfplots@loc@TMPa##1{}% - \or - % mesh/check=warning - \def\pgfplots@loc@TMPa##1{\pgfplots@warning{##1}}% - \or - % mesh/check=error - \def\pgfplots@loc@TMPa##1{\pgfplots@error{##1}}% - \fi - \pgfplots@loc@TMPa{the arguments of [mesh/rows=\pgfplotsplothandlermesh@rows,mesh/cols=\pgfplotsplothandlermesh@cols] assume \the\c@pgfplots@scanlineindex\space points, but I got actually N = \pgfplotsplothandlermesh@numpoints\space points! The data matrix appears to be incomplete or overcomplete!? [Use mesh/check=false to disable this message]}% - \fi + }{% + \def\pgfplots@loc@TMPa{% + \pgfplots@prepare@visualization@depends@on@ value}% + \expandafter\pgfplots@loc@TMPa##1\as##1\pgfplots@EOI + }% + }% + \pgfplots@loc@TMPa#1\pgfplots@EOI + \else + % then, I expect '<\macro>'. + % sanitize: check if #1 is a defined macro: + \begingroup + \escapechar=-1 + \xdef\pgfplots@glob@TMPa{\string#1}% + \endgroup + \pgfutil@ifundefined{\pgfplots@glob@TMPa}{% + \begingroup + \t@pgfplots@toka={#1}% + \pgfplotsthrow{invalid argument} + {\pgfplots@loc@TMPa}% + {Sorry, `visualization depends on' expected a defined control sequence name instead of `\the\t@pgfplots@toka'. Please make sure `\the\t@pgfplots@toka' is a properly defined macro or use the `visualization depends on=<expression> \string\as <\string\macro>' syntax instead}% + \pgfeov + \endgroup + }{% + \expandafter\pgfplots@prepare@visualization@depends@on@#1\as#1\pgfplots@EOI + }% \fi + \fi +}% +\def\pgfplots@prepare@visualization@depends@on@#1\as#2\pgfplots@EOI{% + \pgfplots@prepare@visualization@depends@on@preparetype{#1}\as{#2}% + % prepare the serialization: + \t@pgfplots@tokb=\expandafter{\the\t@pgfplots@tokb\noexpand#2{\csname\string#2@value\endcsname}}% + \t@pgfplots@tokc=\expandafter{\the\t@pgfplots@tokc#2}% +}% +\def\pgfplots@prepare@visualization@depends@on@preparetype#1\as#2{% + \pgfplots@prepare@visualization@depends@on@preparetype@checkvalue#1value\pgfplots@EOI + \ifpgfutil@in@ + \pgfplots@prepare@visualization@depends@on@preparetype@value#1\as{#2}% no braces here. \else - % 2d visualization has no mesh: - \edef\pgfplotsplothandlermesh@rows{\pgfplotsplothandlermesh@numpoints}% - \def\pgfplotsplothandlermesh@cols{1}% + \pgfplots@prepare@visualization@depends@on@preparetype@expr{#1}\as{#2}% + \fi +}% +\def\pgfplots@prepare@visualization@depends@on@preparetype@expr#1\as#2{% + \pgflibraryfpuifactive{% + \def#2{% + \pgfmathparse{#1}% + \pgfmathfloattofixed{\pgfmathresult}% + \expandafter\let\csname \string#2@value\endcsname=\pgfmathresult + }% + }{% + \def#2{% + \pgfmathparse{#1}% + \expandafter\let\csname \string#2@value\endcsname=\pgfmathresult + }% + }% +} +\def\pgfplots@prepare@visualization@depends@on@preparetype@checkvalue#1value#2\pgfplots@EOI{% + \def\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \pgfutil@in@true + \else + \pgfutil@in@false + \fi +}% +\def\pgfplots@prepare@visualization@depends@on@preparetype@value value#1\as#2{% + \begingroup + % remove spaces from #1: + \pgfkeys@spdef\pgfplots@loc@TMPa{#1}% + \t@pgfplots@toka=\expandafter{\pgfplots@loc@TMPa}% + \t@pgfplots@tokb=\expandafter{\csname\string#2@value\endcsname}% + \xdef\pgfplots@glob@TMPa{% + \noexpand\def\the\t@pgfplots@tokb{\the\t@pgfplots@toka}% + }% + \endgroup + \let#2=\pgfplots@glob@TMPa +} + +\def\pgfplotsaxisdeserializedatapointfrom@private@withdeplist#1{% + \pgfplotsaxisdeserializedatapointfrom@private@withdeplist@#1\pgfplots@EOI +}% +\def\pgfplotsaxisdeserializedatapointfrom@private@withdeplist@#1,{% + \pgfplotsaxisdeserializedatapointfrom@private@orig{#1}% + \pgfplotsaxisdeserializedatapointfrom@private@withdeplist@@ +}% +\def\pgfplotsaxisdeserializedatapointfrom@private@withdeplist@@#1{% + \def\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfplots@EOI + \else + \afterassignment\pgfplotsaxisdeserializedatapointfrom@private@withdeplist@@ + \expandafter\def\expandafter#1% \fi - % - \def\pgfplots@loc@TMPa{\pgfkeyssetvalue{/pgfplots/mesh/rows}}% - \expandafter\pgfplots@loc@TMPa\expandafter{\pgfplotsplothandlermesh@rows}% - \def\pgfplots@loc@TMPa{\pgfkeyssetvalue{/pgfplots/mesh/cols}}% - \expandafter\pgfplots@loc@TMPa\expandafter{\pgfplotsplothandlermesh@cols}% +}% + +% PRECONDITION: must be called inside of +% \pgfplots@PREPARE@COORD@STREAM@end@. +% +% POSTCONDITION: +% assigns '/pgfplots/#1 coord sorting=[+-]' +% i.e. whether #1 (x or y or z) coordinates are in ascending (+) ordering or in +% descending order (-). +\def\pgfplots@PREPARE@COORD@STREAM@end@determinecoordsorting#1{% + \pgfplotscoordmath{#1}{if less than} + {\csname pgfplots@currentplot@firstcoord@#1\endcsname}% + {\csname pgfplots@currentplot@lastcoord@#1\endcsname}% + {\pgfkeyssetvalue{/pgfplots/#1 coord sorting}{+}}% + {\pgfkeyssetvalue{/pgfplots/#1 coord sorting}{-}}% }% % Prepares a macro \pgfplots@PREPARE@process@errorbar@for@dir##1 @@ -3100,7 +4474,7 @@ \E\else \E\let\E\pgfplots@current@point@@old\expandafter\E\csname pgfplots@current@point@#1\endcsname \E\let\expandafter\E\csname pgfplots@current@point@#1\endcsname=\E\pgfplots@error@coord - \E\pgfplots@update@limits@for@one@point + \E\pgfplotsaxisupdatelimitsforcoordinate\E\pgfplots@current@point@x\E\pgfplots@current@point@y\E\pgfplots@current@point@z \E\let\expandafter\E\csname pgfplots@current@point@#1\endcsname=\E\pgfplots@current@point@@old \E\edef\E\pgfplots@loc@TMPa{\the\t@pgfplots@toka}% \E\expandafter\E\pgfplots@streamerrorbarcoords\E\pgfplots@loc@TMPa @@ -3115,41 +4489,48 @@ \pgfplots@if{pgfplots@#1islinear}{% \ifcase\csname pgfplots@errorbars@#1mode\endcsname\relax % fixed absolute error. - \pgfmathfloatparsenumber{\csname pgfplots@errorbars@#1fixed\endcsname}% + \pgfplotscoordmath{#1}{parsenumber}{\csname pgfplots@errorbars@#1fixed\endcsname}% \expandafter\let\csname pgfplots@error@coord@#1\endcsname=\pgfmathresult \expandafter\def\csname pgfplots@PREPARE@errorbar@process@#1@\endcsname##1{% \if +##1% - \pgfmathfloatadd@ - {\csname pgfplots@current@point@#1\endcsname}% - {\csname pgfplots@error@coord@#1\endcsname}% + \def\pgfplots@loc@TMPb{add}% \else - \pgfmathfloatsubtract@ - {\csname pgfplots@current@point@#1\endcsname}% - {\csname pgfplots@error@coord@#1\endcsname}% + \def\pgfplots@loc@TMPb{subtract}% \fi + \pgfplotscoordmath{#1}{op}{\pgfplots@loc@TMPb}{% + {\csname pgfplots@current@point@#1\endcsname}% + {\csname pgfplots@error@coord@#1\endcsname}% + }% \let\pgfplots@error@coord=\pgfmathresult \csname pgfplots@PREPARE@errorbar@stream@it@#1\endcsname }% \or% fixed relative error: - \pgfmathfloatparsenumber{\csname pgfplots@errorbars@#1rel\endcsname}% + \pgfplotscoordmath{#1}{parsenumber}{\csname pgfplots@errorbars@#1rel\endcsname}% \let\pgfplots@loc@TMPb=\pgfmathresult % % +1: - \pgfmathfloatcreate{1}{1.0}{0}% + \pgfplotscoordmath{#1}{parsenumber}{1}% \let\pgfplots@loc@TMPa=\pgfmathresult % % Prepare '1 + err': - \pgfmathfloatadd@{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}% + \pgfplotscoordmath{#1}{op}{add}{% + {\pgfplots@loc@TMPa}% + {\pgfplots@loc@TMPb}% + }% \expandafter\let\csname pgfplots@error@coord@#1@+\endcsname=\pgfmathresult % % Prepare '1 - err': - \pgfmathfloatsubtract@{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}% + \pgfplotscoordmath{#1}{op}{subtract}{% + {\pgfplots@loc@TMPa}% + {\pgfplots@loc@TMPb}% + }% \expandafter\let\csname pgfplots@error@coord@#1@-\endcsname=\pgfmathresult % \expandafter\def\csname pgfplots@PREPARE@errorbar@process@#1@\endcsname##1{% - \pgfmathfloatmultiply@ + \pgfplotscoordmath{#1}{op}{multiply}{% {\csname pgfplots@current@point@#1\endcsname} {\csname pgfplots@error@coord@#1@##1\endcsname}% + }% \let\pgfplots@error@coord=\pgfmathresult \csname pgfplots@PREPARE@errorbar@stream@it@#1\endcsname }% @@ -3158,20 +4539,20 @@ \edef\pgfplots@error@coord{\csname pgfplots@current@point@#1@error\endcsname}% \ifx\pgfplots@error@coord\pgfutil@empty \else - \pgfmathfloatparsenumber{\pgfplots@error@coord}% + \pgfplotscoordmath{#1}{parsenumber}{\pgfplots@error@coord}% \let\pgfplots@error@coord=\pgfmathresult % remember result here - will be used in case % of '+' AND '-' error bars: \expandafter\let\csname pgfplots@current@point@#1@error\endcsname=\pgfmathresult \if +##1% - \pgfmathfloatadd@ - {\csname pgfplots@current@point@#1\endcsname}% - {\pgfplots@error@coord}% + \def\pgfplots@loc@TMPb{add}% \else - \pgfmathfloatsubtract@ - {\csname pgfplots@current@point@#1\endcsname}% - {\pgfplots@error@coord}% + \def\pgfplots@loc@TMPb{subtract}% \fi + \pgfplotscoordmath{#1}{op}{\pgfplots@loc@TMPb}{% + {\csname pgfplots@current@point@#1\endcsname}% + {\pgfplots@error@coord}% + }% \let\pgfplots@error@coord=\pgfmathresult \csname pgfplots@PREPARE@errorbar@stream@it@#1\endcsname \fi @@ -3183,9 +4564,10 @@ \else \pgfmathparse{1##1\pgfplots@error@coord}% \let\pgfplots@error@coord=\pgfmathresult - \pgfmathfloatmultiply@ + \pgfplotscoordmath{#1}{multiply}{% {\csname pgfplots@current@point@#1\endcsname} {\pgfplots@error@coord}% + }% \let\pgfplots@error@coord=\pgfmathresult \csname pgfplots@PREPARE@errorbar@stream@it@#1\endcsname \fi @@ -3204,52 +4586,58 @@ % \ifcase\csname pgfplots@errorbars@#1mode\endcsname % fixed absolute, log( x +- e_x ) - \pgfmathfloatparsenumber{\csname pgfplots@errorbars@#1fixed\endcsname}% + % + \pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@errorbars@#1fixed\endcsname}% \expandafter\let\csname pgfplots@error@coord@#1\endcsname=\pgfmathresult \expandafter\def\csname pgfplots@PREPARE@errorbar@process@#1@\endcsname##1{% - \pgfmathfloatparsenumber{\csname pgfplots@current@point@#1@unfiltered\endcsname}% + \pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@current@point@#1@unfiltered\endcsname}% \let\pgfplots@loc@TMPa=\pgfmathresult \if +##1% - \pgfmathfloatadd@ - {\pgfplots@loc@TMPa}% - {\csname pgfplots@error@coord@#1\endcsname}% + \def\pgfplots@loc@op{add}% \else - \pgfmathfloatsubtract@ - {\pgfplots@loc@TMPa}% - {\csname pgfplots@error@coord@#1\endcsname}% + \def\pgfplots@loc@op{subtract}% \fi - \csname pgfplotsmathlog@#1@float\endcsname{\pgfmathresult}% + \pgfplotscoordmath{default}{op}{\pgfplots@loc@op}{% + {\pgfplots@loc@TMPa}% + {\csname pgfplots@error@coord@#1\endcsname}% + }% + \pgfplotscoordmath{default}{tostring}{\pgfmathresult}% + \pgfplotscoordmath{#1}{log}{\pgfmathresult}% \let\pgfplots@error@coord=\pgfmathresult \csname pgfplots@PREPARE@errorbar@stream@it@#1\endcsname }% \or% fixed relative, log( x ( 1+-e_x ) ) = log(x) + log(1+-e_x) - \pgfmathfloatparsenumber{\csname pgfplots@errorbars@#1rel\endcsname}% + \pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@errorbars@#1rel\endcsname}% \let\pgfplots@loc@TMPb=\pgfmathresult % % +1: - \pgfmathfloatcreate{1}{1.0}{0}% + \pgfplotscoordmath{default}{one}% \let\pgfplots@loc@TMPa=\pgfmathresult % % Prepare '1 + err': - \pgfmathfloatadd@{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}% - \csname pgfplotsmathlog@#1@float\endcsname{\pgfmathresult}% - \ifx\pgfmathresult\pgfutil@empty + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}}% + \pgfplotscoordmath{default}{tostring}{\pgfmathresult}% + \pgfplotscoordmath{#1}{log}{\pgfmathresult}% + \pgfplotscoordmath{#1}{if is bounded}{\pgfmathresult}{% + }{% % 1 + err <= 0 and log(1+err) is undefined: - \pgfmathfloattofixed{\pgfplots@loc@TMPb}% - \pgfplots@error{Sorry, log(1+\pgfmathresult) is undefined. Please provide a different argument for '/pgfplots/error bar/#1 fixed relative'.}% + \pgfplotscoordmath{default}{tostring}{\pgfplots@loc@TMPb}% + \pgfplots@error{Sorry, log(1 + \pgfmathresult) is undefined. Please provide a different argument for '/pgfplots/error bar/#1 fixed relative'.}% \let\pgfmathresult=\pgfutil@empty - \fi + }% \expandafter\let\csname pgfplots@error@coord@#1@+\endcsname=\pgfmathresult % % Prepare '1 - err': - \pgfmathfloatsubtract@{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}% - \csname pgfplotsmathlog@#1@float\endcsname{\pgfmathresult}% - \ifx\pgfmathresult\pgfutil@empty - % 1 + err <= 0 and log(1+err) is undefined: - \pgfmathfloattofixed{\pgfplots@loc@TMPb}% - \pgfplots@error{Sorry, log(1-\pgfmathresult) is undefined. Please provide a different argument for '/pgfplots/error bar/#1 fixed relative'.}% + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}}% + \pgfplotscoordmath{default}{tostring}{\pgfmathresult}% + \pgfplotscoordmath{#1}{log}{\pgfmathresult}% + \pgfplotscoordmath{#1}{if is bounded}{\pgfmathresult}{% + }{% + % 1 - err <= 0 and log(1+err) is undefined: + \pgfplotscoordmath{default}{tostring}{\pgfplots@loc@TMPb}% + \pgfplots@error{Sorry, log(1 - \pgfmathresult) (\pgfplots@loc@TMPa - \pgfplots@loc@TMPb) is undefined. Please provide a different argument for '/pgfplots/error bar/#1 fixed relative'.}% \let\pgfmathresult=\pgfutil@empty - \fi + }% \expandafter\let\csname pgfplots@error@coord@#1@-\endcsname=\pgfmathresult % \expandafter\def\csname pgfplots@PREPARE@errorbar@process@#1@\endcsname##1{% @@ -3268,23 +4656,24 @@ \edef\pgfplots@error@coord{\csname pgfplots@current@point@#1@error\endcsname}% \ifx\pgfplots@error@coord\pgfutil@empty \else - \pgfmathfloatparsenumber{\pgfplots@error@coord}% + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@error@coord}% \let\pgfplots@error@coord=\pgfmathresult % remember result here - will be used in case % of '+' AND '-' error bars: \expandafter\let\csname pgfplots@current@point@#1@error\endcsname=\pgfmathresult - \pgfmathfloatparsenumber{\csname pgfplots@current@point@#1@unfiltered\endcsname}% + \pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@current@point@#1@unfiltered\endcsname}% \let\pgfplots@loc@TMPa=\pgfmathresult \if +##1% - \pgfmathfloatadd@ - {\pgfplots@loc@TMPa}% - {\pgfplots@error@coord}% + \def\pgfplots@loc@op{add}% \else - \pgfmathfloatsubtract@ - {\pgfplots@loc@TMPa}% - {\pgfplots@error@coord}% + \def\pgfplots@loc@op{subtract}% \fi - \csname pgfplotsmathlog@#1@float\endcsname{\pgfmathresult}% + \pgfplotscoordmath{default}{op}{\pgfplots@loc@op}{% + {\pgfplots@loc@TMPa}% + {\pgfplots@error@coord}% + }% + \pgfplotscoordmath{default}{tostring}{\pgfmathresult}% + \pgfplotscoordmath{#1}{log}{\pgfmathresult}% \let\pgfplots@error@coord=\pgfmathresult \csname pgfplots@PREPARE@errorbar@stream@it@#1\endcsname \fi @@ -3296,34 +4685,36 @@ \edef\pgfplots@error@coord{\csname pgfplots@current@point@#1@error\endcsname}% \ifx\pgfplots@error@coord\pgfutil@empty \else - \pgfmathfloatparsenumber{\pgfplots@error@coord}% + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@error@coord}% \let\pgfplots@error@coord=\pgfmathresult % remember result here - will be used in case % of '+' AND '-' error bars: \expandafter\let\csname pgfplots@current@point@#1@error\endcsname=\pgfmathresult % - \pgfmathfloatcreate{1}{1.0}{0}% + \pgfplotscoordmath{default}{one}% \let\pgfplots@loc@TMPa=\pgfmathresult \if +##1% - \pgfmathfloatadd@ - {\pgfplots@loc@TMPa}% - {\pgfplots@error@coord}% + \def\pgfplots@loc@op{add}% \else - \pgfmathfloatsubtract@ - {\pgfplots@loc@TMPa}% - {\pgfplots@error@coord}% + \def\pgfplots@loc@op{subtract}% \fi - \csname pgfplotsmathlog@#1@float\endcsname{\pgfmathresult}% + \pgfplotscoordmath{default}{op}{\pgfplots@loc@op}{% + {\pgfplots@loc@TMPa}% + {\pgfplots@error@coord}% + }% + \pgfplotscoordmath{default}{tostring}{\pgfmathresult}% + \pgfplotscoordmath{#1}{log}{\pgfmathresult}% \let\pgfplots@error@coord=\pgfmathresult - \ifx\pgfplots@error@coord\pgfutil@empty - % -> log( <= 0 ) -> do nothing. - \else - \pgfmath@basic@add@ + \pgfplotscoordmath{#1}{if is bounded}{\pgfmathresult}{% + \pgfplotscoordmath{#1}{op}{add}{% {\csname pgfplots@current@point@#1\endcsname} {\pgfplots@error@coord}% + }% \let\pgfplots@error@coord=\pgfmathresult \csname pgfplots@PREPARE@errorbar@stream@it@#1\endcsname - \fi + }{% + % -> log( <= 0 ) -> do nothing. + }% \fi }% % @@ -3366,107 +4757,134 @@ % If there is no data range (for example because meta information is % not available or is not of numeric type), the trafo will simply % copy the input argument symbolically. +% +% Note: it does not hurt to call it multiple times. It checks automatically whether it already is up-to-date. \def\pgfplots@perpointmeta@preparetrafo{% - \let\pgfplots@current@point@meta=\pgfutil@empty - \pgfutil@ifundefined{pgfplots@metamax}{\let\pgfplots@metamax=\pgfutil@empty}{} - \ifpgfplots@warn@for@filter@discards - \global\let\pgfplots@perpointmeta@unboundedwarning@stop=\relax - \def\pgfplots@perpointmeta@unboundedwarning##1{% - \ifx\pgfplots@perpointmeta@unboundedwarning@stop\relax - \begingroup - \pgfmathfloattofixed{##1}% - \pgfplots@warning{The per point meta data `\pgfmathresult' (##1) (and probably others as well) is unbounded - using the minimum value instead.}% - \endgroup - \gdef\pgfplots@perpointmeta@unboundedwarning@stop{1}% - \fi - }% - \else - \def\pgfplots@perpointmeta@unboundedwarning##1{}% - \fi - \if m\pgfplots@colormap@access - % colormap access=map - \ifx\pgfplots@metamax\pgfutil@empty - \def\pgfplots@perpointmeta@trafo##1{% - \pgfmathfloatiffinite{##1}{% - \pgfmathfloattofixed@{##1}% - }{% - \def\pgfmathresult{0}% - \pgfplots@perpointmeta@unboundedwarning{##1}% - }% + \def\pgfplotspointmetarangeexponent{1}% pre-fill + \pgfutil@ifundefined{pgfplots@perpointmeta@trafo}{% + \let\pgfplots@current@point@meta=\pgfutil@empty + \pgfutil@ifundefined{pgfplots@metamax}{\let\pgfplots@metamax=\pgfutil@empty}{} + \ifpgfplots@warn@for@filter@discards + \global\let\pgfplots@perpointmeta@unboundedwarning@stop=\relax + \def\pgfplots@perpointmeta@unboundedwarning##1{% + \ifx\pgfplots@perpointmeta@unboundedwarning@stop\relax + \begingroup + \pgfplotscoordmath{meta}{tostring}{##1}% + \pgfplots@warning{The per point meta data `\pgfmathresult' (##1) (and probably others as well) is unbounded - using the minimum value instead.}% + \endgroup + \gdef\pgfplots@perpointmeta@unboundedwarning@stop{1}% + \fi }% - \def\pgfplots@perpointmeta@traforange{0:1000}% - \edef\pgfplotspointmetarange{0:1000}% \else - % The transformation is - % - % phi(m) = ( m- meta_min) * 1000/ (meta_max-meta_min). - % - % -> precompute the scaling factor! - \edef\pgfplots@loc@TMPa{\pgfplotscolormaprange}% - \ifnum\pgfplots@loc@TMPa=1000 - \else - \pgfplots@error{LOGIC ERROR: sorry, I have hard-coded the assumption \string\pgfplotscolormaprange = 1000, but now it is \pgfplots@loc@TMPa.}% - \fi - \if\pgfplots@perpointmeta@rel@choice0% - % point meta rel=axis wide: - \edef\pgfplotspointmetarange{\pgfplots@axiswide@metamin:\pgfplots@axiswide@metamax}% - % Now, prepare the trafo as such. - % It assigns \pgfmathresult (in fixed point). + \def\pgfplots@perpointmeta@unboundedwarning##1{}% + \fi + \if m\pgfplots@colormap@access + % colormap access=map + \ifx\pgfplots@metamax\pgfutil@empty \def\pgfplots@perpointmeta@trafo##1{% - \pgfmathfloatiffinite{##1}{% - \pgfmathfloatsubtract@{##1}{\pgfplots@axiswide@metamin}% - \expandafter\pgfmathfloatmultiply@\expandafter{\pgfmathresult}{\pgfplots@perpointmeta@trafo@factor}% - \expandafter\pgfmathfloattofixed@\expandafter{\pgfmathresult}% - }{% + \pgfplotscoordmath{meta}{if is}{##1}{u} + {% \def\pgfmathresult{0}% \pgfplots@perpointmeta@unboundedwarning{##1}% - }% - }% - \pgfmathfloatsubtract@{\pgfplots@axiswide@metamax}{\pgfplots@axiswide@metamin}% - \else - % point meta rel=per plot: - \edef\pgfplotspointmetarange{\pgfplots@metamin:\pgfplots@metamax}% - % Now, prepare the trafo as such. - % It assigns \pgfmathresult (in fixed point). - \def\pgfplots@perpointmeta@trafo##1{% - \pgfmathfloatiffinite{##1}{% - \pgfmathfloatsubtract@{##1}{\pgfplots@metamin}% - \expandafter\pgfmathfloatmultiply@\expandafter{\pgfmathresult}{\pgfplots@perpointmeta@trafo@factor}% - \expandafter\pgfmathfloattofixed@\expandafter{\pgfmathresult}% }{% - \def\pgfmathresult{0}% - \pgfplots@perpointmeta@unboundedwarning{##1}% + \pgfplotscoordmath{meta}{tofixed}{##1}% }% }% - \pgfmathfloatsubtract@{\pgfplots@metamax}{\pgfplots@metamin}% + \def\pgfplots@perpointmeta@traforange{0:1000}% + \edef\pgfplotspointmetarange{0:1000}% + \else + % The transformation is + % + % phi(m) = ( m- meta_min) * 1000/ (meta_max-meta_min). + % + % -> precompute the scaling factor! + \edef\pgfplots@loc@TMPa{\pgfplotscolormaprange}% + \ifnum\pgfplots@loc@TMPa=1000 + \else + \pgfplots@error{LOGIC ERROR: sorry, I have hard-coded the assumption \string\pgfplotscolormaprange = 1000, but now it is \pgfplots@loc@TMPa.}% + \fi + \if\pgfplots@perpointmeta@rel@choice0% + % point meta rel=axis wide: + \pgfplots@perpointmeta@preparetrafo@initfrom{pgfplots@axiswide@}% + \else + \pgfplots@perpointmeta@preparetrafo@initfrom{pgfplots@}% + \fi \fi - \let\pgfplots@loc@TMPa=\pgfmathresult - \pgfmathfloatcreate{1}{1.0}{3}% - \expandafter\pgfmathfloatdivide@\expandafter{\pgfmathresult}{\pgfplots@loc@TMPa}% - \let\pgfplots@perpointmeta@trafo@factor=\pgfmathresult - % - % Expands to the transformation range as 'a:b': - \def\pgfplots@perpointmeta@traforange{0:1000}% - \fi - \else - % colormap access=direct - \def\pgfplots@perpointmeta@trafo##1{ - \pgfmathfloatiffinite{##1}{% - \pgfmathfloattofixed@{##1}% - }{% - \def\pgfmathresult{0}% - \pgfplots@perpointmeta@unboundedwarning{##1}% + \else + % colormap access=direct + \def\pgfplots@perpointmeta@trafo##1{% + \pgfplotscoordmath{meta}{if is}{##1}{u}{% + \def\pgfmathresult{0}% + \pgfplots@perpointmeta@unboundedwarning{##1}% + }{% + \pgfplotscoordmath{meta}{tofixed}{##1}% + }% }% - }% - \def\pgfplots@perpointmeta@traforange{0:0}% - \edef\pgfplotspointmetarange{\pgfplots@metamin:\pgfplots@metamax}% - \fi - \edef\pgfplotspointmetatransformedrange{\pgfplots@perpointmeta@traforange}% + \def\pgfplots@perpointmeta@traforange{0:0}% + \edef\pgfplotspointmetarange{\pgfplots@metamin:\pgfplots@metamax}% + \fi + \edef\pgfplotspointmetatransformedrange{\pgfplots@perpointmeta@traforange}% + }{}% }% -\def\pgfplots@perpointmeta@trafo@APPLY{% + +% Employs \csname #1metamin\endcsname and its metamax counterpart to +% initialize the trafo. +% +% This unifies the approaches for \pgfplots@axiswide@metamax and +% \pgfplots@metamax. +\def\pgfplots@perpointmeta@preparetrafo@initfrom#1{% + \edef\pgfplotspointmetarange{\csname #1metamin\endcsname:\csname #1max\endcsname}% + % Now, prepare the trafo as such. + % It assigns \pgfmathresult (in fixed point). + \def\pgfplots@perpointmeta@trafo##1{% + \pgfplotscoordmath{meta}{if is}{##1}{u}{% + \def\pgfmathresult{0}% + \pgfplots@perpointmeta@unboundedwarning{##1}% + }{% + \pgfplotscoordmath{meta}{op}{subtract}{{##1}{\csname #1metamin\endcsname}}% + \pgfplotscoordmath{meta}{op}{multiply}{{\pgfmathresult}{\pgfplots@perpointmeta@trafo@factor}}% + \pgfplotscoordmath{meta}{tofixed}{\pgfmathresult}% + }% + }% + \pgfplotscoordmath{meta}{op}{subtract}{{\csname #1metamax\endcsname}{\csname #1metamin\endcsname}}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotscoordmath{meta}{parsenumber}{1000}% + \pgfplotscoordmath{meta}{op}{divide}{{\pgfmathresult}{\pgfplots@loc@TMPa}}% + \let\pgfplots@perpointmeta@trafo@factor=\pgfmathresult + % + % Expands to the transformation range as 'a:b': + \def\pgfplots@perpointmeta@traforange{0:1000}% + % + \expandafter\let\expandafter\pgfplots@loc@TMPa\csname #1metamax\endcsname + \pgfplotscoordmath{meta}{tostring}{\pgfplots@loc@TMPa}% + \pgfmathfloatparsenumber\pgfmathresult + \pgfmathfloatgetexponent\pgfmathresult\c@pgf@countd + \edef\pgfplotspointmetarangeexponent{\the\c@pgf@countd}% +} + +% A command which is readily available during the visualization phase of each plot. +% +% It takes existing point meta data and transforms it, i.e. it defines +% \pgfplotspointmetatransformed. +% +% The command won't be invoked automatically, it is task of a plot +% handler to decide if it is needed. It's application is relatively +% fast, however. +% +% PRECONDITION: +% - point meta has been set up during the survey phase (i.e. the +% /pgfplots/point meta!=none), +% - there *is* point meta data for the current data point. +% +% POSTCONDITION: +% - the macros \pgfplotspointmeta and \pgfplotspointmetatransformed +% are defined. +% +% @see also \pgfplotsaxisifhaspointmeta +\def\pgfplotsaxisvisphasetransformpointmeta{% \ifx\pgfplots@current@point@meta\pgfutil@empty% \pgfplots@error{could not access the 'point meta' (used for example by scatter plots and color maps). Maybe you need to add '\string\addplot[point meta=y]' or something like that?}% - \pgfmathfloatcreate{1}{1.0}{0}% + \pgfplotscoordmath{meta}{one}% \let\pgfplotspointmeta=\pgfmathresult \def\pgfplotspointmetatransformed{1.0}% \else @@ -3536,7 +4954,11 @@ \pgfplots@error{Sorry, I could not read the plot coordinates near '#1'. Please check for format mistakes.}% }% \long\def\pgfplots@foreach@plot@coord@ITERATE@gobbleone#1{\pgfplots@foreach@plot@coord@ITERATE}% -\def\pgfplots@foreach@plot@coord@NEXT(#1,#2){% +\def\pgfplots@foreach@plot@coord@NEXT(#1){% + \edef\pgfmathresult{#1}% + \expandafter\pgfplots@foreach@plot@coord@NEXT@\expandafter(\pgfmathresult)% +} +\def\pgfplots@foreach@plot@coord@NEXT@(#1,#2){% \ifpgfplots@plot@coords@mathparser \pgfmathparse{#1}\let\pgfplots@current@point@x=\pgfmathresult \pgfmathparse{#2}\let\pgfplots@current@point@y=\pgfmathresult @@ -3613,7 +5035,11 @@ }% } \long\def\pgfplots@foreach@plot@coord@threedim@ITERATE@gobbleone#1{\pgfplots@foreach@plot@coord@threedim@ITERATE}% -\def\pgfplots@foreach@plot@coord@threedim@NEXT(#1,#2,#3){% +\def\pgfplots@foreach@plot@coord@threedim@NEXT(#1){% + \edef\pgfmathresult{#1}% + \expandafter\pgfplots@foreach@plot@coord@threedim@NEXT@\expandafter(\pgfmathresult)% +} +\def\pgfplots@foreach@plot@coord@threedim@NEXT@(#1,#2,#3){% \ifpgfplots@plot@coords@mathparser \pgfmathparse{#1}\let\pgfplots@current@point@x=\pgfmathresult \pgfmathparse{#2}\let\pgfplots@current@point@y=\pgfmathresult @@ -3668,42 +5094,168 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 % -% The same in normalized coordinates of the form -% x1,y1,z1,m1;x2,y2,z2,m2;...;xN,yN,zN,mN; -% if the plot is not threedim, zi is empty. +% A coordinate stream which works like this: +% +% ------------- +% \pgfplots@coord@stream@start +% +% foreach encoded coordinate: +% \def\pgfplots@coord@stream@foreach@NORMALIZED@curencoded{<encoded data>}% +% \def\pgfplots@coord@stream@foreach@NORMALIZED@curencoded@braced{{<encoded data>}}% note the extra braces. +% \pgfplotsaxisdeserializedatapointfrom{<encoded data>} +% \pgfplots@coord@stream@coord % -% The mi are Meta Values associated to point coordinates. They are -% usually empty, but can be used to realize per-point marker -% modifications (scatter plots, especially for colormaps). +% \pgfplots@coord@stream@end +% ------------- +% +% The format of #1 is +% {<datapoint>}{<datapoint>}...{<datapoint>} +% Each data point is decoded with +% \pgfplotsaxisserializedatapoint +% and then, \pgfplots@coord@stream@coord will be called. \long\def\pgfplots@coord@stream@foreach@NORMALIZED#1{% \pgfplots@coord@stream@start - \pgfplots@foreach@plot@coord@NORMALIZED@ITERATE#1\pgfplots@EOI + \pgfplotscoordstream@firstlast@init + \pgfplots@foreach@plot@coord@NORMALIZED@ITERATE#1\pgfplots@EOI% \pgfplots@coord@stream@end }% - -% A looping command to loop through plot coordinates. -% For every point, #1{X}{Y} will be invoked. -% % No scoping is used during this operation, so you can access outer % variables. -\def\pgfplots@foreach@plot@coord@NORMALIZED@ITERATE{% - \pgfutil@ifnextchar\pgfplots@EOI{% - \pgfplots@foreach@plot@coord@FINISH% - }{% - \pgfplots@foreach@plot@coord@NORMALIZED@NEXT% - }% +\def\pgfplots@foreach@plot@coord@NORMALIZED@ITERATE#1{% + \def\pgfplots@coord@stream@foreach@NORMALIZED@curencoded{#1}% + \ifx\pgfplots@coord@stream@foreach@NORMALIZED@curencoded\pgfplots@EOI + \else + \def\pgfplots@coord@stream@foreach@NORMALIZED@curencoded@braced{{#1}}% + \pgfplotsaxisdeserializedatapointfrom{#1}% + \pgfplots@coord@stream@coord + \pgfplotscoordstream@firstlast@update + \expandafter\pgfplots@foreach@plot@coord@NORMALIZED@ITERATE + \fi } -\def\pgfplots@foreach@plot@coord@NORMALIZED@NEXT#1,#2,#3,#4;{% - \def\pgfplots@current@point@x{#1}% - \def\pgfplots@current@point@y{#2}% - \def\pgfplots@current@point@z{#3}% - \def\pgfplots@current@point@meta{#4}% - \pgfplots@coord@stream@coord - \pgfplots@foreach@plot@coord@NORMALIZED@ITERATE + + +% A common routine which resets internal data structures for the +% survey phase, i.e. it is the shared implementation for all \addplot +% variations. +% +% It takes all options which are provided to \addplot, sets them (at +% least partially) and remembers them for the command serialization. +% +% #1: arguments to \addplot plot[#1] +% -> these are called 'behavior' options in the manual; they are set +% immediately. +% +% PRECONDITION: +% \pgfplots@addplotimpl@plot@withoptions has already been invoked +% +% POSTCONDITION: +% - internal datastructures are initialised (coordinate indexing, fpu) +% - all keys which are required for the current plot are determined +% (and set if necessary). +% They are stored into +% \pgfplots@addplot@survey@@optionlist. +% +\def\pgfplots@start@plot@with@behavioroptions#1{% + %\begingroup%<-- has been moved to \pgfplots@addplotimpl@plot@withoptions + \c@pgfplots@coordindex=0 + \def\pgfplots@current@point@coordindex{\the\c@pgfplots@coordindex}% can be used inside of coordinate filters. + \def\coordindex{\pgfplots@current@point@coordindex}% valid inside of \addplot + \def\pgfplots@addplot@running{1}% + % + \def\pgfplots@colorbar@set@src{0}% + \pgfkeysdef{/pgfplots/colorbar source}{% + \pgfplotsutilifstringequal{##1}{true}{% + \def\pgfplots@colorbar@set@src{1}% + }{% + \pgfplotsutilifstringequal{##1}{false}{% + \def\pgfplots@colorbar@set@src{0}% + }{% + \pgfplots@error{Sorry, I don't know the value `colorbar source={##1}' and I am going to ignore it. Maybe you misspelled it?}% + }% + }% + }% + % + % these styles may contain behavior options (error bars, + % samples,... ) activate them! + % + % As of february 20, 2009, #1 will contain BOTH, /pgfplots + % and /tikz options. The /tikz ones are primarily for drawing + % and are UNIMPORTANT at this stage of processing. + % In fact, transparency etc. will only confuse everything. + % + % So: ignore them and set only /pgfplots keys here: + % This may actually redefine styles, for example + % \addplot[every mark/.append style={}] will use + % /pgfplots/every mark/.append style. + % But that doesn't hurt here. + % + % there are some exceptions like /tikz/id etc. These + % exceptions need special styles in the /pgfplots root - or I + % need to change the .unknown handler. See the available + % compatibility styles! + % +% \pgfkeysdef{/pgfplots/.unknown}{% +%\message{In \string\addplot[#1]: I am silently ignoring key `\pgfkeyscurrentkeyRAW' during the preparation phase.}% +% }% + % ATTENTION: + % as of january 30, 2010, I will set /tikz keys as well. This won't hurt + % too much, I hope... there are no graphics operations anyway. But it *is* + % necessary since I *need* the plot handler for the new version. And the plot + % handler is, most likely, a /tikz key. + % + % it is possible that '#1' contains 'forget plot'. So, we need to + % set the options before checking \ifpgfplots@curplot@isirrelevant: + \pgfplotsset{/pgfplots/every axis plot,#1}% + % + \ifpgfplots@curplot@isirrelevant + \def\pgfplots@addplot@survey@@optionlist{/pgfplots/every axis plot,/pgfplots/every forget plot}% + \pgfplotsset{/pgfplots/every forget plot,/pgfplots/every axis plot post}% + \else + \edef\pgfplots@addplot@survey@@optionlist{/pgfplots/every axis plot,/pgfplots/every axis plot no \the\pgfplots@numplots/.try}% + \pgfplotsset{/pgfplots/every axis plot no \the\pgfplots@numplots/.try,/pgfplots/every axis plot post}% + \fi + % + % enable FPU after any \pgfplotsset operations. Otherwise things like + % linewidth=... which use the math parser might fail. + \ifpgfplots@usefpu + \pgfkeys{/pgf/fpu=true}% + \fi + % + % make sure it is reset, just in case it is not supported by the + % input method. + \pgfplotsscanlinelengthinitzero + % + \pgfplots@getcurrent@plothandler\pgfplots@basiclevel@plothandler + \pgfplotsresetplothandler + \pgfplots@basiclevel@plothandler + % + \pgfplots@countplots@init + % + % hooks: + \pgfkeysvalueof{/pgfplots/execute at begin plot@@}% + \pgfkeysvalueof{/pgfplots/execute at begin plot}% + % + \if1\pgfplots@colorbar@set@src + \expandafter\def\expandafter\pgfplots@addplot@survey@@optionlist\expandafter{\pgfplots@addplot@survey@@optionlist,% + /pgfplots/point meta rel=per plot}% + \fi + % + \t@pgfplots@tokc=\expandafter{\pgfplots@addplot@survey@@optionlist,#1}% this allows '#' inside of '#1' + \edef\pgfplots@addplot@survey@@optionlist{\the\t@pgfplots@tokc}% + % + % + \pgfplots@validate@plot@domain@arguments } +\long\def\pgfplotsplothandlersurveyaddoptions#1{% + \pgfplotsset{/pgfplots/execute at end survey/.add={}{% + \t@pgfplots@tokc=\expandafter{\pgfplots@addplot@survey@@optionlist,#1}% this allows '#' inside of '#1' + \edef\pgfplots@addplot@survey@@optionlist{\the\t@pgfplots@tokc}% + },% + #1% + }% +}% -\newif\ifpgfplots@curplot@threedim % The main interface to draw a plot into an axis. % @@ -3775,56 +5327,54 @@ }% } -\long\def\pgfplots@addplotimplAPPEND+[{% +\def\pgfplots@addplotimplAPPEND+{\pgfutil@ifnextchar[{\pgfplots@addplotimplAPPEND@}{\pgfplots@addplotimplAPPEND@[]}}% this allows to gobble spaces and to skip the '[]' +\def\pgfplots@addplotimplAPPEND@[{% \expandafter\pgfplots@addplotimpl\expandafter[\nextplotspec,% } \long\def\pgfplots@addplotimpl[#1]{% - \pgfutil@ifnextchar p{% + \pgfplotsutil@ifnextchar p{% \pgfplots@addplotimpl@plot{#1}% }{% \pgfplots@addplotimpl@plot{#1}plot }% } -\def\pgfplots@addplotimpl@plot#1plot{% - \pgfutil@ifnextchar[{% +\long\def\pgfplots@addplotimpl@plot#1plot{% + \pgfplotsutil@ifnextchar[{% \pgfplots@addplotimpl@plot@withoptions{#1}% }{% \pgfplots@addplotimpl@plot@withoptions{#1}[]% }% } -\def\pgfplots@addplotimpl@plot@withoptions#1[#2]{ +\long\def\pgfplots@addplotimpl@plot@withoptions#1[#2]{ \begingroup% <-- This groups ends in \pgfplots@end@plot % - % make sure it is reset, just in case it is not supported by the - % input method. - \pgfplotsscanlinelengthinitzero - % - \pgfutil@ifnextchar c{% + \pgfplotsutil@ifnextchar c{% \pgfplots@addplotimpl@coordinates{#1}{#2}plot }{% - \pgfutil@ifnextchar f{% + \pgfplotsutil@ifnextchar f{% \pgfplots@addplotimpl@f{#1}{#2}% }{% - \pgfutil@ifnextchar t{% + \pgfplotsutil@ifnextchar t{% + \def\pgfplotssurveyphaseinputclass{table}% \pgfplots@start@plot@with@behavioroptions{#1,/pgfplots/.cd,#2}% \pgfplots@addplotimpl@table{#1,#2}% }{% - \pgfutil@ifnextchar ({% + \pgfplotsutil@ifnextchar ({% \pgfplots@addplotimpl@expression{#1}{#2}% }{% - \pgfutil@ifnextchar\bgroup{% + \pgfplotsutil@ifnextchar\bgroup{% \pgfplots@addplotimpl@expression@curly{#1}{#2}% }{% - \pgfutil@ifnextchar e{% + \pgfplotsutil@ifnextchar e{% \pgfplots@addplotimpl@expression@e{#1}{#2}% }{% - \pgfutil@ifnextchar g{% + \pgfplotsutil@ifnextchar g{% \pgfplots@addplotimpl@g{#1}{#2}% }{% - \pgfutil@ifnextchar s{% + \pgfplotsutil@ifnextchar s{% \pgfplots@addplotimpl@shell{#1}{#2}% }{% @@ -3839,8 +5389,8 @@ }% }% } -\def\pgfplots@addplotimpl@f#1#2f{% - \pgfutil@ifnextchar i{% +\long\def\pgfplots@addplotimpl@f#1#2f{% + \pgfplotsutil@ifnextchar i{% \pgfplots@addplotimpl@file{#1}{#2}% }{% \pgfplots@addplotimpl@function{#1}{#2}% @@ -3902,9 +5452,32 @@ \edef\pgfplots@plot@var@y{\expandafter\noexpand\csname \pgfplots@plot@var@y\endcsname}% \fi % - % Check if we have to sample a line. - \def\b@pgfplots@should@sample@LINE{0}% - \ifpgfplots@curplot@threedim + % Check if we have to sample a line or a matrix. + % + \pgfkeysgetvalue{/pgfplots/sample dim}\pgfplots@loc@TMPa + \def\pgfplots@loc@TMPb{auto}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb + \ifpgfplots@curplot@threedim + \def\b@pgfplots@should@sample@LINE{0}% + \else + \def\b@pgfplots@should@sample@LINE{1}% + \fi + \else + \ifcase\pgfplots@loc@TMPa\relax + % sample dim=0 not useful!? + \def\b@pgfplots@should@sample@LINE{1}% + \or + \def\b@pgfplots@should@sample@LINE{1}% + \or + \def\b@pgfplots@should@sample@LINE{0}% + \else + \pgfplots@error{Sorry, sample dim=\pgfplots@loc@TMPa\space is unsupported (use either 1 or 2)}% + \fi + \fi + % + \if0\b@pgfplots@should@sample@LINE + % sample a matrix. Check the keys; if they are one + % dimensional, switch back to line sampling: \pgfkeysgetvalue{/pgfplots/y domain}{\pgfplots@plot@ydomain}% \edef\pgfplots@plot@ydomain{\pgfplots@plot@ydomain}% \def\pgfplots@loc@TMPa{0:0}% @@ -3932,7 +5505,10 @@ \pgfkeyssetvalue{/pgfplots/mesh/rows}{\pgfkeysvalueof{/pgfplots/samples y}}% \pgfkeyssetvalue{/pgfplots/mesh/cols}{\pgfkeysvalueof{/pgfplots/samples}}% \if1\b@pgfplots@should@sample@LINE + \pgfkeyssetvalue{/pgfplots/sample dim}{1}% \pgfkeyssetvalue{/pgfplots/mesh/cols}{1}% + \else + \pgfkeyssetvalue{/pgfplots/sample dim}{2}% \fi % }% @@ -3945,7 +5521,8 @@ \long\def\pgfplots@addplotimpl@expression#1#2(#3,#4)#5;{\pgfplots@addplotimpl@expression@{#1}{#2}{#3}{#4}{#5}}% % \addplot[#1] [#2] (#3,#4) #5; \long\def\pgfplots@addplotimpl@expression@#1#2#3#4#5{% - \pgfplots@start@plot@with@behavioroptions{#1,/pgfplots/.cd,#2,/pgfplots/mesh/ordering/x varies}% + \def\pgfplotssurveyphaseinputclass{expression}% + \pgfplots@start@plot@with@behavioroptions{#1,/pgfplots/.cd,#2,/pgfplots/mesh input=lattice,/pgfplots/mesh/ordering/x varies}% \pgfplots@plot@expression@preparekeys % \pgfplots@PREPARE@COORD@STREAM{#5}% @@ -4008,7 +5585,11 @@ % macro: \edef\pgfplots@plot@data##1{% \noexpand\pgfplotsforeachungrouped\expandafter\noexpand\pgfplots@plot@var@y in {\pgfplots@expression@ydomain} - {\noexpand\pgfplotsforeachungrouped\expandafter\noexpand\tikz@plot@var in {\pgfplots@expression@xdomain} {##1}}}% + {% + \noexpand\pgfplotsforeachungrouped\expandafter\noexpand\tikz@plot@var in {\pgfplots@expression@xdomain} {##1}% + \noexpand\pgfplotsplothandlernotifyscanlinecomplete + }% + }% \else % sample a line: \def\pgfplots@plot@ydomain{0:0}% @@ -4044,6 +5625,7 @@ \fi \fi \if\pgfplots@samples@logarithmically1% + \def\pgfplotsforeachlogarithmicmathid{x}% use \pgfplotscoordmath{x} % sample logarithmically: \edef\pgfplots@plot@data##1{% \noexpand\pgfplotsforeachlogarithmicungrouped[\pgfplots@plot@samples] @@ -4114,6 +5696,11 @@ \let\pgfplots@addplotimpl@expression@pseudoconst@y=\pgfmathy@ % % + % Warning for use fpu=false: evaluation '\x^3' might be different from 'x^3' for + % negative arguments: + % \x^3 ---> -0.2^3 but x^3 = (-0.2)^3 . + % This does not happen for use fpu=true. + % \pgfplots@plot@data{% \let\pgfmathx@=\pgfplots@addplotimpl@expression@pseudoconst@x \let\pgfmathy@=\pgfplots@addplotimpl@expression@pseudoconst@y @@ -4151,13 +5738,14 @@ }% \expandafter\pgfplots@loc@TMPa\pgfplots@loc@TMPb{#4}% \else - \def\pgfplots@loc@TMPa{\pgfplots@addplotimpl@expression@{#1}{#2}}% + \t@pgfplots@tokc={\pgfplots@addplotimpl@expression@{#1}{#2}}% + \def\pgfplots@loc@TMPa{\the\t@pgfplots@tokc}% this construction allows '#' in either '#1' or '#2' \expandafter\pgfplots@loc@TMPa\expandafter{\tikz@plot@var}{#3}{#4}% \fi }% % \addplot[#1] [#2] expression[#3] {#4} #5; \def\pgfplots@addplotimpl@expression@e#1#2expression{% - \pgfutil@ifnextchar[{% + \pgfplotsutil@ifnextchar[{% \pgfplots@addplotimpl@expression@e@{#1}{#2}% }{% \pgfplots@addplotimpl@expression@e@{#1}{#2}[]% @@ -4184,7 +5772,7 @@ \xdef\pgfplots@gnuplot@format{set format "%.7e";} } \def\pgfplots@addplotimpl@g#1#2g{% - \pgfutil@ifnextchar r{% + \pgfplotsutil@ifnextchar r{% \pgfplots@addplotimpl@graphics{#1}{#2}% }{% \pgfplots@addplotimpl@gnuplot{#1}{#2}% @@ -4196,7 +5784,7 @@ % \addplot[#1] plot[#2] function[#3] {#4} #5; \def\pgfplots@addplotimpl@function#1#2unction{% - \pgfutil@ifnextchar[{% + \pgfplotsutil@ifnextchar[{% \pgfplots@addplotimpl@function@opt{#1}{#2}% }{% \pgfplots@addplotimpl@function@opt{#1}{#2}[]% @@ -4207,6 +5795,7 @@ \def\pgfplots@addplotimpl@function@opt@#1#2#3#4#5{% % FIXME : what about the key search paths if the user changes % them!? + \def\pgfplotssurveyphaseinputclass{gnuplot}% \pgfplots@start@plot@with@behavioroptions{#1,/pgfplots/.cd,#2,/pgfplots/.cd,#3,/pgfplots/mesh/ordering/x varies}% % \pgfplots@gettikzinternal@keyval{prefix}{tikz@plot@prefix}{\jobname.}% @@ -4271,6 +5860,7 @@ \expandafter\def\expandafter\pgfplots@gnuplot@logdirs\expandafter{\pgfplots@gnuplot@logdirs z}% \fi \fi + % \ifpgfplots@curplot@threedim \if1\b@pgfplots@should@sample@LINE \pgfplots@error{Sorry, I do not know how to sample 3D LINE plots with gnuplot... I only know 2D line and 3D mesh. You may want to help the author of pgfplots to improve this feature.}% @@ -4395,7 +5985,7 @@ % \addplot[#1] plot[#2] shell[#3] {#4} #5; \def\pgfplots@addplotimpl@shell#1#2shell{% - \pgfutil@ifnextchar[{% + \pgfplotsutil@ifnextchar[{% \pgfplots@addplotimpl@shell@opt{#1}{#2}% }{% \pgfplots@addplotimpl@shell@opt{#1}{#2}[]% @@ -4404,6 +5994,7 @@ \def\pgfplots@addplotimpl@shell@opt#1#2[#3]#4#5;{\pgfplots@addplotimpl@shell@opt@{#1}{#2}{#3}{#4}{#5}}% % \addplot[#1] [#2] shell[#3] {#4} #5; \def\pgfplots@addplotimpl@shell@opt@#1#2#3#4#5{% + \def\pgfplotssurveyphaseinputclass{shell}% \pgfplots@start@plot@with@behavioroptions{#1,/pgfplots/.cd,#2,/pgfplots/.cd,#3}% \pgfplots@gettikzinternal@keyval{prefix}{tikz@plot@prefix}{\jobname.}% \pgfplots@gettikzinternal@keyval{id}{tikz@plot@id}{pgf-shell}% @@ -4440,7 +6031,7 @@ % \addplot[#1] [#2] file{#3} #4; \def\pgfplots@addplotimpl@file#1#2ile{% - \pgfutil@ifnextchar[{% + \pgfplotsutil@ifnextchar[{% \pgfplots@addplotimpl@file@opt{#1}{#2}% }{% \pgfplots@addplotimpl@file@opt{#1}{#2}[]% @@ -4452,6 +6043,7 @@ \def\pgfplots@addplotimpl@file@opt@#1#2#3#4#5{% % invoke this here - allows to share the 'plot file' impl with % 'plot gnuplot'. + \def\pgfplotssurveyphaseinputclass{file}% \pgfplots@start@plot@with@behavioroptions{#1,/pgfplots/.cd,#2}% \pgfplots@addplotimpl@file@opt@@{#1,#2}{#3}{#4}{#5}% } @@ -4463,13 +6055,18 @@ \pgfqkeys{/pgfplots/plot file}{#2}% \fi \pgfplots@PREPARE@COORD@STREAM{#4}% + \pgfplots@addplotimpl@file@streamit{#3}% + \endgroup +}% +% #1: the file name +\def\pgfplots@addplotimpl@file@streamit#1{% \pgfplots@coord@stream@start \pgfplotsscanlinelengthinitzero - \openin\r@pgfplots@reada=#3 + \openin\r@pgfplots@reada=#1 \ifeof\r@pgfplots@reada - \pgfplots@error{sorry, plot file{#3} could not be opened}% + \pgfplots@error{sorry, plot file{#1} could not be opened}% \else - \pgfplots@logfileopen{#3}% + \pgfplots@logfileopen{#1}% \let\pgfplots@current@point@x@error=\pgfutil@empty \let\pgfplots@current@point@y@error=\pgfutil@empty \let\pgfplots@current@point@z@error=\pgfutil@empty @@ -4490,7 +6087,6 @@ \fi \pgfplotsscanlinelengthcleanup \pgfplots@coord@stream@end - \endgroup }% \def\pgfplots@addplotimpl@file@readall{% \read\r@pgfplots@reada to\pgfplots@file@LINE @@ -4539,7 +6135,7 @@ \def\pgfplots@addplotimpl@graphics#1#2raphics{% - \pgfutil@ifnextchar[{% + \pgfplotsutil@ifnextchar[{% \pgfplots@addplotimpl@graphics@{#1}{#2}% }{% \pgfplots@addplotimpl@graphics@{#1}{#2}[]% @@ -4548,7 +6144,13 @@ % \addplot[#1] plot[#2] graphics[#3] {#4} #5; \long\def\pgfplots@addplotimpl@graphics@#1#2[#3]#4#5;{\pgfplots@addplotimpl@graphics@@{#1}{#2}{#3}{#4}{#5}}% \long\def\pgfplots@addplotimpl@graphics@@#1#2#3#4#5{% - \pgfplots@start@plot@with@behavioroptions{#1,/pgfplots/.cd,#2,% + \def\pgfplotssurveyphaseinputclass{graphics}% + \pgfplots@start@plot@with@behavioroptions{% + /pgfplots/filter discard warning=false, + /pgfplots/mesh/rows=2,% allow \addplot[surf] graphics ... --> yields a good legend. + /pgfplots/mesh/cols=2, + /pgfplots/mesh/check=false, + #1,/pgfplots/.cd,#2,% /pgfplots/plot graphics/@prepare legend, /pgfplots/plot graphics,% /pgfplots/plot graphics/.cd,% @@ -4557,8 +6159,27 @@ /tikz/mark=}% \pgfplots@PREPARE@COORD@STREAM{#5}% \pgfplots@coord@stream@start + % + \pgfkeysgetvalue{/pgfplots/plot graphics/points}{\pgfplots@current@point@points}% + \ifx\pgfplots@current@point@points\pgfutil@empty + \else + \let\pgfplotsplothandlergraphicspointmappoint=\pgfplotsplothandlergraphics@survey@pointmappoint + \expandafter\pgfplots@plot@handler@graphics@parsepointmap\expandafter{\pgfplots@current@point@points}% + \ifpgfplots@plot@graphics@autoadjustaxis + \pgfplotsplothandlergraphicspointmapcomputerequiredview + \ifx\pgfplotsretval\pgfutil@empty + \else + \expandafter\pgfplotssetlateoptions\expandafter{\pgfplotsretval}% + \fi + \fi + % + \def\pgfplots@addplotimpl@graphics@@error##1{}% + \fi + % \pgfkeysgetvalue{/pgfplots/plot graphics/xmin}{\pgfplots@current@point@x}% \pgfkeysgetvalue{/pgfplots/plot graphics/ymin}{\pgfplots@current@point@y}% + % + % these sanity checks do nothing of the 'plot graphics/points' feature has been used: \ifx\pgfplots@current@point@x\pgfutil@empty\pgfplots@addplotimpl@graphics@@error{xmin}\fi \ifx\pgfplots@current@point@y\pgfutil@empty\pgfplots@addplotimpl@graphics@@error{ymin}\fi \ifpgfplots@curplot@threedim @@ -4638,7 +6259,7 @@ % package is used - with all its features, including comfortable % access to the previous and next row and accumulation features. \def\pgfplots@addplotimpl@table#1table{% - \pgfutil@ifnextchar[{% + \pgfplotsutil@ifnextchar[{% \pgfplots@addplotimpl@table@getopts{#1}% }{% \pgfplots@addplotimpl@table@getopts{#1}[]% @@ -4651,10 +6272,10 @@ \pgfplots@addplotimpl@table@installkeypath \pgfplotstableset{#2}% % - \pgfutil@ifnextchar s{% + \pgfplotsutil@ifnextchar s{% \pgfplots@addplotimpl@table@fromshell{#1}{#2}% }{% - \pgfutil@ifnextchar f{% + \pgfplotsutil@ifnextchar f{% \pgfplots@addplotimpl@table@fromstructure@gobble@space{#1}{#2}% }{% \pgfplots@addplotimpl@table@fromfile@gobble@space{#1}{#2}% @@ -4715,6 +6336,7 @@ % \addplot[#1] table[#2] from {#3} #4 ; \long\def\pgfplots@addplotimpl@table@fromstructure@#1#2#3#4{% \begingroup + \def\pgfplotstablename{#3}% store the name of the currently processed table. \pgfplotstablegetscanlinelength{#3}{\pgfplotsscanlinelength}% % FIXME : this thing here has runtime O(N^2) ! % I fear it is faster to simply reload the data .... !? @@ -4731,6 +6353,8 @@ % % % high level user interface functions: + \let\pgfplotstable@coordindex@old=\coordindex + \def\coordindex{\pgfplotstablerow}% \let\lineno=\coordindex% is the same here % \expandafter\pgfplotstablegetcolumnbyname\expandafter{\pgfplots@plot@tbl@x}\of#3\to\addplot@tbl@x @@ -4778,6 +6402,8 @@ \let\pgfplots@current@point@z@error=\pgfutil@empty \fi % + \let\coordindex=\pgfplotstable@coordindex@old + % \pgfplots@PREPARE@COORD@STREAM{#4}% \pgfplots@coord@stream@start \pgfutil@loop @@ -5197,106 +6823,6 @@ \pgfshell[\pgfplots@plot@filename]{#3}\pgfplots@addplotimpl@table@fromfile{#1}{#2}{\pgfplots@plot@filename.out}#4;% }% -% A common routine which resets internal data structures for the -% survey phase, i.e. it is the shared implementation for all \addplot -% variations. -% -% It takes all options which are provided to \addplot, sets them (at -% least partially) and remembers them for the command serialization. -% -% #1: arguments to \addplot plot[#1] -% -> these are called 'behavior' options in the manual; they are set -% immediately. -% -% PRECONDITION: -% \pgfplots@addplotimpl@plot@withoptions has already been invoked -% -% POSTCONDITION: -% - internal datastructures are initialised (coordinate indexing, fpu) -% - all keys which are required for the current plot are determined -% (and set if necessary). -% They are stored into -% \pgfplots@addplot@survey@@optionlist. -% -\def\pgfplots@start@plot@with@behavioroptions#1{% - %\begingroup%<-- has been moved to \pgfplots@addplotimpl@plot@withoptions - \c@pgfplots@coordindex=0 - \def\pgfplots@current@point@coordindex{\the\c@pgfplots@coordindex}% can be used inside of coordinate filters. - \def\coordindex{\pgfplots@current@point@coordindex}% valid inside of \addplot - \def\pgfplots@addplot@running{1}% - \def\pgfplots@colorbar@set@src{0}% - \pgfkeysdef{/pgfplots/colorbar source}{% - \pgfplotsutilifstringequal{##1}{true}{% - \def\pgfplots@colorbar@set@src{1}% - }{% - \pgfplotsutilifstringequal{##1}{false}{% - \def\pgfplots@colorbar@set@src{0}% - }{% - \pgfplots@error{Sorry, I don't know the value `colorbar source={##1}' and I am going to ignore it. Maybe you misspelled it?}% - }% - }% - }% - % - % these styles may contain behavior options (error bars, - % samples,... ) activate them! - % - % As of february 20, 2009, #1 will contain BOTH, /pgfplots - % and /tikz options. The /tikz ones are primarily for drawing - % and are UNIMPORTANT at this stage of processing. - % In fact, transparency etc. will only confuse everything. - % - % So: ignore them and set only /pgfplots keys here: - % This may actually redefine styles, for example - % \addplot[every mark/.append style={}] will use - % /pgfplots/every mark/.append style. - % But that doesn't hurt here. - % - % there are some exceptions like /tikz/id etc. These - % exceptions need special styles in the /pgfplots root - or I - % need to change the .unknown handler. See the available - % compatibility styles! - % - % ATTENTION: starting with more recent versions (since the - % unstable version), I will also set /tikz keys here! This should - % work. It is well tested for the unstable... I hope it will also - % work for the master branch. - %\pgfkeysdef{/pgfplots/.unknown}{% -%\message{In \string\addplot[#1]: I am silently ignoring key `\pgfkeyscurrentkeyRAW' during the preparation phase.}% - %}% - % - % it is possible that '#1' contains 'forget plot'. So, we need to - % set the options before checking - % \ifpgfplots@curplot@isirrelevant: - \pgfplotsset{/pgfplots/every axis plot,#1}% - % - \ifpgfplots@curplot@isirrelevant - \def\pgfplots@addplot@survey@@optionlist{/pgfplots/every axis plot,/pgfplots/every forget plot}% - \pgfplotsset{/pgfplots/every forget plot,/pgfplots/every axis plot post}% - \else - \edef\pgfplots@addplot@survey@@optionlist{/pgfplots/every axis plot,/pgfplots/every axis plot no \the\pgfplots@numplots/.try}% - \pgfplotsset{/pgfplots/every axis plot no \the\pgfplots@numplots/.try,/pgfplots/every axis plot post}% - \fi - % - \ifpgfplots@usefpu - \pgfkeys{/pgf/fpu=true}% - \fi - \pgfplots@countplots@init - % - % hooks: - \pgfkeysvalueof{/pgfplots/execute at begin plot@@}% - \pgfkeysvalueof{/pgfplots/execute at begin plot}% - % - \if1\pgfplots@colorbar@set@src - \expandafter\def\expandafter\pgfplots@addplot@survey@@optionlist\expandafter{\pgfplots@addplot@survey@@optionlist,% - /pgfplots/point meta rel=per plot}% - \fi - % - \expandafter\def\expandafter\pgfplots@addplot@survey@@optionlist\expandafter{\pgfplots@addplot@survey@@optionlist,% - #1,/pgfplots/.cd,/pgfplots/every axis plot post}% - \pgfplots@validate@plot@domain@arguments -} - - % This is a backwards-compatibility method to ensure that % \axis[ybar] % and @@ -5310,7 +6836,7 @@ % So, this macro install special handlers to restore the old setting. \def\pgfplots@install@local@bar@handlers{% \pgfkeysgetvalue{/pgfplots/xbar/.@cmd}\pgfplotskeys@orig@xbar - \pgfkeysgetvalue{/pgfplots/ybar/.@cmd}\pgfplotskeys@orig@xbar + \pgfkeysgetvalue{/pgfplots/ybar/.@cmd}\pgfplotskeys@orig@ybar \pgfkeysgetvalue{/pgfplots/xbar interval/.@cmd}\pgfplotskeys@orig@xbari \pgfkeysgetvalue{/pgfplots/ybar interval/.@cmd}\pgfplotskeys@orig@ybari \pgfkeysdef{/pgfplots/xbar}{% @@ -5375,12 +6901,6 @@ }% }% % -% This macro may be overwritten inside of the \tikz@plot@handler -% macro. This here is just the default implementation. -% -% @INTERNAL HINT: I think the unstable version has another -% implementation. make sure it's not overwritten! -\def\pgfplotsplothandlername{\meaning\tikz@plot@handler}% % \def\pgfplots@countplots@init{% % @@ -5420,6 +6940,7 @@ \long\def\pgfplots@addplotimpl@coordinates#1#2plot coordinates#3#4;{\pgfplots@addplotimpl@coordinates@{#1}{#2}{#3}{#4}}% % \addplot[#1] [#2] coordinates {#3} #4; \long\def\pgfplots@addplotimpl@coordinates@#1#2#3#4{% + \def\pgfplotssurveyphaseinputclass{coordinates}% \pgfplots@start@plot@with@behavioroptions{#1,/pgfplots/.cd,#2}% \pgfplots@PREPARE@COORD@STREAM{#4}% \ifpgfplots@curplot@threedim @@ -5504,6 +7025,9 @@ }% } +\def\pgfplots@invoke@prefilter{% + \pgfkeysvalueof{/pgfplots/pre filter/.@cmd}\pgfeov% +}% \def\pgfplots@invoke@filter#1#2{% \pgfkeysvalueof{/pgfplots/#2 filter/.@cmd}#1\pgfeov% }% @@ -5528,6 +7052,12 @@ \def\pgfplots@stream@withmeta#1#2#3{\def\pgfplots@current@point@meta{#3}\pgfplotstreampoint{\pgfqpoint{#1}{#2}}} \def\pgfplots@stream@withmeta@#1#2#3#4{\def\pgfplots@current@point@coordindex{#1}\pgfplots@stream@withmeta{#2}{#3}{#4}} +\def\pgfplots@stream@decode@and@apply#1#2#3#4{% + \def\pgfplots@current@point@coordindex{#1}% + \pgfplotsaxisdeserializedatapointfrom@private{#2}% + \pgfplotstreampoint{\pgfqpoint{#3}{#4}}% +} + \newif\ifpgfplots@record@marker@stream % Takes a sequence of PREPARED coordinates which are given in floating % point representation and applies the data scaling trafo (if @@ -5546,6 +7076,7 @@ \pgfplots@getcurrent@plothandler\pgfplots@basiclevel@plothandler \pgfplots@gettikzinternal@keyval{mark}{tikz@plot@mark}{}% % + % \ifpgfplots@clip@limits \else % "clip marker paths=true" actually doesn't checks anything -- @@ -5554,6 +7085,9 @@ \pgfplots@clip@marker@pathstrue \fi % + \pgfplots@perpointmeta@preparetrafo + % + \pgfplots@prepare@visualization@dependencies % \def\pgfplots@loc@TMPa{0}% <-- if (collectmark positions) \ifpgfplots@scatterplotenabled @@ -5563,7 +7097,6 @@ \else \def\pgfplots@loc@TMPa{1}% \fi - % \if\pgfplots@loc@TMPa0% % mark=none : no need to waste time collecting marker % positions. @@ -5598,7 +7131,9 @@ \pgfplots@stacked@beginplot \fi \fi + \pgfplotsresetplothandler \pgfplots@basiclevel@plothandler + \expandafter\pgfplotsplothandlerdeserializestatefrom\expandafter{\pgfplots@serialized@state@plothandler}% \pgfplotstreamstart \let\pgfplots@data@scaletrafo@result=\pgfutil@empty \ifpgfplots@record@marker@stream @@ -5625,6 +7160,17 @@ %\expandafter\gdef\expandafter#1\expandafter{#1\pgfplotstreamend}% \fi }% + \def\pgfplots@visualize@performserialization{% + % ATTENTION: a similar thing is REPLICATED for stacked plots! + \t@pgfplots@tokb=\expandafter{\pgfplotsaxisdeserializedatapointfrom@private@lastvalue}% + \edef\pgfplots@loc@TMPa{% + \noexpand\pgfplots@stream@decode@and@apply + {\the\c@pgfplots@coordindex} + {\the\t@pgfplots@tokb}% + {\the\pgf@x}{\the\pgf@y} + }% + \expandafter\pgfplotsapplistXXpushback\expandafter{\pgfplots@loc@TMPa}% + }% \begingroup \let\E=\noexpand %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -5632,19 +7178,6 @@ % % Will be inserted in one of two possible places below (to collect % marker positions) - \def\pgfplots@visualize@performserizalization{% - % ATTENTION: this here is replicated for stacked plots! - \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\pgfplotsapplistXXpushback\E\expandafter{\E\pgfmathresult}% - \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\pgfplotsapplistXXpushback\E\expandafter{\E\pgfmathresult}% - \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 @@ -5655,109 +7188,119 @@ \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 + \E\pgfplotsqpointxy{\E\pgfplots@current@point@x}{\E\pgfplots@current@point@y}% \fi + % \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 + % remember the position (x,y) for markers. + % remember it before \pgfplotstreampoint (which might change (x,y) ) \ifpgfplots@clip - \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@visualize@performserizalization - \E\fi - \E\fi - \else - \pgfplots@visualize@performserizalization - \fi - \E\fi - \E\fi - \E\fi - \E\fi + % check for clip marker paths: + \E\pgfplotsaxisifcontainspoint{\E\pgfplots@visualize@performserialization}{}% \else - \pgfplots@visualize@performserizalization + \E\pgfplots@visualize@performserialization \fi \fi + % \E\pgfplotstreampoint{}% it will simply take \pgf@x and \pgf@y! + % \advance\c@pgfplots@coordindex by1 }% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endgroup % -%\message{Prepared macro \string \pgfplots@apply@data@scaletrafo@to@one@point {\meaning\pgfplots@apply@data@scaletrafo@to@one@point}}% +%\message{Prepared macro \string \pgfplotsaxisvisphasetransformcoordinate {\meaning\pgfplotsaxisvisphasetransformcoordinate}}% %\message{Prepared macro \string \pgfplots@coord@stream@finalize@currentpt {\meaning\pgfplots@coord@stream@finalize@currentpt}}% - \ifpgfplots@apply@datatrafo - \def\pgfplots@coord@stream@coord@{% - \pgfplots@apply@data@scaletrafo@to@one@point% - \pgfplots@coord@stream@finalize@currentpt - }% - \else - \def\pgfplots@coord@stream@coord@{% + \def\pgfplots@coord@stream@coord@{% + \ifx\pgfplots@current@point@x\pgfutil@empty% this realizes `unbounded coords=jump', for example + \pgfplotsplothandlervisualizejump + \else + \pgfplotsaxisvisphasetransformcoordinate\pgfplots@current@point@x\pgfplots@current@point@y\pgfplots@current@point@z% + \pgfplotsaxisvisphasepreparedatapoint \pgfplots@coord@stream@finalize@currentpt - }% - \fi - \if\pgfplots@unbounded@handler j% unbounded coords=jump - \t@pgfplots@tokb=\expandafter{\pgfplots@coord@stream@coord@}% - \edef\pgfplots@coord@stream@coord@{% - \noexpand\ifx\noexpand\pgfplots@current@point@x\noexpand\pgfutil@empty - \noexpand\pgfplots@plothandler@unbounded@visualize@jump - \noexpand\else - \the\t@pgfplots@tokb - \noexpand\fi - }% - \fi - % + \fi + }% } -\def\pgfplots@plothandler@unbounded@visualize@jump{% - \pgfplotstreamend - \pgfplotstreamstart +\def\pgfplots@check@for@default@plot@mark{% + % make sure there is a mark set! + \pgfplots@gettikzinternal@keyval{mark}{tikz@plot@mark}{}% + \def\pgfplots@loc@TMPa{none}% + \ifx\tikz@plot@mark\pgfplots@loc@TMPa + % this here happens only in older versions of pgf. + \let\tikz@plot@mark\pgfutil@empty + \fi + \ifx\tikz@plot@mark\pgfutil@empty + \pgfplots@getcurrent@plothandler\pgfplots@basiclevel@plothandler + \ifx\pgfplots@basiclevel@plothandler\pgfplothandlerdiscard + % oh, the "only marks" plot handler-- and no plot mark!? + % what's that!? + \ifpgfplots@scatterplotenabled + % scatter handles this in /pgfplots/scatter/true + % automatically. + \else + % that appears to be nonsense... + \def\tikz@plot@mark{*}% + \fi + \fi + \fi }% -% Defines an optimized and matching \pgfplots@apply@data@scaletrafo@to@one@point + +% Defines an optimized and matching \pgfplotsaxisvisphasetransformcoordinate % during the coordinate finalization step in \end{axis}. \def\pgfplots@coord@stream@INIT@finalize@storedcoords@prepare@scaletrafomacro{% \begingroup \let\E=\noexpand - % The command which is called for every non-yet-finished point. + % + % \pgfplotsaxisvisphasetransformcoordinate + % Maps a point to the low level xyz coordinate system by applying + % data scaling transformations. + % + % This method should be invoked for every coordinate before it can + % be drawn. % % It is prepared here to eliminate if's. % % Arguments: - % \pgfplots@current@point@[xyz] - % \pgfplots@current@point@[xyz]@error (if in argument list) - \xdef\pgfplots@apply@data@scaletrafo@to@one@point{% + % #1 : a MACRO containing the x value + % #2 : a MACRO containing the y value + % #3 : a MACRO containing the z value + % + % PRECONDITION: + % - the visualization phase is running. + % - #1,#2,#3 are defined and contain + % values resulting from the survey phase. + % + % POSTCONDITION + % - #1,#2,#3 will be redefined to contain data which is + % readily usable by low level pgf plot handlers for + % visualization. + % + % @see \pgfplotsaxisvisphasepreparedatapoint + \xdef\pgfplotsaxisvisphasetransformcoordinate##1##2##3{% \ifpgfplots@apply@datatrafo@x - \E\pgfplots@datascaletrafo@x{\E\pgfplots@current@point@x}% - \E\let\E\pgfplots@current@point@x=\E\pgfmathresult + \E\pgfplotscoordmath{x}{datascaletrafo}{##1}% + \E\let##1=\E\pgfmathresult \fi \ifpgfplots@apply@datatrafo@y - \E\pgfplots@datascaletrafo@y{\E\pgfplots@current@point@y}% - \E\let\E\pgfplots@current@point@y=\E\pgfmathresult + \E\pgfplotscoordmath{y}{datascaletrafo}{##2}% + \E\let##2=\E\pgfmathresult \fi \ifpgfplots@curplot@threedim \ifpgfplots@apply@datatrafo@z - \E\pgfplots@datascaletrafo@z{\E\pgfplots@current@point@z}% - \E\let\E\pgfplots@current@point@z=\E\pgfmathresult + \E\pgfplotscoordmath{z}{datascaletrafo}{##3}% + \E\let##3=\E\pgfmathresult \fi \fi + % \t@pgfplots@tokc=\expandafter{\pgfplots@data@scaletrafo@result}% + % \edef\pgfplots@data@scaletrafo@result{\the\t@pgfplots@tokc(\pgfplots@current@point@x,\pgfplots@current@point@y)}% + }% + % + % Just before the visualization phase can call the low level + % interface, this method is called to handle final changes. + % It is currently only used by the stacked plot interface. + \xdef\pgfplotsaxisvisphasepreparedatapoint{% \ifpgfplots@stackedmode % all these calls work with pgfmath; no more floating point % arithmetics are applied. @@ -5765,15 +7308,13 @@ \E\pgfplots@stacked@finishpoint% \E\pgfplots@stacked@rememberzerolevelpoint@for@next@plot{(\E\pgfplots@current@point@x,\E\pgfplots@current@point@y\ifpgfplots@threedim,\E\pgfplots@current@point@z\fi)}% \fi - % \t@pgfplots@tokc=\expandafter{\pgfplots@data@scaletrafo@result}% - % \edef\pgfplots@data@scaletrafo@result{\the\t@pgfplots@tokc(\pgfplots@current@point@x,\pgfplots@current@point@y)}% }% % \endgroup } \def\pgfplots@addplot@get@named@startendpoints@command#1{% - \ifpgfplots@coord@stream@isfirst + \ifx\pgfplots@currentplot@firstcoord@x\pgfutil@empty % empty plot. \def#1{% \pgfcoordinate{current plot begin}{\pgfplotspointaxisorigin}% @@ -5849,6 +7390,8 @@ \t@pgfplots@tokb=\expandafter{\pgfplots@stored@current@cmd[current plot style]}% \t@pgfplots@tokc=\expandafter{\pgfplots@recorded@marker@stream}% \edef\pgfplots@loc@TMPa{% + \noexpand\pgfkeysvalueof{/pgfplots/execute at begin plot visualization}% + \noexpand\def\noexpand\tikz@plot@mark{\tikz@plot@mark}% make sure we restore the environment setting \noexpand\pgfkeysdef{/tikz/current plot style}{\the\t@pgfplots@toka}% % de-activate the FPU here if it was active! I fear its number % format may cause errors when used in low-level @@ -5864,7 +7407,9 @@ \noexpand\pgfplots@install@plotmark@handler \the\t@pgfplots@tokc \noexpand\endpgfextra - ;}% + ;% + \noexpand\pgfkeysvalueof{/pgfplots/execute at end plot visualization}% + }% \t@pgfplots@toka=\expandafter{\pgfplots@loc@TMPa}% \t@pgfplots@tokb=\expandafter{\pgfplots@stored@current@precmd}% \edef\pgfplots@loc@TMPa{\the\t@pgfplots@tokb\the\t@pgfplots@toka}% @@ -5876,6 +7421,7 @@ \pgfplots@gettikzinternal@keyval{mark indices}{tikz@mark@list}{}% \pgfplots@gettikzinternal@keyval{mark}{tikz@plot@mark}{}% % + % % do not reset \tikz@options: draw color may be acquired % from 'current plot style' %\let\tikz@options=\pgfutil@empty% @@ -5905,6 +7451,9 @@ % \fi %-------------------------------------------------- \pgfplots@perpointmeta@preparetrafo + % + \pgfplots@prepare@visualization@dependencies + % % this here is the MAIN marker code. % It may be modified if scatter plot is enabled, see below. \def\pgfplots@loc@TMPa{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}} @@ -5923,7 +7472,7 @@ % Prepare arguments for '@pre/@post' macros: \t@pgfplots@toka={% \begingroup - \pgfplots@perpointmeta@trafo@APPLY + \pgfplotsaxisvisphasetransformpointmeta \pgfkeysvalueof{/pgfplots/scatter/@pre marker code/.@cmd}\pgfeov }% \t@pgfplots@tokb=\expandafter{\pgfplots@loc@TMPa}% @@ -5958,18 +7507,18 @@ \def\pgfplots@errorbar@draw@float(#1,#2)(#3,#4){% \ifpgfplots@apply@datatrafo@x - \pgfplots@datascaletrafo@x{#1}% + \pgfplotscoordmath{x}{datascaletrafo}{#1}% \let\pgfplots@xarg=\pgfmathresult% - \pgfplots@datascaletrafo@x{#3}% + \pgfplotscoordmath{x}{datascaletrafo}{#3}% \let\pgfplots@error@xarg=\pgfmathresult% \else \def\pgfplots@xarg{#1}% \def\pgfplots@error@xarg{#3}% \fi \ifpgfplots@apply@datatrafo@y - \pgfplots@datascaletrafo@y{#2}% + \pgfplotscoordmath{y}{datascaletrafo}{#2}% \let\pgfplots@yarg=\pgfmathresult% - \pgfplots@datascaletrafo@y{#4}% + \pgfplotscoordmath{y}{datascaletrafo}{#4}% \let\pgfplots@error@yarg=\pgfmathresult% \else \def\pgfplots@yarg{#2}% @@ -5981,27 +7530,27 @@ } \def\pgfplots@errorbar@draw@float@threedim(#1,#2,#3)(#4,#5,#6){% \ifpgfplots@apply@datatrafo@x - \pgfplots@datascaletrafo@x{#1}% + \pgfplotscoordmath{x}{datascaletrafo}{#1}% \let\pgfplots@xarg=\pgfmathresult% - \pgfplots@datascaletrafo@x{#4}% + \pgfplotscoordmath{x}{datascaletrafo}{#4}% \let\pgfplots@error@xarg=\pgfmathresult% \else \def\pgfplots@xarg{#1}% \def\pgfplots@error@xarg{#4}% \fi \ifpgfplots@apply@datatrafo@y - \pgfplots@datascaletrafo@y{#2}% + \pgfplotscoordmath{y}{datascaletrafo}{#2}% \let\pgfplots@yarg=\pgfmathresult% - \pgfplots@datascaletrafo@y{#5}% + \pgfplotscoordmath{y}{datascaletrafo}{#5}% \let\pgfplots@error@yarg=\pgfmathresult% \else \def\pgfplots@yarg{#2}% \def\pgfplots@error@yarg{#5}% \fi \ifpgfplots@apply@datatrafo@z - \pgfplots@datascaletrafo@z{#3}% + \pgfplotscoordmath{z}{datascaletrafo}{#3}% \let\pgfplots@zarg=\pgfmathresult% - \pgfplots@datascaletrafo@z{#6}% + \pgfplotscoordmath{z}{datascaletrafo}{#6}% \let\pgfplots@error@zarg=\pgfmathresult% \else \def\pgfplots@zarg{#3}% @@ -6084,24 +7633,29 @@ \def\pgfplots@prepare@ZERO@coordinates{% \ifpgfplots@xislinear \ifpgfplots@apply@datatrafo@x - \pgfmathfloatcreate{0}{0.0}{0}% - \pgfplots@datascaletrafo@x{\pgfmathresult}% + \pgfplotscoordmath{x}{parsenumber}{0}% + \pgfplotscoordmath{x}{datascaletrafo}{\pgfmathresult}% \global\let\pgfplots@logical@ZERO@x=\pgfmathresult \else \gdef\pgfplots@logical@ZERO@x{0}% \fi + % this works in standard fixed pt math: \pgfplotsmathmax{\pgfplots@logical@ZERO@x}{\pgfplots@xmin}% \global\let\pgfplots@logical@ZERO@x=\pgfmathresult \pgfplotsmathmin{\pgfplots@logical@ZERO@x}{\pgfplots@xmax}% \global\let\pgfplots@logical@ZERO@x=\pgfmathresult \else - \global\let\pgfplots@logical@ZERO@x=\pgfplots@xmin% + \if\pgfplots@log@origin@choice@x0% + \global\let\pgfplots@logical@ZERO@x=\pgfplots@xmin% + \else + \gdef\pgfplots@logical@ZERO@x{1}% + \fi \fi % \ifpgfplots@yislinear \ifpgfplots@apply@datatrafo@y - \pgfmathfloatcreate{0}{0.0}{0}% - \pgfplots@datascaletrafo@y{\pgfmathresult}% + \pgfplotscoordmath{y}{parsenumber}{0}% + \pgfplotscoordmath{y}{datascaletrafo}{\pgfmathresult}% \global\let\pgfplots@logical@ZERO@y=\pgfmathresult \else \gdef\pgfplots@logical@ZERO@y{0}% @@ -6111,14 +7665,18 @@ \pgfplotsmathmin{\pgfplots@logical@ZERO@y}{\pgfplots@ymax}% \global\let\pgfplots@logical@ZERO@y=\pgfmathresult \else - \global\let\pgfplots@logical@ZERO@y=\pgfplots@ymin% + \if\pgfplots@log@origin@choice@y0% + \global\let\pgfplots@logical@ZERO@y=\pgfplots@ymin% + \else + \gdef\pgfplots@logical@ZERO@y{1}% + \fi \fi % \ifpgfplots@threedim \ifpgfplots@zislinear \ifpgfplots@apply@datatrafo@z - \pgfmathfloatcreate{0}{0.0}{0}% - \pgfplots@datascaletrafo@z{\pgfmathresult}% + \pgfplotscoordmath{z}{parsenumber}{0}% + \pgfplotscoordmath{z}{datascaletrafo}{\pgfmathresult}% \global\let\pgfplots@logical@ZERO@z=\pgfmathresult \else \gdef\pgfplots@logical@ZERO@z{0}% @@ -6128,7 +7686,11 @@ \pgfplotsmathmin{\pgfplots@logical@ZERO@z}{\pgfplots@zmax}% \global\let\pgfplots@logical@ZERO@z=\pgfmathresult \else - \global\let\pgfplots@logical@ZERO@z=\pgfplots@zmin% + \if\pgfplots@log@origin@choice@z0% + \global\let\pgfplots@logical@ZERO@z=\pgfplots@zmin% + \else + \gdef\pgfplots@logical@ZERO@z{1}% + \fi \fi \fi % @@ -6151,40 +7713,623 @@ % coordinates. \def\pgfplotsplothandlergraphics{% \def\pgf@plotstreamstart{% - \global\let\pgfplots@plot@handler@graphics@bb@first=\pgfutil@empty - \global\let\pgfplots@plot@handler@graphics@bb@second=\pgfutil@empty + \gdef\pgfplots@plot@handler@graphics@bb@first{\pgf@x=16000pt \pgf@y=16000pt }% + \gdef\pgfplots@plot@handler@graphics@bb@second{\pgf@x=-16000pt \pgf@y=-16000pt }% \global\let\pgf@plotstreampoint=\pgfplots@plot@handler@graphics@collectbb% \global\let\pgf@plotstreamspecial=\pgfutil@gobble% \global\let\pgf@plotstreamend=\pgfplots@plot@handler@graphics@finish% - \def\pgfplots@plothandler@unbounded@visualize@jump{% + \def\pgfplotsplothandlervisualizejump{% \pgfplots@error{Sorry, plot graphics does not support 'unbounded coords=jump'.}% }% }% }% \def\pgfplots@plot@handler@graphics@collectbb#1{% \pgf@process{#1}% - \ifx\pgfplots@plot@handler@graphics@bb@first\pgfutil@empty - % ok, this is the lower left corner. - \xdef\pgfplots@plot@handler@graphics@bb@first{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + \pgf@xa=\pgf@x + \pgf@ya=\pgf@y + \pgfplots@plot@handler@graphics@bb@first + \ifdim\pgf@xa<\pgf@x \pgf@x=\pgf@xa\fi + \ifdim\pgf@ya<\pgf@y \pgf@y=\pgf@ya\fi + \xdef\pgfplots@plot@handler@graphics@bb@first{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + % + \pgfplots@plot@handler@graphics@bb@second + \ifdim\pgf@xa>\pgf@x \pgf@x=\pgf@xa\fi + \ifdim\pgf@ya>\pgf@y \pgf@y=\pgf@ya\fi + \xdef\pgfplots@plot@handler@graphics@bb@second{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + % +}% +\def\pgfplots@plot@handler@graphics@finish{% + \let\pgfplots@plot@handler@graphics@pointmap@B@canvas\pgfutil@empty + % + % check if we have a pointmap. If so, the pointmap should be used + % to place the graphics. + \pgfkeysgetvalue{/pgfplots/plot graphics/points}\pgfplots@plot@handler@graphics@pointmap + \ifx\pgfplots@plot@handler@graphics@pointmap\pgfutil@empty \else - \ifx\pgfplots@plot@handler@graphics@bb@second\pgfutil@empty - % ok, this is the upper right corner. - \xdef\pgfplots@plot@handler@graphics@bb@second{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + \let\pgfplots@plot@handler@graphics@parsepointmap@error=\relax + \expandafter\pgfplots@plot@handler@graphics@parsepointmap\expandafter{\pgfplots@plot@handler@graphics@pointmap}% + \fi + % + % + \ifx\pgfplots@plot@handler@graphics@pointmap@B@canvas\pgfutil@empty + % no pointmap. Good; then squeze graphics into the bounding + % box: + \pgfplots@plot@handler@graphics@usebb + \else + % oh, a pointmap! Process it. + \pgfplots@plot@handler@graphics@process@pointmap + \fi +}% + +% Parses the argument of '/pgfplots/plot graphics/points'. +% +% #1: the argument of the key above. +\def\pgfplots@plot@handler@graphics@parsepointmap#1{% + \let\pgfplots@plot@handler@graphics@pointmap@A@canvas\pgfutil@empty + \let\pgfplots@plot@handler@graphics@pointmap@A@img\pgfutil@empty + \let\pgfplots@plot@handler@graphics@pointmap@B@canvas\pgfutil@empty + \let\pgfplots@plot@handler@graphics@pointmap@B@img\pgfutil@empty + \let\pgfplots@plot@handler@graphics@pointmap@C@canvas\pgfutil@empty + \let\pgfplots@plot@handler@graphics@pointmap@C@img\pgfutil@empty + \let\pgfplots@plot@handler@graphics@pointmap@D@canvas\pgfutil@empty + \let\pgfplots@plot@handler@graphics@pointmap@D@img\pgfutil@empty + \pgfplots@plot@handler@graphics@parsepointmap@loop#1\pgfplots@EOI + \ifpgfplots@plot@graphics@autoadjustaxis + \ifx\pgfplots@plot@handler@graphics@pointmap@A@img\pgfutil@empty \else - \pgfplots@error{Error using 'plot graphics': I encountered more than two coordinates!? I expected only the lower left and upper right corners!}% + \ifx\pgfplots@plot@handler@graphics@pointmap@D@img\pgfutil@empty + \def\pgfplots@loc@TMPa{#1}% + \pgfplots@plot@handler@graphics@parsepointmap@error + \fi \fi \fi }% -\def\pgfplots@plot@handler@graphics@finish{% - \ifx\pgfplots@plot@handler@graphics@bb@first\pgfutil@empty +\def\pgfplots@plot@handler@graphics@parsepointmap@error{% + \pgfplots@error{plot graphics/points={\pgfplots@loc@TMPa} cannot be processed: I need at least *four* inner anchor points to automatically adjust the axis, i.e. 4 points of the form (x,y,z) => (imgx,imgy). Use 'plot graphics/auto adjust axis=false' to disable this feature}% +}% +\def\pgfplots@plot@handler@graphics@parsepointmap@loop{% + \pgfutil@ifnextchar\pgfplots@EOI{% + \pgfplots@gobble@until@EOI + }{% + \pgfplots@plot@handler@graphics@parsepointmap@loop@ + }% +}% +\def\pgfplots@plot@handler@graphics@parsepointmap@loop@(#1,#2){% + \pgfutil@ifnextchar={% + \pgfplots@plot@handler@graphics@parsepointmap@loop@@(#1,#2)% + }{% + \pgfplots@plot@handler@graphics@parsepointmap@loop@@(#1,#2)=>(,)% + }% +}% +\def\pgfplots@plot@handler@graphics@parsepointmap@loop@@(#1,#2)=>{% + \pgfutil@ifnextchar({% + \pgfplots@plot@handler@graphics@parsepointmap@loop@@@(#1,#2)% + }{% + \pgfplots@error{Syntax error for plot graphics/pointmap: expected '(#1,#2) => (...,...)'}% + \pgfplots@gobble@until@EOI + }% +} +\def\pgfplots@plot@handler@graphics@parsepointmap@loop@@@(#1,#2)(#3,#4){% + \def\pgfplotsplothandlergraphicspointmappointindex{}% + \def\pgfplots@loc@TMPc{#4}% + \ifx\pgfplots@loc@TMPc\pgfutil@empty + \else + \ifx\pgfplots@plot@handler@graphics@pointmap@A@img\pgfutil@empty + \def\pgfplotsplothandlergraphicspointmappointindex{A}% + \else + \ifx\pgfplots@plot@handler@graphics@pointmap@B@img\pgfutil@empty + \def\pgfplotsplothandlergraphicspointmappointindex{B}% + \else + \ifx\pgfplots@plot@handler@graphics@pointmap@C@img\pgfutil@empty + \def\pgfplotsplothandlergraphicspointmappointindex{C}% + \else + \ifx\pgfplots@plot@handler@graphics@pointmap@D@img\pgfutil@empty + \def\pgfplotsplothandlergraphicspointmappointindex{D}% + \else + \def\pgfplotsplothandlergraphicspointmappointindex{*}% + %\pgfplots@error{Sorry, the argument '(#1,#2) => (#3,#4)' of plot graphics/pointmap is superfluos; ignoring it.}% + \fi + \fi + \fi + \fi + \pgfmathparse{#3}% + \let\pgfplots@loc@TMPb=\pgfmathresult + % + \pgfmathparse{#4}% + \expandafter\edef\csname pgfplots@plot@handler@graphics@pointmap@\pgfplotsplothandlergraphicspointmappointindex @img\endcsname{{\pgfplots@loc@TMPb}{\pgfmathresult}}% + \fi + % + % + \pgfutil@in@,{#2}% + \ifpgfutil@in@ + \def\pgfplots@loc@TMPa##1,##2\relax{% + \expandafter\edef\csname pgfplots@plot@handler@graphics@pointmap@\pgfplotsplothandlergraphicspointmappointindex @logical\endcsname{{#1}{##1}{##2}}% + % + \pgfplotsplothandlergraphicspointmappoint(#1,##1,##2)(#3,#4) + }% + \pgfplots@loc@TMPa#2\relax + \else + \expandafter\edef\csname pgfplots@plot@handler@graphics@pointmap@\pgfplotsplothandlergraphicspointmappointindex @logical\endcsname{{#1}{#2}{}}% + \pgfplotsplothandlergraphicspointmappoint(#1,#2,)(#3,#4) + \fi + \pgfplots@plot@handler@graphics@parsepointmap@loop +} + +\def\pgfplotsplothandlergraphics@survey@pointmappoint(#1,#2,#3)(#4,#5){% + \def\pgfplots@current@point@x{#1}% + \def\pgfplots@current@point@y{#2}% + \def\pgfplots@current@point@z{#3}% + \pgfplots@coord@stream@coord +}% + +% PRECONDITION: +% \pgfplotsplothandlergraphicspointmappointindex is +% empty if and only if (#4,#5) is empty +% or it is an index among all points with non--empty (#4,#5) image +% coordinates. +\def\pgfplotsplothandlergraphicspointmappoint(#1,#2,#3)(#4,#5){% + \ifx\pgfplotsplothandlergraphicspointmappointindex\pgfutil@empty + \else + \def\pgfplots@loc@TMPc{#3}% + \ifx\pgfplots@loc@TMPc\pgfutil@empty + \pgfplotspointaxisxy{#1}{#2}% + \else + \pgfplotspointaxisxyz{#1}{#2}{#3}% + \fi + \expandafter\edef\csname pgfplots@plot@handler@graphics@pointmap@\pgfplotsplothandlergraphicspointmappointindex @canvas\endcsname{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + \fi +}% + +% Computes view-related keys which should be communicated to the axis +% in order to render the plot graphics correctly. +% +% @POSTCONDITION: \pgfplotsretval contains any required keys. +\def\pgfplotsplothandlergraphicspointmapcomputerequiredview{% + \begingroup + \let\pgfplotsretval=\pgfutil@empty + \ifx\pgfplots@plot@handler@graphics@pointmap@D@img\pgfutil@empty + \else + \pgfkeysgetvalue{/pgfplots/plot graphics/debug}\pgfplots@loc@TMPa + \def\pgfplots@loc@TMPb{true}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb + \def\pgfplotsplothandlergraphicspointmapcomputerequiredview@debug{1}% + \else + \def\pgfplotsplothandlergraphicspointmapcomputerequiredview@debug{0}% + \fi + % The following implementation computes the 'unit vector + % ratio' of the IMAGE. + % + % It then tells PGFPlots to use the very same unit vector + % ratio for its axis. + % + % + % The actual implementation is dumb; it requires 4 (!) points for + % which BOTH, the 3D coordinates and the projected 2D + % coordinates relative to the image's lower left corner are + % available. + % + % Since the 2D projected coordinates are generated by the map + % + % T(x,y,z) = o + x e_x + y e_y + z e_z in R^2 + % with o,e_x,e_y,e_z in R^2, + % + % I have 8 degrees of freedom (two for each of the four + % involved vectors). Thus, a simple approach is to provide 4 + % linearly independend points to get 8 equations. + % + % Then, I solve for o,e_x,e_y,e_z + % + \pgfplotsmatrixnewempty\pgfplotsmatrix + \pgfplotsmatrixresize\pgfplotsmatrix88% + % + \pgfplotsarraynewempty\pgfplotsE + \pgfplotsarrayresize\pgfplotsE8% + % + \def\pgfplots@extractimg##1##2{% + \def\pgfplots@img@x{##1}% + \def\pgfplots@img@y{##2}% + }% + \def\pgfplots@extractlogical##1##2##3{% + \def\pgfplots@logical@x{##1}% + \def\pgfplots@logical@y{##2}% + \def\pgfplots@logical@z{##3}% + }% + % Assemble the linear system such that + % x = [ + % exx + % exy + % eyx + % eyy + % ezx + % ezy + % ox + % oy] + % are the degrees of freedom. + \c@pgfplots@coordindex=0 + \pgfplotsutilforeachcommasep{A,B,C,D}\as\pgfplots@loc@TMPa{% + \expandafter\expandafter\expandafter\pgfplots@extractimg\csname pgfplots@plot@handler@graphics@pointmap@\pgfplots@loc@TMPa @img\endcsname + \expandafter\expandafter\expandafter\pgfplots@extractlogical\csname pgfplots@plot@handler@graphics@pointmap@\pgfplots@loc@TMPa @logical\endcsname + \ifx\pgfplots@logical@z\pgfutil@empty + \else + % + \pgfplotsmatrixletentry \the\c@pgfplots@coordindex,0\of\pgfplotsmatrix=\pgfplots@logical@x% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,1\of\pgfplotsmatrix\to{0}% + \pgfplotsmatrixletentry \the\c@pgfplots@coordindex,2\of\pgfplotsmatrix=\pgfplots@logical@y% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,3\of\pgfplotsmatrix\to{0}% + \pgfplotsmatrixletentry \the\c@pgfplots@coordindex,4\of\pgfplotsmatrix=\pgfplots@logical@z% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,5\of\pgfplotsmatrix\to{0}% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,6\of\pgfplotsmatrix\to{1}% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,7\of\pgfplotsmatrix\to{0}% + % + \pgfplotsarrayletentry\c@pgfplots@coordindex\of\pgfplotsE=\pgfplots@img@x + % + \advance\c@pgfplots@coordindex by1 + \pgfplotsmatrixset \the\c@pgfplots@coordindex,0\of\pgfplotsmatrix\to{0}% + \pgfplotsmatrixletentry \the\c@pgfplots@coordindex,1\of\pgfplotsmatrix=\pgfplots@logical@x% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,2\of\pgfplotsmatrix\to{0}% + \pgfplotsmatrixletentry \the\c@pgfplots@coordindex,3\of\pgfplotsmatrix=\pgfplots@logical@y% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,4\of\pgfplotsmatrix\to{0}% + \pgfplotsmatrixletentry \the\c@pgfplots@coordindex,5\of\pgfplotsmatrix=\pgfplots@logical@z% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,6\of\pgfplotsmatrix\to{0}% + \pgfplotsmatrixset \the\c@pgfplots@coordindex,7\of\pgfplotsmatrix\to{1}% + % + \pgfplotsarrayletentry\c@pgfplots@coordindex\of\pgfplotsE=\pgfplots@img@y + % + \advance\c@pgfplots@coordindex by1 + \fi + }% + \ifx\pgfplots@logical@z\pgfutil@empty + \else + \if1\pgfplotsplothandlergraphicspointmapcomputerequiredview@debug + \pgfplotsplothandlergraphics@debug@matrix@to@string + \fi + % + % + \pgfplotsmatrixsolveLEQS\pgfplotsmatrix=\pgfplotsE + % + \edef\pgfmathresult{\pgfplotsarrayvalueofelem0\of\pgfplotsE}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@xx=\pgfmathresult + \edef\pgfmathresult{\pgfplotsarrayvalueofelem1\of\pgfplotsE}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@xy=\pgfmathresult + \if r\pgfkeysvalueof{/pgfplots/x dir/value}% + % they will be reversed again during the final + % processing: + \edef\pgfplots@xx{-\pgfplots@xx}% + \edef\pgfplots@xy{-\pgfplots@xy}% + \fi + % + \edef\pgfmathresult{\pgfplotsarrayvalueofelem2\of\pgfplotsE}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@yx=\pgfmathresult + \edef\pgfmathresult{\pgfplotsarrayvalueofelem3\of\pgfplotsE}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@yy=\pgfmathresult + \if r\pgfkeysvalueof{/pgfplots/y dir/value}% + % they will be reversed again during the final + % processing: + \edef\pgfplots@yx{-\pgfplots@yx}% + \edef\pgfplots@yy{-\pgfplots@yy}% + \fi + % + \edef\pgfmathresult{\pgfplotsarrayvalueofelem4\of\pgfplotsE}% + \pgfkeysgetvalue{/pgfplots/plot graphics/snap z}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \let\pgfplots@zx=\pgfmathresult + \pgfplotscoordmath{default}{op}{veclen}{% + {\pgfplotsarrayvalueofelem4\of\pgfplotsE}% + {\pgfplotsarrayvalueofelem5\of\pgfplotsE}% + }% + \let\pgfplotszlen=\pgfmathresult + % + % compute 'snap z' relative to + % '\pgfplotszlen' + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplotszlen}}% + \let\pgfplots@loc@TMPa=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{abs}{{\pgfplots@zx}}% + \pgfplotscoordmath{default}{if less than}{\pgfmathresult}{\pgfplots@loc@TMPa}{% + \pgfplotscoordmath{default}{zero}% + }{% + \let\pgfmathresult=\pgfplots@zx + }% + \fi + \pgfplotscoordmath{default}{tofixed}\pgfmathresult% + \let\pgfplots@zx=\pgfmathresult + % + \edef\pgfmathresult{\pgfplotsarrayvalueofelem5\of\pgfplotsE}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@zy=\pgfmathresult + \if r\pgfkeysvalueof{/pgfplots/z dir/value}% + % they will be reversed again during the final + % processing: + \edef\pgfplots@zx{-\pgfplots@zx}% + \edef\pgfplots@zy{-\pgfplots@zy}% + \fi + % + % + \edef\pgfplotsretval{% + x={(\pgfplots@xx,\pgfplots@xy)},% + y={(\pgfplots@yx,\pgfplots@yy)},% + z={(\pgfplots@zx,\pgfplots@zy)},% + scale mode=scale uniformly,% + }% + % + \if1\pgfplotsplothandlergraphicspointmapcomputerequiredview@debug + \pgfplotsplothandlergraphicspointmapcomputerequiredview@debug@output + \fi + % + \ifx\pgfplotsretval\pgfutil@empty + \pgfplots@error{plot graphics failed to perform the 'auto adjust axis' feature \csname on@line\endcsname\space\space (compare 'plot graphics[debug]). The graphics might be scaled incorrectly. Perhaps the provided 'points' are not linearly independent?}% + \else + \begingroup + \pgfkeysgetvalue{/pgfplots/plot graphics/src}\pgfplots@loc@TMPa + \t@pgfplots@tokc=\expandafter{\pgfplots@loc@TMPa}% + \immediate\write + \if1\pgfplotsplothandlergraphicspointmapcomputerequiredview@debug 16\else -1\fi + {PGFPlots plot graphics[auto adjust axis=true] {\the\t@pgfplots@tokc} \csname on@line\endcsname: determined options '\pgfplotsretval'. + \if1\pgfplotsplothandlergraphicspointmapcomputerequiredview@debug + See \the\t@pgfplots@tokc.dat for debug output. + \else + Use 'plot graphics[debug] to generate debug output files. + \fi + ^^J}% + \endgroup + \fi + % + \fi + \fi + \pgfmath@smuggleone\pgfplotsretval + \endgroup +}% +\def\pgfplotsplothandlergraphics@debug@matrix@to@string{% + \pgfplotsmatrixtotext\pgfplotsmatrix + \let\pgfplotsmatrix@text=\pgfplotsretval + \pgfplotsarraytotext\pgfplotsE + \let\pgfplotsrhs@text=\pgfplotsretval +}% +\def\pgfplotsplothandlergraphicspointmapcomputerequiredview@debug@output{% + \begingroup + \immediate\openout\w@pgf@writea=\pgfkeysvalueof{/pgfplots/plot graphics/src}.dat + \pgfplotsarrayselect0\of\pgfplotsE\to\pgfmathresult \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}\let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotsarrayselect1\of\pgfplotsE\to\pgfmathresult \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}\let\pgfplots@loc@TMPb=\pgfmathresult + \immediate\write\w@pgf@writea{img x unit=\pgfplots@loc@TMPa\space\pgfplots@loc@TMPb\if r\pgfkeysvalueof{/pgfplots/x dir/value}(reversed due to x dir=reverse)\fi,}% + \pgfplotsarrayselect2\of\pgfplotsE\to\pgfmathresult \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}\let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotsarrayselect3\of\pgfplotsE\to\pgfmathresult \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}\let\pgfplots@loc@TMPb=\pgfmathresult + \immediate\write\w@pgf@writea{img y unit=\pgfplots@loc@TMPa\space\pgfplots@loc@TMPb\if r\pgfkeysvalueof{/pgfplots/y dir/value}(reversed due to y dir=reverse)\fi,}% + \pgfplotsarrayselect4\of\pgfplotsE\to\pgfmathresult \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}\let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotsarrayselect5\of\pgfplotsE\to\pgfmathresult \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}\let\pgfplots@loc@TMPb=\pgfmathresult + \immediate\write\w@pgf@writea{img z unit=\pgfplots@loc@TMPa\space\pgfplots@loc@TMPb,}% + \pgfplotsarrayselect6\of\pgfplotsE\to\pgfmathresult \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}\let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotsarrayselect7\of\pgfplotsE\to\pgfmathresult \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}\let\pgfplots@loc@TMPb=\pgfmathresult + \immediate\write\w@pgf@writea{img origin=\pgfplots@loc@TMPa\space\pgfplots@loc@TMPb\if r\pgfkeysvalueof{/pgfplots/z dir/value}(reversed due to z dir=reverse)\fi,}% + \def\n{^^J}% + \def\t{^^I}% + \immediate\write\w@pgf@writea{canvasmapmatrix=[\pgfplotsmatrix@text];^^Jcanvasmaprhs = [\pgfplotsrhs@text];^^J}% + \immediate\closeout\w@pgf@writea + \endgroup +}% + +\def\pgfplots@plot@handler@graphics@process@pointmap{% + \begingroup + % determine natural size: + \pgfplots@invoke@pgfkeyscode{/pgfplots/plot graphics/lowlevel get natural size/.@cmd}{}% + \def\pgfplots@loc@TMPa##1##2{% + \global\pgf@x=##1 + \global\pgf@y=##2 + }% + \expandafter\pgfplots@loc@TMPa\pgfmathresult + \edef\pgfplots@W{\pgf@sys@tonumber\pgf@x}% natural WIDTH + \edef\pgfplots@H{\pgf@sys@tonumber\pgf@y}% natural HEIGHT + % + \def\pgfplots@extractimg##1##2{% + \def\pgfplots@img@x{##1}% + \def\pgfplots@img@y{##2}% + }% + \def\pgfplots@extractimgaspoint##1##2{% + \pgfqpoint{##1pt}{##2pt}% + }% + \expandafter\pgfplots@extractimg\pgfplots@plot@handler@graphics@pointmap@A@img% anchor 1 in image + \let\pgfplots@Ax=\pgfplots@img@x + \let\pgfplots@Ay=\pgfplots@img@y + % + \pgfplots@plot@handler@graphics@pointmap@A@canvas% the canvas coordinate corresponding to 'A' + \edef\pgfplots@ax{\pgf@sys@tonumber\pgf@x}% call it 'a' + \edef\pgfplots@ay{\pgf@sys@tonumber\pgf@y}% + % + % compute the CANVAS diagonal between the two anchors points a,b, + % dd := b-a + \pgfpointdiff + \pgfplots@plot@handler@graphics@pointmap@A@canvas + \pgfplots@plot@handler@graphics@pointmap@B@canvas + \edef\pgfplots@ddx{\pgf@sys@tonumber\pgf@x}% + \edef\pgfplots@ddy{\pgf@sys@tonumber\pgf@y}% + % + % compute the IMAGE diagonal between the two image anchor points A,B, + % DD := B - A + \pgfpointdiff + {\expandafter\pgfplots@extractimgaspoint\pgfplots@plot@handler@graphics@pointmap@A@img} + {\expandafter\pgfplots@extractimgaspoint\pgfplots@plot@handler@graphics@pointmap@B@img}% + \pgfplots@loop@CONTINUEtrue + \ifdim\pgf@x=0pt \pgfplots@loop@CONTINUEfalse \fi + \ifdim\pgf@y=0pt \pgfplots@loop@CONTINUEfalse \fi + \ifpgfplots@loop@CONTINUE + \else + \pgfplots@error{Sorry, the first two points with '=>' in plot graphics[points={}] are expected to have different image Y coordinates. Please reorder the sequence.}% + \fi + \edef\pgfplots@DDx{\pgf@sys@tonumber\pgf@x}% + \edef\pgfplots@DDy{\pgf@sys@tonumber\pgf@y}% + % + % What I need now is a shift and the CANVAS dimensions of the + % image. Both can be computed using the relative sizes dd/DD. + % + % The shift is needed to compute the lower left corner of the + % CANVAS image. thus, the lower left CANVAS image corresponds to + % the (0,0) coordinate in the IMAGE. + % + % Remember that 'A' is the anchor 1 in IMAGE coordinates. It is a + % vector from (0,0) --> (A_x,A_y) in IMAGE coordinates. + % + % Now, I want a vector (v_x,v_y) such that q + v = a in CANVAS + % coordinates. Here, 'q' is the lower left corner; it corresponds + % to the (0,0) in IMAGE coordinates. Thus, we have + % v = (a-q). Taking the relative sizes of dd and DD, we find + % + % DD_x / A_x = dd_x / v_x + % DD_y / A_y = dd_y / v_y + % + % and finally q = a-v is the lower left CANVAS coordinate. + \pgfmath@basic@divide@{\pgfplots@ddx}{\pgfplots@DDx}% + \let\pgfplots@x@rel=\pgfmathresult + % + \pgfmath@basic@divide@{\pgfplots@ddy}{\pgfplots@DDy}% + \let\pgfplots@y@rel=\pgfmathresult + % + \pgfmath@basic@multiply@{\pgfplots@Ax}{\pgfplots@x@rel}% + \let\pgfplots@vx=\pgfmathresult + % + \pgfmath@basic@multiply@{\pgfplots@Ay}{\pgfplots@y@rel}% + \let\pgfplots@vy=\pgfmathresult + % + % + % + % + % now, the canvas width. It is even simpler because it holds + % + % DD_x / dd_x = W / w + % DD_y / dd_y = H / h + % + % where (W,H) is the natural size (i.e. in IMAGE coordinates) of the picture and + % (w,h) is the size the picture will occupy in CANVAS coordinates. + % + \pgfmath@basic@multiply@{\pgfplots@x@rel}{\pgfplots@W}% + \let\pgfplots@w=\pgfmathresult + % + \pgfmath@basic@multiply@{\pgfplots@y@rel}{\pgfplots@H}% + \let\pgfplots@h=\pgfmathresult + % + \edef\pgfplots@plot@handler@graphics@DRAW@{% + \noexpand\pgfplots@invoke@pgfkeyscode{/pgfplots/plot graphics/lowlevel draw/.@cmd}{% + {\pgfplots@w pt}% width + {\pgfplots@h pt}% height + }% + }% + \pgfpointadd + {\pgfplots@plot@handler@graphics@pointmap@A@canvas}% the canvas coordinate corresponding to 'A' + {\pgfqpointscale{-1} + {\pgfqpoint{\pgfplots@vx pt}{\pgfplots@vy pt}}% + }% + \edef\pgfplots@plot@handler@graphics@pointmap@lowerleft@canvas{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% +% + % + % + \begingroup + \pgftransformshift{}% simply take \pgf@x and \pgf@y + % + \node[/pgfplots/plot graphics/node] {% + \pgfplots@plot@handler@graphics@DRAW@ + };% + \endgroup + \ifx\pgfplots@plot@handler@graphics@pointmap@C@canvas\pgfutil@empty + \ifpgfplots@threedim + \pgfplots@warning{plot graphics in 3D axis has just two inner anchors (those with '(x,y,z)=>(imgx,imgy)'). You should provide a third one such that I can check for correct scaling.}% + \fi + \else + \pgfplots@plot@handler@graphics@pointmap@sanitize@scaling{C}% + \ifx\pgfplots@plot@handler@graphics@pointmap@D@canvas\pgfutil@empty + \else + \pgfplots@plot@handler@graphics@pointmap@sanitize@scaling{D}% + \fi + \fi + \endgroup +}% + +% Checks if the logical and canvas coordinates of the point identified +% by #1 are correct. +% +% #1: a character in {A,B,C...}. +% +\def\pgfplots@plot@handler@graphics@pointmap@sanitize@scaling#1{% + \begingroup + \expandafter\let\expandafter\pgfplots@point@img\csname pgfplots@plot@handler@graphics@pointmap@#1@img\endcsname + \expandafter\let\expandafter\pgfplots@point@canvas\csname pgfplots@plot@handler@graphics@pointmap@#1@canvas\endcsname + \expandafter\let\expandafter\pgfplots@point@logical\csname pgfplots@plot@handler@graphics@pointmap@#1@logical\endcsname + \expandafter\pgfplots@extractimgaspoint\pgfplots@point@img% anchor 3 in image + \edef\pgfplots@Cx{\pgf@sys@tonumber\pgf@x}% + \edef\pgfplots@Cy{\pgf@sys@tonumber\pgf@y}% + % + \pgfmath@basic@multiply@{\pgfplots@Cx}{\pgfplots@x@rel}% + \let\pgfplots@Cx=\pgfmathresult + % + \pgfmath@basic@multiply@{\pgfplots@Cy}{\pgfplots@y@rel}% + \let\pgfplots@Cy=\pgfmathresult + \pgfpointadd + {\pgfplots@plot@handler@graphics@pointmap@lowerleft@canvas}% + {\pgfpoint\pgfplots@Cx\pgfplots@Cy}% + \edef\pgfplots@point@canvas@check{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + \pgfpointdiff + {\pgfplots@point@canvas@check}% + {\pgfplots@point@canvas}% + \ifdim\pgf@x<0pt \pgf@x=-\pgf@x\fi + \ifdim\pgf@y<0pt \pgf@y=-\pgf@y\fi + \def\pgfplots@is@the@same@point{1}% + \ifdim\pgf@x>\pgfkeysvalueof{/pgfplots/plot graphics/squeeze tol} + \def\pgfplots@is@the@same@point{0}% + \else + \ifdim\pgf@y>\pgfkeysvalueof{/pgfplots/plot graphics/squeeze tol} + \def\pgfplots@is@the@same@point{0}% + \fi + \fi + \if0\pgfplots@is@the@same@point + % + \begingroup + \pgfkeysgetvalue{/pgfplots/plot graphics/src}\pgfplots@loc@TMPa + \t@pgfplots@tokc=\expandafter{\pgfplots@loc@TMPa}% + \def\pgfplots@extractcoord##1##2##3{##1,##2,##3}% + \pgfplots@error{sorry, I can't fix the scaling of 'plot graphics {\the\t@pgfplots@tokc}'. + The points (\expandafter\pgfplots@extractcoord\pgfplots@plot@handler@graphics@pointmap@A@logical) and (\expandafter\pgfplots@extractcoord\pgfplots@plot@handler@graphics@pointmap@B@logical) are correct, but the point (\expandafter\pgfplots@extractcoord\pgfplots@point@logical) is wrong (its position vector has an error of (\the\pgf@x,\the\pgf@y) which is larger than 'squeeze tol=\pgfkeysvalueof{/pgfplots/plot graphics/squeeze tol}'). This is probably caused by improper relations between the axis' unit vectors because the view is incorrect.^^J + - Is the 'view' argument correct (matlab: [h,v] = view)? ^^J + - Does your image have a non-trivial 'plot box ratio' (matlab: ratio = pbaspect)?^^J + Please refer to the pgfplots manual for details. If you continue now, I'll show the points in the image}% + \endgroup + % + % + \scope + \pgfsetstrokecolor{black}% + \pgfsetfillcolor{red}% + \pgfpathcircle{\pgfplots@point@canvas@check}{2pt}% + \pgfusepath{stroke,fill}% + \pgfsetfillcolor{green}% + \pgfpathcircle{\pgfplots@point@canvas}{2pt}% + \pgfusepath{stroke,fill}% + \draw[->,red] + \pgfextra{ + \pgfpathmoveto{\pgfplots@point@canvas@check}% + \pgfpathlineto{\pgfplots@point@canvas}}; + \endscope + \fi + \endgroup +} + +\def\pgfplots@plot@handler@graphics@usebb{% + \pgfpointdiff{\pgfplots@plot@handler@graphics@bb@first}{\pgfplots@plot@handler@graphics@bb@second}% + \def\pgfplots@plot@handler@graphics@finish@ok{1}% + \ifdim\pgf@x=0pt + \def\pgfplots@plot@handler@graphics@finish@ok{0}% + \else + \ifdim\pgf@y=0pt + \def\pgfplots@plot@handler@graphics@finish@ok{0}% + \fi + \fi + \if0\pgfplots@plot@handler@graphics@finish@ok \pgfplots@error{Error using 'plot graphics': I got too few coordinates! I expected the lower left and upper right corners!}% \xdef\pgfplots@plot@handler@graphics@bb@first{\noexpand\pgfqpoint{0pt}{0pt}}% + \xdef\pgfplots@plot@handler@graphics@bb@first{\noexpand\pgfqpoint{0pt}{0pt}}% \fi - \ifx\pgfplots@plot@handler@graphics@bb@second\pgfutil@empty - \pgfplots@error{Error using 'plot graphics': I got too few coordinates! I expected the lower left and upper right corners!}% - \xdef\pgfplots@plot@handler@graphics@bb@second{\noexpand\pgfqpoint{0pt}{0pt}}% - \fi \begingroup % determine the lower left / upper right corners. \pgfplots@plot@handler@graphics@bb@first @@ -6233,11 +8378,44 @@ \ifx\pgfplots@loc@TMPd\pgfutil@empty \pgfplots@error{Error using 'plot graphics': I don't have a graphics file name! Please set the '/pgfplots/plot graphics/src' key to the image file name. Skipping this plot.}% \else + \begingroup + \t@pgfplots@toka=\expandafter{\pgfplots@loc@TMPc}% + % + \def\pgfplots@loc@TMPa{#1}% + \def\pgfplots@loc@TMPb{#2}% + % + \edef\pgfplots@loc@TMPc{% + \the\t@pgfplots@toka,% + \ifx\pgfplots@loc@TMPa\pgfutil@empty\else width=#1,\fi + \ifx\pgfplots@loc@TMPb\pgfutil@empty\else height=#2,\fi + }% + \pgfmath@smuggleone\pgfplots@loc@TMPc + \endgroup + % \def\pgfplots@loc@TMPa{\pgfkeysvalueof{/pgfplots/plot graphics/includegraphics cmd}}% - \expandafter\pgfplots@loc@TMPa\expandafter[\pgfplots@loc@TMPc,width=#1,height=#2]{\pgfplots@loc@TMPd}% + \expandafter\pgfplots@loc@TMPa\expandafter[\pgfplots@loc@TMPc]{\pgfplots@loc@TMPd}% \fi }% +\def\pgfplots@plot@handler@graphics@getnaturalsize{% + \begingroup + \setbox0=\hbox{% + \pgfplots@invoke@pgfkeyscode{/pgfplots/plot graphics/lowlevel draw/.@cmd}{{}{}}% + }% + \pgf@x=\wd0 + \pgf@y=\ht0 + \ifdim\dp0>0pt + \advance\pgf@y by\dp0 + \else + \ifdim\dp0<0pt + \advance\pgf@y by-\dp0 + \fi + \fi + \xdef\pgfplots@glob@TMPb{{\the\pgf@x}{\the\pgf@y}}% + \endgroup + \let\pgfmathresult=\pgfplots@glob@TMPb +}% + % legends for plot graphics should not use 'plot graphics' themselfes % (for obvious reasons). % This key handles that. Furthermore, it remembers the plot mark for @@ -6263,668 +8441,6 @@ } -% The low-level tikz plot handler for 3D mesh and surface plots. -% -% It expects -% a) a coordinate stream which is a linearized matrix, iterated either -% rowwise or column wise, -% b) the current set of options in /pgfplots/mesh/. -% -% -% ATTENTION: -% this handler is NOT as general as the others. In particular, it -% can't be interrupted by TeX groups: every single statement, -% starting with streamstart and ending with stream end, must be in -% the same scope! -% -% As a consequence, you can't use this handler inside of (all) TikZ -% input streams. Try it out. It will work in pgfplots, however. -% -% Furthermore, it relies on a couple of pgfplots macros. This may -% change in future versions. -% It relies on: -% - \ifpgfplots@curplot@threedim -% - \pgfplots@current@point@meta -% -> it also invokes \pgfplots@perpointmeta@preparetrafo and its -% @APPLY counterpart which checks for -% - \pgfplots@metamax -% If you use it outside of pgfplots, use -% \global\let\pgfplots@metamax=\pgfutil@empty -% This is can be used without an initialised -% pgfplots axes - as long as \pgfplots@current@point@meta is in -% the range [0,1000]. -% - for the case 'shader=interp', a bounding box must be established -% before the plot is finished. This must be done using -% \def\pgfplotspointbbupperright{\pgfqpointxyz{2}{2}{0.9}} -% \def\pgfplotspointbblowerleft {\pgfqpointxyz{0}{0}{0.1}} -% or something like that. -% -% Besides these internals, it also relies on all public /pgfplots -% configuration keys related to mesh/surface plots. -% -% Please note that the 'z buffer' feature will not work without -% pgfplots (especially the z buffer=sort feature). -% -% Here is an example which compiles without a pgfplots axes: -% ---------------------------------------------------------- -% \begin{tikzpicture} -% \scope[ -% /pgfplots/.cd, -% surf, -% shader=faceted, -% mesh/rows=4, -% mesh/cols=4, -% mesh/num points=, -% /tikz/x={(0.44237cm,-0.07439cm)}, -% /tikz/y={(0.30942cm,0.23932cm)}, -% /tikz/z={(0.0cm,1.5cm)}, -% ] -% \makeatletter -% -% \global\let\pgfplots@metamax=\pgfutil@empty -% \pgfplots@curplot@threedimtrue -% -% \pgfplotsplothandlermesh -% \pgfplotstreamstart -% -% \def\rangea{0.21}% -% \def\rangeb{0.9}% -% -% \pgfmathparse{1000/(\rangeb-\rangea)} -% \let\factor=\pgfmathresult -% -% \def\simplecoordinate(#1,#2,#3){% -% \pgfmathparse{\factor*(#3 - \rangea)}% -% \let\pgfplots@current@point@meta=\pgfmathresult -% \pgfplotstreampoint{\pgfqpointxyz{#1}{#2}{#3}}% -% }% -% % for the case 'shaer=interp': -% \def\pgfplotspointbbupperright{\pgfqpointxyz{2}{2}{0.9}} -% \def\pgfplotspointbblowerleft {\pgfqpointxyz{0}{0}{0.1}} -% -% \simplecoordinate(0,3,0.7) -% \simplecoordinate(1,3,0.5) -% \simplecoordinate(2,3,0.58) -% \simplecoordinate(3,3,0.9) -% -% \simplecoordinate(0,2,0.68) -% \simplecoordinate(1,2,0.22) -% \simplecoordinate(2,2,0.25) -% \simplecoordinate(3,2,0.4) -% -% \simplecoordinate(0,1,0.6) -% \simplecoordinate(1,1,0.3) -% \simplecoordinate(2,1,0.21) -% \simplecoordinate(3,1,0.3) -% -% \simplecoordinate(0,0,0.8) -% \simplecoordinate(1,0,0.56) -% \simplecoordinate(2,0,0.5) -% \simplecoordinate(3,0,0.75) -% -% -% \pgfplotstreamend -% \pgfusepath{stroke} -% -% \endscope -% \end{tikzpicture} -% ---------------------------------------------------------- -% END OF EXAMPLE -% -> see also the legend image for mesh plots. -% -\def\pgfplotsplothandlermesh{% - \def\pgf@plotstreamstart{% -% \scope - \pgfplotsautocompletemeshkeys% - \pgfkeysgetvalue{/pgfplots/mesh/rows}\pgfplotsplothandlermesh@rows - \pgfkeysgetvalue{/pgfplots/mesh/cols}\pgfplotsplothandlermesh@cols - \pgfkeysgetvalue{/pgfplots/mesh/num points}\pgfplotsplothandlermesh@numpoints - % - \pgfutil@ifundefined{pgfplots@drawmodes}{% - \let\pgfplots@drawmodes=\tikz@mode - \let\pgfplots@drawoptions=\tikz@options - }{}% - % - \def\pgfplotsplothandlermesh@ONEDIMMODE{0}% - \ifnum\pgfplotsplothandlermesh@cols=1 - \def\pgfplotsplothandlermesh@ONEDIMMODE{1}% - \fi - \ifnum\pgfplotsplothandlermesh@rows=1 - \def\pgfplotsplothandlermesh@ONEDIMMODE{1}% - \fi - % - % - % Prepare color data source: - \ifx\pgfplotspointmetainputhandler\pgfutil@empty% - % oh. There is no color data!? Well... then use a constant - % color. - % - % This activates tikz colors: - %\tikz@options - \def\pgfplotsplothandlermesh@preparedrawforcurrent{% - \pgfplots@drawoptions - }% - \else - % Ok, we have color data. - % - % Prepare: - \pgfplots@perpointmeta@preparetrafo - \def\pgfplotsplothandlermesh@preparedrawforcurrent{% - \pgfplotscolormapdefinemappedcolor{\pgfplotsplothandlermesh@shader@cellcolor}% -% \pgfplotsplothandlermesh@setcolor{mapped color}% - % This activates tikz colors: -%\message{executing \meaning\pgfplots@drawoptions'}% - %\tikz@options - \pgfplots@drawoptions - }% - % - % Acquire the values for \tikz@mode@* [used for faceted] - \pgfplots@drawmodes - % - % Now, process the 'shader' key here: - \if\pgfplotsplothandlermesh@ONEDIMMODE1 - \def\pgfplots@meshmode{m}% 'mesh' - \fi - \if\pgfplots@meshmode m% mesh - % this is processed by the 'shader=flat' code below. - \def\pgfplotsplothandlermesh@shader{0}% 'flat' - \fi - \if\pgfplotsplothandlermesh@shader2% 'shader=interp' - \pgflibrarysurfshadingifactive - {}% - {% - \pgfutil@ifundefined{pgfplotsplothandlermesh@shader@warning}{% - \pgfplots@error{Sorry, surface shading (shader=interp) is NOT available for the selected driver `\pgfsysdriver'. I will use 'shader=flat' if you continue now}% - \gdef\pgfplotsplothandlermesh@shader@warning{x}% - }{}% - \def\pgfplotsplothandlermesh@shader{0}% - }% - \fi - \if\pgfplotsplothandlermesh@zbuffer@choice4% 'z buffer=sort': - \if\pgfplotsplothandlermesh@shader2% 'shader=interp' - \pgfplots@error{Sorry, 'shader=interp' does not support 'z buffer=sort'. If you continue now, 'shader=flat' will be used.}% - \def\pgfplotsplothandlermesh@shader{0}% 'flat' - \fi - \fi - \ifnum\pgfplotsplothandlermesh@shader<2 - % 0 == 'flat' - % 1 == 'faceted' - \if\pgfplotsplothandlermesh@flatmode c% 'flat corner': - % - % use colordata of ONE corner point. That's easy, not - % much to do. - \let\pgfplotsplothandlermesh@unpack=\pgfplotsplothandlermesh@unpack@corner - \t@pgfplots@toka=\expandafter{\pgfplotsplothandlermesh@preparedrawforcurrent}% - \t@pgfplots@tokb={% - \pgfplots@perpointmeta@trafo@APPLY - \let\pgfplotsplothandlermesh@shader@cellcolor=\pgfplotspointmetatransformed}% - \edef\pgfplotsplothandlermesh@preparedrawforcurrent{% - \the\t@pgfplots@tokb - \the\t@pgfplots@toka - }% - \else - % 'flat mean': - % - % use colordata as mean of all corners for shading. - \let\pgfplotsplothandlermesh@unpack=\pgfplotsplothandlermesh@unpack@mean@accum - \global\pgfplots@tmpa=0pt - \t@pgfplots@toka=\expandafter{\pgfplotsplothandlermesh@preparedrawforcurrent}% - \if\pgfplotsplothandlermesh@ONEDIMMODE0 - \t@pgfplots@tokb={\global\divide\pgfplots@tmpa by4 }% - \else - \t@pgfplots@tokb={\global\divide\pgfplots@tmpa by2 }% - \fi - \t@pgfplots@tokc={% - \edef\pgfplotsplothandlermesh@shader@cellcolor{\pgf@sys@tonumber\pgfplots@tmpa}% - \global\pgfplots@tmpa=0pt }% - \edef\pgfplotsplothandlermesh@preparedrawforcurrent{% - \the\t@pgfplots@tokb - \the\t@pgfplots@tokc - \the\t@pgfplots@toka - }% - \fi - \if\pgfplots@meshmode m% - % 'mesh' plot: stroke only and use the 'flat' code - % here just to define the color for each mesh - % segment. - \let\pgfplotsplothandlermesh@usepath=\pgfusepathqstroke - \else - % 'surf' plot: - \let\pgfplotsplothandlermesh@usepath=\pgfusepathqfillstroke - % the distinction between 'faceted' and 'flat' is - % technical: it is just the default draw color. - % - % 'flat,draw=black' is the same as 'faceted'. - \if\pgfplotsplothandlermesh@shader1% faceted - % make sure there is a the correct color. - \expandafter\def\expandafter\pgfplots@drawoptions\expandafter{% - \pgfplots@drawoptions - \pgfsetstrokecolor{\pgfkeysvalueof{/pgfplots/faceted color}}% - }% - \fi - \fi - \else - % 'shader=2': 'interp': - % very simple: defer work to surf library. Only - % provide the mapped colordata. - % - % This won't be used for mesh plots, neither in one - % nor in two dimensions. - \pgfkeyssetvalue{/pgfplots/surf shading/north east corner}{\pgfplotspointbbupperright}% - \pgfkeyssetvalue{/pgfplots/surf shading/south west corner}{\pgfplotspointbblowerleft}% - \pgfkeyssetvalue{/pgfplots/surf shading/anchor}{\pgfpointorigin}% - \pgfkeysgetvalue{/pgfplots/colormap name}\pgfplots@loc@TMPa - \expandafter\pgfplotscolormaptopdffunction\expandafter{\pgfplots@loc@TMPa}% - \pgfkeyslet{/pgfplots/surf shading/colormap}\pgfplotsretval - \let\pgfplotsplothandlermesh@unpack=\relax % unused. - \let\pgfplotsplothandlermesh@preparedrawforcurrent=\relax - \pgfkeyslet{/pgfplots/surf shading/cols}\pgfplotsplothandlermesh@cols - \if\pgfplots@plot@mesh@ordering0% - % ordering=x varies: - \global\let\pgf@plotstreampoint=\pgfplotsplothandlermesh@shader@interp% - \else - % colwise: - % - % The low level shader NEEDS rowwise ordering. So, we need to transpose the data matrix. - % As usual in TeX, we should save macros as much as possible. I guess we NEED at least one macro for each matrix row. - % Idea: - % while we iterate colwise through the input data, accumulate row vectors. - % Then, process the row vectors. - % Since vectors are expensive (in terms of number of macros), we use fast "append" lists instead of vectors. - \global\let\pgf@plotstreampoint=\pgfplotsplothandlermesh@shader@interp@incremental@transpose% - % - % init all required row vectors: - \c@pgfplots@scanlineindex=0 - \pgfutil@loop - \ifnum\c@pgfplots@scanlineindex<\pgfplotsplothandlermesh@rows\relax - \expandafter\pgfplotsapplistXnewempty\csname pgfp@transprow@\the\c@pgfplots@scanlineindex\endcsname% - \advance\c@pgfplots@scanlineindex by1 - \pgfutil@repeat - %\pgfkeyslet{/pgfplots/surf shading/cols}\pgfplotsplothandlermesh@rows - %\pgfplots@error{Sorry, the 'shader=interp' does not yet support 'mesh/ordering=colwise'... You can continue now, but the plot will be transposed.}% - \fi - \pgfplotslibrarysurfstreamstart - \let\pgfplotsplothandlermesh@usepath=\pgfusepathqfill - \fi - \fi - % PREPARE THE STREAM PROCESSING: - \def\pgfplots@plothandler@unbounded@visualize@jump{% - \pgfplotstreampoint{\global\pgf@x=-16000.0pt \global\pgf@y=-16000.0pt }% - }% - \let\pgfplotsplothandlermesh@check@unbounded=\pgfplotsplothandlermesh@check@unbounded@setbool - \if\pgfplotsplothandlermesh@ONEDIMMODE1% - % Special case: 1D mesh processing - \global\let\pgf@plotstreampoint=\pgfplotsplothandlermesh@ONEDIM@draw% - \global\let\pgf@plotstreamspecial=\pgfutil@gobble% - \global\let\pgf@plotstreamend=\pgfplotsplothandlermesh@finish% - \let\pgfplotsplothandlermesh@draw@element=\pgfplotsplothandlermesh@draw@element@line - \def\pgfplotsplothandlermesh@process@element{% - \pgfplotsplothandlermesh@draw@element - \pgfplotsplothandlermesh@i - \pgfplotsplothandlermesh@im - }% - \if\pgfplots@unbounded@handler j% - % unbounded coords=jump: - % append checks for unbounded coords to - % \pgfplotsplothandlermesh@process@element - \t@pgfplots@tokb={% - \pgfplots@loc@tmptrue - \expandafter\pgfplotsplothandlermesh@check@unbounded\pgfplotsplothandlermesh@i\relax - \expandafter\pgfplotsplothandlermesh@check@unbounded\pgfplotsplothandlermesh@im\relax - }% - \t@pgfplots@toka=\expandafter{\pgfplotsplothandlermesh@process@element}% - \edef\pgfplotsplothandlermesh@process@element{% - \the\t@pgfplots@tokb - \noexpand\ifpgfplots@loc@tmp - \the\t@pgfplots@toka - \noexpand\fi - }% - \fi - \if\pgfplotsplothandlermesh@zbuffer@choice4% - % z buffer=sort: - % create a z buffer: - % the z buffer contains elements {<view depth>}{{<pt1>}{<pt2>}{<pt3>}{<pt4>}} - \pgfplotsarraynewempty\pgfplots@zbuffer@local - % - % and collect each point into the z buffer: - \def\pgfplotsplothandlermesh@process@element{% - \pgfplotsmathviewdepthxyz{\pgfplots@current@point@x}{\pgfplots@current@point@y}{\pgfplots@current@point@z}% FIXME relies on pgfplots macros - % assemble array element: - \edef\pgfplots@loc@TMPa{% - {\pgfmathresult}% - {% - {\pgfplotsplothandlermesh@i}% - {\pgfplotsplothandlermesh@im}% - }% - }% - \expandafter\pgfplotsarraypushback\pgfplots@loc@TMPa\to\pgfplots@zbuffer@local - }% - \fi - \else - % ok, normal 2D mesh processing: - % - % And now finally: initialise the conversion from - % LINEARIZED COORD STREAM -> DATA MATRIX: - \if\pgfplots@plot@mesh@ordering0% - % x varies (=rowwise): - \let\pgfplotsplothandlermesh@scanlinelength=\pgfplotsplothandlermesh@cols - \else - % y varies (=colwise): - \let\pgfplotsplothandlermesh@scanlinelength=\pgfplotsplothandlermesh@rows - \fi - \def\pgfplotsplothandlermesh@process@element{% - \pgfplotsplothandlermesh@draw@element - \pgfplotsplothandlermesh@im@jm - \pgfplotsplothandlermesh@im@j - \pgfplotsplothandlermesh@i@j - \pgfplotsplothandlermesh@i@jm - }% - % Init memory: - % in fact, this does only remember the maximum capacity; - % it doesn't fill the memory. - \c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@scanlinelength\relax - \advance\c@pgfplots@scanlineindex by1 - \pgfplotsdequenewempty{lastscanline}\capacity{\the\c@pgfplots@scanlineindex}% - % - \if2\pgfplotsplothandlermesh@shader - % shader=interp does not support z buffer=sort. - % It also has its own \pgf@plotstreampoint method, see - % above. - \def\pgfplots@plothandler@unbounded@visualize@jump{% - \pgfplots@error{Sorry, shader=interp does not support 'unbounded coords=jump'. Please use 'shader=flat' for this case.}% - }% - \else - \global\let\pgf@plotstreampoint=\pgfplotsplothandlermesh@fillscanline% - \if\pgfplotsplothandlermesh@zbuffer@choice4% - % z buffer=sort: - % create a z buffer: - % the z buffer contains elements {<view depth>}{{<pt1>}{<pt2>}{<pt3>}{<pt4>}} - \pgfplotsarraynewempty\pgfplots@zbuffer@local - % - % and collect each point into the z buffer - % (instead of drawing it): - \def\pgfplotsplothandlermesh@process@element{% - \pgfplotsmathviewdepthxyz{\pgfplots@current@point@x}{\pgfplots@current@point@y}{\pgfplots@current@point@z}% FIXME relies on pgfplots macros - % assemble array element: - \edef\pgfplots@loc@TMPa{% - {\pgfmathresult}% - {% - {\pgfplotsplothandlermesh@im@jm}% - {\pgfplotsplothandlermesh@im@j}% - {\pgfplotsplothandlermesh@i@j}% - {\pgfplotsplothandlermesh@i@jm}% - }% - }% - \expandafter\pgfplotsarraypushback\pgfplots@loc@TMPa\to\pgfplots@zbuffer@local - }% - \fi - \if\pgfplots@unbounded@handler j% - % unbounded coords=jump: - % append checks for unbounded coords to - % \pgfplotsplothandlermesh@process@element - \t@pgfplots@tokb={% - \pgfplots@loc@tmptrue - \expandafter\pgfplotsplothandlermesh@check@unbounded\pgfplotsplothandlermesh@i@j\relax - \expandafter\pgfplotsplothandlermesh@check@unbounded\pgfplotsplothandlermesh@i@jm\relax - \expandafter\pgfplotsplothandlermesh@check@unbounded\pgfplotsplothandlermesh@im@j\relax - \expandafter\pgfplotsplothandlermesh@check@unbounded\pgfplotsplothandlermesh@im@jm\relax - }% - \t@pgfplots@toka=\expandafter{\pgfplotsplothandlermesh@process@element}% - \edef\pgfplotsplothandlermesh@process@element{% - \the\t@pgfplots@tokb - \noexpand\ifpgfplots@loc@tmp - \the\t@pgfplots@toka - \noexpand\fi - }% - \fi - \fi - % - \global\let\pgf@plotstreamspecial=\pgfutil@gobble% - \global\let\pgf@plotstreamend=\pgfplotsplothandlermesh@finish% - \let\pgfplotsplothandlermesh@draw@element=\pgfplotsplothandlermesh@draw@element@rectangle - \fi - \c@pgfplots@scanlineindex=0 - }% -}% - -\def\pgfplotsplothandlermesh@check@unbounded@setbool#1#2\relax{% - \ifdim#1=-16000pt - \pgfplots@loc@tmpfalse - \fi -}% - -\long\def\pgfplotsplothandlermesh@defaultlegend@img#1{% - \scope[% - #1, - /pgfplots/mesh/rows=3, - /pgfplots/mesh/cols=3, - /pgfplots/mesh/num points=, - /tikz/x={(0.44237cm,-0.07439cm)}, - /tikz/y={(0.30942cm,0.23932cm)}, - /tikz/z={(0.0cm,1.5cm)}, - scale=0.4, - yshift=-0.7cm, - ] - \let\pgfplots@metamax=\pgfutil@empty - \pgfplots@curplot@threedimtrue - - \pgfplotsplothandlermesh - \pgfplotstreamstart - - \def\rangea{0.21}% - \def\rangeb{0.7}% - - \pgfmathparse{1000/(\rangeb-\rangea)} - \let\factor=\pgfmathresult - - \pgfutil@ifundefined{pgfqpointxyz@orig}{% - \let\pgfqpointxyz@orig=\pgfqpointxyz - }{}% - % - \def\simplecoordinate(##1,##2,##3){% - \pgfmathparse{\factor*(##3 - \rangea)}% - \pgfmathfloatparsenumber\pgfmathresult - \let\pgfplots@current@point@meta=\pgfmathresult - % pgfplots changes \pgfqpointxyz to - % \pgfplotspointdescriptionxy inside of legends, so use the - % '@orig' point command: - \pgfplotstreampoint{\pgfqpointxyz@orig{##1}{##2}{##3}}% - }% - % for the case 'shader=interp': - \def\pgfplotspointbbupperright{\pgfqpointxyz@orig{2}{2}{0.9}} - \def\pgfplotspointbblowerleft {\pgfqpointxyz@orig{0}{0}{0.1}} - - \simplecoordinate(0,2,0.7) - \simplecoordinate(1,2,0.5) - \simplecoordinate(2,2,0.43) - - \simplecoordinate(0,1,0.68) - \simplecoordinate(1,1,0.4) - \simplecoordinate(2,1,0.25) - - \simplecoordinate(0,0,0.6) - \simplecoordinate(1,0,0.35) - \simplecoordinate(2,0,0.21) - - \pgfplotstreamend - \pgfusepath{stroke} - \endscope -}% - -\def\pgfplotsplothandlermesh@finish{% - \ifnum\pgfplotsplothandlermesh@shader=2 - % shader=interp: - \ifx\pgf@plotstreampoint\pgfplotsplothandlermesh@shader@interp@incremental@transpose% - % This is the case for 'mesh/ordering=colwise'. We need to finish the transpose procedure: - \pgfplotsplothandlermesh@shader@interp@transpose@finish - \fi - \pgfplotslibrarysurfstreamend - \pgfplotslibrarysurfdrawinpicture - \else - \if\pgfplotsplothandlermesh@zbuffer@choice4% - % z buffer=sort: - % process the z buffer: - \pgfkeyslet{/pgfplots/iflessthan/.@cmd}\pgfplotsplothandlermesh@zbuffer@sort@iflessthen - \pgfkeysdef{/pgfplots/array/unscope pre}{% - \pgfplotsarrayforeachungrouped\pgfplots@zbuffer@local\as\curelem{% - \expandafter\pgfplotsplothandlermesh@draw@zbufferelement\curelem% - }% - }% - \pgfkeysdef{/pgfplots/array/unscope post}{}% - \pgfplotsarraysort\pgfplots@zbuffer@local - \fi - \fi -% \endscope -}% - -% the pgf@plotstreampoint routine for the first scan line: -\def\pgfplotsplothandlermesh@fillscanline#1{% - \pgf@process{#1}% - \edef\pgfplotsplothandlermesh@i@j{{\the\pgf@x}{\the\pgf@y}{\pgfplots@current@point@meta}}% - \expandafter\pgfplotsdequepushback\pgfplotsplothandlermesh@i@j\to{lastscanline}% - \advance\c@pgfplots@scanlineindex by1 - \ifnum\c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@scanlinelength\relax - % second line! - \global\let\pgf@plotstreampoint=\pgfplotsplothandlermesh@draw%% - \c@pgfplots@scanlineindex=0 - \fi -}% - -% This is the pgf@plotstreampoint for all scan lines starting with the -% second. -% -% We perform -% for i = 1 to rows (note the 1! 0 would be the first row) -% for j = 0 to cols -% get (i-1, j) from front of deque // remember: i: rows, j : cols. We iterate rowwise. -% push (i,j) to back of deque -% if j > 0 -% draw -% (i-1,j-1) [from last iteration] -- (i-1,j) [from deque] -% -- ( i,j-1) [from last iteration] -- ( i,j) [from #1] -% endif -% let (i-1,j-1) := (i-1,j) // for next iteration -% let ( i,j-1) := ( i,j) // for next iteration -% end -% end -% -% This is a SWEEP through the data matrix. -\def\pgfplotsplothandlermesh@draw#1{% - % NOTATION: - % 'im == (i-1)' - % 'jm == (j-1)' - \pgf@process{#1}% - \edef\pgfplotsplothandlermesh@i@j{{\the\pgf@x}{\the\pgf@y}{\pgfplots@current@point@meta}}% FIXME relies on pgfplots macros -%\message{##\the\c@pgfplots@scanlineindex: prepare rectangle with corner \meaning\pgfplotsplothandlermesh@i@j.}% - \pgfplotsdequepopfront{lastscanline}\to\pgfplotsplothandlermesh@im@j - \expandafter\pgfplotsdequepushback\pgfplotsplothandlermesh@i@j\to{lastscanline}% - \ifnum\c@pgfplots@scanlineindex>0 - \pgfplotsplothandlermesh@process@element - \fi - \let\pgfplotsplothandlermesh@im@jm=\pgfplotsplothandlermesh@im@j - \let\pgfplotsplothandlermesh@i@jm=\pgfplotsplothandlermesh@i@j - \advance\c@pgfplots@scanlineindex by1 - \ifnum\c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@scanlinelength\relax - \c@pgfplots@scanlineindex=0 - \fi -}% -\def\pgfplotsplothandlermesh@shader@interp#1{% - \pgfplots@perpointmeta@trafo@APPLY - \pgfplotslibrarysurfstreamcoord{#1}{\pgfplotspointmetatransformed}% -}% -\def\pgfplotsplothandlermesh@shader@interp@incremental@transpose#1{% - \pgfplots@perpointmeta@trafo@APPLY - \pgf@process{#1}% - \edef\pgfplotsplothandlermesh@i{\noexpand\pgfplotsplothandlermesh@shader@interp@next{\the\pgf@x}{\the\pgf@y}{\pgfplotspointmetatransformed}}% - % - % Store the postprocessed point into the appropriate row vector: - \def\pgfplots@loc@TMPa{\expandafter\pgfplotsapplistXpushback\expandafter{\pgfplotsplothandlermesh@i}\to} - \expandafter\pgfplots@loc@TMPa\csname pgfp@transprow@\the\c@pgfplots@scanlineindex\endcsname% - % - \advance\c@pgfplots@scanlineindex by1 - \ifnum\c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@scanlinelength\relax - \c@pgfplots@scanlineindex=0 - \fi -}% -\def\pgfplotsplothandlermesh@shader@interp@transpose@finish{% - % Now, "execute" each row vector: - \def\pgfplotsplothandlermesh@shader@interp@next##1##2##3{% - \pgfplotslibrarysurfstreamcoord{\global\pgf@x=##1 \global\pgf@y=##2 }{##3}% - }% - \c@pgfplots@scanlineindex=0 - \pgfutil@loop - \ifnum\c@pgfplots@scanlineindex<\pgfplotsplothandlermesh@rows\relax - \expandafter\pgfplotsapplistXlet\expandafter\pgfplots@loc@TMPd\expandafter=\csname pgfp@transprow@\the\c@pgfplots@scanlineindex\endcsname% - \expandafter\pgfplotsapplistXnewempty\csname pgfp@transprow@\the\c@pgfplots@scanlineindex\endcsname% clear - % execute the row: - \pgfplots@loc@TMPd - \advance\c@pgfplots@scanlineindex by1 - \pgfutil@repeat - \let\pgfplots@loc@TMPd=\relax -}% - -\def\pgfplotsplothandlermesh@draw@zbufferelement#1#2{% - \pgfplotsplothandlermesh@draw@element#2\relax -}% -% a possible value for \pgfplotsplothandlermesh@draw@element -\def\pgfplotsplothandlermesh@draw@element@line#1#2{% - \pgfpathmoveto{\expandafter\pgfplotsplothandlermesh@unpack#1}% - \pgfpathlineto{\expandafter\pgfplotsplothandlermesh@unpack#2}% - \pgfplotsplothandlermesh@preparedrawforcurrent - \pgfplotsplothandlermesh@usepath -}% -% a possible value for \pgfplotsplothandlermesh@draw@element -\def\pgfplotsplothandlermesh@draw@element@rectangle#1#2#3#4{% - \pgfpathmoveto{\expandafter\pgfplotsplothandlermesh@unpack#1}% - \pgfpathlineto{\expandafter\pgfplotsplothandlermesh@unpack#2}% - \pgfpathlineto{\expandafter\pgfplotsplothandlermesh@unpack#3}% - \pgfpathlineto{\expandafter\pgfplotsplothandlermesh@unpack#4}% - \pgfplotsplothandlermesh@preparedrawforcurrent - \pgfpathclose - \pgfplotsplothandlermesh@usepath -}% - -\def\pgfplotsplothandlermesh@zbuffer@sort@iflessthen#1#2#3#4\pgfeov{% - \edef\pgfplots@loc@TMPa{#1}% - \expandafter\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@\pgfplots@loc@TMPa\relax - \let\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@a=\pgfmathresult - \edef\pgfplots@loc@TMPb{#2}% - \expandafter\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@\pgfplots@loc@TMPb\relax - \let\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@b=\pgfmathresult - \ifdim\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@b pt<\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@a pt% - #3\relax - \else - #4\relax - \fi -}% -\def\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@#1#2{% - \def\pgfmathresult{#1}% -}% - -% #1: projected x coord -% #2: projected y coord -% #3: per point meta (if any) -\def\pgfplotsplothandlermesh@unpack@corner#1#2#3{% - \global\pgf@x=#1\relax - \global\pgf@y=#2\relax -}% -\def\pgfplotsplothandlermesh@unpack@mean@accum#1#2#3{% - \global\pgf@x=#1\relax - \global\pgf@y=#2\relax - \def\pgfplots@current@point@meta{#3}% - \pgfplots@perpointmeta@trafo@APPLY - \global\advance\pgfplots@tmpa by\pgfplotspointmetatransformed pt -}% -% same as above, just for one dim plots (rows == 1 || cols==1) -\def\pgfplotsplothandlermesh@ONEDIM@draw#1{% - \pgf@process{#1}% - \edef\pgfplotsplothandlermesh@i{{\the\pgf@x}{\the\pgf@y}{\pgfplots@current@point@meta}}% - \ifnum\c@pgfplots@scanlineindex>0 - \pgfplotsplothandlermesh@process@element - \fi - \let\pgfplotsplothandlermesh@im=\pgfplotsplothandlermesh@i - \advance\c@pgfplots@scanlineindex by1 -}% % #1: a normalized coordinate stream. % @@ -6974,8 +8490,7 @@ \pgfplotsprependlistXnewempty{reversed}% }% \def\pgfplots@coord@stream@coord{% - \edef\pgfplots@loc@TMPa{\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z,\pgfplots@current@point@meta;}% - \expandafter\pgfplotsprependlistXpushfront\expandafter{\pgfplots@loc@TMPa}\to{reversed}% + \expandafter\pgfplotsprependlistXpushfront\expandafter{\pgfplots@coord@stream@foreach@NORMALIZED@curencoded@braced}\to{reversed}% }% \def\pgfplots@coord@stream@end{% \pgfplotsprependlistXlet\pgfplots@loc@TMPa={reversed}% @@ -6997,8 +8512,7 @@ }% }% \def\pgfplots@coord@stream@coord{% - \edef\pgfplots@loc@TMPa{\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z,\pgfplots@current@point@meta;}% - \expandafter\pgfplots@zbuffer@local@SETCUR\expandafter{\pgfplots@loc@TMPa}% + \expandafter\pgfplots@zbuffer@local@SETCUR\expandafter{\pgfplots@coord@stream@foreach@NORMALIZED@curencoded}% \advance\c@pgfplots@scanlineindex by1 }% \def\pgfplots@coord@stream@end{% @@ -7010,7 +8524,7 @@ \pgfkeysdef{/pgfplots/array/unscope pre}{% \pgfplotsapplistXnewempty{\pgfp@sortedlist}% \pgfplotsarrayforeachungrouped\pgfplots@zbuffer@local\as\curelem{% - \expandafter\pgfplotsapplistXpushback\curelem\to{\pgfp@sortedlist}% + \expandafter\pgfplotsapplistXpushback\expandafter{\expandafter{\curelem}}\to{\pgfp@sortedlist}% }% \pgfplotsapplistXlet\pgfplots@loc@TMPa={\pgfp@sortedlist}% \global\let\pgfplotsglobalretval=\pgfplots@loc@TMPa @@ -7034,44 +8548,58 @@ % only need to know whether [xy] coordinates are sorted % ascending or descending. This information is already ready. % - \begingroup - \if+\pgfkeysvalueof{/pgfplots/x coord sorting}% - \def\pgfplots@minmaxvalue@x{0}% - \else - \def\pgfplots@minmaxvalue@x{0}% - \fi - \if+\pgfkeysvalueof{/pgfplots/y coord sorting}% - \def\pgfplots@minmaxvalue@y{0}% - \else - \def\pgfplots@minmaxvalue@y{1}% - \fi - \pgfplotsifaxissurfaceisforeground{\pgfplots@minmaxvalue@x vv}{% - \def\pgfplots@reverse@x{1}% - }{% - \def\pgfplots@reverse@x{0}% - }% - \pgfplotsifaxissurfaceisforeground{v\pgfplots@minmaxvalue@y v}{% - \def\pgfplots@reverse@y{1}% - }{% - \def\pgfplots@reverse@y{0}% - }% - \if1\pgfplots@reverse@x - \if1\pgfplots@reverse@y - \pgfkeys{/pgfplots/z buffer=reverse xy seq}% + \if1\pgfplotsplothandlermesh@matrixinput + % mesh input=lattice + \begingroup + \if+\pgfkeysvalueof{/pgfplots/x coord sorting}% + \def\pgfplots@minmaxvalue@x{0}% + \else + \def\pgfplots@minmaxvalue@x{0}% + \fi + \if+\pgfkeysvalueof{/pgfplots/y coord sorting}% + \def\pgfplots@minmaxvalue@y{0}% + \else + \def\pgfplots@minmaxvalue@y{1}% + \fi + \pgfplotsifaxissurfaceisforeground{\pgfplots@minmaxvalue@x vv}{% + \def\pgfplots@reverse@x{1}% + }{% + \def\pgfplots@reverse@x{0}% + }% + \pgfplotsifaxissurfaceisforeground{v\pgfplots@minmaxvalue@y v}{% + \def\pgfplots@reverse@y{1}% + }{% + \def\pgfplots@reverse@y{0}% + }% + \if1\pgfplots@reverse@x + \if1\pgfplots@reverse@y + \pgfkeys{/pgfplots/z buffer=reverse xy seq}% + \else + \pgfkeys{/pgfplots/z buffer=reverse x seq}% + \fi \else - \pgfkeys{/pgfplots/z buffer=reverse x seq}% + \if1\pgfplots@reverse@y + \pgfkeys{/pgfplots/z buffer=reverse y seq}% + \else + \pgfkeys{/pgfplots/z buffer=none}% + \fi \fi +%\message{z buffer=auto mode chose z buffer= \ifcase\pgfplotsplothandlermesh@zbuffer@choice NONE \or reverse x seq \or reverse y seq \or reverse xy seq \or sort\or default \fi. mesh ordering = \ifcase\pgfplots@plot@mesh@ordering x varies/rowwise\or y varies/colwise\fi}% + % 'z buffer' is no longer 'auto' now: + \pgfplots@apply@zbuffer{#1}% + \endgroup \else - \if1\pgfplots@reverse@y - \pgfkeys{/pgfplots/z buffer=reverse y seq}% + % mesh input=patches + \ifpgfplots@threedim + \if\pgfplots@meshmode n% + \else + \pgfkeys{/pgfplots/z buffer=sort}% + \fi \else \pgfkeys{/pgfplots/z buffer=none}% \fi + \gdef\pgfplotsglobalretval{#1}% \fi -%\message{z buffer=auto mode chose z buffer= \ifcase\pgfplotsplothandlermesh@zbuffer@choice NONE \or reverse x seq \or reverse y seq \or reverse xy seq \or sort\or default \fi. mesh ordering = \ifcase\pgfplots@plot@mesh@ordering x varies/rowwise\or y varies/colwise\fi}% - % 'z buffer' is no longer 'auto' now: - \pgfplots@apply@zbuffer{#1}% - \endgroup \or % z buffer=default. \if\pgfplots@meshmode n% @@ -7079,10 +8607,8 @@ \gdef\pgfplotsglobalretval{#1}% \else % mesh=true - \begingroup \pgfkeysalso{/pgfplots/z buffer=auto}% \pgfplots@apply@zbuffer{#1}% - \endgroup \fi \fi }% @@ -7109,8 +8635,7 @@ \pgfplotsapplistXnewempty{\resultlist}% }% \def\pgfplots@coord@stream@coord{% - \edef\pgfplots@loc@TMPa{\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z,\pgfplots@current@point@meta;}% - \expandafter\pgfplotsprependlistXpushfront\expandafter{\pgfplots@loc@TMPa}\to{reversedscanline}% + \expandafter\pgfplotsprependlistXpushfront\expandafter{\pgfplots@coord@stream@foreach@NORMALIZED@curencoded@braced}\to{reversedscanline}% \advance\c@pgfplots@scanlineindex by1 \ifnum\c@pgfplots@scanlineindex=\pgfplotsscanlinelength\relax \pgfplotsprependlistXlet\pgfplots@loc@TMPa={reversedscanline}% @@ -7145,8 +8670,7 @@ \pgfplotsprependlistXnewempty{resultlist}% }% \def\pgfplots@coord@stream@coord{% - \edef\pgfplots@loc@TMPa{\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z,\pgfplots@current@point@meta;}% - \expandafter\pgfplotsapplistXpushback\expandafter{\pgfplots@loc@TMPa}\to{\scanline}% + \expandafter\pgfplotsapplistXpushback\expandafter{\pgfplots@coord@stream@foreach@NORMALIZED@curencoded@braced}\to{\scanline}% \advance\c@pgfplots@scanlineindex by1 \ifnum\c@pgfplots@scanlineindex=\pgfplotsscanlinelength\relax \pgfplotsapplistXlet\pgfplots@loc@TMPa={\scanline}% @@ -7175,12 +8699,14 @@ % A special '<' operation which returns true if the point coordinate % '#1' is BEHIND #2 with respect to the current 3D view. \def\pgfplots@apply@zbuffer@SORT@iflessthan#1#2#3#4\pgfeov{% - \edef\pgfplots@loc@TMPa{#1}% - \expandafter\pgfplots@apply@zbuffer@SORT@iflessthan@\pgfplots@loc@TMPa\relax + \pgfplotsaxisdeserializedatapointfrom{#1}% + \pgfplotsmathfloatviewdepthxyz{\pgfplots@current@point@x}{\pgfplots@current@point@y}{\pgfplots@current@point@z}% \let\pgfplots@apply@zbuffer@SORT@iflessthan@a=\pgfmathresult - \edef\pgfplots@loc@TMPb{#2}% - \expandafter\pgfplots@apply@zbuffer@SORT@iflessthan@\pgfplots@loc@TMPb\relax + % + \pgfplotsaxisdeserializedatapointfrom{#2}% + \pgfplotsmathfloatviewdepthxyz{\pgfplots@current@point@x}{\pgfplots@current@point@y}{\pgfplots@current@point@z}% \let\pgfplots@apply@zbuffer@SORT@iflessthan@b=\pgfmathresult + % \pgfmathfloatlessthan@{\pgfplots@apply@zbuffer@SORT@iflessthan@b}{\pgfplots@apply@zbuffer@SORT@iflessthan@a}% \ifpgfmathfloatcomparison #3\relax @@ -7189,14 +8715,6 @@ \fi }% -% returns the view depth of the provided serialized coordinate into -% \pgfmathresult -% -% FIXME : relies on the internal repr in -% \pgfplots@coord@stream@foreach@NORMALIZED : -\def\pgfplots@apply@zbuffer@SORT@iflessthan@#1,#2,#3,#4;{% - \pgfplotsmathfloatviewdepthxyz{#1}{#2}{#3}% -}% % Defines \pgfmathresult to be the view depth of a three component % vector. The third component will be used if and only if the boolean @@ -7321,7 +8839,7 @@ \if1\csname pgfpmeta@\pgfplotspointmetainputhandler @issymbolic\endcsname \else % ok, be fault tolerant and round to an integer: - \pgfmathfloattofixed{\pgfplotspointmeta}% + \pgfplotscoordmath{meta}{tofixed}{\pgfplotspointmeta}% \begingroup \pgfkeys{/pgf/number format/precision=0}% \expandafter\pgfmathroundto\expandafter{\pgfmathresult}% diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex index ec1642f9409..fe6106f4380 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex @@ -24,6 +24,8 @@ % %-------------------------------------------- +\def\pgfplotsset#{\pgfqkeys{/pgfplots}} + \def\pgfplots@error#1{\PackageError{pgfplots}{#1}{}}% \def\pgfplotstable@error@pkg#1{\PackageError{pgfplotstable}{#1}{}}% @@ -163,4 +165,6 @@ \pgfutil@ifundefined{pgfplots@texdist@protect}{% \def\pgfplots@texdist@protect{}% }{} + +\input pgfplotssysgeneric.code.tex \endinput diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplothandler.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplothandler.code.tex new file mode 100644 index 00000000000..63cd7be107c --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplothandler.code.tex @@ -0,0 +1,2185 @@ +%-------------------------------------------- +% +% Package pgfplots +% +% Provides a user-friendly interface to create function plots (normal +% plots, semi-logplots and double-logplots). +% +% It is based on Till Tantau's PGF package. +% +% Copyright 2007-2010 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +%-------------------------------------------- + +% Assigns default values to 'rows' and 'cols' in case +% their values are empty. +% +% PRECONDITION: +% The values of +% - '/pgfplots/mesh/rows' +% - '/pgfplots/mesh/cols' +% - '/pgfplots/mesh/num points' +% - \pgfplotsscanlinelength +% - '/pgfplots/mesh/ordering' +% are assigned properly. +% +% POSTCONDITION: +% 'rows' and 'cols' now incorporates \pgfplotsscanlinelength if +% their values had been empty. However, there may still be empty +% values. +% +% @see \pgfplotsautocompletemeshkeys +\def\pgfplotspreparemeshkeydefaults{% + \pgfplots@autocomplete@meshkeys0% +}% + +% Completes and sanitizes 'mesh/rows' and 'mesh/cols' such that they +% have useful integer values afterwards. +% +% This method works similarly to \pgfplotspreparemeshkeydefaults. +% However, it really completes values and issues error messages if +% that proves to be impossible. +% +% PRECONDITION: +% The values of +% - '/pgfplots/mesh/rows' +% - '/pgfplots/mesh/cols' +% - '/pgfplots/mesh/num points' +% - '/pgfplots/mesh/ordering' +% are assigned properly. +% If +% - \pgfplotsscanlinelength +% exists and is positive, it may also be used. +% +% POSTCONDITION: +% 'rows' and 'cols' have useful integer values. +\def\pgfplotsautocompletemeshkeys{% + \pgfplots@autocomplete@meshkeys1% +}% +\def\pgfplots@autocomplete@meshkeys#1{% + % For #1 = 0, the values are only partially completed (which is + % also compatible with patch plots) + \pgfkeysgetvalue{/pgfplots/mesh/rows}\pgfplotsplothandlermesh@rows + \pgfkeysgetvalue{/pgfplots/mesh/cols}\pgfplotsplothandlermesh@cols + \pgfkeysgetvalue{/pgfplots/mesh/num points}\pgfplotsplothandlermesh@numpoints + \edef\pgfplotsplothandlermesh@numpoints{\pgfplotsplothandlermesh@numpoints}% + \edef\pgfplotsplothandlermesh@cols{\pgfplotsplothandlermesh@cols}% + \edef\pgfplotsplothandlermesh@rows{\pgfplotsplothandlermesh@rows}% + % + \def\pgfplots@loc@TMPa{0}% + \ifpgfplots@curplot@threedim + \def\pgfplots@loc@TMPa{1}% + \else + \if s\pgfplots@meshmode + % we have a 'surf' plot. That doesn't make sense unless + % one has a matrix, even for a two--dimensional plot. Try it. + \def\pgfplots@loc@TMPa{1}% + \fi + \fi + \if1\pgfplots@loc@TMPa + \ifx\pgfplotsplothandlermesh@rows\pgfutil@empty + \ifx\pgfplotsplothandlermesh@cols\pgfutil@empty + \pgfutil@ifundefined{pgfplotsscanlinelength}{\def\pgfplotsscanlinelength{-1}}{}% + \ifpgfplots@scanline@verbose + \ifnum\pgfplotsscanlinelength>0 + % we have scanlinelength set! Use it: + \message{PGFPlots: Scanline length is \pgfplotsscanlinelength.}% + \else + \ifnum\pgfplotsscanlinelength=-2 + \message{PGFPlots: Scanline length could not be determined since multiple, different scan line lengths have been found.}% + \else + \message{PGFPlots: No end-of-scanline marker found in input stream.}% + \fi + \fi + \fi + \ifnum\pgfplotsscanlinelength>0 + % we have scanlinelength set! Use it: + \if\pgfplots@plot@mesh@ordering0% + % ordering = x varies= rowwise -> scanline is cols! + \edef\pgfplotsplothandlermesh@cols{\pgfplotsscanlinelength}% + \else + % ordering = y varies = colwise: scanline is rows! + \edef\pgfplotsplothandlermesh@rows{\pgfplotsscanlinelength}% + \fi + \else + \if1#1% + % try to get reasonable values: + \ifx\pgfplotsplothandlermesh@numpoints\pgfutil@empty + \pgfplots@error{Sorry, a mesh needs either '[mesh/rows=<N>]' or '[mesh/cols=<N>]' set - or at least '[mesh/num points=<N>]'. But it did not find any of them...}% + \def\pgfplotsplothandlermesh@cols{5}% + \def\pgfplotsplothandlermesh@rows{5}% + \else + % We don't have rows/cols. Well, try using + % sqrt(num points) for both of them! + \ifnum\pgfplotsplothandlermesh@numpoints<16380 + \pgfmath@basic@sqrt@{\pgfplotsplothandlermesh@numpoints}% + \else + \pgfmathfloatparsenumber{\pgfplotsplothandlermesh@numpoints}% + \pgfmathfloatsqrt@{\pgfmathresult}% + \pgfmathfloattofixed{\pgfmathresult}% + \fi + \begingroup + % Try whether this rows*rows yields numpoints: + \afterassignment\pgfplots@gobble@until@relax + \c@pgf@counta=\pgfmathresult\relax + \c@pgf@countb=\c@pgf@counta + \multiply\c@pgf@counta by\c@pgf@counta + \def\pgfplotsretval{1}% + \ifnum\c@pgf@counta=\pgfplotsplothandlermesh@numpoints\relax + % ok, rows*rows = numpoints. + \edef\pgfplotsplothandlermesh@rows{\the\c@pgf@countb}% + \else + % oh. Did not work. Check for rounding errors: + \c@pgf@counta=\c@pgf@countb + \advance\c@pgf@counta by1 + \c@pgf@countb=\c@pgf@counta + \multiply\c@pgf@counta by\c@pgf@counta + \ifnum\c@pgf@counta=\pgfplotsplothandlermesh@numpoints + % ok, (rows+1)*(rows+1) = numpoints. + \edef\pgfplotsplothandlermesh@rows{\the\c@pgf@countb}% + \else + % no... did not work. num points doesn't + % appear to be a squared number. + \def\pgfplotsretval{0}% + \edef\pgfplotsplothandlermesh@rows{5}% + \fi + \fi + \if\pgfplotsretval1 + \pgfplots@warning{% + mesh processing did not find '[mesh/rows=<N>]' or '[mesh/cols=<N>]'. + Assuming [mesh/rows=\pgfplotsplothandlermesh@rows,mesh/cols=\pgfplotsplothandlermesh@rows] + as sqrt(num points) = sqrt(\pgfplotsplothandlermesh@numpoints) [ = \pgfmathresult].}% + \else + \pgfplots@error{Sorry, 'plot mesh' needs either '[mesh/rows=<N>]' or '[mesh/cols=<N>]' set, + but it did not find any of them. + I also tried rows = sqrt(num points) = sqrt(\pgfplotsplothandlermesh@numpoints) = \pgfmathresult\space without success.}% + \fi + \pgfmath@smuggleone\pgfplotsplothandlermesh@rows + \endgroup + \let\pgfplotsplothandlermesh@cols=\pgfplotsplothandlermesh@rows + \fi + \else + % #1=0 -> leave them empty. + \fi + \fi + \fi + \fi + \if1#1% + \ifx\pgfplotsplothandlermesh@rows\pgfutil@empty + \ifx\pgfplotsplothandlermesh@cols\pgfutil@empty + \else + % Compute 'rows' out of 'num points' and 'cols': + \ifx\pgfplotsplothandlermesh@numpoints\pgfutil@empty + \pgfplots@error{Sorry, matrix input needs a valid '[mesh/num points=<N>]' variable if only one of '[mesh/rows=<N>]' or '[mesh/cols=<N>]' is given.}% + \def\pgfplotsplothandlermesh@numpoints{100}% + \fi + \begingroup + \c@pgf@counta=\pgfplotsplothandlermesh@numpoints\relax + \divide\c@pgf@counta by\pgfplotsplothandlermesh@cols\relax + \xdef\pgfplots@glob@TMPa{\the\c@pgf@counta}% + \endgroup + \let\pgfplotsplothandlermesh@rows=\pgfplots@glob@TMPa + \fi + \else + \ifx\pgfplotsplothandlermesh@cols\pgfutil@empty + % Compute 'cols' out of 'num points' and 'rows': + \ifx\pgfplotsplothandlermesh@numpoints\pgfutil@empty + \pgfplots@error{Sorry, matrix input needs a valid '[mesh/num points=<N>]' variable if only one of '[mesh/cols=<N>]' or '[mesh/rows=<N>]' is given.}% + \def\pgfplotsplothandlermesh@numpoints{100}% + \fi + \begingroup + \c@pgf@counta=\pgfplotsplothandlermesh@numpoints\relax + \divide\c@pgf@counta by\pgfplotsplothandlermesh@rows\relax + \xdef\pgfplots@glob@TMPa{\the\c@pgf@counta}% + \endgroup + \let\pgfplotsplothandlermesh@cols=\pgfplots@glob@TMPa + \fi + \fi + \ifx\pgfplotsplothandlermesh@numpoints\pgfutil@empty + \c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@rows\relax + \multiply\c@pgfplots@scanlineindex by \pgfplotsplothandlermesh@cols\relax + \edef\pgfplotsplothandlermesh@numpoints{\the\c@pgfplots@scanlineindex}% + \fi + % + \c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@rows\relax + \multiply\c@pgfplots@scanlineindex by\pgfplotsplothandlermesh@cols\relax + \ifnum\c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@numpoints\relax + \else + \ifcase\pgfplots@mesh@checkmode\relax + % mesh/check=false + \def\pgfplots@loc@TMPa##1{}% + \or + % mesh/check=warning + \def\pgfplots@loc@TMPa##1{\pgfplots@warning{##1}}% + \or + % mesh/check=error + \def\pgfplots@loc@TMPa##1{\pgfplots@error{##1}}% + \fi + \pgfplots@loc@TMPa{the arguments of [mesh/rows=\pgfplotsplothandlermesh@rows,mesh/cols=\pgfplotsplothandlermesh@cols] assume \the\c@pgfplots@scanlineindex\space points, but I got actually N = \pgfplotsplothandlermesh@numpoints\space points! The data matrix appears to be incomplete or overcomplete!? [Use mesh/check=false to disable this message]}% + \fi + \fi + \else + % 2d visualization has no mesh: + \edef\pgfplotsplothandlermesh@rows{\pgfplotsplothandlermesh@numpoints}% + \def\pgfplotsplothandlermesh@cols{1}% + \fi + % + \def\pgfplots@loc@TMPa{\pgfkeyssetvalue{/pgfplots/mesh/rows}}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfplotsplothandlermesh@rows}% + \def\pgfplots@loc@TMPa{\pgfkeyssetvalue{/pgfplots/mesh/cols}}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfplotsplothandlermesh@cols}% +}% + +%% +%% Helper structs for patch plots (surfaces) + +\def\pgfplotspatchvertex#1#2#3#4\endvertex{% + \def\pgfplotspatchvertexstruct{{#1}{#2}{#3}#4}% + \def\pgfplotspatchvertexx{#1}% + \def\pgfplotspatchvertexy{#2}% + \def\pgfplotspatchvertexmeta{#3}% + \def\pgfplotspatchvertexdepth{#4}% +}% +\def\pgfplotspointpatchvertex#1#2#3#4\endvertex{% + \global\pgf@x=#1 + \global\pgf@y=#2 +}% + +% Allows to combined different vertices in the form +% \pgfplotspatchvertexaccumstart +% \expandafter\pgfplotspatchvertexadd\vertexA\times{0.25}% +% \expandafter\pgfplotspatchvertexadd\vertexB\times{0.5}% +% \expandafter\pgfplotspatchvertexadd\vertexC\times{0.75}% +% \pgfplotspatchvertexfinish\finalvertex +% --> now, \finalvertex contains the result vertex, 0.25*A + 0.5*B + 0.75*C . +% +% THERE MUST NOT BE MATH INBETWEEN. +% More precisely, this overwrites the macros +% \pgf@x,\pgf@y, \pgf@xa,\pgf@ya, \pgf@yb, \pgfmathresult and \pgfplotspatchvertexdepth +\def\pgfplotspatchvertexaccumstart{% + \pgf@xa=0pt + \pgf@ya=0pt + \pgf@yb=0pt + \pgfplotscoordmath{meta}{zero}% +}% +\def\pgfplotspatchvertexadd#1#2#3#4\times#5{% + \global\pgf@x=#1 + \global\pgf@y=#2 + \advance\pgf@xa by#5\pgf@x + \advance\pgf@ya by#5\pgf@y + \let\pgfmathresult@=\pgfmathresult + \pgfplotscoordmath{meta}{parsenumber}{#5}% + \pgfplotscoordmath{meta}{op}{multiply}{{#3}{\pgfmathresult}}% + \pgfplotscoordmath{meta}{op}{add}{{\pgfmathresult@}{\pgfmathresult}}% + \def\pgfplotspatchvertexdepth{#4}% + \ifx\pgfplotspatchvertexdepth\pgfutil@empty + \else + \global\pgf@y=#4pt + \advance\pgf@yb by#5\pgf@y + \fi +}% +\def\pgfplotspatchvertexfinish#1{% + \edef#1{{\the\pgf@xa}{\the\pgf@ya}{\pgfmathresult}\ifx\pgfplotspatchvertexdepth\pgfutil@empty\else\pgf@sys@tonumber\pgf@yb\fi}% +} +% Same as \pgfplotspatchvertexadd, but it only adds the X and Y +% coordinates (ignoring the rest). +\def\pgfplotspatchvertexaddXY#1#2#3#4\times#5{% + \global\pgf@x=#1 + \global\pgf@y=#2 + \advance\pgf@xa by#5\pgf@x + \advance\pgf@ya by#5\pgf@y +}% +% Same as \pgfplotspatchvertexfinish, but it only saves X and Y. +\def\pgfplotspatchvertexfinishXY#1{% + \edef#1{{\the\pgf@xa}{\the\pgf@ya}{}}% +} + +% #1 class name +% #2 method +% <any method arguments follow> +\def\pgfplotspatchclass#1#2{% + \pgfutil@ifundefined{pgfpptch@#1@#2}{% + \pgfplotspatchclasserror{#1}{#2}% + }{% + \edef\pgfplotspatchclassname{#1}% + \csname pgfpptch@#1@#2\endcsname + }% +}% +\def\pgfplotspatchclasserror#1#2{% + \pgfutil@ifundefined{pgfpptch@#1@}{% + \pgfplots@error{Sorry, the 'patch type=#1' is not defined. Maybe you misspelled it? Or perhaps you need to load \string\usepgfplotslibrary{patchplots}?}% + }{% + \pgfplots@error{Sorry, the patch class '#1' has no method '#2' (or it is not yet implemented)}% + }% +}% + +\def\pgfplotsplothandlermesh@setnextvertex#1{% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set next vertex}{#1}% +}% + +% Declares a new patch class named #1. +% +% #1: a string name. +% #2: methods defining the class, provided as key values. See the +% predefined classes to adjust your own ones. Documentation about the +% available methods and their arguments can be found below in this +% file. +% +% @see \usepgfplotslibrary{patchplots} +\def\pgfplotsdeclarepatchclass#1#2{% + \edef\pgfplotsdeclarepatchclass@{@#1@}% + \pgfutil@ifundefined{pgfpptch@#1@}{% + % Ok. This is the FIRST declaration of this patch class. + % Define some default algorithms. + % + \expandafter\def\csname pgfpptch@#1@\endcsname{#1}% + \pgfqkeys{/pgfplots/@declare patch}{% + init=, + allow matrix=0, + init pdf shading=, + stream to shader={% +%\message{\pgfplotspatchclassname: stream to shader: Starting ^^J}% + \pgfplotspatchclass{\pgfplotspatchclassname}{foreach vertex}{% +%\message{vertex (\pgfplotspatchvertexx,\pgfplotspatchvertexy[\pgfplotspatchvertexmeta]. ^^J}% + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord{% + \global\pgf@x=\pgfplotspatchvertexx\space + \global\pgf@y=\pgfplotspatchvertexy\space + }{\pgfplotspointmetatransformed}% + }% + },% + get num cdata vertices=\pgfplotspatchclass{\pgfplotspatchclassname}{get vertices}, + set edge visible=\expandafter\edef\csname pgfppatchedge@##1\endcsname{##2}, + uses view depth=0, + serialize except vertices=\let\pgfplotsretval\pgfutil@empty, + deserialize except vertices=##1, + serialize={% + % the default serialization is not necessarily the fastest + % possible. But it should work. + \pgfplotspatchclass{\pgfplotspatchclassname}{serialize except vertices}% + \t@pgfplots@toka=\expandafter{\pgfplotsretval + \let\pgfplotspatchready@defaultserialize=\pgfplotspatchready + \let\pgfplotspatchready=\relax + }% + \edef\pgfplotsretval{% + \noexpand\pgfplotspatchclass{\pgfplotspatchclassname}{new}% + \the\t@pgfplots@toka + }% + \pgfplotspatchclass{\pgfplotspatchclassname}{foreach vertex}{% + \t@pgfplots@toka=\expandafter{\pgfplotsretval}% + \edef\pgfplotsretval{\the\t@pgfplots@toka + \noexpand\pgfplotspatchclass{\pgfplotspatchclassname}{set next vertex}{\pgfplotspatchvertexstruct}% + }% + }% + \expandafter\def\expandafter\pgfplotsretval\expandafter{\pgfplotsretval + \let\pgfplotspatchready=\pgfplotspatchready@defaultserialize + }% + }, + deserialize=##1, + triangulate class=triangle, + triangulate={% + \pgfplots@error{triangulate: not yet implemented for \pgfplotspatchclassname}% + },% + refine={% + \let\pgfplotsrefinedpatchready=\pgfplotspatchready + \pgfplotspatchclass@recursiverefine{##1}% + },% + recursive refine@={% + \pgfplots@error{refine: not yet implemented for \pgfplotspatchclassname}% + },% + }% + }{}% + % + % + \pgfqkeys{/pgfplots/@declare patch}{#2}% + % + % + \pgfutil@ifundefined{pgfpptch\pgfplotsdeclarepatchclass@ foreach cdata vertex}{% + \pgfutil@namelet + {pgfpptch\pgfplotsdeclarepatchclass@ foreach cdata vertex} + {pgfpptch\pgfplotsdeclarepatchclass@ foreach vertex}% + }{% + }% + \pgfutil@ifundefined{pgfpptch\pgfplotsdeclarepatchclass@ stroke path}{% + \pgfutil@namelet + {pgfpptch\pgfplotsdeclarepatchclass@ stroke path} + {pgfpptch\pgfplotsdeclarepatchclass@ fill path}% + }{% + }% +}% +\pgfqkeys{/pgfplots/@declare patch}{% + % may do any more or less global preparations. It is some sort (!) + % of constructor. + init/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ init\endcsname{#1}},% + allow matrix/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ allow matrix\endcsname{\def\pgfplotsretval{#1}}},% + uses view depth/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ uses view depth\endcsname{\def\pgfplotsretval{#1}}},% + new/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ new\endcsname{#1}},% + % + % sets the next vertex value of the patch. + % + % if the patch has all expected vertices, \pgfplotspatchready is + % invoked and the next call to 'set next vertex' will start a new + % patch. + % + % #1: encodes the current vertex such that + % \pgfplotspatchvertex#1\endvertex + % is accepted. + set next vertex/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ set next vertex\endcsname##1{#1}},% + % + % declares whether a single edge is visible or not. + % #1: an integer denoting the edge, either 0,1,2,...,N-1 where N = num verts + % #2: 0 if the edge is not to be stroked and 1 if it is stroked. + % + % This command doesn't need to be called; but if it is, it needs + % to be called for every edge. + % + % ATTENTION: this is *only* used by 'stroke path'. You will never + % need 'stroke path' unless some edges are invisible. If all edges + % are visible, 'stroke path' and 'fill path' are the same. + % + % This is currently *only* used for triangle triangulations! + set edge visible/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ set edge visible\endcsname##1##2{#1}},% + % + % Defines \pgfplotsretval to be a serialized representation of + % this patch. + serialize/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ serialize\endcsname{#1}},% + % Defines \pgfplotsretval to be a serialized representation of + % this patches extra data fields, excluding vertices. + % This is often a NO-OP (unless 'set edge visible' has been used) + serialize except vertices/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ serialize except vertices\endcsname{#1}},% + % + % Restores a serialized representation from #1. + deserialize/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ deserialize\endcsname##1{#1}},% + % Restores a serialized representation from #1. Only vertices are + % not stored here. + deserialize except vertices/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ deserialize except vertices\endcsname##1{#1}},% + % + % issues \pgfplotspatchvertex{...}\endvertex for the first vertex. + first vertex/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ first vertex\endcsname{#1}},% + % + % invokes + % \pgfplotspatchvertex...\endvertex + % #1 + % for the every vertex. + foreach vertex/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ foreach vertex\endcsname##1{#1}},% + % + % invokes + % \pgfplotspatchvertex...\endvertex + % #1 + % for the every colored vertex. + % See 'get num cdata vertices' + foreach cdata vertex/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ foreach cdata vertex\endcsname##1{#1}},% + % + % generates a pgf path which is readily usable for filling. + fill path/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ fill path\endcsname{#1}},% + % + % Similar to 'fill path', this here paints the edges. It is only + % useful if 'set edge visible' is in use. In all other cases, it + % is the same as 'fill path' + % + % This is currently *only* used for triangle triangulations! + stroke path/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ stroke path\endcsname{#1}},% + % + init pdf shading/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ init pdf shading\endcsname{#1}},% + stream to shader/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ stream to shader\endcsname{#1}},% + % + % expands to the number of vertices. + get num vertices/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ get num vertices\endcsname{\def\pgfplotsretval{#1}}},% + % + % expands to the number of vertices which have color data + % attached. This is usually the same as 'get num vertices' (but + % see coons patches). + get num cdata vertices/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ get num cdata vertices\endcsname{\def\pgfplotsretval{#1}}},% + % + % Approximates the given patch by at least one triangle. + % For every finished triangle, \pgfplotspatchready will be invoked + % and \pgfplotsplothandlermesh@patchclass will be set to triangle. + % More precisely, it is expected to be set to the return value of + % 'triangulate class'. + triangulate/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ triangulate\endcsname{#1}},% + % Defines \pgfplotsretval to be the classname returned by + % 'triangulate'. This is usually 'triangle' + triangulate class/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ triangulate class\endcsname{\def\pgfplotsretval{#1}}},% + % + % Refines the given patch #1 times. + % For every finished patch, \pgfplotspatchready will be invoked. + refine/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ refine\endcsname##1{#1}},% + % + % shared helper method which can be invoked recursively by refine. + % the default implementation of 'refine' will invoke this one. + % + % #1: a serialized representation of the given patch. Use it to + % restore the current patch in intermediate steps. Note that you + % may not use \begingroup/\endgroup in this method; otherwise the + % 'z buffer' algorithm will need to be done with \global (and I + % don't want that. You probably neither). + % + % The refinement loop as such will be controlled by the default + % implementation of 'refine'. This macro is ONLY to be called by the + % default implementation of 'refine'! Overwriting it should + % automatically yield refinement facilities. + % + % the macro \pgfplotspatchready should be called for each refined + % element (happens automatically if you use 'set next vertex'). + % + % POSTCONDITION: + % the element has been refined once. + recursive refine@/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ recursive refine@\endcsname##1{#1}},% + % + get pdf shading type/.style={get pdf shading type*={\def\pgfplotsretval{#1}}}, + get pdf shading type*/.code= + {\expandafter\def\csname pgfpptch\pgfplotsdeclarepatchclass@ get pdf shading type\endcsname{#1}},% +} + +\def\pgfplotspatchclass@recursiverefine#1{% + \c@pgf@counta=#1 + \ifnum\c@pgf@counta=1 + \let\pgfplotspatchready=\pgfplotsrefinedpatchready + \else + \advance\c@pgf@counta by-1 + \edef\pgfplotspatchready{\noexpand\pgfplotspatchclass@recursiverefine{\the\c@pgf@counta}}% + \fi + % + \pgfplotspatchclass{\pgfplotspatchclassname}{serialize}% + \t@pgfplots@toka=\expandafter{\pgfplotsretval}% + \t@pgfplots@tokc=\expandafter{\pgfplotspatchready}% + \edef\pgfplots@loc@TMPa{% + \noexpand\pgfplotspatchclass{\pgfplotspatchclassname}{deserialize}{\the\t@pgfplots@toka}% + \noexpand\def\noexpand\pgfplotspatchready{\the\t@pgfplots@tokc}% + \noexpand\def\noexpand\pgfplotspatchclassname{\pgfplotspatchclassname}% % FIXME: is that correct? + }% + \expandafter\pgfplotspatchclass@recursiverefine@\expandafter{\pgfplots@loc@TMPa}% +}% +\def\pgfplotspatchclass@recursiverefine@{% + \pgfplotspatchclass{\pgfplotspatchclassname}{recursive refine@}% +}% + + +% sequence macros preferred over integer indices. +% using characters avoids the extensive use of \csname ...\endcsname +% and \expandafter which would be necessary for integer indices. +\def\pgfpptchindexnext@A{B}% 0->1 +\def\pgfpptchindexnext@B{C}% 1->2 +\def\pgfpptchindexnext@C{D}% 2->3 +\def\pgfpptchindexnext@D{E}% 3->4 +\def\pgfpptchindexnext@E{F}% 4->5 +\def\pgfpptchindexnext@F{G}% 5->6 +\def\pgfpptchindexnext@G{H}% 6->7 +\def\pgfpptchindexnext@H{I}% 7->8 +\def\pgfpptchindexnext@I{J}% 8->9 +\def\pgfpptchindexnext@J{K}% 9->10 +\def\pgfpptchindexnext@K{L}% 10->11 +\def\pgfpptchindexnext@L{M}% 11->12 +\def\pgfpptchindexnext@M{N}% 12->13 +\def\pgfpptchindexnext@N{O}% 13->14 +\def\pgfpptchindexnext@O{P}% 14->15 +\def\pgfpptchindexnext@P{Q}% 15->16 +\def\pgfpptchindexnext@Q{R}% 16->17 + +\pgfplotsdeclarepatchclass{line}{% + allow matrix=0, + new=\def\pgfplotspatchclass@line@no{0}, + set next vertex={% + \if0\pgfplotspatchclass@line@no\relax + \edef\pgfplotspatchclass@line@A{#1}% + \def\pgfplotspatchclass@line@no{1}% + \else + \edef\pgfplotspatchclass@line@B{#1}% + \def\pgfplotspatchclass@line@no{0}% + \pgfplotspatchready% + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@line@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@line@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@line@B\endvertex #1% + }, + fill path={% + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@line@A\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@line@B\endvertex}% + }, + serialize except vertices=\let\pgfplotsretval\pgfutil@empty,% + deserialize except vertices=, + get num vertices=2, + get pdf shading type=0, +}% + +\pgfplotsdeclarepatchclass{triangle}{% + allow matrix=0, + new=\def\pgfplotspatchclass@tri@no{0}\let\pgfplotspatchclass@trie@AB\relax, + set next vertex={% + \ifcase\pgfplotspatchclass@tri@no\relax + \edef\pgfplotspatchclass@tri@A{#1}% + \def\pgfplotspatchclass@tri@no{1}% + \or + \edef\pgfplotspatchclass@tri@B{#1}% + \def\pgfplotspatchclass@tri@no{2}% + \or + \edef\pgfplotspatchclass@tri@C{#1}% + \def\pgfplotspatchclass@tri@no{0}% + \pgfplotspatchready% + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@tri@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tri@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tri@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@tri@C\endvertex #1% + }, + fill path={% + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@A\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@B\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@C\endvertex}% + \pgfpathclose + }, + stroke path={% + \ifx\pgfplotspatchclass@trie@AB\relax + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@A\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@B\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@C\endvertex}% + \pgfpathclose + \else + \if1\pgfplotspatchclass@trie@AB + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@A\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@B\endvertex}% + \fi + \if1\pgfplotspatchclass@trie@BC + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@B\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@C\endvertex}% + \fi + \if1\pgfplotspatchclass@trie@CA + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@C\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@A\endvertex}% + \fi + \fi + }, + triangulate=\pgfplotspatchready, + set edge visible={% + \ifcase#1 + \edef\pgfplotspatchclass@trie@AB{#2}% + \or + \edef\pgfplotspatchclass@trie@BC{#2}% + \or + \edef\pgfplotspatchclass@trie@CA{#2}% + \fi + }, + serialize except vertices={% + \ifx\pgfplotspatchclass@trie@AB\relax + \let\pgfplotsretval\pgfutil@empty% + \else + \edef\pgfplotsretval{% + \noexpand\def\noexpand\pgfplotspatchclass@trie@AB{\pgfplotspatchclass@trie@AB}% + \noexpand\def\noexpand\pgfplotspatchclass@trie@BC{\pgfplotspatchclass@trie@BC}% + \noexpand\def\noexpand\pgfplotspatchclass@trie@CA{\pgfplotspatchclass@trie@CA}% + }% + \fi + },% + recursive refine@={% + % + \pgfplotspatchclass{\pgfplotspatchclassname}{new}% + % + % Perform longest edge bisection. + \pgfpointdiff + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@A\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@B\endvertex}% + \edef\pgfplots@loc@TMPa{{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}}% + \expandafter\pgfmath@basic@veclen@\pgfplots@loc@TMPa + \pgf@xa=\pgfmathresult pt + \pgf@yc=\pgf@xa % "max so far" + \def\pgfplotspatch@tri@longestedgestart{A}% + % + \pgfpointdiff + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@B\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@C\endvertex}% + \edef\pgfplots@loc@TMPa{{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}}% + \expandafter\pgfmath@basic@veclen@\pgfplots@loc@TMPa + \pgf@xa=\pgfmathresult pt + \ifdim\pgf@xa>\pgf@yc + \pgf@yc=\pgf@xa + \def\pgfplotspatch@tri@longestedgestart{B}% + \fi + % + \pgfpointdiff + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@C\endvertex}% + {\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@tri@A\endvertex}% + \edef\pgfplots@loc@TMPa{{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}}% + \expandafter\pgfmath@basic@veclen@\pgfplots@loc@TMPa + \pgf@xa=\pgfmathresult pt + \ifdim\pgf@xa>\pgf@yc + \def\pgfplotspatch@tri@longestedgestart{C}% + \fi + % The ordering is not arbitrary + % (unless z buffer=sort is in effect). Let's assume that the + % AB edge is BACKGROUND and the CD edge is FOREGROUND. Then + % this sequence here should have approximately the same depth + % ordering: + % + \pgfplotspatchvertexaccumstart + \if A\pgfplotspatch@tri@longestedgestart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@tri@A\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@tri@B\times{0.5}% + \def\pgfplots@loc@TMPa{ACM,BCM}% + \else + \if B\pgfplotspatch@tri@longestedgestart + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@tri@B\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@tri@C\times{0.5}% + \def\pgfplots@loc@TMPa{ABM,ACM}% + \else + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@tri@C\times{0.5}% + \expandafter\pgfplotspatchvertexadd\pgfplotspatchclass@tri@A\times{0.5}% + \def\pgfplots@loc@TMPa{ABM,BCM}% + \fi + \fi + \pgfplotspatchvertexfinish\pgfplotspatchclass@tri@M + \edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa;\pgfplotspatchclass@tri@M}% + % + % invoke helper method such that I don't need to restore or + % recompute \pgfplotspatchclass@tri@M during recursion. + \expandafter\pgfplotspatchclass@tri@recursiverefine@@\pgfplots@loc@TMPa\relax{#1}% + }, + deserialize except vertices=% + \let\pgfplotspatchclass@trie@AB\relax + #1, + get pdf shading type=4, + get num vertices=3, +}% +\def\pgfplotspatchclass@tri@recursiverefine@@#1#2M,#3#4M;#5\relax#6{% + \expandafter\let\expandafter\pgfplotspatchclass@tri@A@\csname pgfplotspatchclass@tri@#1\endcsname + \expandafter\let\expandafter\pgfplotspatchclass@tri@B@\csname pgfplotspatchclass@tri@#2\endcsname + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@tri@A@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@tri@B@}% + \pgfplotsplothandlermesh@setnextvertex{#5}% + #6% + % + \expandafter\let\expandafter\pgfplotspatchclass@tri@A@\csname pgfplotspatchclass@tri@#3\endcsname + \expandafter\let\expandafter\pgfplotspatchclass@tri@B@\csname pgfplotspatchclass@tri@#4\endcsname + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@tri@A@}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@tri@B@}% + \pgfplotsplothandlermesh@setnextvertex{#5}% + #6% +}% + + +\pgfplotsdeclarepatchclass{rectangle}{% + allow matrix=1, + new=\def\pgfplotspatchclass@rect@no{0}, + set next vertex={% + \ifcase\pgfplotspatchclass@rect@no\relax + \edef\pgfplotspatchclass@rect@A{#1}% + \def\pgfplotspatchclass@rect@no{1}% + \or + \edef\pgfplotspatchclass@rect@B{#1}% + \def\pgfplotspatchclass@rect@no{2}% + \or + \edef\pgfplotspatchclass@rect@C{#1}% + \def\pgfplotspatchclass@rect@no{3}% + \or + \edef\pgfplotspatchclass@rect@D{#1}% + \def\pgfplotspatchclass@rect@no{0}% + \pgfplotspatchready% + \fi + }, + first vertex=\expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@A\endvertex, + foreach vertex={% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@A\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@B\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@C\endvertex #1% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@D\endvertex #1% + }, + stream to shader={% + % a 'foreach vertex' with slightly different sequence: + \def\pgfplots@foreachvertex@@{% + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord{% + \global\pgf@x=\pgfplotspatchvertexx\space + \global\pgf@y=\pgfplotspatchvertexy\space + }{\pgfplotspointmetatransformed}% + }% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@A\endvertex\pgfplots@foreachvertex@@% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@B\endvertex\pgfplots@foreachvertex@@% + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@D\endvertex\pgfplots@foreachvertex@@% EXCHANGED SEQUENCE + \expandafter\pgfplotspatchvertex\pgfplotspatchclass@rect@C\endvertex\pgfplots@foreachvertex@@% + },% + fill path={% + \pgfpathmoveto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@rect@A\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@rect@B\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@rect@C\endvertex}% + \pgfpathlineto{\expandafter\pgfplotspointpatchvertex\pgfplotspatchclass@rect@D\endvertex}% + \pgfpathclose + }, + init pdf shading={% + \if0\b@pgfplotsplothandlermesh@matrixoutput + \ifnum\pgfkeysvalueof{/pgfplots/surf shading/cols}=2 + \else + \pgfplots@error{Sorry, (patch type=rectangle) and (rectangular patch shadings with more than one rectangle) is not supported (got \pgfkeysvalueof{/pgfplots/surf shading/cols} x * input points). + It is supported if z buffer!=sort. Consider using 'patch to triangles=true' to combine it with z buffer=sort}% + \fi + \fi + }, + recursive refine@={% + \pgfplots@error{Please use \string\usepgfplotslibrary{patchplots} in order to use 'refine,patch type=\pgfplotspatchclassname'}% + }, + triangulate={% + \let\pgfplotsplothandlermesh@patchclass@=\pgfplotsplothandlermesh@patchclass + \def\pgfplotsplothandlermesh@patchclass{triangle}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{new}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}01% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}10% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}21% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@A}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@D}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@B}% + % + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}01% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}11% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set edge visible}20% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@B}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@C}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotspatchclass@rect@D}% + \let\pgfplotsplothandlermesh@patchclass=\pgfplotsplothandlermesh@patchclass@ + },% + serialize except vertices=\let\pgfplotsretval\pgfutil@empty,% + deserialize except vertices=, + get pdf shading type=5, + get num vertices=4, +}% + +\def\pgfplots@rect@next@A{B} +\def\pgfplots@rect@next@B{C} +\def\pgfplots@rect@next@C{D} +\def\pgfplots@rect@next@D{A} + +\def\pgfplots@rect@rnext@A{D} +\def\pgfplots@rect@rnext@B{A} +\def\pgfplots@rect@rnext@C{B} +\def\pgfplots@rect@rnext@D{C} + +% Ideas: make sure that the foreground edge is the 'v=1' +% edge of the coons patch, i.e. that it is drawn on top of +% the rest. +% +% Furthermore, for fixed v, the 'u=1' point should belong +% to the foreground (as it is drawn on top of u=0). +% +% In other words, if the coons patch looks like +% +% BB-------CC <--v=1 +% | | +% | | +% | | +% AA-------DD <--v=0 +% | | +% u=0 u=1 +% +% where the AA,BB,CC,DD are the corners of the coons +% patch, The FOREGROUND POINT of our visualization here should be CC, +% the second most foreground point BB (assuming that +% foreground point and second most foreground point are +% adjacent). +% +% Thus, if 'CC' is behind of 'BB' in the A,B,C,D ordering: +% start the coons patch with AA := BB-1 in forward +% direction. +% else +% start the coons patch with AA := BB+1 in reverse +% direction. +% +% #1: the vertex prefix for the rectangular shape. +% Thus, \csname #1A\endcsname is the first vertex, \csname #1B\endcsname the second +% and #1C, #1D the third and fourth. +% +% #2: A macro name. It will be defined to be either A,B,C or D. +% #3: A macro name. It will be defined to be either empty or 'r'. If +% it is empty, the coons patch shall be in the sequence +% #2,next(#2),next(next(#2),.... +% If it is 'r', the coons patch shall be in the sequence +% #2,prev(#2),prev(prev(#2),... +% +% Note that this method works also for biquadratic patches since these +% patches also have #1A, #1B, #1C and #1D as their corners. +% +\def\pgfplotspatchclass@rect@to@coonspatch@findshadingsequence@for@depth#1#2#3{% + \def#2{A}% + \def#3{}% + % + \expandafter\expandafter\expandafter\pgfplotspatchvertex\csname #1A\endcsname\endvertex + \ifx\pgfplotspatchvertexdepth\pgfutil@empty + \else + % aaah -- we have z buffer information. Then we will use it! + \edef\PA{\pgfplotspatchvertexdepth pt A}% + \expandafter\expandafter\expandafter\pgfplotspatchvertex\csname #1B\endcsname\endvertex + \edef\PB{\pgfplotspatchvertexdepth pt B}% + \expandafter\expandafter\expandafter\pgfplotspatchvertex\csname #1C\endcsname\endvertex + \edef\PC{\pgfplotspatchvertexdepth pt C}% + \expandafter\expandafter\expandafter\pgfplotspatchvertex\csname #1D\endcsname\endvertex + \edef\PD{\pgfplotspatchvertexdepth pt D}% + \pgfplotsutilsortfour\PA\PB\PC\PD + \def\toCHAR##1pt ##2{##2}% get original index + % + % + \edef\PA{\expandafter\toCHAR\PA}%% + \edef#2{\expandafter\toCHAR\PB}%% + \edef\Pnext{\csname pgfplots@rect@next@#2\endcsname}% this here uses only A,B,C and D (also for biquadratic patches!) + \if\Pnext\PA + % ok, next(BB) = CC. + % that means we have to advance forward. + \def#3{}% + \edef#2{\csname pgfplots@rect@rnext@#2\endcsname}% + \else + \edef#2{\csname pgfplots@rect@next@#2\endcsname}% + \def#3{r}% + \fi +%\message{^^JDEPTH SEQUENCE for rectangle: \PA, \PB, \PC, \PD^^J}% +%\message{COONS PATH ORDERING: starts with #2, direction: \ifx#3\pgfutil@empty forward\else backward\fi^^J}% + \fi +}% + +\def\pgfplotspatchclass@rect@to@coonspatch@findshadingsequence@for@depth@no@op#1#2#3{% + \def#2{A}% + \def#3{}% +} + +% The low-level tikz plot handler for 3D mesh and surface plots. +% +% It expects +% a) a coordinate stream which is a linearized matrix, iterated either +% rowwise or column wise, +% b) the current set of options in /pgfplots/mesh/. +% +% +% ATTENTION: +% this handler is NOT as general as the others. In particular, it +% can't be interrupted by TeX groups: every single statement, +% starting with streamstart and ending with stream end, must be in +% the same scope! +% +% As a consequence, you can't use this handler inside of (all) TikZ +% input streams. Try it out. It will work in pgfplots, however. +% +% Furthermore, it relies on a couple of pgfplots macros. This may +% change in future versions. +% It relies on: +% - \ifpgfplots@curplot@threedim +% - \pgfplots@current@point@meta +% -> it also invokes \pgfplots@perpointmeta@preparetrafo and its +% @APPLY counterpart which checks for +% - \pgfplots@metamax +% If you use it outside of pgfplots, use +% \global\let\pgfplots@metamax=\pgfutil@empty +% This is can be used without an initialised +% pgfplots axes - as long as \pgfplots@current@point@meta is in +% the range [0,1000]. +% - for the case 'shader=interp', a bounding box must be established +% before the plot is finished. This must be done using +% \def\pgfplotspointbbupperright{\pgfqpointxyz{2}{2}{0.9}} +% \def\pgfplotspointbblowerleft {\pgfqpointxyz{0}{0}{0.1}} +% or something like that. +% +% Besides these internals, it also relies on all public /pgfplots +% configuration keys related to mesh/surface plots. +% +% Please note that the 'z buffer' feature will not work without +% pgfplots (especially the z buffer=sort feature). +% +% Here is an example which compiles without a pgfplots axes: +% ---------------------------------------------------------- +% \begin{tikzpicture} +% \scope[ +% /pgfplots/.cd, +% surf, +% shader=faceted, +% mesh/rows=4, +% mesh/cols=4, +% mesh/num points=, +% /tikz/x={(0.44237cm,-0.07439cm)}, +% /tikz/y={(0.30942cm,0.23932cm)}, +% /tikz/z={(0.0cm,1.5cm)}, +% ] +% \makeatletter +% +% \global\let\pgfplots@metamax=\pgfutil@empty +% \pgfplots@curplot@threedimtrue +% +% \pgfplotsplothandlermesh +% \pgfplotstreamstart +% +% \def\rangea{0.21}% +% \def\rangeb{0.9}% +% +% \pgfmathparse{1000/(\rangeb-\rangea)} +% \let\factor=\pgfmathresult +% +% \def\simplecoordinate(#1,#2,#3){% +% \pgfmathparse{\factor*(#3 - \rangea)}% +% \let\pgfplots@current@point@meta=\pgfmathresult +% \pgfplotstreampoint{\pgfqpointxyz{#1}{#2}{#3}}% +% }% +% % for the case 'shaer=interp': +% \def\pgfplotspointbbupperright{\pgfqpointxyz{2}{2}{0.9}} +% \def\pgfplotspointbblowerleft {\pgfqpointxyz{0}{0}{0.1}} +% +% \simplecoordinate(0,3,0.7) +% \simplecoordinate(1,3,0.5) +% \simplecoordinate(2,3,0.58) +% \simplecoordinate(3,3,0.9) +% +% \simplecoordinate(0,2,0.68) +% \simplecoordinate(1,2,0.22) +% \simplecoordinate(2,2,0.25) +% \simplecoordinate(3,2,0.4) +% +% \simplecoordinate(0,1,0.6) +% \simplecoordinate(1,1,0.3) +% \simplecoordinate(2,1,0.21) +% \simplecoordinate(3,1,0.3) +% +% \simplecoordinate(0,0,0.8) +% \simplecoordinate(1,0,0.56) +% \simplecoordinate(2,0,0.5) +% \simplecoordinate(3,0,0.75) +% +% +% \pgfplotstreamend +% \pgfusepath{stroke} +% +% \endscope +% \end{tikzpicture} +% ---------------------------------------------------------- +% END OF EXAMPLE +% -> see also the legend image for mesh plots. +% +\def\pgfplotsplothandlermesh{% + \pgfkeysgetvalue{/pgfplots/patch type}\pgfplotsplothandlermesh@patchclass + \ifx\pgfplotsplothandlermesh@patchclass\pgfplotsplothandlermesh@patchclass@defaulttext + \let\pgfplotsplothandlermesh@patchclass=\pgfutil@empty + \fi + % FIXME : detect 1d mode here! + \ifx\pgfplotsplothandlermesh@patchclass\pgfutil@empty + % assign default patch class. + \if1\pgfplotsplothandlermesh@matrixinput + \def\pgfplotsplothandlermesh@patchclass{rectangle}% + \else + \def\pgfplotsplothandlermesh@patchclass{triangle}% + \fi + \pgfkeyslet{/pgfplots/patch type}\pgfplotsplothandlermesh@patchclass + \fi + % + \if0\pgfplotsplothandlermesh@matrixinput + % mesh input=patches: simply skip empty input lines: + \pgfkeyssetvalue{/pgfplots/empty line}{none}% + \fi + % + \pgfkeysgetvalue{/pgfplots/patch table/value}\pgfplotsplothandlermesh@patchtable + \ifx\pgfplotsplothandlermesh@patchtable\pgfutil@empty + \else + \def\pgfplotsplothandlermesh@matrixinput{0}% implies 'patch input=patches' + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@mesh@patchtable + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@mesh@patchtable + \let\pgfplotsplothandlersurveyend=\pgfplotsplothandlersurveyend@mesh@patchtable + \fi + \def\pgf@plotstreamstart{% +% \scope + % + % this shouldn't be necessary, but it doesn't hurt either. + \pgfplots@perpointmeta@preparetrafo + % + \def\pgfplotsplothandlermesh@ONEDIMMODE{0}% + \pgfplotsplothandlermesh@init@meshkeys + % + % + \let\pgfplotsplothandlermesh@patchclass@input=\pgfplotsplothandlermesh@patchclass + \let\pgfplotsplothandlermesh@patchclass@output=\pgfplotsplothandlermesh@patchclass@input + \if0\pgfplotsplothandlermesh@triangulate + \else + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@input}{triangulate class}% + \let\pgfplotsplothandlermesh@patchclass@output=\pgfplotsretval + \fi + % + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@input}{init}% + \ifx\pgfplotsplothandlermesh@patchclass@input\pgfplotsplothandlermesh@patchclass@output + \else + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{init}% + \fi + % + % assign boolean: + \let\b@pgfplotsplothandlermesh@matrixoutput=\pgfplotsplothandlermesh@matrixinput + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{allow matrix}% + \if0\pgfplotsretval + \def\b@pgfplotsplothandlermesh@matrixoutput{0}% + \fi + \ifnum\pgfkeysvalueof{/pgfplots/patch refines}>0 + \def\b@pgfplotsplothandlermesh@matrixoutput{0}% + \fi + \if1\pgfplotsaxisplothasjumps + \def\b@pgfplotsplothandlermesh@matrixoutput{0}% + \fi + \if\pgfplotsplothandlermesh@zbuffer@choice4% 'z buffer=sort': + \def\b@pgfplotsplothandlermesh@matrixoutput{0}% + \fi + \if2\pgfplotsplothandlermesh@shader + \else + % 'shader!=interp' + \def\b@pgfplotsplothandlermesh@matrixoutput{0}% + \fi + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{get pdf shading type}% + \if4\pgfplotsretval + \else + \if5\pgfplotsretval + \else + \def\b@pgfplotsplothandlermesh@matrixoutput{0}% + \fi + \fi + % + % special handling: check if Type=5 shadings need to be + % converted to Type=4 + \if0\b@pgfplotsplothandlermesh@matrixoutput + % no matrix output possible + \if5\pgfplotsretval + % pdf shading type=5 (matrix output) + \ifnum\pgfplotsplothandlermesh@shader>1 + % shader=interp or shader=faceted interp + % + % oh. shading type=5 is *essentially* the same as + % matrix output, but matrix output is forbidden. + % In that case, triangulate the matrix and shade the + % triangles: + \def\pgfplotsplothandlermesh@triangulate{1}% + \def\pgfplotsplothandlermesh@patchclass@output{triangle}% + \fi + \fi + \fi + % + \pgfplotsplothandlermesh@init@DECODE + \pgfplotsplothandlermesh@init@REFINE + % + \pgfutil@ifundefined{pgfplots@drawmodes}{% + \let\pgfplots@drawmodes=\tikz@mode + \let\pgfplots@drawoptions=\tikz@options + }{}% + % + % + % Prepare color data source: + \ifx\pgfplotspointmetainputhandler\pgfutil@empty% + % oh. There is no color data!? Well... then use a constant + % color. + % + % This activates tikz colors: + %\tikz@options + \def\pgfplotsplothandlermesh@definecolor{% + \pgfplots@drawoptions + }% + \else + \pgfplotsplothandlermesh@init@cdata + \pgfplotsplothandlermesh@init@shader + \pgfplotsplothandlermesh@init@flat@color + \fi + % PREPARE THE STREAM PROCESSING: + % handling of jumps. + \pgfplotsplothandlermesh@init@jumphandling + % + % z buffering: + \pgfplotsplothandlermesh@init@zbuffer + % + \pgfplotsplothandlermesh@init@mesh@stream + % + \c@pgfplots@scanlineindex=0 + }% +}% +\def\pgfplotsplothandlermesh@patchclass@defaulttext{default}% + + +% Defines \pgfplotsretval to be either empty or the current point's +% depth according to z buffer information. +\def\pgfplotsplothandlermesh@compute@vertex@depth{\let\pgfplotsretval\pgfutil@empty}% + +% If \pgfplotsplothandlermesh@compute@vertex@depth is set to this +% particular implementation, the \pgfplotspatchvertexdepth macro will +% contain the view depth. +% +\def\pgfplotsplothandlermesh@compute@vertex@depth@doit{% + \pgfplotsmathviewdepthxyz{\pgfplots@current@point@x}{\pgfplots@current@point@y}{\pgfplots@current@point@z}% FIXME relies on pgfplots macros + \edef\pgfplotsretval{\pgfmathresult}% +}% + + +% The patch visualization works like a PIPELINE: +% +% DECODE -> CHECK JUMP -> REFINE -> FINISH +% +% where FINISH is usually nothing but VISUALIZE; but it can also mean +% to collect patches, sort them according to view depth and visualize +% the result. +% +% Each single PIPE element can be exchanged by a separate "subclass". +% For example, DECODE can either DECODE from a matrix (a lattice) or a +% sequence of patch coords. +% +\def\pgfplotsplothandlermesh@stream#1{% + \pgfplotsplothandlermesh@PIPE@DECODE{#1}% +}% + +% accumulates a patch vertex-by-vertex. +% #1 the next vertex of a patch (#1 defines canvas coordinates \pgf@x +% and \pgf@y). +% +% @PRECONDITION \pgfplots@current@point@[xyz] and \pgfplots@current@point@meta +% need to be defined. +\def\pgfplotsplothandlermesh@PIPE@DECODE#1{% + \let\pgfplotsplothandlermesh@patchclass\pgfplotsplothandlermesh@patchclass@input + \pgfplotsplothandlermesh@compute@vertex@depth% <-- this modifies \pgfplotsretval + \pgf@process{#1}% + % calls \pgfplotspatchready when ready + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{set next vertex}{{\the\pgf@x}{\the\pgf@y}{\pgfplots@current@point@meta}\pgfplotsretval}%% +}% +\def\pgfplotspatchready{% + \pgfplotsplothandlermesh@PIPE@CHECKJUMP +}% +\let\pgfplotspatchready@orig=\pgfplotspatchready +\def\pgfplotsplothandlermesh@PIPE@CHECKJUMP{% + \pgfplots@loc@tmptrue + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{foreach vertex}{% + \pgfplotsplothandlermesh@check@unbounded% + }% + \ifpgfplots@loc@tmp + \expandafter\pgfplotsplothandlermesh@PIPE@REFINE + \fi +}% +\def\pgfplotsplothandlermesh@PIPE@REFINE@no@op{% + \pgfplotsplothandlermesh@PIPE@FINISH +}% +\let\pgfplotsplothandlermesh@PIPE@REFINE=\pgfplotsplothandlermesh@PIPE@REFINE@no@op + +% invoked when a patch is completely processed. +% This might be replaced by the z buffering algorithm +\def\pgfplotsplothandlermesh@PIPE@FINISH{% + \pgfplotsplothandlermesh@VISUALIZE +}% + +% Standard implementation for VISUALIZE +\def\pgfplotsplothandlermesh@VISUALIZE@std@fill@andor@stroke{% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{fill path}% + \pgfplotsplothandlermesh@definecolor + \pgfplotsplothandlermesh@usepath +}% +\let\pgfplotsplothandlermesh@VISUALIZE@std=\pgfplotsplothandlermesh@VISUALIZE@std@fill@andor@stroke + +\let\pgfplotsplothandlermesh@VISUALIZE=\pgfplotsplothandlermesh@VISUALIZE@std + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\def\pgfplotsplothandlermesh@init@DECODE{% + \if1\pgfplotsplothandlermesh@matrixinput + % mesh input=lattice + % Init memory: + % + % And now finally: initialise the conversion from + % LINEARIZED COORD STREAM -> DATA MATRIX: + \if\pgfplots@plot@mesh@ordering0% + % x varies (=rowwise): + \let\pgfplotsplothandlermesh@scanlinelength=\pgfplotsplothandlermesh@cols + \else + % y varies (=colwise): + \let\pgfplotsplothandlermesh@scanlinelength=\pgfplotsplothandlermesh@rows + \fi + % + \if1\pgfplotsplothandlermesh@ONEDIMMODE +%\message{initialised DECODE for 1d mode.^^J}% + \let\pgfplotsplothandlermesh@PIPE@DECODE=\pgfplotsplothandlermesh@PIPE@DECODE@matrix@ONEDIMMODE + \else + \if0\b@pgfplotsplothandlermesh@matrixoutput + % in fact, this does only remember the maximum capacity; + % it doesn't fill the memory. + \c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@scanlinelength\relax + \advance\c@pgfplots@scanlineindex by1 + \pgfplotsdequenewempty{lastscanline}\capacity{\the\c@pgfplots@scanlineindex}% + \let\pgfplotsplothandlermesh@PIPE@DECODE=\pgfplotsplothandlermesh@PIPE@DECODE@matrix@fillscanline +%\message{initialised DECODE for patch output (from matrix).^^J}% + \else + % SPECIAL HANDLING! + \let\pgfplotsplothandlermesh@PIPE@DECODE=\pgfplotsplothandlermesh@PIPE@DECODE@to@shader +%\message{initialised DECODE for direct matrix output (from matrix).^^J}% + \fi + \fi + \else +%\message{initialised DECODE for patch output (from patch).^^J}% + \fi +}% + + +\def\pgfplotsplothandlermesh@PIPE@REFINE@triangulate{% + \let\pgfplotspatchready\pgfplotsplothandlermesh@PIPE@FINISH + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{triangulate}% + \let\pgfplotspatchready\pgfplotspatchready@orig +}% +\def\pgfplotsplothandlermesh@PIPE@REFINE@recursively{% + \let\pgfplotspatchready\pgfplotsplothandlermesh@PIPE@FINISH + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{refine}{\pgfplotsplothandlermesh@refinecount}% + \let\pgfplotspatchready\pgfplotspatchready@orig +}% +\def\pgfplotsplothandlermesh@PIPE@REFINE@triangulate@recursively{% + \let\pgfplotspatchready=\pgfplotsplothandlermesh@PIPE@REFINE@triangulate@recursively@patchready + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{refine}{\pgfplotsplothandlermesh@refinecount}% + \let\pgfplotspatchready\pgfplotspatchready@orig +}% +\def\pgfplotsplothandlermesh@PIPE@REFINE@triangulate@recursively@patchready{% + \let\pgfplotspatchready\pgfplotsplothandlermesh@PIPE@FINISH + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{triangulate}% + \let\pgfplotspatchready\pgfplotsplothandlermesh@PIPE@REFINE@triangulate@recursively@patchready +}% +\def\pgfplotsplothandlermesh@init@REFINE{% + \pgfkeysgetvalue{/pgfplots/patch refines}\pgfplotsplothandlermesh@refinecount + \if0\pgfplotsplothandlermesh@triangulate + \ifnum\pgfplotsplothandlermesh@refinecount>0 +%\message{initiased REFINE to REFINE.}% + \let\pgfplotsplothandlermesh@PIPE@REFINE=\pgfplotsplothandlermesh@PIPE@REFINE@recursively + \else +%\message{initiased REFINE to NOP.}% + \let\pgfplotsplothandlermesh@PIPE@REFINE=\pgfplotsplothandlermesh@PIPE@REFINE@no@op + \fi + \else +%\message{initiased REFINE to triangulate.}% + \ifnum\pgfplotsplothandlermesh@refinecount>0 + \let\pgfplotsplothandlermesh@PIPE@REFINE=\pgfplotsplothandlermesh@PIPE@REFINE@triangulate@recursively + \else + \let\pgfplotsplothandlermesh@PIPE@REFINE=\pgfplotsplothandlermesh@PIPE@REFINE@triangulate + \fi + \fi +}% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% MESH SURVEY +\newif\ifpgfplotsplothandlermesh@patchtable@hascdata +\newif\ifpgfplotsplothandlermesh@patchtable@cdata@individual +\def\pgfplotsplothandlersurveystart@mesh@patchtable{% + \pgfplotsarraynewempty\pgfplots@verts +}% +\def\pgfplotsplothandlersurveypoint@mesh@patchtable{% + \pgfplotscoordmath{x}{parsenumber}{\pgfplots@current@point@x}% + \let\pgfplots@current@point@x=\pgfmathresult + % + \pgfplotscoordmath{y}{parsenumber}{\pgfplots@current@point@y}% + \let\pgfplots@current@point@y=\pgfmathresult + % + \ifpgfplots@curplot@threedim + \pgfplotscoordmath{z}{parsenumber}{\pgfplots@current@point@z}% + \let\pgfplots@current@point@z=\pgfmathresult + \fi + % + \ifpgfplotsplothandlermesh@patchtable@hascdata + % will be handled later, using data from within 'patch table': + \let\pgfplots@current@point@meta=\pgfutil@empty + \else + \pgfplotsaxissurveysetpointmeta + \fi + % + \def\pgfplots@loc@TMPa{1}% + \ifx\pgfplots@current@point@x\pgfutil@empty + \def\pgfplots@loc@TMPa{0}% + \else + \ifx\pgfplots@current@point@y\pgfutil@empty + \def\pgfplots@loc@TMPa{0}% + \else + \ifx\pgfplots@current@point@z\pgfutil@empty + \ifpgfplots@curplot@threedim + \def\pgfplots@loc@TMPa{0}% + \fi + \fi + \fi + \fi + \if1\pgfplots@loc@TMPa + \edef\pgfplots@loc@TMPa{\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z;\pgfplots@current@point@meta;}% + \expandafter\pgfplotsarraypushback\pgfplots@loc@TMPa\to\pgfplots@verts + \fi +}% +\def\pgfplotsplothandlersurveyend@mesh@patchtable{% + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@default + \let\pgfplotsplothandlersurveyend=\pgfplotsplothandlersurveyend@default + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@default + \pgfplotsplothandlersurveystart + \expandafter\pgfplotstable@isloadedtable\expandafter{\pgfplotsplothandlermesh@patchtable}{% + \pgfplots@error{Sorry, 'patch table={<loaded table>}' has not been implemented; it would probably be too slow :-(. Please provide a file name or inline table data}% + }{% + \expandafter\pgfplotstableread\expandafter*\expandafter{\pgfplotsplothandlermesh@patchtable} to listener\pgfplotsplothandlermesh@patchtable@rowlistener + }% + \pgfplotsplothandlersurveyend +}% + +\def\pgfplotsplothandlermesh@patchtable@init{% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{get num vertices}% + \let\pgfplotsplothandlermesh@patchtable@numverts=\pgfplotsretval + % + \ifpgfplotsplothandlermesh@patchtable@hascdata + \ifpgfplotsplothandlermesh@patchtable@cdata@individual + \else + \ifnum\pgfplotsplothandlermesh@patchtable@numverts<\pgfplotstablecols\relax + % prepare a pointer to data column: use the column + % after the last vertex index. + % this thing constitutes the "default" cdata source for + % 'point meta=explicit'. + \pgfplotstablereadgetptrtocolindex + {\pgfplotsplothandlermesh@patchtable@numverts} + {\pgfplots@table@PTR@CDATA}% + \else + \let\pgfplots@table@PTR@CDATA=\relax + \fi + \fi + \else + \pgfplotsplothandlermesh@patchtable@cdata@individualfalse + \fi + % + \c@pgf@countb=0 + \pgfutil@loop + \ifnum\c@pgf@countb<\pgfplotsplothandlermesh@patchtable@numverts\relax + \edef\pgfplots@loc@TMPa{% + \noexpand\pgfplotstablereadgetptrtocolindex{\the\c@pgf@countb}{\expandafter\noexpand\csname pgfplots@table@PTR@\the\c@pgf@countb\endcsname}% + }% + \pgfplots@loc@TMPa + \advance\c@pgf@countb by1 + \pgfutil@repeat + \let\pgfplotsplothandlermesh@patchtable@init=\relax +}% +\def\pgfplotsplothandlermesh@patchtable@rowlistener@exceptionmsg{% + \pgfplotsplothandlermesh@patchtable:\pgfplotstablelineno\space\space could not read column no \the\c@pgf@countb: '\pgfplots@current@vertexindex' is no valid index into the array of \pgfplotsarraysizeof\pgfplots@verts\space coordinates% +}% +\def\pgfplotsplothandlermesh@patchtable@rowlistener{% + \pgfplotsplothandlermesh@patchtable@init% + \let\pgfplotsexceptionmsg=\pgfplotsplothandlermesh@patchtable@rowlistener@exceptionmsg + % + \ifpgfplotsplothandlermesh@patchtable@hascdata + \ifpgfplotsplothandlermesh@patchtable@cdata@individual + \else + \ifx\pgfplots@table@PTR@CDATA\relax + \let\pgfplots@current@point@meta=\pgfutil@empty + \else + \pgfplotstablereadevalptr\pgfplots@table@PTR@CDATA\pgfplots@current@point@meta + \fi + \fi + \fi + % + \c@pgf@countb=0 + \pgfutil@loop + \ifnum\c@pgf@countb<\pgfplotsplothandlermesh@patchtable@numverts\relax + \expandafter\pgfplotstablereadevalptr\csname pgfplots@table@PTR@\the\c@pgf@countb\endcsname\pgfplots@current@vertexindex% + % + \ifx\pgfplots@current@vertexindex\pgfutil@empty + \else + \pgfmathfloatparsenumber{\pgfplots@current@vertexindex}% + \pgfmathfloattoint\pgfmathresult + \let\pgfplots@current@vertexindex=\pgfmathresult + % + \pgfplotsarrayselect\pgfplots@current@vertexindex\of\pgfplots@verts\to\pgfplots@stored@pt + % + \ifpgfplotsplothandlermesh@patchtable@cdata@individual + \c@pgf@countc=\c@pgf@countb\relax + \advance\c@pgf@countc by\pgfplotsplothandlermesh@patchtable@numverts\relax + \expandafter\getthisrowno\expandafter{\the\c@pgf@countc}\pgfplots@current@point@meta + \fi + % + \expandafter\pgfplotsplothandlermesh@patchtable@stream\pgfplots@stored@pt + \fi + \advance\c@pgf@countb by1 + \pgfutil@repeat + \let\pgfplotsexceptionmsg=\relax +} +\def\pgfplotsplothandlermesh@patchtable@stream#1,#2,#3;#4;{% + \def\pgfplots@current@point@x{#1}% + \def\pgfplots@current@point@y{#2}% + \def\pgfplots@current@point@z{#3}% + \ifpgfplotsplothandlermesh@patchtable@hascdata + \def\pgfplots@set@perpointmeta@done{0}% + \pgfplotsaxissurveysetpointmeta + \else + \def\pgfplots@current@point@meta{#4}% + \fi + \pgfplotsplothandlersurveypoint +}% +% MESH SURVEY +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\pgfplotsplothandlermesh@init@meshkeys{% + \if1\pgfplotsplothandlermesh@matrixinput + % mesh input=lattice + \pgfplotsautocompletemeshkeys% + \pgfkeysgetvalue{/pgfplots/mesh/rows}\pgfplotsplothandlermesh@rows + \pgfkeysgetvalue{/pgfplots/mesh/cols}\pgfplotsplothandlermesh@cols + \pgfkeysgetvalue{/pgfplots/mesh/num points}\pgfplotsplothandlermesh@numpoints + % + % the \pgfplotsplothandlermesh@ONEDIMMODE macro is ONLY + % interesting for matrix input. + \ifnum\pgfplotsplothandlermesh@cols>1 + \else + \def\pgfplotsplothandlermesh@ONEDIMMODE{1}% + \fi + \ifnum\pgfplotsplothandlermesh@rows>1 + \else + \def\pgfplotsplothandlermesh@ONEDIMMODE{1}% + \fi + \if1\pgfplotsplothandlermesh@ONEDIMMODE + \def\pgfplotsplothandlermesh@patchclass{line}% + \pgfkeyslet{/pgfplots/patch type}\pgfplotsplothandlermesh@patchclass + \fi + \else + % mesh input=patches + \pgfkeys{/pgfplots/mesh/ordering/x varies}% disable any special handling. + \fi +}% + + +\def\pgfplotsplothandlermesh@init@cdata{% + % Ok, we have color data. + % + % Prepare: + \def\pgfplotsplothandlermesh@definecolor{% + \pgfplotsplothandlermesh@get@flat@color + \pgfplotscolormapdefinemappedcolor{\pgfplotsretval}% + \pgfplots@drawoptions + }% + % + % Acquire the values for \tikz@mode@* [used for faceted] + \pgfplots@drawmodes +} + + +\let\pgfsetstrokecolor@orig=\pgfsetstrokecolor +\def\pgfplotsplothandlermesh@VISUALIZE@std@separate@fillstroke@setstrokecolor#1{% + \pgfsetstrokecolor@orig{.}% +}% +\def\pgfplotsplothandlermesh@VISUALIZE@std@separate@fillstroke{% + \pgfplotsplothandlermesh@get@flat@color + \pgfplotscolormapdefinemappedcolor{\pgfplotsretval}% + % + \ifx\pgfplotsplothandlermesh@usepathfill\relax + \else + \let\pgfsetstrokecolor=\pgfplotsplothandlermesh@VISUALIZE@std@separate@fillstroke@setstrokecolor + \pgfplots@drawoptions + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{fill path}% + \pgfplotsplothandlermesh@usepathfill + \fi + \ifx\pgfplotsplothandlermesh@usepathstroke\relax + \else + \let\pgfsetstrokecolor=\pgfsetstrokecolor@orig + \pgfplots@drawoptions + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{stroke path}% + \pgfplotsplothandlermesh@usepathstroke + \fi +}% + +\def\pgfplotsplothandlermesh@VISUALIZE@interp{% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{stream to shader}% +}% + +\def\pgfplotsplothandlermesh@VISUALIZE@faceted@interp{% + \pgfplotslibrarysurfstreamstart + \pgfplotsplothandlermesh@VISUALIZE@interp + \pgfplotslibrarysurfstreamend + \pgfplotslibrarysurfdrawinpicture + % + \pgfplotsplothandlermesh@VISUALIZE@std +}% + +\def\pgfplotsplothandlermesh@PIPE@CHECKJUMP@disable{% + \def\pgfplotsplothandlermesh@PIPE@CHECKJUMP{\pgfplotsplothandlermesh@PIPE@REFINE}% +}% + +\def\pgfplotsplothandlermesh@init@shader{% + % + % Now, process the 'shader' key here: + \if\pgfplotsplothandlermesh@ONEDIMMODE1 + \def\pgfplots@meshmode{m}% 'mesh' + \fi + \if\pgfplots@meshmode m% mesh + % this is processed by the 'shader=flat' code below. + \def\pgfplotsplothandlermesh@shader{0}% 'flat' + \fi + \ifnum\pgfplotsplothandlermesh@shader>1% 'shader=interp' and 'shader=faceted interp' + \pgflibrarysurfshadingifactive + {}% + {% + \pgfutil@ifundefined{pgfplotsplothandlermesh@shader@warning}{% + \pgfplots@error{Sorry, surface shading (shader=interp) is NOT available for the selected driver `\pgfsysdriver'. I will use 'shader=flat' if you continue now}% + \gdef\pgfplotsplothandlermesh@shader@warning{x}% + }{}% + \def\pgfplotsplothandlermesh@shader{0}% + }% + \fi + % + % + \ifnum\pgfplotsplothandlermesh@shader>1 + % 'shader=2': 'interp': + % very simple: defer work to surf library. Only + % provide the mapped colordata. + % + % 'shader=3': 'faceted interp': + % a mix of 'faceted' and 'interp'. (might be inefficient in + % terms of pdf memory and rendering times) + % + % This won't be used for mesh plots, neither in one + % nor in two dimensions. + \pgfkeyssetvalue{/pgfplots/surf shading/north east corner}{\pgfplotspointbbupperright}% + \pgfkeyssetvalue{/pgfplots/surf shading/south west corner}{\pgfplotspointbblowerleft}% + \pgfkeyssetvalue{/pgfplots/surf shading/anchor}{\pgfpointorigin}% + \if1\b@pgfplotsplothandlermesh@matrixoutput + % this *implies* a compatible patch class, see the + % definition of \b@pgfplotsplothandlermesh@matrixoutput + \def\pgfplotsretval{5}% + \else + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{get pdf shading type}% + \fi + \pgfkeyslet{/pgfplots/surf shading/shading type}\pgfplotsretval% + \pgfkeysgetvalue{/pgfplots/colormap name}\pgfplots@loc@TMPa + \expandafter\pgfplotscolormaptopdffunction\expandafter{\pgfplots@loc@TMPa}% + \pgfkeyslet{/pgfplots/surf shading/colormap}\pgfplotsretval + \pgfplotscolormapgetcolorspace\pgfplots@loc@TMPa + \pgfkeyslet{/pgfplots/surf shading/colorspace}\pgfplotsretval + \if2\pgfplotsplothandlermesh@shader + % shader=interp + \let\pgfplotsplothandlermesh@definecolor=\relax + \let\pgfplotsplothandlermesh@VISUALIZE=\pgfplotsplothandlermesh@VISUALIZE@interp% + \pgfkeyslet{/pgfplots/surf shading/cols}\pgfplotsplothandlermesh@scanlinelength + %\if1\b@pgfplotsplothandlermesh@matrixoutput + \iffalse% FIXME : is this special handling necessary!? + \if\pgfplots@plot@mesh@ordering0% + % ordering=x varies: + % nothing special to do + \else + % FIXME + % [this happens only for mesh input=lattice] + % colwise: + % + % The low level shader NEEDS rowwise ordering. So, we need to transpose the data matrix. + % As usual in TeX, we should save macros as much as possible. I guess we NEED at least one macro for each matrix row. + % Idea: + % while we iterate colwise through the input data, accumulate row vectors. + % Then, process the row vectors. + % Since vectors are expensive (in terms of number of macros), we use fast "append" lists instead of vectors. + \let\pgfplotsplothandlermesh@shader@interp=\pgfplotsplothandlermesh@shader@interp@incremental@transpose + % + % init all required row vectors: + \c@pgfplots@scanlineindex=0 + \pgfutil@loop + \ifnum\c@pgfplots@scanlineindex<\pgfplotsplothandlermesh@rows\relax + \expandafter\pgfplotsapplistXnewempty\csname pgfp@transprow@\the\c@pgfplots@scanlineindex\endcsname% + \advance\c@pgfplots@scanlineindex by1 + \pgfutil@repeat + %\pgfkeyslet{/pgfplots/surf shading/cols}\pgfplotsplothandlermesh@rows + %\pgfplots@error{Sorry, the 'shader=interp' does not yet support 'mesh/ordering=colwise'... You can continue now, but the plot will be transposed.}% + \fi + \fi + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{init pdf shading}% + \pgfplotslibrarysurfstreamstart + \else + % shader='faceted interp' + \let\pgfplotsplothandlermesh@VISUALIZE=\pgfplotsplothandlermesh@VISUALIZE@faceted@interp% + \pgfkeyssetvalue{/pgfplots/surf shading/cols}{2}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{init pdf shading}% + \fi + \else + \def\pgfplotsplothandlermesh@VISUALIZE{\pgfplotsplothandlermesh@VISUALIZE@std}% + \fi + % + %% + \ifpgfplotsplothandlermesh@internaldepth + \else + % disable internal sorting. + \let\pgfplotspatchclass@rect@to@coonspatch@findshadingsequence@for@depth=\pgfplotspatchclass@rect@to@coonspatch@findshadingsequence@for@depth@no@op% + \let\pgfplotspatchclass@tri@to@coonspatch@findshadingsequence@for@depth=\pgfplotspatchclass@tri@to@coonspatch@findshadingsequence@for@depth@no@op + \fi +}% + +\def\pgfplotsplothandlermesh@init@flat@color{% + \ifcase\pgfplotsplothandlermesh@shader + % 0 == 'flat' + \def\pgfplotsplothandlermesh@needs@flat@color{1}% + \or + % 1 == 'faceted' + \def\pgfplotsplothandlermesh@needs@flat@color{1}% + \or + % 2 == 'interp' + \def\pgfplotsplothandlermesh@needs@flat@color{0}% + \or + % 3 == 'faceted interp' + \def\pgfplotsplothandlermesh@needs@flat@color{1}% + \fi + \if1\pgfplotsplothandlermesh@needs@flat@color + \if\pgfplotsplothandlermesh@flatmode c% 'flat corner': + % + % use colordata of ONE corner point. That's easy, not + % much to do. + \def\pgfplotsplothandlermesh@get@flat@color{% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{first vertex}% + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \let\pgfplotsretval=\pgfplotspointmetatransformed% + }% + \else + % 'flat mean': + % + % use colordata as mean of all corners for shading. + \global\pgfplots@tmpa=0pt + \def\pgfplotsplothandlermesh@get@flat@color{% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{foreach cdata vertex}{% + \let\pgfplots@current@point@meta=\pgfplotspatchvertexmeta + \pgfplotsaxisvisphasetransformpointmeta + \global\advance\pgfplots@tmpa by\pgfplotspointmetatransformed pt + }% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{get num vertices}% + \global\divide\pgfplots@tmpa by\pgfplotsretval\relax + \edef\pgfplotsretval{\pgf@sys@tonumber\pgfplots@tmpa}% + \global\pgfplots@tmpa=0pt + }% + \fi + % + % + \if\pgfplots@meshmode m% + % 'mesh' plot: stroke only and use the 'flat' code + % here just to define the color for each mesh + % segment. + \let\pgfplotsplothandlermesh@usepath=\pgfusepathqstroke + \else + % 'surf' plot: + \let\pgfplotsplothandlermesh@usepath=\pgfusepathqfillstroke + \if\pgfplotsplothandlermesh@shader3% faceted interp + % it has an extra fill command (shading) + \let\pgfplotsplothandlermesh@usepath=\pgfusepathqstroke + \fi + % + % the distinction between 'faceted' and 'flat' is + % technical: it is just the default draw color. + % + % 'flat,draw=black' is the same as 'faceted'. + \pgfkeysgetvalue{/pgfplots/faceted color}\pgfplots@loc@TMPb + \def\pgfplots@loc@TMPc{none}% + \ifx\pgfplots@loc@TMPb\pgfplots@loc@TMPc + \pgfkeyslet{/pgfplots/faceted color}\pgfutil@empty + \def\pgfplots@loc@TMPb{}% + \fi + % + \def\pgfplots@loc@TMPa{0}% + \if\pgfplotsplothandlermesh@shader1% faceted + \def\pgfplots@loc@TMPa{1}% + \ifx\pgfplots@loc@TMPb\pgfutil@empty + % oh. no faceted color. Then: fill only, use + % whatever color is available. + \def\pgfplots@loc@TMPa{0}% + %\let\pgfplotsplothandlermesh@usepath=\pgfusepathqfill + \fi + \fi + \if\pgfplotsplothandlermesh@shader3% faceted interp + \def\pgfplots@loc@TMPa{1}% + \ifx\pgfplots@loc@TMPb\pgfutil@empty + % oh. no faceted color. Then: no-op! + % This is the same as interp with more overhead + % (but allows z buffering). + \def\pgfplots@loc@TMPa{0}% + \def\pgfplotsplothandlermesh@usepath{\pgfusepath{discard}}% + \fi + \fi + \if1\pgfplots@loc@TMPa + % make sure there is a the correct color. + \expandafter\def\expandafter\pgfplots@drawoptions\expandafter{% + \pgfplots@drawoptions + \pgfsetstrokecolor{\pgfkeysvalueof{/pgfplots/faceted color}}% + }% + \fi + % + \fi + % + \ifx\pgfplotsplothandlermesh@PIPE@REFINE\pgfplotsplothandlermesh@PIPE@REFINE@no@op + \let\pgfplotsplothandlermesh@VISUALIZE@std=\pgfplotsplothandlermesh@VISUALIZE@std@fill@andor@stroke + \else + \ifpgfplotsplothandlermesh@hide@refined@edges + % this is (at most) partially implemented. + \let\pgfplotsplothandlermesh@VISUALIZE@std=\pgfplotsplothandlermesh@VISUALIZE@std@separate@fillstroke + \else + \let\pgfplotsplothandlermesh@VISUALIZE@std=\pgfplotsplothandlermesh@VISUALIZE@std@fill@andor@stroke + \fi + % + % FIXME : that doesn't work. + % filling *always* seems to need a stroke operation, + % otherwise there will be translucent edges. + % I need to adjust the stroke color :-( + % + % FIXME : even that doesn't work correctly. The problem + % is: drawing adjacent patches on top of each other + % OVERDRAWS edges: once with the correct stroke color; + % once with the fill color. + % + \ifx\pgfplotsplothandlermesh@usepath\pgfusepathqstroke + \let\pgfplotsplothandlermesh@usepathfill=\relax + \let\pgfplotsplothandlermesh@usepathstroke=\pgfusepathqstroke + \else + \ifx\pgfplotsplothandlermesh@usepath\pgfusepathqfillstroke + \let\pgfplotsplothandlermesh@usepathfill=\pgfusepathqfillstroke + \let\pgfplotsplothandlermesh@usepathstroke=\pgfusepathqstroke + \else + \let\pgfplotsplothandlermesh@usepathfill=\relax + \let\pgfplotsplothandlermesh@usepathstroke=\relax + \fi + \fi + \fi + \fi +}% + + +\def\pgfplotsplothandlermesh@init@jumphandling{% + % For matrix input, a "jump" should result in something + % visible although it must not destroy the matrix structure. + % + % try this here: + \def\pgfplotsplothandlervisualizejump{% + \pgfplotstreampoint{\global\pgf@x=-16000.0pt \global\pgf@y=-16000.0pt }% + }% + % + \if0\pgfplotsaxisplothasjumps + \pgfplotsplothandlermesh@PIPE@CHECKJUMP@disable + \fi +}% + + +\def\pgfplotsplothandlermesh@init@zbuffer{% + \ifpgfplots@curplot@threedim + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{uses view depth}% + \if1\pgfplotsretval + \let\pgfplotsplothandlermesh@compute@vertex@depth=\pgfplotsplothandlermesh@compute@vertex@depth@doit% + \fi + % + \if\pgfplotsplothandlermesh@zbuffer@choice4% + % z buffer=sort: + % create a z buffer: + % the z buffer contains elements {<view depth>}{{<pt1>}{<pt2>}{<pt3>}{<pt4>}} + \pgfplotsarraynewempty\pgfplots@zbuffer@local + % + \let\pgfplotsplothandlermesh@compute@vertex@depth=\pgfplotsplothandlermesh@compute@vertex@depth@doit% + % + \let\pgfplotsplothandlermesh@accum@element@depth=\pgfmath@basic@add@ + % + % and collect each point into the z buffer + % (instead of drawing it): + \def\pgfplotsplothandlermesh@PIPE@FINISH{% + % + % compute DEPTH(lattice element):= min{DEPTH(A),DEPTH(B),DEPTH(C),DEPTH(D)} + \def\pgfmathresult{0}% + \def\pgfplotsplothandlermesh@zbuffer@tmp{}% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{foreach vertex}{% + \pgfplotsplothandlermesh@accum@element@depth\pgfplotspatchvertexdepth\pgfmathresult + \t@pgfplots@toka=\expandafter{\pgfplotsplothandlermesh@zbuffer@tmp}% + \t@pgfplots@tokb=\expandafter{\pgfplotspatchvertexstruct}% + \edef\pgfplotsplothandlermesh@zbuffer@tmp{% + \the\t@pgfplots@toka + {\the\t@pgfplots@tokb}% + }% + }% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{serialize except vertices}% + \t@pgfplots@toka=\expandafter{\pgfplotsretval}% + \t@pgfplots@tokb=\expandafter{\pgfplotsplothandlermesh@zbuffer@tmp}% + \edef\pgfplotsplothandlermesh@zbuffer@tmp{% + {\the\t@pgfplots@toka}% first argument is meta data, then follow the vertices + \the\t@pgfplots@tokb% + }% + % + % assemble array element: + \t@pgfplots@toka=\expandafter{\pgfplotsplothandlermesh@zbuffer@tmp}% + \edef\pgfplots@loc@TMPa{% + {\pgfmathresult}% + {% + \the\t@pgfplots@toka + }% + }% + \expandafter\pgfplotsarraypushback\pgfplots@loc@TMPa\to\pgfplots@zbuffer@local + }% + \fi + \fi +}% +\def\pgfplotsplothandlermesh@init@mesh@stream{% + \global\let\pgf@plotstreamspecial=\pgfutil@gobble% + \global\let\pgf@plotstreamend=\pgfplotsplothandlermesh@finish% + \global\let\pgf@plotstreampoint=\pgfplotsplothandlermesh@stream + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{new}% +} + +{ +\dimen0=-16000.0pt +\xdef\pgfplotsplothandlermesh@check@unbounded@text{\the\dimen0}% +} + +\def\pgfplotsplothandlermesh@check@unbounded{% + \ifx\pgfplotspatchvertexx\pgfplotsplothandlermesh@check@unbounded@text + \pgfplots@loc@tmpfalse + \fi +}% + +\long\def\pgfplotsplothandlermesh@defaultlegend@img#1{% + \scope[% + #1, + /pgfplots/mesh/rows=3, + /pgfplots/mesh/cols=3, + /pgfplots/mesh/num points=, + /tikz/x={(0.44237cm,-0.07439cm)}, + /tikz/y={(0.30942cm,0.23932cm)}, + /tikz/z={(0.0cm,1.5cm)}, + scale=0.4, + yshift=-0.7cm, + ] + \let\pgfplots@metamax=\pgfutil@empty + \pgfplots@curplot@threedimtrue + + \pgfplotsplothandlermesh + \pgfplotstreamstart + + \def\rangea{0.21}% + \def\rangeb{0.7}% + + \pgfmathparse{1000/(\rangeb-\rangea)} + \let\factor=\pgfmathresult + + \pgfutil@ifundefined{pgfqpointxyz@orig}{% + \let\pgfqpointxyz@orig=\pgfqpointxyz + }{}% + % + \def\simplecoordinate(##1,##2,##3){% + \pgfmathparse{\factor*(##3 - \rangea)}% + \pgfmathfloatparsenumber\pgfmathresult + \let\pgfplots@current@point@meta=\pgfmathresult + % pgfplots changes \pgfqpointxyz to + % \pgfplotspointdescriptionxy inside of legends, so use the + % '@orig' point command: + \pgfplotstreampoint{\pgfqpointxyz@orig{##1}{##2}{##3}}% + }% + % for the case 'shader=interp': + \def\pgfplotspointbbupperright{\pgfqpointxyz@orig{2}{2}{0.9}} + \def\pgfplotspointbblowerleft {\pgfqpointxyz@orig{0}{0}{0.1}} + + \simplecoordinate(0,2,0.7) + \simplecoordinate(1,2,0.5) + \simplecoordinate(2,2,0.43) + + \simplecoordinate(0,1,0.68) + \simplecoordinate(1,1,0.4) + \simplecoordinate(2,1,0.25) + + \simplecoordinate(0,0,0.6) + \simplecoordinate(1,0,0.35) + \simplecoordinate(2,0,0.21) + + \pgfplotstreamend + \pgfusepath{stroke} + \endscope +}% + +\def\pgfplotsplothandlermesh@finish{% + \if\pgfplotsplothandlermesh@zbuffer@choice4% + % z buffer=sort: + % process the z buffer: + \pgfkeyslet{/pgfplots/iflessthan/.@cmd}\pgfplotsplothandlermesh@zbuffer@sort@iflessthen + \pgfkeysdef{/pgfplots/array/unscope pre}{% + \let\pgfplotsplothandlermesh@patchclass=\pgfplotsplothandlermesh@patchclass@output + \def\pgfplotspatchready{\pgfplotsplothandlermesh@VISUALIZE}% + \pgfplotsarrayforeachungrouped\pgfplots@zbuffer@local\as\curelem{% + \expandafter\pgfplotsplothandlermesh@draw@zbufferelement\curelem% + }% + }% + \pgfkeysdef{/pgfplots/array/unscope post}{}% + \pgfplotsarraysort\pgfplots@zbuffer@local + \fi + % + \if2\pgfplotsplothandlermesh@shader + % shader=interp: + % FIXME : broken! + %\ifx\pgfplotsplothandlermesh@shader@interp\pgfplotsplothandlermesh@shader@interp@incremental@transpose% + % This is the case for 'mesh/ordering=colwise'. We need to finish the transpose procedure: + % \pgfplotsplothandlermesh@shader@interp@transpose@finish + %\fi + \pgfplotslibrarysurfstreamend + \pgfplotslibrarysurfdrawinpicture + \fi +}% + + +\def\pgfplotsplothandlermesh@PIPE@DECODE@to@shader#1{% + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotslibrarysurfstreamcoord + {#1}% + {\pgfplotspointmetatransformed}% +}% + +\def\pgfplotsplothandlermesh@PIPE@DECODE@matrix@ONEDIMMODE#1{% + \let\pgfplotsplothandlermesh@patchclass\pgfplotsplothandlermesh@patchclass@input + \pgfplotsplothandlermesh@compute@vertex@depth% <-- this modifies \pgfplotsretval + \pgf@process{#1}% + \edef\pgfplotsplothandlermesh@i{{\the\pgf@x}{\the\pgf@y}{\pgfplots@current@point@meta}\pgfplotsretval}% + \ifnum\c@pgfplots@scanlineindex>0 + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotsplothandlermesh@im}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotsplothandlermesh@i}% + \else + \advance\c@pgfplots@scanlineindex by1 + \fi + \let\pgfplotsplothandlermesh@im=\pgfplotsplothandlermesh@i +}% + +% the pgf@plotstreampoint routine for the first scan line: +\def\pgfplotsplothandlermesh@PIPE@DECODE@matrix@fillscanline#1{% + \pgfplotsplothandlermesh@compute@vertex@depth% <-- this modifies \pgfplotsretval + \pgf@process{#1}% + \edef\pgfplots@loc@TMPa{{\the\pgf@x}{\the\pgf@y}{\pgfplots@current@point@meta}\pgfplotsretval}% + \expandafter\pgfplotsdequepushback\pgfplots@loc@TMPa\to{lastscanline}% + \advance\c@pgfplots@scanlineindex by1 + \ifnum\c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@scanlinelength\relax + % second line! + \let\pgfplotsplothandlermesh@PIPE@DECODE=\pgfplotsplothandlermesh@PIPE@DECODE@matrix%% + \c@pgfplots@scanlineindex=0 + \fi +}% +% This is the pgf@plotstreampoint for all scan lines starting with the +% second. +% +% We perform +% // i == y +% // j == x +% for i = 1 to rows (note the 1! 0 would be the first row) +% for j = 0 to cols +% get (i-1, j) from front of deque // remember: i: rows, j : cols. We iterate rowwise. +% push (i,j) to back of deque +% if j > 0 +% draw +% (i-1,j-1) [from last iteration] -- (i-1,j ) [from deque] +% -- ( i,j ) [from last iteration] -- (i ,j-1) [from #1] +% -- cycle +% endif +% let (i-1,j-1) := (i-1,j) // for next iteration +% let ( i,j-1) := ( i,j) // for next iteration +% end +% end +% +% This is a SWEEP through the data matrix. +\def\pgfplotsplothandlermesh@PIPE@DECODE@matrix#1{% + % NOTATION: + % 'im == (i-1)' + % 'jm == (j-1)' + \pgfplotsplothandlermesh@compute@vertex@depth% <-- this modifies \pgfplotsretval + \pgf@process{#1}% + \edef\pgfplotsplothandlermesh@i@j{{\the\pgf@x}{\the\pgf@y}{\pgfplots@current@point@meta}\pgfplotsretval}% FIXME relies on pgfplots macros +%\message{##\the\c@pgfplots@scanlineindex: prepare rectangle with corner \meaning\pgfplotsplothandlermesh@i@j.}% + \pgfplotsdequepopfront{lastscanline}\to\pgfplotsplothandlermesh@im@j + \expandafter\pgfplotsdequepushback\pgfplotsplothandlermesh@i@j\to{lastscanline}% + \ifnum\c@pgfplots@scanlineindex>0 + \let\pgfplotsplothandlermesh@patchclass\pgfplotsplothandlermesh@patchclass@input + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotsplothandlermesh@im@jm}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotsplothandlermesh@im@j}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotsplothandlermesh@i@j}% + \expandafter\pgfplotsplothandlermesh@setnextvertex\expandafter{\pgfplotsplothandlermesh@i@jm}% + \fi + \let\pgfplotsplothandlermesh@im@jm=\pgfplotsplothandlermesh@im@j + \let\pgfplotsplothandlermesh@i@jm=\pgfplotsplothandlermesh@i@j + \advance\c@pgfplots@scanlineindex by1 + \ifnum\c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@scanlinelength\relax + \c@pgfplots@scanlineindex=0 + \fi +}% +\def\pgfplotsplothandlermesh@shader@interp@incremental@transpose#1{% + \pgfplotsaxisvisphasetransformpointmeta + \pgf@process{#1}% + \edef\pgfplotsplothandlermesh@i{\noexpand\pgfplotsplothandlermesh@shader@interp@next{\the\pgf@x}{\the\pgf@y}{\pgfplotspointmetatransformed}}% + % + % Store the postprocessed point into the appropriate row vector: + \def\pgfplots@loc@TMPa{\expandafter\pgfplotsapplistXpushback\expandafter{\pgfplotsplothandlermesh@i}\to} + \expandafter\pgfplots@loc@TMPa\csname pgfp@transprow@\the\c@pgfplots@scanlineindex\endcsname% + % + \advance\c@pgfplots@scanlineindex by1 + \ifnum\c@pgfplots@scanlineindex=\pgfplotsplothandlermesh@scanlinelength\relax + \c@pgfplots@scanlineindex=0 + \fi +}% +\def\pgfplotsplothandlermesh@shader@interp@transpose@finish{% + % Now, "execute" each row vector: + \def\pgfplotsplothandlermesh@shader@interp@next##1##2##3{% + \pgfplotslibrarysurfstreamcoord{\global\pgf@x=##1 \global\pgf@y=##2 }{##3}% + }% + \c@pgfplots@scanlineindex=0 + \pgfutil@loop + \ifnum\c@pgfplots@scanlineindex<\pgfplotsplothandlermesh@rows\relax + \expandafter\pgfplotsapplistXlet\expandafter\pgfplots@loc@TMPd\expandafter=\csname pgfp@transprow@\the\c@pgfplots@scanlineindex\endcsname% + \expandafter\pgfplotsapplistXnewempty\csname pgfp@transprow@\the\c@pgfplots@scanlineindex\endcsname% clear + % execute the row: + \pgfplots@loc@TMPd + \advance\c@pgfplots@scanlineindex by1 + \pgfutil@repeat + \let\pgfplots@loc@TMPd=\relax +}% + +\def\pgfplotsplothandlermesh@draw@zbufferelement#1#2{% + \pgfplotsplothandlermesh@draw@zbufferelement@#2\pgfplots@EOI +} +\def\pgfplotsplothandlermesh@draw@zbufferelement@#1{% + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{deserialize except vertices}{#1}% + \pgfplotsplothandlermesh@draw@zbufferelement@@ +} +\def\pgfplotsplothandlermesh@draw@zbufferelement@@#1{% + \def\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfplots@EOI + \else + \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass@output}{set next vertex}{#1}% + \expandafter\pgfplotsplothandlermesh@draw@zbufferelement@@ + \fi +}% + + +\def\pgfplotsplothandlermesh@zbuffer@sort@iflessthen#1#2#3#4\pgfeov{% + \edef\pgfplots@loc@TMPa{#1}% + \expandafter\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@\pgfplots@loc@TMPa\relax + \let\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@a=\pgfmathresult + \edef\pgfplots@loc@TMPb{#2}% + \expandafter\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@\pgfplots@loc@TMPb\relax + \let\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@b=\pgfmathresult + \ifdim\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@b pt<\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@a pt% + #3\relax + \else + #4\relax + \fi +}% +\def\pgfplotsplothandlermesh@zbuffer@sort@iflessthen@#1#2{% + \def\pgfmathresult{#1}% +}% +\def\pgfplotsplothandlermesh@unpack@zbuffer@pointdepth#1{% + \expandafter\pgfplotsplothandlermesh@unpack@zbuffer@pointdepth@#1% +}% +\def\pgfplotsplothandlermesh@unpack@zbuffer@pointdepth@#1#2#3#4{% + \def\pgfplotsretval{#4}% +}% diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsplothandlers.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsplothandlers.code.tex new file mode 100644 index 00000000000..7506cabcf16 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsplothandlers.code.tex @@ -0,0 +1,2230 @@ +%-------------------------------------------- +% +% Package pgfplots +% +% Provides a user-friendly interface to create function plots (normal +% plots, semi-logplots and double-logplots). +% +% It is based on Till Tantau's PGF package. +% +% Copyright 2010 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +%-------------------------------------------- + +% 1. OVERVIEW +% +% Plot handlers are extended versions of the plot handlers of PGF with +% backwards compatibility. +% +% To remind ourselfes: PGF plot handlers work like this +% \pgfplotstreamstart +% \pgfplotstreampoint{...} +% \pgfplotstreampoint{...} +% \pgfplotstreampoint{...} +% \pgfplotstreampoint{...} +% \pgfplotstreamend +% +% and that's it. +% +% PGFPlots plot handlers also contain these three macros. The tasks +% are (of course) the same. In addition, they support a set of further +% macros for every plot handler: +% +% \pgfplotsplothandlersurveystart +% \pgfplotsplothandlersurveypoint +% \pgfplotsplothandlersurveyend +% +% and serialization methods +% \pgfplotsplothandlerserializepointto +% \pgfplotsplothandlerdeserializepointfrom +% \pgfplotsplothandlerserializestateto +% \pgfplotsplothandlerdeserializepointfrom +% +% The idea is as follows: +% During \addplot, PGFPLots performs a survey phase. Survey means: +% nothing will be drawn, only stats will be collected. In this phase, +% the \pgfplotsplothandlersurvey* methods will be invoked; followed by +% a serialization. +% +% Then, when every plot has been surveyed, PGFPlots calls +% \pgfplotsplothandlerdeserializestatefrom{<serialized state>} +% \pgfplotstreamstart +% foreach <serizalized point> { +% \pgfplotsplothandlerdeserializepointfrom{<serialized point>} +% apply data transformations +% handle plot marks +% \pgfplotstreampoint{\pgfplotsqpointxy{<x>}{<y}} +% } +% \pgfplotstreamend +% +% See below for details about the survey phase and the visualization +% phase and the API of an axis. +% +% Thus, the PGF basic level streams can (but don't need to) make use +% of the macros assigned by the +% \pgfplotsplothandlerdeserializepointfrom and +% \pgfplotsplothandlerdeserializestatefrom. +% +% Furthermore, a plot handler *can* redefine any of the survey and/or +% serialization methods to add further functionality. But it doesn't +% need to, it's ok if it only relies on x,y as standard pgf plot +% handlers do. +% +% If it overwrites something, it should do so in its main method, the +% one in which it also defines the \pgf@plotstreamstart etc. methods +% (see pgfmoduleplot.code.tex for example). BUT: do NOT overwrite +% these methods globally! +% +% 2. A Description of the two phases: +% +% THE SURVEY PHASE: +% The survey phase works as follows. +% PRECONDITION: +% - we are `inside' of an axis. +% - \addplot starts the survey phase. +% +% The following happens: +% - the plot handler is determined and activated such that its +% methods are usable ("class is instantiated") +% - \pgfplots@PREPARE@COORD@STREAM is the internal, low level +% entry point where pgfplots controls the survey phase. +% - the coordinate input routine is initialised. It issues a +% series of commands (all within the *same* TeX scope): +% \pgfplots@coord@stream@start +% \pgfplots@coord@stream@coord +% \pgfplots@coord@stream@coord +% \pgfplots@coord@stream@coord +% \pgfplots@coord@stream@coord +% \pgfplots@coord@stream@coord +% \pgfplots@coord@stream@coord +% ... +% \pgfplots@coord@stream@end +% - \pgfplotsplothandlersurveystart is called in +% \pgfplots@coord@stream@start. +% - \pgfplots@coord@stream@coord calls +% \pgfplotsplothandlersurveypoint +% - \pgfplots@coord@stream@end calls +% \pgfplotsplothandlersurveyend +% \pgfplotsplothandlerserializestateto<\macro> +% Furthermore, it remembers the <\macro> such that it can be +% deserialized later. +% Then, the survey phase ends. The main point of interest is the +% \pgfplotsplothandlersurveypoint routine, especially its +% communication with the axis. It is described below. +% +% POSTCONDITION: +% - the state of the axis is now aware of the new plot (limits, +% stacking, ...). +% - The plot's survey state is stored using its serialized +% representation. +% +% THE VISUALIZATION PHASE: +% FIXME +% +% 2.1 The API of an axis +% +% As described above, the coordinate input routine fires a lot of +% \pgfplots@coord@stream@coord commands, which, in turn, invoke +% \pgfplotsplothandlersurveypoint. Somehow this should update the +% axis' state to reflect each point. But the 'data point' is a rather +% abstract thing. Usually, it will contain at least (x,y) (or maybe z) +% coordinates. But it may be more complex. +% +% So, the coordinate input routine provides whatever the user has +% chosen. Let's assume, we are using \addplot table. Then, we can +% access every cell in the current row (using \thisrow{<colname>} for +% example). The plot handler knows how to extract its information from +% this state. In general, the following steps are taken: +% - the plot handler assembles coordinates. +% - every assembled coordinate should be reported to the axis by +% defining \pgfplots@current@point@[xyz] to its coordinates and +% calling +% \pgfplotsaxisparsecoordinate{} +% This will apply coordinate filters, parse the single coordinates +% and apply high level transformations and any logarithms. +% It is some sort of advanced coordinate parser which works only for +% (x,y) or for (x,y,z). +% It yields (x,y,z). But the axis might need to change its +% components! Thus, you also need to call +% \pgfplotsaxispreparecoordinate{}. +% This will, for example, apply the "stack plots" feature or the +% 'data cs' feature. +% +% If necessary, the plot handler calls +% \pgfplotsaxisparsecoordinate{} and +% \pgfplotsaxispreparecoordinate{} multiple times, once for each +% encountered coordinate. +% +% It might occasionally be too much to call +% \pgfplotsaxispreparecoordinate. +% +% It might happen that a coordinate filter discards a coordinate. +% This is returned in the \ifpgfplotsaxisparsecoordinateok boolean +% and has to be checked by the plot handler. +% +% - the plot handler knows which of the coordinates contribute to the +% final plot. It invokes +% \ifpgfplotsaxisparsecoordinateok +% \pgfplotsaxisupdatelimitsforcoordinate{<x>}{<y>}{<z>} +% \fi +% for each of these coordinates. This has to be done for final +% coordinates only, i.e. after \pgfplotsaxispreparecoordinate. +% +% - eventually, the plot handler is satisfied and considers a data +% point as "readily surveyed". It is allowed if this does *not* +% happen inside of \pgfplotsplothandlersurveypoint, but it must +% happen before \pgfplotsplothandlersurveyend is finished. +% +% The plot handler invokes \pgfplotsaxisdatapointsurveyed. +% This tells the axis that it can perform its own surveying tasks +% (see below) and furthermore, that it can serialize the data point. +% Consequently, it will invoke +% \pgfplotsplothandlerserializepointto{<\macro>} +% and it will remember that \macro internally. This serialization is +% employed to place plot marks and to apply z buffering techniques +% (that's why it is done by the axis and not by the plot handler on +% its own). +% +% The axis does its own surveying task, initiated by +% \pgfplotsaxisdatapointsurveyed (which is, turn, invoked by the +% plot handler). This command handles the |point meta| feature, that +% is: it queries the |point meta| input source and updates the meta +% limits. Furthermore, the error bar feature is processed at this +% point (using the final data point's (x,y,z) coordinates as basis). +% The |xtick=data| feature is also prepared at this stage. +% +% - Later, the coordinate input routine invokes +% \pgfplots@coord@stream@end indicating the end-of-input. This will +% finalize the survey phase. +% +% A simple example looks like this: +% \pgfplotsplothandlersurveystart: does nothing in the simple example. +% \pgfplotsplothandlersurveypoint: +% parses the input format somehow to get (x,y,z) in raw, symbolic format +% calls \pgfplotsaxisparsecoordinate +% calls \pgfplotsaxispreparecoordinate +% calls \ifpgfplotsaxisparsecoordinateok \pgfplotsaxisupdatelimitsforcoordinate{<x>}{<y>}{<z} \fi +% calls \pgfplotsaxisdatapointsurveyed +% \pgfplotsplothandlersurveyend: does nothing in the simple example. +% +% In fact, this is more or less the initial configuration used for +% lineto or similar plot handlers. +% +% 2.2 Further Survey Phase API functions +% \pgfplotssurveyphaseinputclass +% expands to the actual name of the input method (like +% 'coordinates', 'expression' or 'table') +% +% \pgfplotsplothandlernotifyscanlinecomplete +% Called whenever an end-of-scanline marker has been processed, i.e. +% whenever the 'empty line' key has been triggered. The default is to +% do nothing. +% +% \pgfplotsaxissurveysetpointmeta +% processes the 'point meta' key, i.e. it assigns +% \pgfplots@current@point@meta. This macro can only be called once for +% each coordinate (it will be deactivated afterwards). PGFPlots calls +% it in \pgfplotsaxisdatapointsurveyed . +% +% \pgfplotsplothandlersurveyaddoptions{<options>} +% which allows to change the current plot style from within API +% functions. It sets <options> and remembers them for the +% visualization phase. +% +% \pgfplotsaxisupdatelimitsforpointmeta{<meta>}, +% provided there is a point meta input handler (which is numeric). +% Otherwise, the command is equal to \relax. +% +% +% 3. Details about the VISUALIZATION phase +% +% The visualization phase consists of +% <installation of the plot handler> +% \pgfplotstreamstart +% foreach serialized coordinate { +% pgfplots calls \pgfplotsplothandlerdeserializestatefrom{<serialized repr>} +% if coordinate is empty ("unbounded") +% pgfplots call \pgfplotsplothandlervisualizejump +% else +% pgfplots calls \pgfplotsaxisvisphasetransformcoordinate +% pgfplots calls \pgfplotsaxisvisphasepreparedatapoint +% fi +% \pgfplotstreampoint +% } +% \pgfplotstreamend +% +% User defined plot handlers might need to invoke +% \pgfplotsaxisvisphasetransformcoordinate on their own. +% +% During the visualization phase, the following macros can be used: +% +% - \pgfplotsaxisvisphasetransformpointmeta to set up point meta. +% Use this only if there *is* point meta, see +% \pgfplotsaxisifhaspointmeta{<true code>}{<false code>}. +% +% 4. API Functions of pgfplots to work with the visualization phases +% +% \pgfplotsifissurveyphase{<true code>}{<false code>} +% \pgfplotsifisvisualizationphase{<true code>}{<false code>} +% +% \pgfplotsaxisfilteredcoordsaway +% This macro expands to '1' if all points have been surveyed +% successfully. It expands to '0' if at least one point has been +% filtered away (for whatever reasons). This does not apply to +% jumps. +% \pgfplotsaxisplothasjumps +% This macro expands to '1' if the current plot has jumps and '0' +% if not.During the visualization phase, a jump is usually indicated +% by an empty coordinate. +% + +\def\pgfplotssurveyphaseinputclass{direct} + +% Resets the plot handler routines. +% +% This is necessary before installing a new plot handler! +\def\pgfplotsresetplothandler{% + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@default + \let\pgfplotsplothandlername=\pgfplotsplothandlername@default + \let\pgfplotsplothandlersurveyend=\pgfplotsplothandlersurveyend@default + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@default + \let\pgfplotsplothandlerserializepointto=\pgfplotsplothandlerserializepointto@default + \let\pgfplotsplothandlerdeserializepointfrom=\pgfplotsplothandlerdeserializepointfrom@default + \let\pgfplotsplothandlerserializestateto=\pgfplotsplothandlerserializestateto@default + \let\pgfplotsplothandlerdeserializestatefrom=\pgfplotsplothandlerdeserializestatefrom@default + \let\pgfplotsplothandlervisualizejump=\pgfplotsplothandlervisualizejump@default + \let\pgfplotsplothandlernotifyscanlinecomplete=\relax +}% + +% \pgfplotsplothandlersurveystart +\def\pgfplotsplothandlersurveystart@default{}% + +% \pgfplotsplothandlername +\def\pgfplotsplothandlername@default{% + [tikz@plot@handler: \meaning\pgf@plotstreamstart]% +}% + +% \pgfplotsplothandlersurveyend +% Called at the end of each survey phase. +\def\pgfplotsplothandlersurveyend@default{} +\let\pgfplotsplothandlernotifyscanlinecomplete=\relax% + +% \pgfplotsplothandlersurveypoint is called for each encountered data +% point. +% +% The data point as such is available using the current state of any +% macros which are assigned during the survey phase (during \addplot). +% This includes any table macros etc. +% PGFPlots stores the x,y and z coordinates into \pgfplots@current@point@[xyz]. +% The point meta coordinate is in \pgfplots@current@point@meta. +% +% Note that since any currently assigned macro can be used here, the +% new DV engine of PGF is also valid (and will be supported +% eventually). This DV engine stores data point entries in keys, +% namely those in the key path /data point. See the pgf manual. +\def\pgfplotsplothandlersurveypoint@default{% + \pgfplotsaxisparsecoordinate + \pgfplotsaxispreparecoordinate + \ifpgfplotsaxisparsecoordinateok + \pgfplotsaxisupdatelimitsforcoordinate\pgfplots@current@point@x\pgfplots@current@point@y\pgfplots@current@point@z + \fi + \pgfplotsaxisdatapointsurveyed +}% + +% \pgfplotsplothandlerserializepointto{<\macro>} +% should save a complete data point to <\macro> such that it can be +% de-serialized later. +% +% #1: a macro name. Will be filled with (expandable) data. +% The format can be arbitrary, but you should be able to extra it. +% +% @PRECONDITION +% this macro will be invoked in a context where the current data +% point has been processed completely, including any preparations. +% The required data which should be saved depends on the plot +% handler. Usually, all plot handlers require +% \pgfplots@current@point@[xyz] and \pgfplots@current@point@meta. +% This macro should only assign keys which have been defined or +% validated by any of the plot handler relevant methods (including +% the de-serialization or survey methods). +\def\pgfplotsplothandlerserializepointto@default#1{% + % Store normalized point for list: + % We need + % xi,yi,zi,mi; + % where zi and mi may be empty. mi is the per-point meta + % information. It is used for per-coordinate marker + % modifications (like colormaps for scatter plots). + \edef#1{\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z}% +}% + +% the counterpart for \pgfplotsplothandlerserializepointto. +% It should restore the state as it was before the serialization. +% +% #1: the serialized information. +\def\pgfplotsplothandlerdeserializepointfrom@default#1{% + \expandafter\pgfplotsplothandlerdeserializepointfrom@default@#1\relax +}% + +\def\pgfplotsplothandlerdeserializepointfrom@default@#1,#2,#3\relax{% + \def\pgfplots@current@point@x{#1}% + \def\pgfplots@current@point@y{#2}% + \def\pgfplots@current@point@z{#3}% +}% +% \pgfplotsplothandlerserializestateto{<\macro>} +% should save the state of the current plot handler such that it can +% be de-serialized later. +% +% The state does usually NOT contain a coordinate stream, this is +% accomplished by \pgfplotsplothandlerserializepointto. +% +% #1: a macro name. Can be filled with anything, including +% non-expandable macro invocations. +\def\pgfplotsplothandlerserializestateto@default#1{% + \def#1{}% +}% + +% +\def\pgfplotsplothandlerdeserializestatefrom@default#1{% + #1% +}% + +\def\pgfplotsplothandlervisualizejump@default{% + \pgfplotstreamend + \pgfplotstreamstart +}% + +\pgfplotsresetplothandler + +% ================================== + +% Defines +% - a generic update limits routine, +% \pgfplotsaxisupdatelimitsforcoordinate#1#2#3 +% if #3 is empty, it will assume a 2d point, otherwise a 3d point +% and the axis will be three dimensional as well. +% During \addplot, this auto-detection will be disabled in favor of +% the '\addplot3' versus' \addplot' syntax. +% +\def\pgfplots@prepare@axis@API{% + \pgfplots@curplot@threedimtrue + \pgfplots@prepare@axis@API@ + \let\pgfplotsaxisupdatelimitsforcoordinatethreedim=\pgfplotsaxisupdatelimitsforcoordinate@ + \let\pgfplotsaxisparsecoordinatethreedim=\pgfplotsaxisparsecoordinate@ + % + \pgfplots@curplot@threedimfalse + \pgfplots@prepare@axis@API@ + \let\pgfplotsaxisupdatelimitsforcoordinatetwodim=\pgfplotsaxisupdatelimitsforcoordinate@ + \let\pgfplotsaxisparsecoordinatetwodim=\pgfplotsaxisparsecoordinate@ + % + \def\pgfplotsaxisupdatelimitsforcoordinate##1##2##3{% + \pgfplots@ifempty{##3}{% + \pgfplotsaxisupdatelimitsforcoordinatetwodim{##1}{##2}{}% + }{% + \global\pgfplots@threedimtrue + \pgfplotsaxisupdatelimitsforcoordinatethreedim{##1}{##2}{##3}% + }% + }% + \def\pgfplotsaxisparsecoordinate{% + \ifx\pgfplots@current@point@z\pgfutil@empty + \pgfplotsaxisparsecoordinatetwodim + \else + \global\pgfplots@threedimtrue + \pgfplotsaxisparsecoordinatethreedim% + \fi + }% +}% +\def\pgfplots@prepare@axis@API@{% + \begingroup + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \let\E=\noexpand + % Setup Just-In-Time-Macro Compilation: + % I compile a set of macros which is highly optimized for this + % particular axis configuration. + % + % \pgfplotsaxisupdatelimitsforcoordinate + % Updates the current x and y limits for point (#1,#2). + % + % To eliminate all those case distinctions, it is created with + % 'edef' and a lot of '\noexpand' calls here: + % + % + % The point coordinates are given in floating point format (FIXME) + % + % Please note that if user specified limits are given, automatic + % limits are only applied to points which fall into the user specified + % clipping region. + % + % PRECONDITIONS: + % - the input coordinates have been parsed correctly (floating point + % format for linear axis, log applied for logarithmic ones) + % + % Arguments: + % #1,#2,#3 the x,y and z coordinate. z is ignored for 2d plots. + \xdef\pgfplotsaxisupdatelimitsforcoordinate@##1##2##3{% +%\E\tracingmacros=2\E\tracingcommands=2 +%\E\pgfplots@message{Updating limits for (##1,##2) ...}% + % + % VIM SEARCH PATTERN: + % [^E]\zs\\\ze[^E] + % -> this finds '\' which is neither '\E' nor is it prefixed + % by 'E'. + % + % + % + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDfalse + % check whether we need to clip limits: + \ifpgfplots@clip@limits + \ifpgfplots@autocompute@xmin + \else + \ifpgfplots@xislinear + \E\pgfmathfloatlessthan@{##1}{\E\pgfplots@xmin}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \else + \E\pgfplotsmathlessthan{##1}{\E\pgfplots@xmin}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \fi + \fi + \ifpgfplots@autocompute@xmax + \else + \ifpgfplots@xislinear + \E\pgfmathfloatlessthan@{\E\pgfplots@xmax}{##1}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \else + \E\pgfplotsmathlessthan{\E\pgfplots@xmax}{##1}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \fi + \fi + \ifpgfplots@autocompute@ymin + \else + \ifpgfplots@yislinear + \E\pgfmathfloatlessthan@{##2}{\E\pgfplots@ymin}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \else + \E\pgfplotsmathlessthan{##2}{\E\pgfplots@ymin}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \fi + \fi + \ifpgfplots@autocompute@ymax + \else + \ifpgfplots@yislinear + \E\pgfmathfloatlessthan@{\E\pgfplots@ymax}{##2}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \else + \E\pgfplotsmathlessthan{\E\pgfplots@ymax}{##2}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \fi + \fi + \ifpgfplots@curplot@threedim + \ifpgfplots@autocompute@zmin + \else + \ifpgfplots@zislinear + \E\pgfmathfloatlessthan@{##3}{\E\pgfplots@zmin}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \else + \E\pgfplotsmathlessthan{##3}{\E\pgfplots@zmin}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \fi + \fi + \ifpgfplots@autocompute@zmax + \else + \ifpgfplots@zislinear + \E\pgfmathfloatlessthan@{\E\pgfplots@zmax}{##3}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \else + \E\pgfplotsmathlessthan{\E\pgfplots@zmax}{##3}% + \E\ifpgfmathfloatcomparison + \E\pgfplots@update@limits@for@one@point@ISCLIPPEDtrue + \E\fi + \fi + \fi + \fi + \fi + % + % + % + % Update limits: + \E\ifpgfplots@update@limits@for@one@point@ISCLIPPED + \E\else + \ifpgfplots@autocompute@xmin + \ifpgfplots@xislinear + \E\pgfplotsmathfloatmin{\E\pgfplots@xmin}{##1}% + \E\global\E\let\E\pgfplots@xmin=\E\pgfmathresult + \else + \E\pgfplotsmathmin{\E\pgfplots@xmin}{##1}% + \E\global\E\let\E\pgfplots@xmin=\E\pgfmathresult + \fi + \fi + \ifpgfplots@autocompute@xmax + \ifpgfplots@xislinear + \E\pgfplotsmathfloatmax{\E\pgfplots@xmax}{##1}% + \E\global\E\let\E\pgfplots@xmax=\E\pgfmathresult + \else + \E\pgfplotsmathmax{\E\pgfplots@xmax}{##1}% + \E\global\E\let\E\pgfplots@xmax=\E\pgfmathresult + \fi + \fi + \ifpgfplots@autocompute@ymin + \ifpgfplots@yislinear + \E\pgfplotsmathfloatmin{\E\pgfplots@ymin}{##2}% + \E\global\E\let\E\pgfplots@ymin=\E\pgfmathresult + \else + \E\pgfplotsmathmin{\E\pgfplots@ymin}{##2}% + \E\global\E\let\E\pgfplots@ymin=\E\pgfmathresult + \fi + \fi + \ifpgfplots@autocompute@ymax + \ifpgfplots@yislinear + \E\pgfplotsmathfloatmax{\E\pgfplots@ymax}{##2}% + \E\global\E\let\E\pgfplots@ymax=\E\pgfmathresult + \else + \E\pgfplotsmathmax{\E\pgfplots@ymax}{##2}% + \E\global\E\let\E\pgfplots@ymax=\E\pgfmathresult + \fi + \fi + \ifpgfplots@curplot@threedim + \ifpgfplots@autocompute@zmin + \ifpgfplots@zislinear + \E\pgfplotsmathfloatmin{\E\pgfplots@zmin}{##3}% + \E\global\E\let\E\pgfplots@zmin=\E\pgfmathresult + \else + \E\pgfplotsmathmin{\E\pgfplots@zmin}{##3}% + \E\global\E\let\E\pgfplots@zmin=\E\pgfmathresult + \fi + \fi + \ifpgfplots@autocompute@zmax + \ifpgfplots@zislinear + \E\pgfplotsmathfloatmax{\E\pgfplots@zmax}{##3}% + \E\global\E\let\E\pgfplots@zmax=\E\pgfmathresult + \else + \E\pgfplotsmathmax{\E\pgfplots@zmax}{##3}% + \E\global\E\let\E\pgfplots@zmax=\E\pgfmathresult + \fi + \fi + \fi + \E\fi + % + % Compute data range: + \ifpgfplots@autocompute@all@limits + % the data range will be acquired simply from the axis + % range, see below! + \else + % Attention: it is only done for linear axis! + \ifpgfplots@xislinear + \E\pgfplotsmathfloatmin{\E\pgfplots@data@xmin}{##1}% + \E\global\E\let\E\pgfplots@data@xmin=\E\pgfmathresult + \E\pgfplotsmathfloatmax{\E\pgfplots@data@xmax}{##1}% + \E\global\E\let\E\pgfplots@data@xmax=\E\pgfmathresult + \fi + \ifpgfplots@yislinear + \E\pgfplotsmathfloatmin{\E\pgfplots@data@ymin}{##2}% + \E\global\E\let\E\pgfplots@data@ymin=\E\pgfmathresult + \E\pgfplotsmathfloatmax{\E\pgfplots@data@ymax}{##2}% + \E\global\E\let\E\pgfplots@data@ymax=\E\pgfmathresult + \fi + \ifpgfplots@curplot@threedim + \ifpgfplots@zislinear + \E\pgfplotsmathfloatmin{\E\pgfplots@data@zmin}{##3}% + \E\global\E\let\E\pgfplots@data@zmin=\E\pgfmathresult + \E\pgfplotsmathfloatmax{\E\pgfplots@data@zmax}{##3}% + \E\global\E\let\E\pgfplots@data@zmax=\E\pgfmathresult + \fi + \fi + \fi +%\E\pgfplots@message{Updated limits: (\E\pgfplots@xmin,\E\pgfplots@ymin) rectangle (\E\pgfplots@xmax,\E\pgfplots@ymax).}% +% +%\E\tracingmacros=0\E\tracingcommands=0 + }% + % + % A routine which parses a coordinate. + % Here, 'coordinate' means (x,y) for a two dimensional plot and + % '(x,y,z)' for a three dimensional one. + % + % The preparation consists of + % - filtering. + % - coordinate parsing and high level transformations. + % - logs. + % + % It might happen that \pgfplotsaxisparsecoordinate is called + % multiple times for a single data "point" (for example, a quiver + % point might call it for the point where the vector starts and + % where the vector ends). + % + % @PRECONDITION + % - the plot's survey phase is running (has already been started) + % - \pgfplots@current@point@[xyz] contains the coordinates of the + % point. I assume they are unparsed. + % + % + % @POSTCONDITION + % - the axis' state will be updated. + % - the \pgfplots@current@point@[xyz] macros will contain parsed data. + % - \ifpgfplotsaxisparsecoordinateok will be true if and only + % if the data point has not been filtered away. If it has been + % filtered away, \pgfplots@current@point@[xyz] will be empty. + % - \pgfplots@current@point@[xyz]@unfiltered contain unparsed + % data. + % + % @see \pgfplotsaxispreparecoordinate + % @see \pgfplotsaxisdatapointsurveyed + \xdef\pgfplotsaxisparsecoordinate@{% + % These things are necessary for error bars and are available + % as public results in math parser invocations (for meta and + % filters) + \E\let\E\pgfplots@current@point@x@unfiltered=\E\pgfplots@current@point@x + \E\let\E\pgfplots@current@point@y@unfiltered=\E\pgfplots@current@point@y + \E\let\E\pgfplots@current@point@z@unfiltered=\E\pgfplots@current@point@z + \E\def\E\pgfplots@unbounded@dir{}% + % + \E\pgfplots@invoke@prefilter + % + \E\pgfplots@prepare@xcoord{\E\pgfplots@current@point@x}% + \E\expandafter\E\pgfplots@invoke@filter\E\expandafter{\E\pgfmathresult}{x}% + \E\let\E\pgfplots@current@point@x=\E\pgfmathresult + % + \E\pgfplots@prepare@ycoord{\E\pgfplots@current@point@y}% + \E\expandafter\E\pgfplots@invoke@filter\E\expandafter{\E\pgfmathresult}{y}% + \E\let\E\pgfplots@current@point@y=\E\pgfmathresult + % + \ifpgfplots@curplot@threedim + \E\pgfplots@prepare@zcoord{\E\pgfplots@current@point@z}% + \E\expandafter\E\pgfplots@invoke@filter\E\expandafter{\E\pgfmathresult}{z}% + \E\let\E\pgfplots@current@point@z=\E\pgfmathresult + \fi + % + \E\pgfplots@invoke@filter@xyz + % + \E\ifx\E\pgfplots@current@point@x\E\pgfutil@empty + \E\else + \ifpgfplots@xislinear + \E\pgfplotscoordmath{x}{parsenumber}{\E\pgfplots@current@point@x}% + \E\let\E\pgfplots@current@point@x=\E\pgfmathresult + \else + % logs are already parsed (in prepare routine) + \fi + \E\pgfplotscoordmath{x}{if is bounded}{\E\pgfplots@current@point@x}% + {}% + {% this clears nan, inf and -inf points. + \E\let\E\pgfplots@current@point@x=\E\pgfutil@empty + \E\def\E\pgfplots@unbounded@dir{x}% + }% + \E\fi + % + \E\ifx\E\pgfplots@current@point@y\E\pgfutil@empty + \E\else + \ifpgfplots@yislinear + \E\pgfplotscoordmath{y}{parsenumber}{\E\pgfplots@current@point@y}% + \E\let\E\pgfplots@current@point@y=\E\pgfmathresult + \else + % logs are already parsed (in prepare routine) + \fi + \E\pgfplotscoordmath{y}{if is bounded}{\E\pgfplots@current@point@y}% + {}% + {% this clears nan, inf and -inf points. + \E\let\E\pgfplots@current@point@y=\E\pgfutil@empty + \E\def\E\pgfplots@unbounded@dir{y}% + }% + \E\fi + % + \ifpgfplots@curplot@threedim + % + \E\ifx\E\pgfplots@current@point@z\E\pgfutil@empty + \E\else + \ifpgfplots@zislinear + \E\pgfplotscoordmath{z}{parsenumber}{\E\pgfplots@current@point@z}% + \E\let\E\pgfplots@current@point@z=\E\pgfmathresult + \else + % logs are already parsed (in prepare routine) + \fi + \E\pgfplotscoordmath{z}{if is bounded}{\E\pgfplots@current@point@z}% + {}% + {% this clears nan, inf and -inf points. + \E\let\E\pgfplots@current@point@z=\E\pgfutil@empty + \E\def\E\pgfplots@unbounded@dir{z}% + }% + \E\fi + \fi + % + % check if coordinates are bounded: + \E\pgfplotsaxisparsecoordinateoktrue + \E\ifx\E\pgfplots@current@point@x\E\pgfutil@empty + \E\pgfplotsaxisparsecoordinateokfalse + \E\else + \E\ifx\E\pgfplots@current@point@y\E\pgfutil@empty + \E\pgfplotsaxisparsecoordinateokfalse + \E\else + \ifpgfplots@curplot@threedim + \E\ifx\E\pgfplots@current@point@z\E\pgfutil@empty + \E\pgfplotsaxisparsecoordinateokfalse + \E\fi + \fi + \E\fi + \E\fi + % + }% + % + \endgroup +}% + +% ================================== +% The quiver plot handler. +% It draws a lot of arrows. +% Its input is (x_i,y_i); (u_i,v_i) for data point i and it draws a +% vector in direction (u_i,v_i) starting from (x_i,y_i) . +% It also supports 3D arrows (involving z_i and w_i). + +\newif\ifpgfplots@quiver@usetikz +\newif\ifpgfplots@quiver@updatelimits + +\pgfplotsset{ + % The 'quiver' plot handler for two- and three dimensional plots. + % + % User Interface: + % use /pgfplots/quiver to enable the plot handler. + % Then, provide `quiver/u value' or `quiver/u' to + % tell where to find the 'x' coordinates of the vectors, and similarly + % for 'v' and 'w' instead of 'u'. + quiver/.code={% + \let\tikz@plot@handler=\pgfplotsplothandlerquiver + \pgfqkeys{/pgfplots/quiver}{#1}% + },% + quiver/u value*/.initial=0, + quiver/v value*/.initial=0, + quiver/w value*/.initial=0, + quiver/u value is expr/.initial=0, + quiver/v value is expr/.initial=0, + quiver/w value is expr/.initial=0, + quiver/u filter/.code=, + quiver/v filter/.code=, + quiver/w filter/.code=, + quiver/u value/.code =\pgfplots@set@source@for{quiver/u}{#1}{0},% + quiver/u/.code =\pgfplots@set@source@for{quiver/u}{#1}{1},% + quiver/v value/.code =\pgfplots@set@source@for{quiver/v}{#1}{0},% + quiver/v/.code =\pgfplots@set@source@for{quiver/v}{#1}{1},% + quiver/w value/.code =\pgfplots@set@source@for{quiver/w}{#1}{0},% + quiver/w/.code =\pgfplots@set@source@for{quiver/w}{#1}{1},% + quiver/before arrow/.code=, + quiver/after arrow/.code=, + quiver/every arrow/.style={}, + quiver/arrow color/.initial=, + quiver/scale arrows/.initial=1, + quiver/update limits/.is if=pgfplots@quiver@updatelimits, + quiver/update limits=true, + quiver/colored/.code={% + \def\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \pgfkeyslet{/pgfplots/quiver/arrow color}\pgfplots@loc@TMPa + \pgfkeysalso{/pgfplots/set point meta if empty=f(x)}% + \fi + },% + quiver/colored/.default=mapped color, +}% + +\def\pgfplots@set@source@for#1#2#3{% + \pgfkeyssetvalue{/pgfplots/#1 value*}{#2}% + \pgfkeyssetvalue{/pgfplots/#1 is expr}{#3}% +}% +% To be used to create a simple parser for keys initialised by +% \pgfplots@set@source@for: +% +% #1: the key path (relative to /pgfplots/) of the data. +% Can be empty in which case /pgfplots/#2 is used to access data. +% #2: the key name of the data +% #3: a macro name which be will defined to be a parser for the data. +% +% The parser will check whether the '#2 is expr' key is set. +% Furthermore, it defines /data point/#2 to be the result. +% +% Example: +% \pgfplots@set@source@for{hist/data}{...} +% +% -> +% \pgfplots@prepare@source@parser@for{hist/}{data}\parser +% +% then, invoking \parser +% will define \pgfmathresult to be the argument provided to +% \pgfplots@set@source@for. +\def\pgfplots@prepare@source@parser@for#1#2#3{% + \pgfkeyslet{/data point/#1#2}\pgfutil@empty% + % + \pgfkeysgetvalue{/pgfplots/#1#2 value*}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + % assume the '/data point/#1#2' is set by some input + % routine. + % Invoke math parser in this case. + \pgfkeyssetvalue{/pgfplots/#1#2 is expr}{1}% + \else + \pgfkeyslet{/data point/#1#2}\pgfplots@loc@TMPa + \fi + \def#3{% + \edef\pgfmathresult{\pgfkeysvalueof{/data point/#1#2}} +%\message{parse coordinate #1#2 (\pgfmathresult) ...^^J}% + }% + % + % + \pgfkeysifdefined{/pgfplots/#1#2 coord trafo/.@cmd}{% + \pgfkeysgetvalue{/pgfplots/#1#2 coord trafo/.@cmd}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfplots@empty@command@key + \else + \t@pgfplots@toka=\expandafter{#3}% + \t@pgfplots@tokb={% + \def\pgfplots@loc@TMPa{\pgfkeysvalueof{/pgfplots/#1#2 coord trafo/.@cmd}}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}\pgfeov% + }% + \t@pgfplots@tokc={% + \ifx\pgfmathresult\pgfutil@empty + \else + \pgfmathfloatparsenumber{\pgfmathresult}% + \fi + }% + \edef#3{% + \the\t@pgfplots@toka + \the\t@pgfplots@tokb + \the\t@pgfplots@tokc + }% + \fi + }{}% + % + \t@pgfplots@toka=\expandafter{#3}% + \if1\pgfkeysvalueof{/pgfplots/#1#2 is expr}% + \t@pgfplots@tokc={% + \ifx\pgfmathresult\pgfutil@empty + \else + \pgfmathparse{\pgfmathresult}% + \fi + }% + \else + \t@pgfplots@tokc={% + \ifx\pgfmathresult\pgfutil@empty + \else + \pgfmathfloatparsenumber{\pgfmathresult}% + \fi + }% + \fi + \edef#3{% + \the\t@pgfplots@toka + \the\t@pgfplots@tokc + }% + % + \pgfkeysgetvalue{/pgfplots/#1#2 filter/.@cmd}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfplots@empty@command@key + \else + \t@pgfplots@toka=\expandafter{#3}% + \t@pgfplots@tokb={% + \def\pgfplots@loc@TMPa{\pgfkeysvalueof{/pgfplots/#1#2 filter/.@cmd}}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}\pgfeov% + }% + \t@pgfplots@tokc={% + \ifx\pgfmathresult\pgfutil@empty + \else + \pgfmathfloatparsenumber{\pgfmathresult}% + \fi + }% + \edef#3{% + \the\t@pgfplots@toka + \the\t@pgfplots@tokb + \the\t@pgfplots@tokc + }% + \fi + % + \iftrue + \t@pgfplots@toka=\expandafter{#3}% + \t@pgfplots@tokc={% +%\message{parse coordinate (#1#2) = \pgfmathresult.^^J}% + }% + \edef#3{% + \the\t@pgfplots@toka + \the\t@pgfplots@tokc + }% + \fi +}% + +% Invokes /pgfplots/#1 coord inv trafo on \pgfmathresult if that key +% exists. +% #1 the argument is in float (will become the 'default' coordmath +% eventually). +% +% On output, it should either '#1' if there was no coord inv trafo or +% the result of the trafo. +\def\pgfplots@coord@trafo@inv@for#1{% + \def\pgfplots@loc@TMPb{/pgfplots/#1 coord inv trafo/.@cmd}% + \pgfkeysifdefined{\pgfplots@loc@TMPb}{% + \pgfkeysgetvalue{\pgfplots@loc@TMPb}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfplots@empty@command@key + \else + \pgfmathfloattofixed{\pgfmathresult}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}\pgfeov + \fi + }{}% +} +% Like \pgfplots@coord@trafo@inv@for, but for the normal trafo +% direction +\def\pgfplots@coord@trafo@for#1{% + \def\pgfplots@loc@TMPb{/pgfplots/#1 coord trafo/.@cmd}% + \pgfkeysifdefined{\pgfplots@loc@TMPb}{% + \pgfkeysgetvalue{\pgfplots@loc@TMPb}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfplots@empty@command@key + \else + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}\pgfeov + \fi + }{}% +} +\def\pgfplotsplothandlerquiver{% + \pgfplotsresetplothandler + \let\pgf@plotstreamstart=\pgfplotsplothandlervisbegin@quiver + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@quiver + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@quiver + \let\pgfplotsplothandlerserializepointto=\pgfplotsplothandlerserializepointto@quiver + \let\pgfplotsplothandlerdeserializepointfrom=\pgfplotsplothandlerdeserializepointfrom@quiver + \let\pgfplotsplothandlerquiver@vis@hook=\pgfutil@empty + % + \ifpgfplots@xislinear \else \pgfplotsplothandlerquivererror \fi + \ifpgfplots@yislinear \else \pgfplotsplothandlerquivererror\fi + \pgfplotsifcurplotthreedim{% + \ifpgfplots@zislinear \else \pgfplotsplothandlerquivererror \fi + }{}% +}% +\def\pgfplotsplothandlerquivererror{\pgfplots@error{Sorry, quiver plots for logarithmic axes are not yet implemented. In fact, the implementation does something -- but it will probably change in future releases. Contact the mailing list if you have questions}}% + +\def\pgfplotsplothandlersurveystart@quiver{% + \pgfkeysgetvalue{/pgfplots/quiver/scale arrows}\pgfplots@quiver@scale + \ifx\pgfplots@quiver@scale\pgfutil@empty + \else + \def\pgfplots@loc@TMPa{1}% + \ifx\pgfplots@loc@TMPa\pgfplots@quiver@scale + \let\pgfplots@quiver@scale=\pgfutil@empty + \else + \pgfmathparse{\pgfplots@quiver@scale}% + \pgfmathfloatparsenumber\pgfplots@quiver@scale + \let\pgfplots@quiver@scale=\pgfmathresult + \fi + \fi + % + \pgfplots@prepare@source@parser@for@quiver u\pgfplots@quiver@prepare@u% + \pgfplots@prepare@source@parser@for@quiver v\pgfplots@quiver@prepare@v% + \pgfplots@prepare@source@parser@for@quiver w\pgfplots@quiver@prepare@w% +}% + +\def\pgfplots@prepare@source@parser@for@quiver#1#2{% + \pgfplots@prepare@source@parser@for{quiver/}{#1}{#2}% + \t@pgfplots@toka=\expandafter{#2}% + \t@pgfplots@tokb=\expandafter{\csname pgfplots@quiver@#1\endcsname}% + \edef#2{% + \the\t@pgfplots@toka + \noexpand\let\the\t@pgfplots@tokb=\noexpand\pgfmathresult + \ifx\pgfplots@quiver@scale\pgfutil@empty + \else + \noexpand\pgfmathfloatmultiply@{\pgfplots@quiver@scale}{\the\t@pgfplots@tokb}% + \noexpand\let\the\t@pgfplots@tokb=\noexpand\pgfmathresult + \fi + }% +}% + +\def\pgfplotsplothandlersurveypoint@quiver{% + \pgfplots@quiver@prepare@u + \pgfplots@quiver@prepare@v + \pgfplotsifcurplotthreedim{% + \pgfplots@quiver@prepare@w + }{% + \let\pgfplots@quiver@w=\pgfutil@empty + }% + \pgfplotsaxisparsecoordinate + \pgfplotsaxispreparecoordinate + \ifpgfplotsaxisparsecoordinateok + \pgfplotsaxisupdatelimitsforcoordinate\pgfplots@current@point@x\pgfplots@current@point@y\pgfplots@current@point@z + % + \pgfmathadd@{\pgfplots@quiver@u}{\pgfplots@current@point@x}% + \let\pgfplots@quiver@u=\pgfmathresult + \pgfmathadd@{\pgfplots@quiver@v}{\pgfplots@current@point@y}% + \let\pgfplots@quiver@v=\pgfmathresult + \pgfplotsifcurplotthreedim{% + \pgfmathadd@{\pgfplots@quiver@w}{\pgfplots@current@point@z}% + \let\pgfplots@quiver@w=\pgfmathresult + }{}% + \ifpgfplots@quiver@updatelimits + \pgfplotsaxisupdatelimitsforcoordinate\pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w + \fi + \fi + \pgfplotsaxisdatapointsurveyed +}% +\def\pgfplotsplothandlerserializepointto@quiver#1{% + \edef#1{\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z>\pgfplots@quiver@u,\pgfplots@quiver@v,\pgfplots@quiver@w}% +}% +\def\pgfplotsplothandlerdeserializepointfrom@quiver#1{% + \expandafter\pgfplotsplothandlerdeserializepointfrom@quiver@#1\relax +}% +\def\pgfplotsplothandlerdeserializepointfrom@quiver@#1,#2,#3>#4,#5,#6\relax{% + \def\pgfplots@current@point@x{#1}% + \def\pgfplots@current@point@y{#2}% + \def\pgfplots@current@point@z{#3}% + \def\pgfplots@quiver@u{#4}% + \def\pgfplots@quiver@v{#5}% + \def\pgfplots@quiver@w{#6}% +}% +\def\pgfplotsplothandlervisbegin@quiver{% + \def\pgfplots@quiver@has@handled@point@meta{0}% + \pgfkeysgetvalue{/pgfplots/quiver/arrow color}\pgfplots@quiver@color + \ifx\pgfplots@quiver@color\pgfutil@empty + \else + % prepare the color data and define 'mapped color': + \def\pgfplots@quiver@has@handled@point@meta{1}% + \expandafter\def\expandafter\pgfplotsplothandlerquiver@vis@hook\expandafter{% + \pgfplotsplothandlerquiver@vis@hook + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotscolormapdefinemappedcolor{\pgfplotspointmetatransformed}% + }% + % SEE BELOW AS WELL FOR HOW TO ENABLE THE COLOR. + \fi + % + % + \pgfkeysgetvalue{/pgfplots/quiver/every arrow/.@cmd}\pgfplots@quiver@everyarrow + \ifx\pgfplots@quiver@everyarrow\pgfplots@empty@style@key + % use PGF basic level methods to set the 'arrow color': + \ifx\pgfplots@quiver@color\pgfutil@empty + \else + \expandafter\def\expandafter\pgfplotsplothandlerquiver@vis@hook\expandafter{% + \pgfplotsplothandlerquiver@vis@hook + \pgfsetstrokecolor{\pgfkeysvalueof{/pgfplots/quiver/arrow color}}% + % for arrow heads: + \pgfsetfillcolor{\pgfkeysvalueof{/pgfplots/quiver/arrow color}}% + }% + \fi + \else + % 'every arrow' should provide a high level user interface. + % Use tikz instead of pgf. This is slower, but more powerfull. + \pgfplots@quiver@usetikztrue + \pgfplotsaxisifhaspointmeta{% + % ASSERT(mapped color is available) + \if0\pgfplots@quiver@has@handled@point@meta% + % -> define mapped color + \expandafter\def\expandafter\pgfplotsplothandlerquiver@vis@hook\expandafter{% + \pgfplotsplothandlerquiver@vis@hook + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotscolormapdefinemappedcolor{\pgfplotspointmetatransformed}% + }% + \def\pgfplots@quiver@has@handled@point@meta{1}% + \fi + }{}% + % use tikz methods to set the 'arrow color': + \ifx\pgfplots@quiver@color\pgfutil@empty + \else + \t@pgfplots@toka=\expandafter{\pgfplots@quiver@color}% + \edef\pgfplots@loc@TMPa{\noexpand\pgfkeysalso{/pgfplots/quiver/every arrow/.prefix style={\the\t@pgfplots@toka}}}% + \pgfplots@loc@TMPa + \fi + \fi + % + \global\let\pgf@plotstreampoint=\pgfplotsplothandlerquiver@vis% + \global\let\pgf@plotstreamspecial=\pgfutil@gobble% + \global\let\pgf@plotstreamend=\relax +}% + +\def\pgfplotsplothandlerquiver@vis#1{% + \pgfkeysvalueof{/pgfplots/quiver/before arrow/.@cmd}\pgfeov + \pgfplotsplothandlerquiver@vis@hook + \ifpgfplots@quiver@usetikz + \draw[/pgfplots/quiver/every arrow] \pgfextra{\pgfplotsplothandlerquiver@vis@path{#1}}; + \else + \pgfplotsplothandlerquiver@vis@path{#1}% + \pgfusepath{stroke}% + \fi + \pgfkeysvalueof{/pgfplots/quiver/after arrow/.@cmd}\pgfeov +}% +\def\pgfplotsplothandlerquiver@vis@path#1{% + \pgfpathmoveto{#1}% + \pgfplotsaxisvisphasetransformcoordinate\pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w + \pgfpathlineto{% + \pgfplotsifcurplotthreedim{% + \pgfplotsqpointxyz\pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w + }{% + \pgfplotsqpointxy\pgfplots@quiver@u\pgfplots@quiver@v + }% + }% +}% + +\newif\ifpgfplotsplothandlerhistogram@intervals +\newif\ifpgfplotsplothandlerhistogram@cumulative +\pgfplotsset{ + hist/.code={% + \let\tikz@plot@handler=\pgfplotsplothandlerhistogram + \pgfqkeys{/pgfplots/hist}{#1}% + }, + hist/data value/.code =\pgfplots@set@source@for{hist/data}{#1}{0},% + hist/data/.code =\pgfplots@set@source@for{hist/data}{#1}{1},% + hist/data filter/.code=, + hist/data value=\pgfkeysvalueof{/data point/y}, +% hist/data=y, + hist/data min/.initial=\pgfkeysvalueof{/pgfplots/xmin}, + hist/data max/.initial=\pgfkeysvalueof{/pgfplots/xmax}, + hist/bins/.initial=10, + hist/intervals/.is if=pgfplotsplothandlerhistogram@intervals, + hist/intervals/.default=true, + hist/intervals=true, + hist/cumulative/.is if=pgfplotsplothandlerhistogram@cumulative, + hist/cumulative/.default=true, + hist/handler/.style={/tikz/ybar interval}, + hist/symbolic coords/.style={% + /pgfplots/symbolic coords={hist/data}{A,B,C,D,E,F,G,H,I,J}, + /pgfplots/symbolic coords={x}{A,B,C,D,E,F,G,H,I,J}, + },% +}% +\def\pgfplotsplothandlerhistogram{% + \pgfplotsresetplothandler + \def\pgf@plotstreamstart{% + \pgfplotsset{/pgfplots/hist/handler}% + \pgfplotsresetplothandler + \tikz@plot@handler + \pgf@plotstreamstart + }% + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@hist + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@hist + \let\pgfplotsplothandlersurveyend=\pgfplotsplothandlersurveyend@hist +}% +\def\pgfplotsplothandlersurveystart@hist{% + \pgfplots@prepare@source@parser@for{hist/}{data}{\pgfplotsplothandlerhistogram@parse}% + % + \pgfkeysgetvalue{/pgfplots/hist/data min}\pgfmathresult + \edef\pgfmathresult{\pgfmathresult}% + \ifx\pgfmathresult\pgfutil@empty\else + \pgfplots@coord@trafo@for{hist/data}% + \fi + \edef\pgfplotsplothandlerhistogram@datamin{\pgfmathresult}% + % + \pgfkeysgetvalue{/pgfplots/hist/data max}\pgfmathresult + \edef\pgfmathresult{\pgfmathresult}% + \ifx\pgfmathresult\pgfutil@empty\else + \pgfplots@coord@trafo@for{hist/data}% + \fi + \edef\pgfplotsplothandlerhistogram@datamax{\pgfmathresult}% + % + \ifx\pgfplotsplothandlerhistogram@datamin\pgfutil@empty + \pgfmathfloatcreate{1}{1.0}{2147483645}% + \let\pgfplotsplothandlerhistogram@datamin=\pgfmathresult + \def\pgfplotsplothandlerhistogram@datamin@autocompute{1}% + \else + \pgfmathfloatparsenumber{\pgfplotsplothandlerhistogram@datamin}% + \let\pgfplotsplothandlerhistogram@datamin=\pgfmathresult + \def\pgfplotsplothandlerhistogram@datamin@autocompute{0}% + \fi + \ifx\pgfplotsplothandlerhistogram@datamax\pgfutil@empty + \pgfmathfloatcreate{2}{1.0}{2147483645}% + \let\pgfplotsplothandlerhistogram@datamax=\pgfmathresult + \def\pgfplotsplothandlerhistogram@datamax@autocompute{1}% + \else + \pgfmathfloatparsenumber{\pgfplotsplothandlerhistogram@datamax}% + \let\pgfplotsplothandlerhistogram@datamax=\pgfmathresult + \def\pgfplotsplothandlerhistogram@datamax@autocompute{0}% + \fi + % + \edef\pgfplotsplothandlerhistogram@Nfixed{\pgfkeysvalueof{/pgfplots/hist/bins}}% + \c@pgf@counta=\pgfplotsplothandlerhistogram@Nfixed\relax + \advance\c@pgf@counta by-1 + \edef\pgfplotsplothandlerhistogram@Nmax{\the\c@pgf@counta}% + % + \pgfmathfloatparsenumber{\pgfplotsplothandlerhistogram@Nfixed}% + \let\pgfplotsplothandlerhistogram@N=\pgfmathresult + % + \pgfplotsapplistXnewempty\pgfp@hist@@ + \def\c@pgfplotsplothandlerhistogram@num{0}% + \c@pgfplots@coordindex=0 +}% + +\def\pgfplotsplothandlersurveypoint@hist@limits{% + \if1\pgfplotsplothandlerhistogram@datamin@autocompute + \pgfplotsmathfloatmin{\pgfplots@current@point@data}{\pgfplotsplothandlerhistogram@datamin}% + \let\pgfplotsplothandlerhistogram@datamin=\pgfmathresult + \fi + % + \if1\pgfplotsplothandlerhistogram@datamax@autocompute + \pgfplotsmathfloatmax{\pgfplots@current@point@data}{\pgfplotsplothandlerhistogram@datamax}% + \let\pgfplotsplothandlerhistogram@datamax=\pgfmathresult + \fi +}% +\def\pgfplotsplothandlersurveypoint@hist{% + % Note that at this point, the coordinate filtering does NOT + % apply. Perhaps it should... + \pgfplotsplothandlerhistogram@parse + \let\pgfplots@current@point@data=\pgfmathresult + % + \ifx\pgfplots@current@point@data\pgfutil@empty + \else + \pgfmathfloatiffinite\pgfplots@current@point@data{% + \pgfplotsplothandlersurveypoint@hist@limits + % + \pgfplotsutil@advancestringcounter\c@pgfplotsplothandlerhistogram@num + % + % store parsed result. + \edef\pgfmathresult{{\pgfplots@current@point@data}}% + \expandafter\pgfplotsapplistXpushback\expandafter{\pgfmathresult}\to\pgfp@hist@@ + }{% + }% + \fi + \advance\c@pgfplots@coordindex by1 +}% +\def\pgfplotsplothandlersurveyend@hist{% + \ifnum\c@pgfplotsplothandlerhistogram@num>0 + \expandafter\pgfplotsplothandlersurveyend@hist@ + \fi +}% +\def\pgfplotsplothandlersurveyend@hist@{% + \pgfmathfloatsubtract@{\pgfplotsplothandlerhistogram@datamax}{\pgfplotsplothandlerhistogram@datamin}% + \let\pgfplotsplothandlerhistogram@range=\pgfmathresult + \pgfmathfloatdivide@{\pgfplotsplothandlerhistogram@range}{\pgfplotsplothandlerhistogram@N}% + \let\pgfplotsplothandlerhistogram@h=\pgfmathresult + \pgfmathfloatreciprocal@{\pgfplotsplothandlerhistogram@h}% + \let\pgfplotsplothandlerhistogram@invh=\pgfmathresult + % + \pgfplotsarraynewempty{pgfp@hist}% + \pgfplotsarrayresize{pgfp@hist}{\pgfplotsplothandlerhistogram@Nfixed}% + \pgfplotsarrayforeachungrouped{pgfp@hist}\as\pgfplots@hist@count{% + \pgfplotsarrayset{\pgfplotsarrayforeachindex}\of{pgfp@hist}\to{0}% + }% + % + \pgfplotsapplistXlet\pgfplots@hist@data=\pgfp@hist@@ + \pgfplotsapplistXnewempty\pgfp@hist@@ + \expandafter\pgfplotsplothandlersurveyend@hist@loop\pgfplots@hist@data\pgfplots@EOI + \let\pgfplots@hist@data=\relax + % + \ifpgfplotsplothandlerhistogram@cumulative + \c@pgf@counta=0 + \pgfplotsarrayforeachungrouped{pgfp@hist}\as\pgfplots@hist@count{% + \advance\c@pgf@counta by\pgfplots@hist@count\relax + \def\pgfplots@loc@TMPa{\pgfplotsarrayset{\pgfplotsarrayforeachindex}\of{pgfp@hist}\to}% + \expandafter\pgfplots@loc@TMPa\expandafter{\the\c@pgf@counta}% + }% + \fi + % + \pgfplots@curplot@threedimfalse + % + \pgfplotsset{/pgfplots/hist/handler}% + \pgfplotsresetplothandler + \tikz@plot@handler + % + \pgfplotsplothandlersurveystart + % + \let\pgfplots@current@point@z=\pgfutil@empty + \pgfplotsarrayforeachungrouped{pgfp@hist}\as\pgfplots@hist@count{% + \pgfplotsplothandlerhistgetintervalstartfor\pgfplotsarrayforeachindex + \pgfplotsplothandlerhist@invtrafo + \let\pgfplots@current@point@x\pgfmathresult% + \let\pgfplots@current@point@y\pgfplots@hist@count% +%\message{Survey point (\pgfplots@current@point@x,\pgfplots@current@point@y)^^J}% + \pgfplotsplothandlersurveypoint + }% + \ifpgfplotsplothandlerhistogram@intervals + % replicate last count. + \let\pgfmathresult\pgfplotsplothandlerhistogram@datamax% + \pgfplotsplothandlerhist@invtrafo + \let\pgfplots@current@point@x\pgfmathresult% + \let\pgfplots@current@point@y\pgfplots@hist@count% +%\message{Survey point (\pgfplots@current@point@x,\pgfplots@current@point@y)^^J}% + \pgfplotsplothandlersurveypoint + \fi + % + \pgfplotsplothandlersurveyend +} +\def\pgfplotsplothandlerhist@invtrafo{% + % This here might be inefficient, because + % there needs to be a compatible "x coord trafo" as well -- and + % that transformation will (most likely) do the very same thing as + % the hist/data coord trafo. + % + % But I did not find a way to combine the transformations + % automatically without resorting to hackery. + % + % And: the performance impact might (hopefully) be small... + \pgfplots@coord@trafo@inv@for{hist/data}% +}% +\def\pgfplotsplothandlersurveyend@hist@loop#1{% + \def\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfplots@EOI + \else + \pgfplotsplothandlerhistgetbinfor@{#1}% + \expandafter\pgfplotsplothandlerhistadvancebin\expandafter{\pgfmathresult}% + % + \expandafter\pgfplotsplothandlersurveyend@hist@loop + \fi +}% +\def\pgfplotsplothandlerhistadvancebin#1{% + \pgfplotsarrayselect{#1}\of{pgfp@hist}\to\pgfplots@loc@TMPa% + \pgfplotsutil@advancestringcounter\pgfplots@loc@TMPa + \pgfplotsarrayletentry{#1}\of{pgfp@hist}=\pgfplots@loc@TMPa +}% +\def\pgfplotsplothandlerhistgetintervalstartfor#1{% + \pgfmathfloatparsenumber{#1}% + \expandafter\pgfplotsplothandlerhistgetintervalstartfor@\expandafter{\pgfmathresult}% +}% +\def\pgfplotsplothandlerhistgetintervalstartfor@#1{% + \pgfmathfloatmultiply@{\pgfplotsplothandlerhistogram@h}{#1}% + \expandafter\pgfmathfloatadd@\expandafter{\pgfmathresult}{\pgfplotsplothandlerhistogram@datamin}% +}% +\def\pgfplotsplothandlerhistgetbinfor#1{% + \pgfmathfloatparsenumber{#1}% + \expandafter\pgfplotsplothandlerhistgetbinfor@\expandafter{\pgfmathresult}% +}% + +\def\pgfplotsplothandlerhistsettol#1{% + \begingroup + \pgfmathfloatparsenumber{#1}% + \global\let\pgfplotsplothandlerhisttol@parsed=\pgfmathresult + \endgroup +}% +\pgfplotsplothandlerhistsettol{1e-4}% + +\def\pgfplotsplothandlerhistgetbinfor@#1{% + \pgfmathfloatsubtract@{#1}{\pgfplotsplothandlerhistogram@datamin}% + \expandafter\pgfmathfloatmultiply@\expandafter{\pgfmathresult}{\pgfplotsplothandlerhistogram@invh}% + \expandafter\pgfmathfloatadd@\expandafter{\pgfmathresult}{\pgfplotsplothandlerhisttol@parsed}% + \pgfmathfloattofixed{\pgfmathresult}% + \afterassignment\pgfplots@gobble@until@relax + \c@pgf@counta=\pgfmathresult\relax + \ifnum\pgfplotsplothandlerhistogram@Nfixed>\c@pgf@counta + \ifnum\c@pgf@counta<0 + \def\pgfmathresult{0}% + \else + \def\pgfmathresult{\the\c@pgf@counta}% + \fi + \else + \let\pgfmathresult=\pgfplotsplothandlerhistogram@Nmax + \fi +}% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +% +% Contour plots +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 + +\newif\ifpgfplotsplothandlercontour@labels +\newif\ifpgfplotsplothandlercontour@filled + +\pgfplotsset{ + contour prepared/.code={% + \let\tikz@plot@handler=\pgfplotsplothandlercontourprepared + \pgfqkeys{/pgfplots/contour}{% + #1,% + }% + }, + contour prepared filled/.style={% + /pgfplots/contour prepared={draw color=mapped color!80!black,labels=false,filled=true}, + }, + % FIXME : should use \tikz@plot@handler instead of just the + % visualization thing! + contour/handler/.style={/tikz/sharp plot}, + contour prepared format/.is choice, + contour prepared format/standard/.code= {\def\pgfplotsplothandlercontourprepared@format{s}}, + contour prepared format/matlab/.code= {\def\pgfplotsplothandlercontourprepared@format{m}}, + contour prepared format/standard, + contour/draw color/.initial=mapped color, + contour/fill color/.initial=mapped color, + contour/label distance/.initial=70pt, + contour/label node code/.code={% + \node {\pgfmathprintnumber{#1}}; + },% + contour/labels/.is if=pgfplotsplothandlercontour@labels, + contour/labels=true, + contour/filled/.is if=pgfplotsplothandlercontour@filled, + contour/filled/.default=true, + contour/data limits/.initial=,% FIXME EXPERIMENTAL + contour/every contour label/.style={% + sloped,% + transform shape,% + inner sep=2pt, + font=\scriptsize, + every node/.style={mapped color!50!black,fill=white},% + /pgf/number format/relative={\pgfplotspointmetarangeexponent},% + %every node/.style={yshift=10pt},% + }, + contour/labels over line/.style={ + /pgfplots/contour/every contour label/.append style={% + every node/.append style={% + fill=none, + anchor=base, + yshift=1pt, + }, + }, + }, + contour/contour label style/.style={ + /pgfplots/contour/every contour label/.append style={#1}}, + % + % + % Styles to actually *compute* the contour. + % These are mostly placeholders here: As long as the + % algorithm is not ready, we have to resort to external tools. + % + % Shared parameters: + contour/number/.initial=5, + % + % + % Interface to external tools: + contour external/.code={% + \edef\tikz@plot@handler{\noexpand\pgfplotsplothandlercontourexternal}% + \pgfqkeys{/pgfplots/contour external}{#1}% + }, + contour external/scanline marks/.is choice, + contour external/scanline marks/false/.code={\def\pgfplotsplothandlercontourexternal@scanlinemode{0}}, + contour external/scanline marks/if in input/.code={\def\pgfplotsplothandlercontourexternal@scanlinemode{1}}, + contour external/scanline marks/required/.code={\def\pgfplotsplothandlercontourexternal@scanlinemode{2}}, + contour external/scanline marks/true/.code={\def\pgfplotsplothandlercontourexternal@scanlinemode{2}}, + contour external/scanline marks/if in input, + contour external/file/.initial=,% auto-generate + contour external/script extension/.initial=script, + contour external/script/.initial=,% not yet initialised + contour external/cmd/.initial=,% not yet initialised + contour external/.search also=/pgfplots/contour, + contour gnuplot/.style={ + contour external={% + scanline marks=required, + script={unset surface; set cntrparam levels \pgfkeysvalueof{/pgfplots/contour/number}; set contour; set table \"\outfile\"; splot \"\infile\";}, + cmd={gnuplot \"\script\"}, + #1,% + }, + }, +}% +\def\pgfplotsplothandlercontourprepared{% + \pgfplotsresetplothandler + \pgfplotsset{empty line=jump}% + \let\pgf@plotstreamstart=\pgfplotsplothandlervisstart@contour + \let\pgfplotsplothandlersurveyend=\pgfplotsplothandlersurveyend@contour + \if m\pgfplotsplothandlercontourprepared@format + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@contourmatlabformat + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@contourmatlabformat + \pgfplotsaxisifhaspointmeta{}{% + \pgfplotsset{/pgfplots/point meta=explicit}% + }% + \fi + \pgfplotsplothandlercontour@prepare@point@meta +}% +\def\pgfplotsplothandlercontour@prepare@point@meta{% + \ifpgfplots@curplot@threedim + \pgfplotsset{/pgfplots/set point meta if empty=z}% + \else + \pgfplotsaxisifhaspointmeta{}{% + \pgfkeysgetvalue{/pgfplots/table/meta index}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty +% FIXME : this here is reasonable, but it should be sanity checked! + \pgfkeyssetvalue{/pgfplots/table/meta index}{2}% + \fi + \pgfplotsset{/pgfplots/set point meta if empty=explicit}% + }% + %\pgfplots@error{Sorry, 'contour external' requires \string\addplot3 (or a non-empty `point meta' used as label data)}% + \fi + \def\pgfplotsplothandlercontour@empty@pointmeta@error@@{0}% +}% +\def\pgfplotsplothandlercontour@empty@pointmeta@error{% + \if0\pgfplotsplothandlercontour@empty@pointmeta@error@@ + \def\pgfplotsplothandlercontour@empty@pointmeta@error@@{1}% + \def\pgfplots@current@point@meta{0}% + \pgfplotsthrow{invalid argument}{\pgfplots@current@point@meta}{Sorry, contour plots require non--empty `point meta'. Please use '\string\addplot3[contour ...] together with 'view={0}{90}' or provide a valid 'point meta=<value>' (for example `<value>=z'?)}\pgfeov% + \fi +}% + +\def\pgfplotsplothandlersurveystart@contourmatlabformat{% + \def\c@pgfplotsplothandlercontourprepared@matlabformat@cur{0}% + \def\c@pgfplotsplothandlercontourprepared@matlabformat@count{0}% +} +\def\pgfplotsplothandlersurveypoint@contourmatlabformat{% + \ifnum\c@pgfplotsplothandlercontourprepared@matlabformat@cur=\c@pgfplotsplothandlercontourprepared@matlabformat@count\relax + \pgfmathfloatparsenumber{\pgfplots@current@point@y}% + \pgfmathfloattoint\pgfmathresult + \let\c@pgfplotsplothandlercontourprepared@matlabformat@count=\pgfmathresult + \def\c@pgfplotsplothandlercontourprepared@matlabformat@cur{0}% + % + \pgfmathfloatparsenumber{\pgfplots@current@point@x}% + \let\pgfplotsplothandlercontourprepared@matlabformat@meta=\pgfmathresult + % + \else + \let\pgfplots@current@point@z=\pgfplotsplothandlercontourprepared@matlabformat@meta + \let\pgfplots@current@point@meta=\pgfplotsplothandlercontourprepared@matlabformat@meta + \pgfplotsplothandlersurveypoint@default + \pgfplotsutil@advancestringcounter\c@pgfplotsplothandlercontourprepared@matlabformat@cur + \fi +}% +\def\pgfplotsplothandlersurveyend@contour{% + \pgfplotsplothandlercontour@init@limits + \ifx\pgfplotsplothandlercontour@limits@low@meta\pgfutil@empty + \else + \pgfplotsaxisupdatelimitsforpointmeta\pgfplotsplothandlercontour@limits@low@meta + \fi +}% + +\def\pgfplotsplothandlervisstart@contour{% + % + \ifpgfplotsplothandlercontour@labels + \pgfkeysgetvalue{/pgfplots/contour/label distance}\pgfplotsplothandlercontour@labeldist + \pgfmathparse{\pgfplotsplothandlercontour@labeldist}% + \edef\pgfplotsplothandlercontour@labeldist{\pgfmathresult pt}% + % + \pgfplotsapplistXnewempty\pgfplotsplothandlercontour@storedlabels + \let\pgfplotsplothandlercontour@handlesplinesegment=\pgfplotsplothandlercontour@handlesplinesegment@forlabels + \else + \def\pgfplotsplothandlercontour@handlesplinesegment##1##2##3{}% + \fi + % + \ifpgfplotsplothandlercontour@filled + \pgfseteorule + \pgfplotsapplistXnewempty\pgfplotsplothandlercontour@stored@lastcontourpath + \pgfplotsplothandlercontour@init@limits + \fi + % + \pgfplotsresetplothandler + \pgfplotsset{/pgfplots/contour/handler}% + \tikz@plot@handler + % + \def\pgfplotsplothandlercontour@haspendingjump{0}% + \let\pgfplotsplothandlervisualizejump=\pgfplotsplothandlercontour@jump + % + \let\pgfplotsplothandlercontour@handler@start=\pgf@plotstreamstart + \let\pgfplotsplothandlercontour@lastcontour=\pgfutil@empty + \global\let\pgf@plotstreampoint=\pgfplotsplothandlercontour@streampoint + \global\let\pgf@plotstreamend=\pgfplotsplothandlercontour@streamend +}% + +\def\pgfplotsplothandlercontour@jump{% + \def\pgfplotsplothandlercontour@haspendingjump{1}% +}% + +\def\pgfplotsplothandlercontour@streamend{% + \ifx\pgfplotsplothandlercontour@lastcontour\pgfutil@empty + \else + % + \def\pgfplotsplothandlercontour@haspendingjump{0}% important! (this is a different case than a jump) + \pgfplotsplothandlercontour@finishcontourline + % + \ifpgfplotsplothandlercontour@filled + \if0\pgfplotsplothandlercontour@processed@outer + \pgfplotsplothandlercontour@stream@bbcontour + \pgfplotsplothandlercontour@finishcontourline + \fi + \fi + % + \ifpgfplotsplothandlercontour@labels + \scope[/pgfplots/contour/every contour label] + \let\pgfplots@restore@drawmodes=\relax% FIXME : necessary? + \pgfplotsapplistXlet\pgfplotsplothandlercontour@storedlabels@=\pgfplotsplothandlercontour@storedlabels + \pgfplotsapplistXnewempty\pgfplotsplothandlercontour@storedlabels + \expandafter\pgfplotsplothandlercontourplacelabels\pgfplotsplothandlercontour@storedlabels@\pgfplots@EOI + \endscope + \fi + \fi +}% +\def\pgfplotsplothandlercontour@check@bbcontour{% + \ifpgfplotsplothandlercontour@filled + \if0\pgfplotsplothandlercontour@processed@outer + \pgfplotscoordmath{meta}{if less than} + {\pgfplotsplothandlercontour@act@contour} + {\pgfplotsplothandlercontour@limits@low@meta} + {% + % TRUE! + \pgfplotsplothandlercontour@stream@bbcontour@inbetween + }{}% + \fi + \fi +}% +\def\pgfplotsplothandlercontour@stream@bbcontour@inbetween{% + \def\pgfplotsplothandlercontour@processed@outer{1}% +}% + +\def\pgfplotsplothandlercontour@stream@bbcontour{% +%\message{contour: processing OUTER data limit contour...}% + \def\pgfplotsplothandlercontour@haspendingjump{0}% important + % + % forbid labels: + \let\pgfplotsplothandlercontour@stream@bbcontour@oldlabelsetting=\pgfplotsplothandlercontour@handlesplinesegment + \def\pgfplotsplothandlercontour@handlesplinesegment##1##2##3{}% + % + \let\pgfplots@current@point@meta=\pgfplotsplothandlercontour@limits@low@meta + \pgfplotsplothandlercontour@streampoint{% + \pgfplotsplothandlerpointxyz + \pgfplotsplothandlercontour@limits@low@x + \pgfplotsplothandlercontour@limits@low@y + \pgfplotsplothandlercontour@limits@low@z + }% + \pgfplotsplothandlercontour@streampoint{% + \pgfplotsplothandlerpointxyz + \pgfplotsplothandlercontour@limits@high@x + \pgfplotsplothandlercontour@limits@low@y + \pgfplotsplothandlercontour@limits@low@z + }% + \pgfplotsplothandlercontour@streampoint{% + \pgfplotsplothandlerpointxyz + \pgfplotsplothandlercontour@limits@high@x + \pgfplotsplothandlercontour@limits@high@y + \pgfplotsplothandlercontour@limits@low@z + }% + \pgfplotsplothandlercontour@streampoint{% + \pgfplotsplothandlerpointxyz + \pgfplotsplothandlercontour@limits@low@x + \pgfplotsplothandlercontour@limits@high@y + \pgfplotsplothandlercontour@limits@low@z + }% + \pgfplotsplothandlercontour@streampoint{% + \pgfplotsplothandlerpointxyz + \pgfplotsplothandlercontour@limits@low@x + \pgfplotsplothandlercontour@limits@low@y + \pgfplotsplothandlercontour@limits@low@z + }% + \def\pgfplotsplothandlercontour@processed@outer{1}% + % + % restore labels: + \let\pgfplotsplothandlercontour@handlesplinesegment=\pgfplotsplothandlercontour@stream@bbcontour@oldlabelsetting +}% +\def\pgfplotsplothandlercontourplacelabels#1{% + \def\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfplots@EOI + \else + % + \pgfplotsplothandlercontourplacelabels@act#1\relax + % + \expandafter\pgfplotsplothandlercontourplacelabels + \fi +}% +\def\pgfplotsplothandlercontourplacelabels@act#1,#2;#3,#4;#5\relax{% + \begingroup + \def\pgfplots@current@point@meta{#5}% + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotscolormapdefinemappedcolor{\pgfplotspointmetatransformed}% + % + \pgftransformlineattime{0.5}{\pgfqpoint{#1}{#2}}{\pgfqpoint{#3}{#4}}% + \pgfkeysvalueof{/pgfplots/contour/label node code/.@cmd}#5\pgfeov + \endgroup +}% + +\def\pgfplotsplothandlercontour@streampoint#1{% + \pgf@process{#1}% + % remember point: + \edef\pgfplotsplothandlercontour@act@canvas{\pgf@x=\the\pgf@x\space\pgf@y=\the\pgf@y\space}% + % + \let\pgfplotsplothandlercontour@act@contour=\pgfplots@current@point@meta + \ifx\pgfplotsplothandlercontour@act@contour\pgfutil@empty + % oh. No Z data!? That should not happen! + \pgfplotsplothandlercontour@empty@pointmeta@error + \fi + \ifx\pgfplotsplothandlercontour@lastcontour\pgfutil@empty + % oh. its the very first point. + \def\pgfplotsplothandlercontour@haspendingjump{0}% important! (this is a different case than a jump) + \pgfplotsplothandlercontour@preparenewcontourline + \else + \ifx\pgfplotsplothandlercontour@lastcontour\pgfplotsplothandlercontour@act@contour + % belongs to the same contour. + \if1\pgfplotsplothandlercontour@haspendingjump + \pgfplotsplothandlercontour@finishcontourline + \pgfplotsplothandlercontour@preparenewcontourline + \fi + \else + % oh, a new contour line. + \def\pgfplotsplothandlercontour@haspendingjump{0}% important! (this is a different case than a jump) + \pgfplotsplothandlercontour@finishcontourline + \pgfplotsplothandlercontour@check@bbcontour + \pgfplotsplothandlercontour@preparenewcontourline + \fi + \fi + % + % + % handle difference vector for label placement: + \ifx\pgfplotsplothandlercontour@lastcanvas\pgfutil@empty + \else + \pgfplotsplothandlercontour@handlesplinesegment + {\pgfplotsplothandlercontour@lastcanvas} + {\pgfplotsplothandlercontour@act@canvas}% + {\pgfplotsplothandlercontour@act@contour}% + \fi + % + \pgfplotsplothandlercontour@handler@streampoint{\pgfplotsplothandlercontour@act@canvas}% + \let\pgfplotsplothandlercontour@lastlastcanvas=\pgfplotsplothandlercontour@lastcanvas + \let\pgfplotsplothandlercontour@lastcanvas=\pgfplotsplothandlercontour@act@canvas + \let\pgfplotsplothandlercontour@lastcontour=\pgfplotsplothandlercontour@act@contour + % + \ifpgfplotsplothandlercontour@filled + \t@pgfplots@toka=\expandafter{\expandafter{\pgfplotsplothandlercontour@act@canvas}}% + \expandafter\pgfplotsapplistXpushback\expandafter\pgf@plotstreampoint\the\t@pgfplots@toka + \to\pgfplotsplothandlercontour@stored@lastcontourpath + \fi + % + \ifx\pgf@plotstreampoint\pgfplotsplothandlercontour@streampoint + \else + \let\pgfplotsplothandlercontour@handler@streampoint=\pgf@plotstreampoint + \fi + \global\let\pgf@plotstreampoint=\pgfplotsplothandlercontour@streampoint + \global\let\pgf@plotstreamend=\pgfplotsplothandlercontour@streamend + % ATTENTION : if the low level plot handler introduces extra + % levels of scopes, this *will* fail! +}% + +% +% #1 : source +% #2 : target +% #3 : contour value +\def\pgfplotsplothandlercontour@handlesplinesegment@forlabels#1#2#3{% + #2% + \pgf@xb=\pgf@x + \pgf@yb=\pgf@y + #1% + \pgf@xc=\pgf@x + \pgf@yc=\pgf@y + \pgfpointdiff + {\pgf@x=\pgf@xc \pgf@y=\pgf@yc} + {\pgf@x=\pgf@xb \pgf@y=\pgf@yb}% + \edef\pgfplots@loc@TMPa{{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}}% + \expandafter\pgfmath@basic@veclen@\pgfplots@loc@TMPa + \pgf@xa=\pgfmathresult pt + % + \advance\pgf@xa by\pgfplotsplothandlercontour@len\relax + \edef\pgfplotsplothandlercontour@len{\the\pgf@xa}% +%\message{contour(\pgfplotsplothandlercontour@act@contour): cur len=\pgfplotsplothandlercontour@len > \pgfplotsplothandlercontour@labeldist ? [segment from #1--#2];}% + \ifdim\pgf@xa>\pgfplotsplothandlercontour@labeldist\relax + \def\pgfplotsplothandlercontour@haslabel{1}% + \edef\pgfplots@loc@TMPa{{\the\pgf@xc,\the\pgf@yc;\the\pgf@xb,\the\pgf@yb;{#3}}}% + \expandafter\pgfplotsapplistXpushback\expandafter{\pgfplots@loc@TMPa}\to\pgfplotsplothandlercontour@storedlabels + \advance\pgf@xa by-\pgfplotsplothandlercontour@labeldist\relax + \edef\pgfplotsplothandlercontour@len{\the\pgf@xa\relax}% + \fi +}% + + +\def\pgfplotsplothandlercontour@preparenewcontourline{% + \if0\pgfplotsplothandlercontour@haspendingjump +%\message{PREPARE NEW CONTOUR LEVEL (\pgfplots@current@point@meta).}% + % a completely new level has been + % started, not due to jumps inside of one level. + % + % thus, we need to compute 'mapped color': + \pgfplotsaxisvisphasetransformpointmeta + \pgfplotscolormapdefinemappedcolor{\pgfplotspointmetatransformed}% + \pgfsetstrokecolor{\pgfkeysvalueof{/pgfplots/contour/draw color}}% + \ifpgfplotsplothandlercontour@filled + \pgfsetfillcolor{\pgfkeysvalueof{/pgfplots/contour/fill color}}% + \fi + % + % furthermore, we need to handle the 'filled' style: + \ifpgfplotsplothandlercontour@filled + \pgfplotsapplistXlet\pgfplotsplothandlercontour@stored@lastcontourpath@=\pgfplotsplothandlercontour@stored@lastcontourpath + % flush: + \pgfplotsapplistXnewempty\pgfplotsplothandlercontour@stored@lastcontourpath + % + % process it: + \ifx\pgfplotsplothandlercontour@stored@lastcontourpath@\pgfutil@empty + % oh. This here is the very first contour. Nothing to do! + \else + % ok. This here is the i'th contour level, i>0. + % Thus, we have the 'i-1'th contour stored. + % REPLICATE its path to fill the space between the (i-1)'th contour and the i'th one! + \let\pgf@plotstreamstart=\pgfplotsplothandlercontour@handler@start + \pgf@plotstreamstart + \pgfplotsplothandlercontour@stored@lastcontourpath@ + \pgf@plotstreamend + \fi + \fi + \else +%\message{PREPARE NEW CONTOUR for the already begun level \pgfplots@current@point@meta.}% + \ifpgfplotsplothandlercontour@filled + \pgfplotsapplistXpushback\pgf@plotstreamstart\to\pgfplotsplothandlercontour@stored@lastcontourpath + \fi + \fi + % + \let\pgfplotsplothandlercontour@lastcanvas=\pgfutil@empty + \let\pgfplotsplothandlercontour@lastlastcanvas=\pgfutil@empty + \ifpgfplotsplothandlercontour@labels + \def\pgfplotsplothandlercontour@haslabel{0}% + % + % this here means that 20% of labeldist are already there. + % it moves the first label nearer to its start. + \pgf@xa=\pgfplotsplothandlercontour@labeldist\relax + \pgf@xa=0.2\pgf@xa + \edef\pgfplotsplothandlercontour@len{\the\pgf@xa}% + \fi + \def\pgfplotsplothandlercontour@haspendingjump{0}% + % + \pgfplotsplothandlercontour@handler@start + \let\pgfplotsplothandlercontour@handler@end=\pgf@plotstreamend + \let\pgfplotsplothandlercontour@handler@streampoint=\pgf@plotstreampoint +}% +\def\pgfplotsplothandlercontour@finishcontourline{% + \ifpgfplotsplothandlercontour@labels + \if0\pgfplotsplothandlercontour@haslabel + \ifx\pgfplotsplothandlercontour@lastlastcanvas\pgfutil@empty + \else + % force a label: +%\message{FORCING A LABEL for contour \pgfplotsplothandlercontour@lastcontour\space from (\pgfplotsplothandlercontour@lastlastcanvas --\pgfplotsplothandlercontour@lastcanvas)}% + \edef\pgfplotsplothandlercontour@len{\pgfplotsplothandlercontour@labeldist}% + \pgfplotsplothandlercontour@handlesplinesegment + {\pgfplotsplothandlercontour@lastlastcanvas} + {\pgfplotsplothandlercontour@lastcanvas}% + {\pgfplotsplothandlercontour@lastcontour}% + \fi + \fi + \fi + \pgfplotsplothandlercontour@handler@end + % +% \ifpgfplotsplothandlercontour@filled +% \pgfpathclose % FIXME this is, in general, not good enough. +% \fi + \if0\pgfplotsplothandlercontour@haspendingjump +%\message{usepath{} to finalize level \pgfplotsplothandlercontour@lastcontour.}% + % flush paths if the complete contour level is ready. + % do *not* flush paths if we have just a new part of the + % existing contour level. + % + % This makes a difference for the filled contour. + \ifpgfplotsplothandlercontour@filled + \pgfusepath{fill,stroke}% + \else + \pgfusepath{stroke}% + \fi + \else +%\message{usepath{} for level \pgfplotsplothandlercontour@lastcontour.}% + \ifpgfplotsplothandlercontour@filled + \pgfplotsapplistXpushback\pgf@plotstreamend\to\pgfplotsplothandlercontour@stored@lastcontourpath + \fi + \fi +}% + +\def\pgfplotsplothandlercontour@init@limits{% + \def\pgfplotsplothandlercontour@processed@outer{0}% + \let\pgfplotsplothandlercontour@limits@low@meta=\pgfutil@empty + \let\pgfplotsplothandlercontour@limits@low@x=\pgfutil@empty + \let\pgfplotsplothandlercontour@limits@low@y=\pgfutil@empty + \let\pgfplotsplothandlercontour@limits@low@z=\pgfutil@empty + \let\pgfplotsplothandlercontour@limits@high@meta=\pgfutil@empty + \let\pgfplotsplothandlercontour@limits@high@x=\pgfutil@empty + \let\pgfplotsplothandlercontour@limits@high@y=\pgfutil@empty + \let\pgfplotsplothandlercontour@limits@high@z=\pgfutil@empty + % + \pgfkeysgetvalue{/pgfplots/contour/data limits}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \def\pgfplotsplothandlercontour@processed@outer{1}% + \else + \expandafter\pgfplotsplothandlercontour@init@limits@getboundingboxlow\pgfplots@loc@TMPa\pgfplots@EOI + \fi +%\message{contour: I processed data limits to MIN = (\pgfplotsplothandlercontour@limits@low@x,\pgfplotsplothandlercontour@limits@low@y,\pgfplotsplothandlercontour@limits@low@z;\pgfplotsplothandlercontour@limits@low@meta) and MAX = (\pgfplotsplothandlercontour@limits@high@x,\pgfplotsplothandlercontour@limits@high@y,\pgfplotsplothandlercontour@limits@high@z;\pgfplotsplothandlercontour@limits@high@meta).}% +}% +\def\pgfplotsplothandlercontour@init@limits@getboundingboxlow(#1,#2,#3,#4){% + \def\pgfplotsplothandlercontour@init@limits@cur{low}% + \pgfplotsplothandlercontour@init@limits@read(#1,#2,#3,#4)% + \pgfutil@ifnextchar(% + \pgfplotsplothandlercontour@init@limits@getboundingboxhigh + {\pgfplots@error{Sorry, 'data limits=(xmin,ymin,zmin,contourmin) (xmax,ymax,zmax,contourmax)' has been expected, not \pgfkeysvalueof{/pgfplots/contour/data limits}}\pgfplots@gobble@until@EOI}% +}% +\def\pgfplotsplothandlercontour@init@limits@getboundingboxhigh(#1,#2,#3,#4){% + \def\pgfplotsplothandlercontour@init@limits@cur{high}% + \pgfplotsplothandlercontour@init@limits@read(#1,#2,#3,#4)% + \pgfutil@gobble +}% +\def\pgfplotsplothandlercontour@init@limits@read(#1,#2,#3,#4){% + % FIXME : logs and trafos and user interface! + \pgfplotscoordmath{x}{parsenumber}{#1}% + \pgfplotscoordmath{x}{datascaletrafo}\pgfmathresult + \expandafter\let\csname pgfplotsplothandlercontour@limits@\pgfplotsplothandlercontour@init@limits@cur @x\endcsname=\pgfmathresult + % + \pgfplotscoordmath{y}{parsenumber}{#2}% + \pgfplotscoordmath{y}{datascaletrafo}\pgfmathresult + \expandafter\let\csname pgfplotsplothandlercontour@limits@\pgfplotsplothandlercontour@init@limits@cur @y\endcsname=\pgfmathresult + % + \ifpgfplots@curplot@threedim + \pgfplotscoordmath{z}{parsenumber}{#3}% + \pgfplotscoordmath{z}{datascaletrafo}\pgfmathresult + \expandafter\let\csname pgfplotsplothandlercontour@limits@\pgfplotsplothandlercontour@init@limits@cur @z\endcsname=\pgfmathresult + \fi + % + \pgfplotscoordmath{meta}{parsenumber}{#4}% + \expandafter\let\csname pgfplotsplothandlercontour@limits@\pgfplotsplothandlercontour@init@limits@cur @meta\endcsname=\pgfmathresult +}% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% contour external implementation +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\pgfplotsplothandlercontourexternal{% + \pgfplotsresetplothandler + \def\pgfplotsplothandlername{contour external}% + % + \pgfplotsplothandlercontour@prepare@point@meta + % + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@contourexternal + \def\pgf@plotstreamstart{% + \pgfplotsplothandlercontourprepared + \pgf@plotstreamstart + }% +}% +\gdef\c@pgfplotsplothandlersurveystart@contourexternal@fileno{0}% +\def\pgfplotsplothandlersurveystart@contourexternal{% + % + \pgfkeysgetvalue{/pgfplots/contour external/file}\pgfplotsplothandlercontourexternal@file + % + \ifx\pgfplotsplothandlercontourexternal@file\pgfutil@empty + \pgfutil@ifundefined{pgfactualjobname}{% + \let\pgfplots@loc@TMPa=\jobname + }{% + % be compatible with external lib: + \let\pgfplots@loc@TMPa=\pgfactualjobname + }% + \edef\pgfplotsplothandlercontourexternal@file{\pgfplots@loc@TMPa_contourtmp\c@pgfplotsplothandlersurveystart@contourexternal@fileno}% + \pgfplotsutil@advancestringcounter@global\c@pgfplotsplothandlersurveystart@contourexternal@fileno + \fi + % + \if0\pgfplotsplothandlercontourexternal@scanlinemode + \pgfplotsset{plot to file/scanline marks/false}% + \else + \pgfplotsset{plot to file/scanline marks/if in input}% the choice 'always' is unaware of existing end-of-scanline marks + \fi + \pgfplotsplothandlertofile{\pgfplotsplothandlercontourexternal@file.dat}% + \pgfplotsplothandlersurveystart + \let\pgfplotsplothandlersurveypoint@tofile=\pgfplotsplothandlersurveypoint + \let\pgfplotsplothandlersurveyend@tofile=\pgfplotsplothandlersurveyend + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@contourexternal + \let\pgfplotsplothandlersurveyend=\pgfplotsplothandlersurveyend@contourexternal +}% +\def\pgfplotsplothandlersurveypoint@contourexternal{% + % temporarily disable updates to point meta limits. They should be + % updated during the contour prepared processing. + \let\pgfplotsplothandlercontourexternal@orig@perpointlimits@limits=\pgfplots@set@perpointmeta@limits + \let\pgfplots@set@perpointmeta@limits=\relax + % + \pgfplotsaxissurveysetpointmeta + \let\pgfplots@current@point@z=\pgfplots@current@point@meta + % + \let\pgfplots@set@perpointmeta@limits=\pgfplotsplothandlercontourexternal@orig@perpointlimits@limits + % +%\message{contour gnuplot: collecting point (\pgfplots@current@point@x,\pgfplots@current@point@y,\pgfplots@current@point@z) [\pgfplots@current@point@meta]...}% + \pgfplotsplothandlersurveypoint@tofile +}% + +{ +\catcode`\`=12 +\catcode`\'=12 +\catcode`\"=12 +\catcode`\|=12 +\catcode`\;=12 +\catcode`\:=12 +\catcode`\#=12 +\gdef\pgfplotsplothandlersurveyend@contourexternal{% + \pgfplotsplothandlersurveyend@tofile + \if2\pgfplotsplothandlercontourexternal@scanlinemode + \if0\pgfplotsplothandlertofilegeneratedscanlinemarks + \pgfplots@error{Sorry, processing the input stream did not lead to end-of-scanline markers; the generated temporary file for 'contour external' does not contain any of them (indicating that matrix structure is lost). To fix this, you have the following options:^^J - Insert end-of-scanline markers into your input data (i.e. empty lines),^^J - provide two of the three options 'mesh/rows=<num matrix rows>, mesh/cols=<num matrix cols>, mesh/num points=<total number points>'}% + \fi + \fi + % + \begingroup + \let\numcoords=\pgfplots@current@point@coordindex% + \pgfplotsautocompletemeshkeys + \def\"{"}% + \def\|{|}% + \def\;{;}% + \def\:{:}% + \def\#{#}% + \def\'{'}% + \def\`{`}% + \edef\ordering{\pgfplots@plot@mesh@ordering}% + \edef\infile{\pgfplotsplothandlercontourexternal@file.dat}% + \edef\outfile{\pgfplotsplothandlercontourexternal@file.table}% + \edef\script{\pgfplotsplothandlercontourexternal@file.\pgfkeysvalueof{/pgfplots/contour external/script extension}}% + \immediate\openout\w@pgf@writea=\script + \immediate\write\w@pgf@writea{\pgfkeysvalueof{/pgfplots/contour external/script}}% + \immediate\closeout\w@pgf@writea + % + \immediate\write18{\pgfkeysvalueof{/pgfplots/contour external/cmd}}% + \endgroup + % + % + \pgfplotsplothandlercontourprepared + \let\pgfplots@coord@stream@start=\relax% has already been done. + \def\pgfplots@coord@stream@end{\pgfplotsplothandlersurveyend}% + \ifpgfplots@curplot@threedim + \pgfplotssetpointmetainput{z}{}% + \else + \pgfplotssetpointmetainput{explicit}{}% + \fi + \pgfplots@addplotimpl@file@streamit{\pgfplotsplothandlercontourexternal@file.table}% + \closein\r@pgfplots@reada +}% +} + + + + + +% the `plot unprocessed to file' plot handler simply copies the input data +% UNPROCESSED to an output file. +% +% I use it as helper tool for `contour gnuplot'. +% +% this cannot be combined with other plot handlers unless the other +% plot handlers controls that explicitly +% +% Immediately after the survey ends, this plot handler will set +% \pgfplotsplothandlertofilegeneratedscanlinemarks to '1' or '0'. +\pgfplotsset{ + plot unprocessed to file/.code={ + \edef\tikz@plot@handler{\noexpand\pgfplotsplothandlertofile{#1}}% + }, + plot to file/scanline marks/.is choice, + plot to file/scanline marks/false/.code={\def\pgfplotsplothandlertofile@scanlinemarks{0}}, + plot to file/scanline marks/if in input/.code={\def\pgfplotsplothandlertofile@scanlinemarks{1}}, + plot to file/scanline marks/always/.code={\def\pgfplotsplothandlertofile@scanlinemarks{2}}, + plot to file/scanline marks/true/.code={\def\pgfplotsplothandlertofile@scanlinemarks{2}}, + plot to file/scanline marks/if in input, + plot to file/col sep/.initial=\pgfplots@TAB, + plot to file/end-of-scanline content/.initial=, +} + +\def\pgfplotsplothandlertofile#1{% + \edef\pgfplotsplothandlertofile@name{#1}% + \pgfplotsresetplothandler + \pgfplotsset{empty line=scanline}% + \let\pgfplotsplothandlersurveystart=\pgfplotsplothandlersurveystart@tofile + \def\pgfplotsplothandlername{plot to file}% + \let\pgfplotsplothandlersurveyend=\pgfplotsplothandlersurveyend@tofile + \let\pgfplotsplothandlersurveypoint=\pgfplotsplothandlersurveypoint@tofile + \let\pgfplotsplothandlernotifyscanlinecomplete=\pgfplotsplothandlernotifyscanlinecomplete@tofile + % + \if1\pgfplotsplothandlertofile@scanlinemarks + % plot to file/scanline marks=if in input + % check if we have mesh input: + \def\pgfplots@loc@TMP@has@mesh@information{0}% + \pgfkeysgetvalue{/pgfplots/mesh/rows}\pgfplots@loc@TMPa + \pgfkeysgetvalue{/pgfplots/mesh/cols}\pgfplots@loc@TMPb + \pgfkeysgetvalue{/pgfplots/mesh/num points}\pgfplots@loc@TMPc + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \ifx\pgfplots@loc@TMPc\pgfutil@empty + \else + % has rows and num points: + \def\pgfplots@loc@TMP@has@mesh@information{1}% + \fi + \else + \ifx\pgfplots@loc@TMPb\pgfutil@empty + \ifx\pgfplots@loc@TMPc\pgfutil@empty + \else + % has cols and num points: + \def\pgfplots@loc@TMP@has@mesh@information{1}% + \fi + \else + % has rows,cols: + \def\pgfplots@loc@TMP@has@mesh@information{1}% + \fi + \fi + \if1\pgfplots@loc@TMP@has@mesh@information + % activate 'plot to file/scanline marks=always + % --> we have the required information! + \def\pgfplotsplothandlertofile@scanlinemarks{2}% + \fi + \fi + % NO \else here! + \if2\pgfplotsplothandlertofile@scanlinemarks + % plot to file/scanline marks=always + \pgfplotsautocompletemeshkeys% + \def\c@pgfplotsplothandlertofile@scanlinelength{0}% + \if\pgfplots@plot@mesh@ordering0% + % ordering = x varies= rowwise -> scanline is cols! + \pgfkeysgetvalue{/pgfplots/mesh/cols}\c@pgfplotsplothandlertofile@expectedscanline + \else + % ordering = y varies = colwise: scanline is rows! + \pgfkeysgetvalue{/pgfplots/mesh/rows}\c@pgfplotsplothandlertofile@expectedscanline + \fi + \fi + \pgfplotsplothandlertofile@scanlinependingfalse + \pgfkeysgetvalue{/pgfplots/plot to file/col sep}\pgfplotsplothandlertofile@colsep + \pgfkeysgetvalue{/pgfplots/plot to file/end-of-scanline content}\pgfplotsplothandlertofile@scanlinemark + % + % + \def\pgfplotsplothandlertofilegeneratedscanlinemarks{0}% +}% +\def\pgfplotsplothandlertofile@scanlinemarks@check{% + \if2\pgfplotsplothandlertofile@scanlinemarks + % plot to file/scanline marks=always + \pgfplotsutil@advancestringcounter\c@pgfplotsplothandlertofile@scanlinelength + \ifnum\c@pgfplotsplothandlertofile@scanlinelength=\c@pgfplotsplothandlertofile@expectedscanline + \def\c@pgfplotsplothandlertofile@scanlinelength{0}% + \pgfplotsplothandlernotifyscanlinecomplete@tofile + \fi + \fi +}% +\newif\ifpgfplotsplothandlertofile@scanlinepending +\def\pgfplotsplothandlernotifyscanlinecomplete@tofile{% + \if0\pgfplotsplothandlertofile@scanlinemarks + \else + \pgfplotsplothandlertofile@scanlinependingtrue + \fi +}% +\def\pgfplotsplothandlersurveypoint@tofile{% + \ifpgfplotsplothandlertofile@scanlinepending + \def\pgfplotsplothandlertofilegeneratedscanlinemarks{1}% + \immediate\write\w@pgf@writea{\pgfplotsplothandlertofile@scanlinemark}% end-of-scanline + \pgfplotsplothandlertofile@scanlinependingfalse + \fi + \pgfplotscoordmath{x}{parsenumber}{\pgfplots@current@point@x}% + \pgfplotscoordmath{x}{tostring}{\pgfmathresult}% + \let\pgfplots@current@point@x=\pgfmathresult + % + \pgfplotscoordmath{y}{parsenumber}{\pgfplots@current@point@y}% + \pgfplotscoordmath{y}{tostring}{\pgfmathresult}% + \let\pgfplots@current@point@y=\pgfmathresult + % + \ifpgfplots@curplot@threedim + \pgfplotscoordmath{z}{parsenumber}{\pgfplots@current@point@z}% + \pgfplotscoordmath{z}{tostring}{\pgfmathresult}% + \let\pgfplots@current@point@z=\pgfmathresult + \fi + % + \pgfplotsaxissurveysetpointmeta + \pgfplotsaxisifhaspointmeta{% + \pgfplotscoordmath{meta}{tostring}{\pgfplots@current@point@meta}% + \let\pgfplots@current@point@meta=\pgfmathresult + }{}% + % + \immediate\write\w@pgf@writea{% + \pgfplots@current@point@x\pgfplotsplothandlertofile@colsep + \pgfplots@current@point@y\pgfplotsplothandlertofile@colsep + \ifpgfplots@curplot@threedim\pgfplots@current@point@z\pgfplotsplothandlertofile@colsep\fi + \pgfplots@current@point@meta + }% + \advance\c@pgfplots@coordindex by1 + \pgfplotsplothandlertofile@scanlinemarks@check +}% +\def\pgfplotsplothandlersurveyend@tofile{% + \immediate\closeout\w@pgf@writea +}% +\def\pgfplotsplothandlersurveystart@tofile{% + \immediate\openout\w@pgf@writea=\pgfplotsplothandlertofile@name\relax +}% + + +\input pgfplotsmeshplothandler.code.tex diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex index 3c3e9dd7f6a..2276f571db9 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex @@ -46,32 +46,29 @@ % 2. At the beginning and end of each plot, the lists in 1.) are % initialised properly. % -% 3. While plot coordinates are processed, the following methods +% 3.1 While plot coordinates are processed during the survey phase, the following methods % interact with the stacked API: % \pgfplots@stacked@preparepoint@inmacro % -> compute the 'stacked' sum. % This may need to be done with floating point arithmetics because % the data scaling trafo is not yet initialised +% \pgfplots@stacked@rememberzerolevelpoint@for@next@plot +% \pgfplots@stacked@getnextzerolevelpoint % +% +% 3.2 during the final visualization phase, we have % \pgfplots@stacked@finishpoint % -> takes coordinates as they will be given to Tikz. This method is % used to % - communicate zero level coordinates to Tikz % - implement the 'closed paths' option (allows filled stacked plots). % -% \pgfplots@stacked@rememberzerolevelpoint@for@next@plot -% \pgfplots@stacked@getnextzerolevelpoint -% % 4. Zero levels are communicated to Tikz by % \pgfplots@stacked@initzerolevelhandler. This routine initialises an % input stream for Tikz plot handlers which produces a sequence of % zero levels. It is used by [xy]comb and [xy]bar. % % -% REMARK: -% the state of the boolean \ifpgfplots@datascaletrafo@initialised -% determines whether these routines expect and return floating point -% numbers or fixed point numbers. \let\pgfplots@stacked@zerolevelpoint@x=\pgfutil@empty \let\pgfplots@stacked@zerolevelpoint@y=\pgfutil@empty @@ -114,29 +111,25 @@ \let\pgfplots@stacked@closedcycle@impl=\pgfutil@empty \ifpgfplots@stacked@isfirstplot \global\pgfplotslistnewempty\pgfplots@stacked@zerolevellist - \def\pgfplots@stacked@zerolevelpoint@x{0}% - \def\pgfplots@stacked@zerolevelpoint@y{0}% - \def\pgfplots@stacked@zerolevelpoint@z{0}% % 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 + \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 - \ifpgfplots@xislinear - \pgfmathfloatcreate{0}{0.0}{0}% - \let\pgfplots@stacked@zerolevelpoint@x=\pgfmathresult - \fi - \ifpgfplots@yislinear - \pgfmathfloatcreate{0}{0.0}{0}% - \let\pgfplots@stacked@zerolevelpoint@y=\pgfmathresult - \fi - \ifpgfplots@threedim - \ifpgfplots@zislinear - \pgfmathfloatcreate{0}{0.0}{0}% - \let\pgfplots@stacked@zerolevelpoint@z=\pgfmathresult - \fi - \fi + \pgfplotscoordmath{x}{parsenumber}{0}% + \let\pgfplots@stacked@zerolevelpoint@x=\pgfmathresult + \let\pgfplots@stacked@zerolevelpoint@y=\pgfmathresult + \let\pgfplots@stacked@zerolevelpoint@z=\pgfmathresult + % + \pgfmathfloatcreate{0}{0.0}{0}% + \ifpgfplots@xislinear\else \let\pgfplots@stacked@zerolevelpoint@x=\pgfmathresult \fi + \ifpgfplots@yislinear\else \let\pgfplots@stacked@zerolevelpoint@y=\pgfmathresult \fi + \ifpgfplots@zislinear\else \let\pgfplots@stacked@zerolevelpoint@z=\pgfmathresult \fi \fi + % \def\pgfplots@stacked@getnextzerolevelpoint{}% will remain constant anyway. \else {\globaldefs=1 @@ -259,26 +252,27 @@ % - \pgfplots@current@point@[xyz] are adjusted. \def\pgfplots@stacked@preparepoint@inmacro{% \pgfplots@stacked@getnextzerolevelpoint + % \ifpgfplots@stacked@plus - \let\pgfplots@stacked@op=\pgfmath@basic@add@ + \def\pgfplots@stacked@op{add}% \else - \let\pgfplots@stacked@op=\pgfmath@basic@subtract@ + \def\pgfplots@stacked@op{subtract}% \fi \pgfplots@if{pgfplots@\pgfplots@stacked@dir islinear}{% - \ifpgfplots@datascaletrafo@initialised - \else - \ifpgfplots@stacked@plus - \let\pgfplots@stacked@op=\pgfmathfloatadd@ - \else - \let\pgfplots@stacked@op=\pgfmathfloatsubtract@ - \fi - \fi - }{}% - \edef\pgfplots@loc@TMPa{ - \noexpand\pgfplots@stacked@op - {\csname pgfplots@stacked@zerolevelpoint@\pgfplots@stacked@dir\endcsname}% - {\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname}}% - \pgfplots@loc@TMPa + \pgfplotscoordmath{\pgfplots@stacked@dir}{op}{\pgfplots@stacked@op}{% + {\csname pgfplots@stacked@zerolevelpoint@\pgfplots@stacked@dir\endcsname}% + {\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname}}% + }{% + % LOG. we need to compute log(zerolevel + current): + \pgfplotscoordmath{\pgfplots@stacked@dir}{exp}{\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname}% + \pgfmathfloatparsenumber\pgfmathresult + \expandafter\let\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname=\pgfmathresult + \csname pgfmathfloat\pgfplots@stacked@op @\endcsname + {\csname pgfplots@stacked@zerolevelpoint@\pgfplots@stacked@dir\endcsname}% + {\csname pgfplots@current@point@\pgfplots@stacked@dir\endcsname}% + }% + % + % 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 @@ -289,6 +283,12 @@ \else \pgfplots@stacked@rememberzerolevelpoint@for@next@plot{(\pgfplots@current@point@x,\pgfplots@current@point@y)}% \fi + % + \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 + }% } % This here is a re-implementation of the stored plot processing. @@ -469,16 +469,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endgroup % - \ifpgfplots@apply@datatrafo - \def\pgfplots@coord@stream@coord@{% - \pgfplots@apply@data@scaletrafo@to@one@point% - \pgfplots@coord@stream@finalize@currentpt - }% - \else - \def\pgfplots@coord@stream@coord@{% - \pgfplots@coord@stream@finalize@currentpt - }% - \fi + \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. diff --git a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex index 46367c7c43e..de218f8bcb9 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex @@ -149,7 +149,7 @@ \def\pgfplots@init@scaled@tick@for#1{% \global\def\pgfplots@glob@TMPa{0}% \begingroup - \ifcase\csname pgfplots@scaled@ticks@#1@choice\endcsname + \ifcase\csname pgfplots@scaled@ticks@#1@choice\endcsname\relax % CASE 0 : scaled #1 ticks=false: do nothing here. \or % CASE 1 : scaled #1 ticks=true: @@ -213,9 +213,9 @@ % x-axis tick labels for #1th tick % #1: the axis (x,y or z) % #2: the value -% #3,#4: coordinates for \pgfplotspointonorientedsurfaceab +% #3,#4+#5: arguments for \pgfplotspointonorientedsurfaceabwithbshift % #5: ticknumber -\def\pgfplots@show@ticklabel#1#2(#3,#4)#5{% +\def\pgfplots@show@ticklabel#1#2(#3,#4+#5)#6{% \begingroup% \csname ifpgfplots@#1ticklabel@interval\endcsname % Special case for the INTERVAL feature: @@ -240,18 +240,19 @@ \let\pgfplots@show@ticklabel@coord@y=\pgfmathresult% \let\ticknum=\pgfplots@show@ticklabel@num\relax% \let\tick=\pgfplots@show@ticklabel@tick% - \pgfplots@show@ticklabel@@{#1}{\pgfplotspointonorientedsurfaceab{\pgfplots@show@ticklabel@coord@x}{\pgfplots@show@ticklabel@coord@y}}% + \pgfplots@show@ticklabel@@{#1} + {\pgfplotspointonorientedsurfaceabwithbshift{\pgfplots@show@ticklabel@coord@x}{\pgfplots@show@ticklabel@coord@y}{#5}}% \fi \xdef\pgfplots@show@ticklabel@LASTTICK{% \noexpand\def\noexpand\pgfplots@show@ticklabel@tick{\nexttick}% \noexpand\def\noexpand\pgfplots@show@ticklabel@coord@x{\pgfplots@show@ticklabel@coord@x@new}% \noexpand\def\noexpand\pgfplots@show@ticklabel@coord@y{\pgfplots@show@ticklabel@coord@y@new}% - \noexpand\edef\noexpand\pgfplots@show@ticklabel@num{#5}% + \noexpand\edef\noexpand\pgfplots@show@ticklabel@num{#6}% }% \else - \let\ticknum=#5\relax% + \let\ticknum=#6\relax% \pgfplots@show@ticklabel@{#1}{#2}% - \pgfplots@show@ticklabel@@{#1}{\pgfplotspointonorientedsurfaceab{#3}{#4}}% + \pgfplots@show@ticklabel@@{#1}{\pgfplotspointonorientedsurfaceabwithbshift{#3}{#4}{#5}}% \fi \endgroup } @@ -469,7 +470,7 @@ % #2: tick value. \def\pgfplots@show@ticklabel@#1#2{% \csname ifpgfplots@apply@datatrafo@#1\endcsname - \csname pgfplots@inverse@datascaletrafo@#1\endcsname{#2}% + \pgfplotscoordmath{#1}{datascaletrafo inverse}{#2}% \ifcase\csname pgfplots@scaled@ticks@#1@choice\endcsname \or \expandafter\pgfmathfloatshift@\expandafter{\pgfmathresult}{\csname pgfplots@tick@scale@#1\endcsname}% @@ -480,7 +481,12 @@ \or % scaled #1 ticks=manual. Invoke manual tick scaling code: \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@tick@scale@#1\endcsname + \begingroup + \pgfkeys{/pgf/fpu=true}% \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}% + \pgfmath@smuggleone\pgfmathresult + \endgroup + \pgfmathfloatparsenumber\pgfmathresult% \fi % .. and this here provides \tick as fixed point repr: \expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}% @@ -590,10 +596,10 @@ }% % Fills the macros -% \pgfplots@tick@beg@a \pgfplots@tick@end@a -% \pgfplots@tick@beg@b \pgfplots@tick@end@b +% \pgfplots@tick@LOWER@b \pgfplots@tick@end@a +% \pgfplots@tick@UPPER@b \pgfplots@tick@end@b % with coordinates such that -% (\pgfplots@tick@beg@a,\pgfplots@tmpa) -- (\pgfplots@tick@end@a,\pgfplots@tmpa) +% (\pgfplots@tick@LOWER@b,\pgfplots@tmpa) -- (\pgfplots@tick@end@a,\pgfplots@tmpa) % produces a correct tick line. % % The '@b' variant is only used in case of \pgfplots@ytickposnum = 0 @@ -602,56 +608,65 @@ % #2 : the current tick width % \def\pgfplots@prepare@tick@offsets@for@#1#2{% + % % FIXME : this stuff was ok for 2D. % For 3D, it works only for the cases of boxed axes or centered % axis lines. \ifcase\csname pgfplots@#1tickposnum\endcsname\relax % both %(\pgfplots@xcoordminTEX-\pgfplots@tick@offset, \pgfplots@tmpa) -- ++( #2, 0pt) - \edef\pgfplots@tick@beg@a{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}% - \pgfmathsubtract@{\pgfplots@tick@beg@a}{\pgfplots@tick@offset}% - \let\pgfplots@tick@beg@a=\pgfmathresult - \pgfmathadd@{\pgfplots@tick@beg@a}{#2}% - \let\pgfplots@tick@end@a=\pgfmathresult + \edef\pgfplots@tick@LOWER@b{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}% % %(\pgfplots@xcoordmaxTEX+\pgfplots@tick@offset, \pgfplots@tmpa) -- ++(-#2, 0pt) - \edef\pgfplots@tick@beg@b{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}% - \pgfmathadd@{\pgfplots@tick@beg@b}{\pgfplots@tick@offset}% - \let\pgfplots@tick@beg@b=\pgfmathresult - \pgfmathsubtract@{\pgfplots@tick@beg@b}{#2}% - \let\pgfplots@tick@end@b=\pgfmathresult% + \edef\pgfplots@tick@UPPER@b{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}% \or % left % (\pgfplots@xcoordminTEX-\pgfplots@tick@offset, \pgfplots@tmpa) -- ++( #2, 0pt); - \edef\pgfplots@tick@beg@a{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}% - \pgfmathsubtract@{\pgfplots@tick@beg@a}{\pgfplots@tick@offset}% - \let\pgfplots@tick@beg@a=\pgfmathresult - \pgfmathadd@{\pgfplots@tick@beg@a}{#2}% - \let\pgfplots@tick@end@a=\pgfmathresult + \edef\pgfplots@tick@LOWER@b{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}% \or % center % (\pgfplots@ZERO@x -\pgfplots@tick@offset, \pgfplots@tmpa) -- ++( #2, 0pt); - \pgfmathsubtract@{\csname pgfplots@logical@ZERO@\pgfplotspointonorientedsurfaceB \endcsname}{\pgfplots@tick@offset}% - \let\pgfplots@tick@beg@a=\pgfmathresult - \pgfmathadd@{\pgfplots@tick@beg@a}{#2}% - \let\pgfplots@tick@end@a=\pgfmathresult% + \edef\pgfplots@tick@LOWER@b{\csname pgfplots@logical@ZERO@\pgfplotspointonorientedsurfaceB \endcsname}% \or % right % (\pgfplots@xcoordmaxTEX+\pgfplots@tick@offset, \pgfplots@tmpa) -- ++(-#2, 0pt); - \edef\pgfplots@tick@beg@b{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}% - \pgfmathadd@{\pgfplots@tick@beg@b}{\pgfplots@tick@offset}% - \let\pgfplots@tick@beg@b=\pgfmathresult - \pgfmathsubtract@{\pgfplots@tick@beg@b}{#2}% - \let\pgfplots@tick@end@b=\pgfmathresult% + \edef\pgfplots@tick@UPPER@b{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}% \else % FALL BACK. never used, I guess? % (\pgfplots@xcoordminTEX-\pgfplots@tick@offset, \pgfplots@tmpa) -- ++( #2, 0pt); - \edef\pgfplots@tick@beg@a{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}% - \pgfmathsubtract@{\pgfplots@tick@beg@a}{\pgfplots@tick@offset}% - \let\pgfplots@tick@beg@a=\pgfmathresult - \pgfmathadd@{\pgfplots@tick@beg@a}{#2}% - \let\pgfplots@tick@end@a=\pgfmathresult + \edef\pgfplots@tick@LOWER@b{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}% \fi + % + \ifcase\csname pgfplots@#1tickalignnum\endcsname\relax + \def\pgfplots@tick@offset{0}% + \or + \edef\pgfplots@tick@offset{#2}% + \or + \pgfmathmultiply@{0.5}{#2}% + \let\pgfplots@tick@offset=\pgfmathresult% + \fi + % + \edef\pgfplots@tick@LOWER@shiftbeg{-\pgfplots@tick@offset}% + \pgfmathadd@{\pgfplots@tick@LOWER@shiftbeg}{#2}% + \let\pgfplots@tick@LOWER@shiftend=\pgfmathresult + % + \edef\pgfplots@tick@UPPER@shiftbeg{\pgfplots@tick@offset}% + \pgfmathsubtract@{\pgfplots@tick@UPPER@shiftbeg}{#2}% + \let\pgfplots@tick@UPPER@shiftend=\pgfmathresult + % + % Assemble the \pgfplots@drawticklines@for@placecomputedtick + % command. + \def\pgfplots@drawticklines@for@placecomputedtick{% + \if\pgfplots@drawticklines@for@placecomputedtick@LOWEROK1% + \pgfpathmoveto{\pgfplotspointonorientedsurfaceabwithbshift{\pgfplots@curtickpos}{\pgfplots@tick@LOWER@b}{\pgfplots@tick@LOWER@shiftbeg pt}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceabwithbshift{\pgfplots@curtickpos}{\pgfplots@tick@LOWER@b}{\pgfplots@tick@LOWER@shiftend pt}}% + \fi + \if\pgfplots@drawticklines@for@placecomputedtick@UPPEROK1% + \pgfpathmoveto{\pgfplotspointonorientedsurfaceabwithbshift{\pgfplots@curtickpos}{\pgfplots@tick@UPPER@b}{\pgfplots@tick@UPPER@shiftbeg pt}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceabwithbshift{\pgfplots@curtickpos}{\pgfplots@tick@UPPER@b}{\pgfplots@tick@UPPER@shiftend pt}}% + \fi + }% +%\message{place computed tick: LOWEROK=\pgfplots@drawticklines@for@placecomputedtick@LOWEROK; UPPEROK=\pgfplots@drawticklines@for@placecomputedtick@UPPEROK.}% }% @@ -771,11 +786,17 @@ \def\pgfplots@scaled@ticks@z@choice{0}% \csname pgfplots@#1minorticksfalse\endcsname \csname pgfplots@#1minorgridsfalse\endcsname + \expandafter\let\expandafter\pgfplots@ticklabel@pos@orig\csname pgfplots@#1ticklabel@pos\endcsname% \expandafter\let\expandafter\axis@TMP\csname pgfplots@extra@#1ticklabel\endcsname \expandafter\let\csname pgfplots@#1ticklabel\endcsname=\axis@TMP % \pgfplotsset{/pgfplots/every extra #1 tick}% % use a scope here such that line width and draw color can be set. \scope[/pgfplots/.cd,/pgfplots/every extra #1 tick] + \expandafter\let\expandafter\pgfplots@ticklabel@pos@\csname pgfplots@#1ticklabel@pos\endcsname + \ifx\pgfplots@ticklabel@pos@\pgfplots@ticklabel@pos@orig + \else + \pgfplots@init@ticklabelaxisspec + \fi \pgfplots@prepare@tick@coordlists@for{#1}{#2}% \pgfplots@drawgridlines@onorientedsurf% \pgfplots@drawticklines@onorientedsurf% @@ -789,8 +810,8 @@ % and % \pgfplots@prepared@tick@positions@minor@x. % -% The major tick list contains tuples (canvas position,logical position) -% while the minor tick list contains just the canvas position. +% Both lists contain entries of the form {<index>}{<logical position>} +% @see \pgfplots@prepared@tick@pos@unpack % % #1: the axis % #2: the tick list. @@ -814,16 +835,10 @@ % of \foreach statements. And, yes: I have also added a TeX group % on my own (but that's not the problem). \global\pgfplotslistnewempty\pgfplots@prepared@tick@positions@major - \global\pgfplotslistnewempty\pgfplots@prepared@tick@positions@major@tickindices + %\global\pgfplotslistnewempty\pgfplots@prepared@tick@positions@major@tickindices \global\pgfplotslistnewempty\pgfplots@prepared@tick@positions@minor % - \afterassignment\pgfplots@gobble@until@relax - \pgfplots@tmpa=\pgfkeysvalueof{/pgfplots/#1tick placement tolerance}pt\relax - \pgfplots@tmpa=\csname pgfplots@#1@inverseveclength\endcsname\pgfplots@tmpa - \edef\pgfplots@loc@tick@placement@tolerance{\the\pgfplots@tmpa}% - % - \advance\csname pgfplots@#1min@reg\endcsname by-\pgfplots@tmpa - \advance\csname pgfplots@#1max@reg\endcsname by\pgfplots@tmpa + \pgfplots@prepare@tick@coordlists@for@handletolerance#1% % \edef\pgfplots@loc@TMPa{#2}% \ifx\pgfplots@loc@TMPa\pgfutil@empty @@ -837,9 +852,15 @@ \pgfplots@needsminorloopfalse \fi \fi + \pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@minor@tick@list + \ifx\pgfplots@minor@tick@list\pgfutil@empty + \else + \pgfplots@needsminorloopfalse + \fi + % \ifpgfplots@needsminorloop \ifpgfplots@islinear - \expandafter\let\expandafter\pgfplots@minor@tick@num\csname pgfplots@minor@#1tick@num\endcsname + \pgfkeysgetvalue{/pgfplots/minor #1 tick num}\pgfplots@minor@tick@num \begingroup \c@pgf@counta=\pgfplots@minor@tick@num\relax \advance\c@pgf@counta by1\relax @@ -860,18 +881,14 @@ \else \expandafter\def\expandafter\pgfplots@checktickminmax\expandafter{% \pgfplots@checktickminmax - \ifdim\pgfplots@tmpa<\csname pgfplots@#1tickmin\endcsname pt - \pgfplots@tickshowfalse - \fi + \pgfplots@prepare@tick@coordlists@for@checktickmin#1% }% \fi \expandafter\ifx\csname pgfplots@#1tickmax\endcsname\pgfutil@empty \else \expandafter\def\expandafter\pgfplots@checktickminmax\expandafter{% \pgfplots@checktickminmax - \ifdim\pgfplots@tmpa>\csname pgfplots@#1tickmax\endcsname pt - \pgfplots@tickshowfalse - \fi + \pgfplots@prepare@tick@coordlists@for@checktickmax#1% }% \fi % @@ -880,47 +897,39 @@ \foreach \x in {#2} {% \let\pgfplots@ticknum=\pgfplots@glob@TMPa % - \pgfplots@tmpa=\x pt % + \pgfplots@prepare@tick@coordlists@for@assign\pgfplots@tmpa=\x \csname pgfplots@#1tick@check@tickshow\endcsname + \pgfplots@prepare@tick@coordlists@for@checkdatalimits#1% \pgfplots@checktickminmax % \ifpgfplots@tickshow - \ifdim\pgfplots@tmpa<\csname pgfplots@#1min@reg\endcsname - \else - \ifdim\pgfplots@tmpa>\csname pgfplots@#1max@reg\endcsname - \else - \expandafter\pgfplotslistpushbackglobal\x\to\pgfplots@prepared@tick@positions@major - \expandafter\pgfplotslistpushbackglobal\pgfplots@ticknum\to\pgfplots@prepared@tick@positions@major@tickindices - \fi - \fi + \edef\x{{\pgfplots@ticknum}{\x}}% + \expandafter\pgfplotslistpushbackglobal\x\to\pgfplots@prepared@tick@positions@major + %\expandafter\pgfplotslistpushbackglobal\pgfplots@ticknum\to\pgfplots@prepared@tick@positions@major@tickindices \fi % X-Axis ticks bottom and top - % in log: - % log( i*10^k ) = log\pgfplots@i + k\log10 -> draw ticks for i=1..9 \ifpgfplots@needsminorloop + % SEE BELOW for the 'minor #1tick' feature -- it has a + % separate loop. \foreach \pgfplots@i in {1,...,\pgfplots@minor@tick@num} {% - \begingroup \ifpgfplots@islinear - \pgfplots@tmpa=\pgfplots@minor@tick@dist pt % - \pgfplots@tmpa=\pgfplots@i\pgfplots@tmpa + \pgfmathmultiply@{\pgfplots@i}{\pgfplots@minor@tick@dist}% \else - \pgfplots@tmpa=\csname pgfplotsmathlogi@#1\endcsname\pgfplots@i pt % + % in log: + % log( i*10^k ) = log\pgfplots@i + k\log10 -> draw ticks for i=1..9 + \pgfplotscoordmath{#1}{log unsigned int}{\pgfplots@i}% + \pgfplotscoordmath{#1}{tofixed}{\pgfmathresult}% \fi - \edef\pgfmathresult{\the\pgfplots@tmpa}% - \pgfmath@smuggleone\pgfmathresult - \endgroup - \advance\pgfplots@tmpa by\pgfmathresult\relax + \pgfplots@prepare@tick@coordlists@for@advance\pgfplots@tmpa by\pgfmathresult \pgfplots@tickshowtrue + \pgfplots@prepare@tick@coordlists@for@checkdatalimits#1% \pgfplots@checktickminmax \ifpgfplots@tickshow - \ifdim\pgfplots@tmpa<\csname pgfplots@#1min@reg\endcsname - \else - \ifdim\pgfplots@tmpa>\csname pgfplots@#1max@reg\endcsname - \else - \edef\pgfmathresult{\pgf@sys@tonumber{\pgfplots@tmpa}}% - \expandafter\pgfplotslistpushbackglobal\pgfmathresult\to\pgfplots@prepared@tick@positions@minor - \fi - \fi + \pgfplots@prepare@tick@coordlists@for@tofixed\pgfplots@tmpa + \c@pgf@counta=\pgfplots@ticknum\relax + \advance\c@pgf@counta by\pgfplots@i\relax + \edef\x{{\the\c@pgf@counta}{\pgfmathresult}}% + \expandafter\pgfplotslistpushbackglobal\x\to\pgfplots@prepared@tick@positions@minor \fi }% \fi @@ -928,16 +937,99 @@ % carry \ticknum outside of this scope: \global\let\pgfplots@glob@TMPa=\pgfplots@ticknum }% + % + \ifx\pgfplots@minor@tick@list\pgfutil@empty + \else + % handle the 'minor #1tick' feature: + \def\pgfplots@loc@TMPa{\foreach \x in }% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfplots@minor@tick@list} {% + \let\pgfplots@ticknum=\pgfplots@glob@TMPa + % + \pgfplots@prepare@tick@coordlists@for@assign\pgfplots@tmpa=\x + \pgfplots@tickshowtrue + \pgfplots@prepare@tick@coordlists@for@checkdatalimits#1% + \pgfplots@checktickminmax + \ifpgfplots@tickshow + \edef\x{{\pgfplots@ticknum}{\x}}% + \expandafter\pgfplotslistpushbackglobal\x\to\pgfplots@prepared@tick@positions@minor + \fi + \pgfplotsutil@advancestringcounter\pgfplots@ticknum + % carry \ticknum outside of this scope: + \global\let\pgfplots@glob@TMPa=\pgfplots@ticknum + }% + \fi \fi \endgroup \expandafter\let\csname pgfplots@prepared@tick@positions@minor@#1\endcsname=\pgfplots@prepared@tick@positions@minor \expandafter\let\csname pgfplots@prepared@tick@positions@major@#1\endcsname=\pgfplots@prepared@tick@positions@major - \expandafter\let\csname pgfplots@prepared@tick@positions@major@tickindices@#1\endcsname=\pgfplots@prepared@tick@positions@major@tickindices + %\expandafter\let\csname pgfplots@prepared@tick@positions@major@tickindices@#1\endcsname=\pgfplots@prepared@tick@positions@major@tickindices \global\let\pgfplots@prepared@tick@positions@major=\relax - \global\let\pgfplots@prepared@tick@positions@major@tickindices=\relax + %\global\let\pgfplots@prepared@tick@positions@major@tickindices=\relax \global\let\pgfplots@prepared@tick@positions@minor=\relax }% +% The following set of macros can be used to replace the TeX register +% arithmetics used to speed up the computations inside of +% \pgfplots@prepare@tick@coordlists@for by something different. +% +% FIXME : that is no clean programming! Perhaps a new math class +% should be used here, and implemented during the complete tick +% preparation!? +% +% Keep in mind that these tick positions are in "transformed +% range", i.e. they are expected to be in the range -16000...16000. At +% the time of this modification, only the smithchart lib needs special +% handling here... does this justify a re-design? +\def\pgfplots@prepare@tick@coordlists@for@assign#1=#2{% + #1=#2pt +}% +\def\pgfplots@prepare@tick@coordlists@for@advance#1by#2{% + \advance#1 by#2 pt % +}% +\def\pgfplots@prepare@tick@coordlists@for@tofixed#1{% + \edef\pgfmathresult{\pgf@sys@tonumber{#1}}% +}% +\def\pgfplots@prepare@tick@coordlists@for@handletolerance#1{% + \afterassignment\pgfplots@gobble@until@relax + \pgfplots@tmpa=\pgfkeysvalueof{/pgfplots/#1tick placement tolerance}pt\relax + \pgfplots@tmpa=\csname pgfplots@#1@inverseveclength\endcsname\pgfplots@tmpa + \edef\pgfplots@loc@tick@placement@tolerance{\the\pgfplots@tmpa}% + % + \advance\csname pgfplots@#1min@reg\endcsname by-\pgfplots@tmpa + \advance\csname pgfplots@#1max@reg\endcsname by\pgfplots@tmpa +}% +\def\pgfplots@prepare@tick@coordlists@for@checktickmin#1{% + \ifdim\pgfplots@tmpa<\csname pgfplots@#1tickmin\endcsname pt + \pgfplots@tickshowfalse + \fi +}% +\def\pgfplots@prepare@tick@coordlists@for@checktickmax#1{% + \ifdim\pgfplots@tmpa>\csname pgfplots@#1tickmax\endcsname pt + \pgfplots@tickshowfalse + \fi +}% +\def\pgfplots@prepare@tick@coordlists@for@checkdatalimits#1{% + \ifdim\pgfplots@tmpa<\csname pgfplots@#1min@reg\endcsname + \pgfplots@tickshowfalse + \else + \ifdim\pgfplots@tmpa>\csname pgfplots@#1max@reg\endcsname + \pgfplots@tickshowfalse + \fi + \fi +}% + +% Unpacks entries of the \pgfplots@prepared@tick@positions@* lists. +% +% Defines \pgfplots@tick to be the actual tick position and +% \pgfplots@ticknum to be its index. +% +% Usage: +% \expandafter\pgfplots@prepared@tick@pos@unpack\entry +\def\pgfplots@prepared@tick@pos@unpack#1#2{% + \def\pgfplots@tick{#2}% + \def\pgfplots@ticknum{#1}% +} + % Draws grid lines at the a-positions of the currently set oriented % surface. % @@ -965,7 +1057,7 @@ \pgfplots@if{pgfplots@#1minorgrids}{\pgfplots@loop@CONTINUEtrue}{}% \ifpgfplots@loop@CONTINUE \scope - \pgfplots@drawtickgridlines@INSTALLCLIP@onorientedsurf#1 + \pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf#1% % \pgfplots@if{pgfplots@#1minorgrids}{% \draw[% @@ -975,8 +1067,8 @@ /pgfplots/every minor #1 grid]% \pgfextra \pgfplotslistforeach\pgfplots@prepared@tick@positions@minor@\as\pgfplots@curgridpos{% - \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\pgfplots@curgridpos}{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}}% - \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\pgfplots@curgridpos}{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}}% + \expandafter\pgfplots@prepared@tick@pos@unpack\pgfplots@curgridpos + \pgfplots@drawgridlines@onorientedsurf@fromto\pgfplots@tick }% \endpgfextra; }{}% @@ -989,8 +1081,8 @@ /pgfplots/every major #1 grid]% \pgfextra \pgfplotslistforeach\pgfplots@prepared@tick@positions@major@\as\pgfplots@curgridpos{% - \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\pgfplots@curgridpos}{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}}% - \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\pgfplots@curgridpos}{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}}% + \expandafter\pgfplots@prepared@tick@pos@unpack\pgfplots@curgridpos + \pgfplots@drawgridlines@onorientedsurf@fromto\pgfplots@tick }% \endpgfextra; }{}% @@ -1002,6 +1094,16 @@ }% } +% Should draw a single grid line on the actual oriented surface. +% #1 the value of the grid line. +% +% PRECONDITION +% \pgfplots@ticknum contains the index of the current tick. +\def\pgfplots@drawgridlines@onorientedsurf@fromto#1{% + \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{#1}{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceab{#1}{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}}% +}% + % Draws ticks on the currently active "oriented surface". % % The oriented surface is two dimensional and has been initialised @@ -1040,26 +1142,27 @@ \expandafter\pgfplots@drawticklines@onorientedsurf@\pgfplotspointonorientedsurfaceA }% +\def\pgfplots@drawticklines@INSTALLCLIP@onorientedsurf#1{% + \pgfplots@drawtickgridlines@INSTALLCLIP@onorientedsurf{#1}% +}% +\def\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf#1{% + \pgfplots@drawtickgridlines@INSTALLCLIP@onorientedsurf{#1}% +}% % Avoids tick lines which are too thick by introducing a clipping % region. Tick lines (and grid lines) won't extend to the left or % right of axis #1. \def\pgfplots@drawtickgridlines@INSTALLCLIP@onorientedsurf#1{% \pgfinterruptboundingbox% \begingroup - \pgf@xa=5cm - \edef\pgfplots@loc@TMPc{\pgf@sys@tonumber{\pgf@xa}}% % the case ||e_b|| == 0 should never happen here! Should be % caught before entering this routine. - \pgfmathmultiply@{\pgfplots@loc@TMPc}{\csname pgfplots@\pgfplotspointonorientedsurfaceB @inverseveclength\endcsname}% \let\pgfplots@loc@LENGTH=\pgfmathresult - \pgfmathsubtract@{\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname}{\pgfplots@loc@LENGTH}% - \let\pgfplots@loc@MIN=\pgfmathresult - \pgfmathadd@{\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname}{\pgfplots@loc@LENGTH}% - \let\pgfplots@loc@MAX=\pgfmathresult - \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1min\endcsname}{\pgfplots@loc@MIN}}% - \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1max\endcsname}{\pgfplots@loc@MIN}}% - \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1max\endcsname}{\pgfplots@loc@MAX}}% - \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1min\endcsname}{\pgfplots@loc@MAX}}% + \expandafter\let\expandafter\pgfplots@loc@MIN\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname + \expandafter\let\expandafter\pgfplots@loc@MAX\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname + \pgfpathmoveto{\pgfplotspointonorientedsurfaceabwithbshift{\csname pgfplots@#1min\endcsname}{\pgfplots@loc@MIN}{-5cm}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceabwithbshift{\csname pgfplots@#1max\endcsname}{\pgfplots@loc@MIN}{-5cm}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceabwithbshift{\csname pgfplots@#1max\endcsname}{\pgfplots@loc@MAX}{5cm}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceabwithbshift{\csname pgfplots@#1min\endcsname}{\pgfplots@loc@MAX}{5cm}}% \pgfusepath{clip}% \endgroup \endpgfinterruptboundingbox% @@ -1112,24 +1215,9 @@ % never used? \def\pgfplots@drawticklines@for@placecomputedtick@UPPEROK{0}% \fi - \begingroup - % Assemble the \pgfplots@drawticklines@for@placecomputedtick - % command. - \let\E=\noexpand - \xdef\pgfplots@drawticklines@for@placecomputedtick{% - \if\pgfplots@drawticklines@for@placecomputedtick@LOWEROK1% - \E\pgfpathmoveto{\E\pgfplotspointonorientedsurfaceab{\E\pgfplots@curtickpos}{\E\pgfplots@tick@beg@a}}% - \E\pgfpathlineto{\E\pgfplotspointonorientedsurfaceab{\E\pgfplots@curtickpos}{\E\pgfplots@tick@end@a}}% - \fi - \if\pgfplots@drawticklines@for@placecomputedtick@UPPEROK1% - \E\pgfpathmoveto{\E\pgfplotspointonorientedsurfaceab{\E\pgfplots@curtickpos}{\E\pgfplots@tick@beg@b}}% - \E\pgfpathlineto{\E\pgfplotspointonorientedsurfaceab{\E\pgfplots@curtickpos}{\E\pgfplots@tick@end@b}}% - \fi - }% - \endgroup \expandafter\let\expandafter\pgfplots@prepared@tick@positions@major@\csname pgfplots@prepared@tick@positions@major@#1\endcsname \expandafter\let\expandafter\pgfplots@prepared@tick@positions@minor@\csname pgfplots@prepared@tick@positions@minor@#1\endcsname - \pgfplots@drawtickgridlines@INSTALLCLIP@onorientedsurf#1 + \pgfplots@drawticklines@INSTALLCLIP@onorientedsurf#1 % \pgfplots@if{pgfplots@#1minorticks}{% \draw[% @@ -1140,19 +1228,13 @@ \pgfextra \pgfmathparse{\pgfplots@subtickwidth}% \let\pgfplots@subtickwidth@=\pgfmathresult - \pgfmathmultiply@{\pgfplots@subtickwidth@}{\csname pgfplots@\pgfplotspointonorientedsurfaceB @inverseveclength\endcsname}% \let\pgfplots@subtickwidth@=\pgfmathresult \let\pgfplots@subtickwidth=\pgfmathresult - \ifcase\csname pgfplots@#1tickalignnum\endcsname\relax - \def\pgfplots@tick@offset{0}% - \or - \let\pgfplots@tick@offset=\pgfplots@subtickwidth@% - \or - \pgfmathmultiply@{0.5}{\pgfplots@subtickwidth@}% - \let\pgfplots@tick@offset=\pgfmathresult% - \fi \pgfplots@prepare@tick@offsets@for@{#1}{\pgfplots@subtickwidth@}% \pgfplotslistforeach\pgfplots@prepared@tick@positions@minor@\as\pgfplots@curtickpos{% + \expandafter\pgfplots@prepared@tick@pos@unpack\pgfplots@curtickpos + \let\pgfplots@curtickpos=\pgfplots@tick + \pgfplotspointouternormalvectorofaxissetv{}{\pgfplots@curtickpos}% \pgfplots@drawticklines@for@placecomputedtick }% \endpgfextra; @@ -1167,19 +1249,13 @@ \pgfextra \pgfmathparse{\pgfplots@tickwidth}% \let\pgfplots@tickwidth@=\pgfmathresult - \pgfmathmultiply@{\pgfplots@tickwidth@}{\csname pgfplots@\pgfplotspointonorientedsurfaceB @inverseveclength\endcsname}% \let\pgfplots@tickwidth@=\pgfmathresult \let\pgfplots@tickwidth=\pgfmathresult - \ifcase\csname pgfplots@#1tickalignnum\endcsname\relax - \def\pgfplots@tick@offset{0}% - \or - \let\pgfplots@tick@offset=\pgfplots@tickwidth@% - \or - \pgfmathmultiply@{0.5}{\pgfplots@tickwidth@}% - \let\pgfplots@tick@offset=\pgfmathresult% - \fi \pgfplots@prepare@tick@offsets@for@{#1}{\pgfplots@tickwidth@}% \pgfplotslistforeach\pgfplots@prepared@tick@positions@major@\as\pgfplots@curtickpos{% + \expandafter\pgfplots@prepared@tick@pos@unpack\pgfplots@curtickpos + \let\pgfplots@curtickpos=\pgfplots@tick + \pgfplotspointouternormalvectorofaxissetv{}{\pgfplots@curtickpos}% \pgfplots@drawticklines@for@placecomputedtick }% \endpgfextra; @@ -1263,7 +1339,7 @@ \fi \let\pgfplots@tick@offset=\pgfmathresult \pgfplots@ticklabel@maxtickdimen@extrashift{#1}{\pgfplots@tick@offset}% - \pgfmathmultiply@{\pgfplots@tick@offset}{\csname pgfplots@\pgfplotspointonorientedsurfaceB @inverseveclength\endcsname}% + %\pgfmathmultiply@{\pgfplots@tick@offset}{\csname pgfplots@\pgfplotspointonorientedsurfaceB @inverseveclength\endcsname}% \let\pgfplots@tick@offset=\pgfmathresult }% % @@ -1277,38 +1353,50 @@ \pgfmathmultiply{-1}{\pgfplots@tick@offset}% \let\pgfplots@tick@offset=\pgfmathresult \fi - \pgfmathsubtract@{\pgfplots@tick@origin}{\pgfplots@tick@offset}% + \edef\pgfplots@tick@offset{-\pgfplots@tick@offset}% + %\pgfmathsubtract@{\pgfplots@tick@origin}{\pgfplots@tick@offset}% \else \if0\pgfplots@ticklabelside \expandafter\let\expandafter\pgfplots@tick@origin\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname% \pgfplots@tickposchoiceb - \pgfmathsubtract@{\pgfplots@tick@origin}{\pgfplots@tick@offset}% + %\pgfmathsubtract@{\pgfplots@tick@origin}{\pgfplots@tick@offset}% + \edef\pgfplots@tick@offset{-\pgfplots@tick@offset}% \else \if1\pgfplots@ticklabelside \expandafter\let\expandafter\pgfplots@tick@origin\csname pgfplots@\pgfplotspointonorientedsurfaceB max\endcsname% \pgfplots@tickposchoicea - \pgfmathadd@{\pgfplots@tick@origin}{\pgfplots@tick@offset}% + %\pgfmathadd@{\pgfplots@tick@origin}{\pgfplots@tick@offset}% \else - % Should never happen. - \pgfplots@error{Internal logic error during tick label placement (got placement character '\pgfplots@ticklabelside'). - Please report this as a bug or verify your input arguments to #1ticklabel pos.}% - \expandafter\let\expandafter\pgfplots@tick@origin\csname pgfplots@\pgfplotspointonorientedsurfaceB min\endcsname% + \expandafter\let\expandafter\pgfplots@tick@origin\csname pgfplots@logical@ZERO@\pgfplotspointonorientedsurfaceB\endcsname% + % FIXME : is that correct!? \pgfplots@tickposchoiceb - \pgfmathsubtract@{\pgfplots@tick@origin}{\pgfplots@tick@offset}% + %\pgfmathsubtract@{\pgfplots@tick@origin}{\pgfplots@tick@offset}% + %\edef\pgfplots@tick@offset{-\pgfplots@tick@offset}% + % + \if2\pgfplots@ticklabelside + \else + % Should never happen. + \pgfplots@error{Internal logic error during tick label placement (got placement character '\pgfplots@ticklabelside'). + Please report this as a bug or verify your input arguments to #1ticklabel pos.}% + \fi \fi \fi \fi + %\let\pgfplots@tick@origin=\pgfmathresult% + \edef\pgfplots@tick@offset{\pgfplots@tick@offset pt}% % % make sure the \pgfmathlogtologten method works even for % non-standard 'log basis #1': - \expandafter\let\expandafter\pgfmathlogtologten@\csname pgfplotsmathlogtologten@#1@\endcsname + \def\pgfmathlogtologten@{\pgfplotscoordmath{#1}{log to log 10}}% % - \let\pgfplots@tick@origin=\pgfmathresult% \xdef\pgfplots@show@ticklabel@LASTTICK{}% \pgfplotslistforeachungrouped\pgfplots@prepared@tick@positions@major@\as\pgfplots@curtickpos{% - \expandafter\pgfplotslistpopfront\csname pgfplots@prepared@tick@positions@major@tickindices@#1\endcsname\to\pgfplots@ticknum + \expandafter\pgfplots@prepared@tick@pos@unpack\pgfplots@curtickpos + \let\pgfplots@curtickpos=\pgfplots@tick + %\expandafter\pgfplotslistpopfront\csname pgfplots@prepared@tick@positions@major@tickindices@#1\endcsname\to\pgfplots@ticknum + \pgfplotspointouternormalvectorofaxissetv{}{\pgfplots@curtickpos}% \pgfplots@show@ticklabel - {#1}{\pgfplots@curtickpos}(\pgfplots@curtickpos,\pgfplots@tick@origin)% + {#1}{\pgfplots@curtickpos}(\pgfplots@curtickpos,\pgfplots@tick@origin+\pgfplots@tick@offset)% {\pgfplots@ticknum}% }% \pgfplots@ticklabel@maxtickdimen@finish{#1}% @@ -1394,9 +1482,21 @@ \let\pgfplots@loc@TMPc=\pgfmathresult \ifx\pgfplots@loc@TMPc\pgfutil@empty \else - \pgftransformshift{% - \pgfplotspointouternormalvectorofticklabelaxis{#1}% - \pgfqpointscale{-\pgfplots@loc@TMPc}{}% + \pgfplotspointouternormalvectorofaxis@ifdependson@v{\pgfplotsticklabelaxisspec{#1}}{% + \tikzset{every node/.append code={% + \tikz@addtransform{% + \pgftransformshift{% + \pgfplotspointouternormalvectorofticklabelaxis{#1}% + \pgfqpointscale{-\pgfplots@loc@TMPc}{}% + }% + }% + }% + }% + }{% + \pgftransformshift{% + \pgfplotspointouternormalvectorofticklabelaxis{#1}% + \pgfqpointscale{-\pgfplots@loc@TMPc}{}% + }% }% \fi % @@ -1520,7 +1620,8 @@ \def\pgfplots@compute@tick@times@logten#1\to#2#3{% \global\let#2=\pgfutil@empty \foreach \pgfplots@loc@TMPb in {#1} {% - \pgfmathmultiply@{\pgfplots@loc@TMPb}{\csname pgfplots@log@scale@todisplaylog@#3\endcsname}% + \pgfplotscoordmath{#3}{log to display log}{\pgfplots@loc@TMPb}% + \pgfplotscoordmath{#3}{tofixed}{\pgfmathresult}% \ifx#2\pgfutil@empty \xdef#2{\pgfmathresult}% \else @@ -1611,8 +1712,6 @@ % Shortcut-names: \expandafter\let\expandafter\ifpgfplots@is@datascaled\csname ifpgfplots@apply@datatrafo@#1\endcsname % Attention here: use UNSHIFTET scalings, see remark above - \expandafter\let\expandafter\pgfplots@data@scale@trafo\csname pgfplots@datascaletrafo@#1@noshift\endcsname - \expandafter\let\expandafter\pgfplots@data@scale@inverse@trafo\csname pgfplots@inverse@datascaletrafo@#1@noshift\endcsname \expandafter\let\expandafter\ifpgfplots@cur@is@linear\csname ifpgfplots@#1islinear\endcsname % \let\desirednumticks=\c@pgf@countd @@ -1639,6 +1738,18 @@ \expandafter\let\csname pgfplots@#1tick\endcsname=\pgfplots@glob@TMPa \fi \fi + \ifpgfplots@cur@is@linear + \else + \pgfplotscoordmath{#1}{parsenumber}{1}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotscoordmath{#1}{log from display log}{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{tofixed}{\pgfmathresult}% + \let\pgfplots@loc@log@from@display@log@scale=\pgfmathresult + % + \pgfplotscoordmath{#1}{log to display log}{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{#1}{tofixed}{\pgfmathresult}% + \let\pgfplots@loc@log@to@display@log@scale=\pgfmathresult + \fi % \expandafter\ifx\csname pgfplots@#1tick\endcsname\pgfutil@empty % Ok, we have either log or linear axis and need default @@ -1648,12 +1759,13 @@ \let\MAX=\pgf@ya \let\MIN=\pgf@yb % compute step size 'H': - \expandafter\MAX\csname pgfplots@#1max\endcsname pt % + \MAX=\csname pgfplots@#1max\endcsname pt % \advance\MAX by0.001pt % avoid round errors %\expandafter\MIN\the\c@pgf@counta pt - \expandafter\MIN\csname pgfplots@#1min\endcsname pt % + \MIN=\csname pgfplots@#1min\endcsname pt % \H=\MAX \advance\H by-\MIN + \ifdim\H<0pt \H=-1\H \fi %\message{Axis limit #1: [\the\MIN:\the\MAX], diff = \the\H.}% \c@pgf@counta=\desirednumticks \advance\c@pgf@counta by-1 % @@ -1666,40 +1778,18 @@ % CASE LINEAR AXIS \ifpgfplots@is@datascaled % This here works if the scaling trafo is linear. - \expandafter\pgfplots@data@scale@inverse@trafo\expandafter{\Hmacro}% + \pgfplotscoordmath{#1}{datascaletrafo noshift inverse}{\Hmacro}% \let\Hmacro=\pgfmathresult \else \pgfmathfloatparsenumber{\Hmacro}% \let\Hmacro=\pgfmathresult \fi - \expandafter\pgfmathfloat@decompose\pgfmathresult\relax\pgfmathfloat@a@S\H\pgfmathfloat@a@E %\message{Got T^{-1}(H#1) = \Hmacro}% - % modify the mantisse: - \ifdim\H<2pt - \ifdim\H<1.5pt - \H=1.0pt - \else - \H=2.0pt - \fi - \else - \ifdim\H<4.9999pt - \ifdim\H<3.5pt - \H=2.0pt\relax - \else - \H=5.0pt\relax - \fi - \else - \ifdim\H<7.5pt - \H=5.0pt\relax - \else - \H=1.0pt\relax - \advance\pgfmathfloat@a@E by1 - \fi - \fi - \fi - \aftergroup\pgfplots@isuniformticktrue - \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\pgf@sys@tonumber{\H}}{\the\pgfmathfloat@a@E}% + % + \pgfplots@assign@default@tick@foraxis@normalizetickdist#1\Hmacro \let\Hmacro=\pgfmathresult + % + \aftergroup\pgfplots@isuniformticktrue % The following code is carried out in floating point % arithmetics because it requires large data ranges. % @@ -1719,9 +1809,9 @@ % Now, convert everything into the fixed point data % range: \ifpgfplots@is@datascaled - \csname pgfplots@datascaletrafo@#1\endcsname{\MIN@new}% + \pgfplotscoordmath{#1}{datascaletrafo}{\MIN@new}% \MIN=\pgfmathresult pt - \pgfplots@data@scale@trafo\Hmacro + \pgfplotscoordmath{#1}{datascaletrafo noshift}{\Hmacro}% \H=\pgfmathresult pt \else \pgfmathfloattofixed\MIN@new @@ -1742,7 +1832,7 @@ % % And prefer j=1 if that is possible (otherwise minor % ticks are not useful). - \pgfmathmultiply@{\Hmacro}{\csname pgfplots@log@scale@todisplaylog@#1@inv\endcsname}% + \pgfmath@basic@multiply@{\Hmacro}{\pgfplots@loc@log@from@display@log@scale}% \let\Hmacrobaseten=\pgfmathresult \expandafter\H\pgfmathresult pt %\message{ [ H / log(10) = \pgfmathresult ]}% @@ -1764,7 +1854,7 @@ \pgfplots@isuniformtickfalse \fi %\message{final H=\pgf@sys@tonumber{\H} * log(10)}% - \H=\csname pgfplots@log@scale@todisplaylog@#1\endcsname\H\relax + \H=\pgfplots@loc@log@to@display@log@scale\H % Now, we want to activate the Tick set % {lowest, lowest+H, ..., highest} % @@ -1777,14 +1867,14 @@ \MINH=\MIN % % and compute I and I*log(10) here: - \MIN=\csname pgfplots@log@scale@todisplaylog@#1@inv\endcsname\MIN\relax + \MIN=\pgfplots@loc@log@from@display@log@scale \MIN \edef\pgfmathresult{\pgf@sys@tonumber{\MIN}}% \pgfmathsetcount{\c@pgf@counta}{\pgfmathresult}% \ifdim\MIN<0pt % the truncation rounds TOWARDS 0 which is not what I want. \advance\c@pgf@counta by-1 \fi - \MIN=\csname pgfplots@log@scale@todisplaylog@#1\endcsname pt + \MIN=\pgfplots@loc@log@to@display@log@scale pt \multiply\MIN by\c@pgf@counta \ifpgfplots@isuniformtick \else @@ -1814,7 +1904,7 @@ \advance\MINH by-\H % \ifdim\MINH<0pt - \advance\MIN \csname pgfplots@log@scale@todisplaylog@#1\endcsname pt + \advance\MIN \pgfplots@loc@log@to@display@log@scale pt \fi \fi \fi @@ -1846,6 +1936,7 @@ \expandafter\global\expandafter\let\expandafter\pgfplots@glob@TMPb\csname pgfplots@tick@distance@#1\endcsname \endgroup }{% + % Case logarithmic axes and too few ticks. \aftergroup\pgfplots@isuniformtickfalse % ok, do something special. % @@ -1855,10 +1946,11 @@ % So: apply basically the SAME code as above for linear % axis, just everything log 10! And keep in mind that all % coordinates are actually given as natural logarithms. - \expandafter\MIN\csname pgfplots@#1min\endcsname pt + \MIN\csname pgfplots@#1min\endcsname pt \H=\MAX \advance\H by-\MIN - \H=\csname pgfplots@log@scale@todisplaylog@#1@inv\endcsname\H + \ifdim\H<0pt \H=-1\H \fi + \H=\pgfplots@loc@log@from@display@log@scale \H %\message{Axis limit #1: [\the\MIN:\the\MAX], diff/log(10) = \the\H.}% \c@pgf@counta=\desirednumticks\relax \advance\c@pgf@counta by-1 @@ -1873,31 +1965,8 @@ % SEARCH for the NEXT FEASABLE H. \edef\Hmacro{\pgf@sys@tonumber\H}% \pgfmathfloatparsenumber{\Hmacro}% - \expandafter\pgfmathfloat@decompose\pgfmathresult\relax\pgfmathfloat@a@S\H\pgfmathfloat@a@E - % Determine properly snapped mantisse... - \ifdim\H<2pt - \ifdim\H<1.5pt - \H=1.0pt - \else - \H=2.0pt - \fi - \else - \ifdim\H<4.9999pt - \ifdim\H<3.5pt - \H=2.0pt\relax - \else - \H=5.0pt\relax - \fi - \else - \ifdim\H<7.5pt - \H=5.0pt\relax - \else - \H=1.0pt\relax - \advance\pgfmathfloat@a@E by1 - \fi - \fi - \fi - \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\pgf@sys@tonumber{\H}}{\the\pgfmathfloat@a@E}% + \pgfplots@assign@default@tick@foraxis@normalizetickdist#1\pgfmathresult + % \expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}% \let\Hmacro=\pgfmathresult \H=\Hmacro pt % @@ -1909,7 +1978,7 @@ % -> I = round(xmin/H) % -> MIN = I * H % BUT EVERYTHING to log(10) basis! - \MIN=\csname pgfplots@log@scale@todisplaylog@#1@inv\endcsname \MIN\relax + \MIN=\pgfplots@loc@log@from@display@log@scale \MIN \pgfmathlog@invoke@expanded\pgfmathdivide@{% {\pgf@sys@tonumber\MIN}% {\Hmacro}% @@ -1923,8 +1992,8 @@ \multiply\MIN by\c@pgf@counta\relax % % convert back to basis 'e': - \MIN=\csname pgfplots@log@scale@todisplaylog@#1\endcsname\MIN\relax - \H=\csname pgfplots@log@scale@todisplaylog@#1\endcsname\H\relax + \MIN=\pgfplots@loc@log@to@display@log@scale\MIN\relax + \H=\pgfplots@loc@log@to@display@log@scale\H\relax \MINH=\MIN\relax \advance\MINH by\H\relax }% @@ -1947,16 +2016,69 @@ %\message{pgfplots.sty: #1tick set to \csname pgfplots@#1tick\endcsname [#1min=\csname pgfplots@#1min\endcsname, #1max=\csname pgfplots@#1max\endcsname].}% } +% Takes the distance between adjacent ticks as floating point number +% and returns a normalized tick distance. +% +% +% The idea is to get "nice" (human readable) distances instead of +% strange fractions or real numbers. +% +% The result will be assigned to \pgfmathresult (in float). +% +% #1 the axis (x or y or z) +% #2 the unnormalized tick distance computed so far +% +% Example: +% \pgfmathfloatparsenumber{x}{1234} +% \pgfplots@assign@default@tick@foraxis@normalizetickdist\pgfmathresult +% \pgfmathfloatotfixed\pgfmathresult +% --> +% +% \pgfmathresult={1200} +% or something like that. +\def\pgfplots@assign@default@tick@foraxis@normalizetickdist#1#2{% + \begingroup + \let\H=\pgf@xb + \expandafter\pgfmathfloat@decompose#2\relax\pgfmathfloat@a@S\H\pgfmathfloat@a@E + % modify the mantisse: + \ifdim\H<2pt + \ifdim\H<1.5pt + \H=1.0pt + \else + \H=2.0pt + \fi + \else + \ifdim\H<4.9999pt + \ifdim\H<3.5pt + \H=2.0pt\relax + \else + \H=5.0pt\relax + \fi + \else + \ifdim\H<7.5pt + \H=5.0pt\relax + \else + \H=1.0pt\relax + \advance\pgfmathfloat@a@E by1 + \fi + \fi + \fi + \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\pgf@sys@tonumber{\H}}{\the\pgfmathfloat@a@E}% + \pgfmath@smuggleone\pgfmathresult + \endgroup +}% + % Helper method for % \pgfplots@apply@data@scale@trafo@to@options@for % #1: the ticks -% #2: the trafo macro name +% #2: the trafo routine (not necessarily a single macro, but should +% take one arg) % #3: the output macro name \long\def\pgfplots@apply@data@scale@trafo@to@user@ticks#1#2\to#3{% \let#3=\pgfutil@empty \foreach \pgfplots@loc@TMPb in {#1} {% \pgfmathfloatparsenumber{\pgfplots@loc@TMPb}% - \expandafter#2\expandafter{\pgfmathresult}% + #2{\pgfmathresult}% \ifx#3\pgfutil@empty \xdef#3{\pgfmathresult}% \else diff --git a/Master/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-dvips.def b/Master/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-dvips.def index b45b779e003..e81a53a44d8 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-dvips.def +++ b/Master/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-dvips.def @@ -75,11 +75,15 @@ /PatternType 2 /Shading << - /ShadingType 5 + /ShadingType \pgfplotslibrarysurf@type\space /BitsPerCoordinate \pgfplotslibrarysurf@bitspercoordinate\space /BitsPerComponent 16 % Note: this here is the reason why I can't use ASCII85Decode - /VerticesPerRow \pgfkeysvalueof{/pgfplots/surf shading/cols} - /ColorSpace /DeviceRGB + \if5\pgfplotslibrarysurf@type + /VerticesPerRow \pgfkeysvalueof{/pgfplots/surf shading/cols} + \else + /BitsPerFlag 8 + \fi + /ColorSpace /Device\pgfplotslibrarysurf@colorspace /Decode [\pgfplotslibrarysurf@decode] /Function \pgfkeysvalueof{/pgfplots/surf shading/colormap} /DataSource diff --git a/Master/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def b/Master/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def index 63ec517b963..c94f05e585e 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def +++ b/Master/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def @@ -73,11 +73,15 @@ \def\pgfplotssys@do@surfshading@fillpaths#1{% \immediate\pdfobj stream attr {% % stream length will be computed automatically - /ShadingType 5 + /ShadingType \pgfplotslibrarysurf@type\space /BitsPerCoordinate \pgfplotslibrarysurf@bitspercoordinate\space /BitsPerComponent 16 - /VerticesPerRow \pgfkeysvalueof{/pgfplots/surf shading/cols} - /ColorSpace /DeviceRGB + \if5\pgfplotslibrarysurf@type + /VerticesPerRow \pgfkeysvalueof{/pgfplots/surf shading/cols} + \else + /BitsPerFlag 8 + \fi + /ColorSpace /Device\pgfplotslibrarysurf@colorspace /Decode [\pgfplotslibrarysurf@decode] /Function \pgfkeysvalueof{/pgfplots/surf shading/colormap} \ifx\pgfplotslibrarysurf@filter@decode\pgfutil@empty diff --git a/Master/texmf-dist/tex/generic/pgfplots/sys/pgfplotssysgeneric.code.tex b/Master/texmf-dist/tex/generic/pgfplots/sys/pgfplotssysgeneric.code.tex new file mode 100644 index 00000000000..cc79af2d013 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/sys/pgfplotssysgeneric.code.tex @@ -0,0 +1,30 @@ +%-------------------------------------------- +% Package pgfplots +% +% Provides a user-friendly interface to create function plots (normal +% plots, semi-logplots and double-logplots). +% +% It is based on Till Tantau's PGF package. +% +% Copyright 2007/2008 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +%-------------------------------------------- + +\def\pgfplots@sys@beforenode{% + \pgfkeysifdefined{/tikz/tex4ht node/escape/.@cmd}{% + \tikzset{tex4ht node/escape=true}% + }{}% +}% diff --git a/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap.code.tex b/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap.code.tex index b1496a8fc1b..838e0393e2e 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap.code.tex @@ -25,6 +25,8 @@ % %-------------------------------------------- +\pgfkeyssetvalue{/pgfplots/colormap default colorspace}{auto} + % This package relies on pgfplots temporary registers and its array % data structure. @@ -53,6 +55,7 @@ \expandafter\pgfplotsarraynewempty\expandafter{\pgfplots@createcolormap@name}% \def\pgfplots@createcolormap@MIN{0}% NORMALIZATION: assume that lower-end is 0pt. \def\pgfplots@createcolormap@MAX{0}% To be computed. + \pgfplots@createcolormap@initcolorspace \let\pgfplots@createcolormap@LAST=\pgfplots@createcolormap@MIN % PARSE IT: \edef\pgfplots@loc@TMPa{#2}% @@ -75,8 +78,40 @@ \expandafter\let\csname\pgfplots@createcolormap@name @h\endcsname=\pgfplots@createcolormap@H \pgfmathreciprocal@{\pgfplots@createcolormap@H}% \expandafter\let\csname\pgfplots@createcolormap@name @invh\endcsname=\pgfmathresult + \expandafter\let\csname\pgfplots@createcolormap@name @col@comps\endcsname=\pgfplots@createcolormap@col@comps + \expandafter\let\csname\pgfplots@createcolormap@name @colspace\endcsname=\pgfplots@createcolormap@colspace %\pgfplots@colormap@showdebuginfofor{#1}% } +\def\pgfplots@createcolormap@initcolorspace{% + \pgfkeysgetvalue{/pgfplots/colormap default colorspace}\pgfplots@loc@TMPa + \edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa}% + \def\pgfplots@loc@TMPb{auto}% + \ifx\pgfplots@loc@TMPb\pgfplots@loc@TMPa + % colormap default colorspace=auto: same as empty. + \let\pgfplots@loc@TMPa=\pgfutil@empty + \fi + \ifx\pgfplots@loc@TMPa\pgfutil@empty + % colormap default colorspace=auto: + \def\pgfplots@createcolormap@col@comps{}% to be filled from first point + \def\pgfplots@createcolormap@colspace{}% + \else + \def\pgfplots@loc@TMPb{rgb}% + \ifx\pgfplots@loc@TMPb\pgfplots@loc@TMPa + % colormap default colorspace=rgb: + \def\pgfplots@createcolormap@colspace{rgb}% + \def\pgfplots@createcolormap@col@comps{3}% + \else + \def\pgfplots@loc@TMPb{cmyk}% + \ifx\pgfplots@loc@TMPb\pgfplots@loc@TMPa + % colormap default colorspace=cmyk: + \def\pgfplots@createcolormap@colspace{cmyk}% + \def\pgfplots@createcolormap@col@comps{4}% + \else + \pgfplots@error{Sorry, the choice 'colormap default colorspace=\pgfplots@loc@TMPa' is unknown to pgfplots, please use one of 'auto,rgb,cmyk'}% + \fi + \fi + \fi +}% \def\pgfplots@createcolormap@seth[#1]{% \def\pgfplots@createcolormap@context{[#1]}% \pgfmathparse{#1}% @@ -101,7 +136,7 @@ {% \pgfutil@ifnextchar g{\pgfplots@createcolormap@grabgray}% {% - \pgfutil@ifnextchar c{\pgfplots@createcolormap@grabcolor}% + \pgfutil@ifnextchar c{\pgfplots@createcolormap@grabc}% { \expandafter\pgfutil@ifnextchar\pgfplots@activesemicolon{\pgfplots@createcolormap@grabsemicolon@active}% {\pgfplots@createcolormap@error}% @@ -177,6 +212,41 @@ \edef\pgfplots@loc@TMPa{{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}{\pgfmathresult}}% \expandafter\pgfplots@loc@TMPc\pgfplots@loc@TMPa \pgfplots@createcolormap@} + + +\def\pgfplots@createcolormap@grabcmyk myk{ + \def\pgfplots@createcolormap@colspace@actual{cmyk}% + \def\pgfplots@createcolormap@col@comps@actual{4}% + \pgfutil@ifnextchar2{% + \pgfplots@createcolormap@grabcmyk@two@five@five + }{% + \let\pgfplots@createcolormap@next@\pgfplots@createcolormap@grabcmyk@ + \pgfplots@createcolormap@next + }% +} +\def\pgfplots@createcolormap@grabcmyk@(#1)=(#2,#3,#4,#5){% + \def\pgfplots@createcolormap@context{cmyk(#1)=(#2,#3,#4,#5)}% + \pgfplots@createcolormap@nextcolor{#1}{#2}{#3}{#4}{#5}% + \pgfplots@createcolormap@} +\def\pgfplots@createcolormap@grabcmyk@two@five@five255{% + \let\pgfplots@createcolormap@next@\pgfplots@createcolormap@grabcmyk@two@five@five@ + \pgfplots@createcolormap@next +} +\def\pgfplots@createcolormap@grabcmyk@two@five@five@(#1)=(#2,#3,#4,#5){% + \def\pgfplots@createcolormap@context{cmyk255(#1)=(#2,#3,#4,#5)}% + \pgfplots@createcolormap@grabcmyk@two@five@five@rescale{#2}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplots@createcolormap@grabcmyk@two@five@five@rescale{#3}% + \let\pgfplots@loc@TMPb=\pgfmathresult + \pgfplots@createcolormap@grabcmyk@two@five@five@rescale{#4}% + \let\pgfplots@loc@TMPc=\pgfmathresult + \pgfplots@createcolormap@grabcmyk@two@five@five@rescale{#5}% + \def\pgfplots@loc@TMPd{\pgfplots@createcolormap@nextcolor{#1}}% + \edef\pgfplots@loc@TMPa{{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPc}{\pgfmathresult}}% + \expandafter\pgfplots@loc@TMPd\pgfplots@loc@TMPa + \pgfplots@createcolormap@} + + \def\pgfplots@createcolormap@grabgray gray{% \let\pgfplots@createcolormap@next@\pgfplots@createcolormap@grabgray@ \pgfplots@createcolormap@next @@ -185,7 +255,15 @@ \def\pgfplots@createcolormap@context{gray(#1)=(#2)}% \pgfplots@createcolormap@nextRGB{#1}{#2}{#2}{#2}% \pgfplots@createcolormap@} -\def\pgfplots@createcolormap@grabcolor color{% + +\def\pgfplots@createcolormap@grabc c{% + \pgfutil@ifnextchar m{% + \pgfplots@createcolormap@grabcmyk + }{% + \pgfplots@createcolormap@grabcolor + }% +}% +\def\pgfplots@createcolormap@grabcolor olor{% \let\pgfplots@createcolormap@next@\pgfplots@createcolormap@grabcolor@ \pgfplots@createcolormap@next }% @@ -193,36 +271,105 @@ \def\pgfplots@createcolormap@context{color(#1)=(#2)}% \pgfutil@colorlet{pgf@tempcol}{#2}% \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}% - \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}% - \expandafter\pgfplots@createcolormap@grabcolor@@\pgf@rgbcolor\relax{#1}}% + \ifx\pgfplots@createcolormap@colspace\pgfutil@empty + % This here is mainly for backwards compatibility... in older + % versions, rgb was the only choice. This should still work + % unless overruled explicitly. + \def\pgfplots@createcolormap@colspace{rgb}% + \def\pgfplots@createcolormap@col@comps{3}% + \fi + % convert the colorspace (if needed): + \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{\pgfplots@createcolormap@colspace}{\pgf@rgbcolor}% + % + \let\pgfplots@createcolormap@colspace@actual=\pgfplots@createcolormap@colspace + \let\pgfplots@createcolormap@col@comps@actual=\pgfplots@createcolormap@col@comps + % + \if4\pgfplots@createcolormap@col@comps + \let\pgfplots@loc@TMPa=\pgfplots@createcolormap@grabcolor@@@ + \else + \let\pgfplots@loc@TMPa=\pgfplots@createcolormap@grabcolor@@ + \fi + \expandafter\pgfplots@loc@TMPa\pgf@rgbcolor\relax{#1}% +}% \def\pgfplots@createcolormap@grabcolor@@#1,#2,#3\relax#4{% \pgfplots@createcolormap@nextRGB{#4}{#1}{#2}{#3}% \pgfplots@createcolormap@} +\def\pgfplots@createcolormap@grabcolor@@@#1,#2,#3,#4\relax#5{% + \pgfplots@createcolormap@nextcolor{#5}{#1}{#2}{#3}{#4}% + \pgfplots@createcolormap@} + \def\pgfplots@createcolormap@rgbrangeexception#1#2#3{% \pgfplots@error{Sorry, RGB[#1,#2,#3] is not supported. The allowed range is 0 <= r,g,b <= 1. The error occured near `\pgfplots@createcolormap@context'}% }% +\def\pgfplots@createcolormap@rangeexception#1#2{% + \pgfplots@error{Sorry, the color component at index #1 (value #2) is out of range. The allowed range is 0 <= value <= 1. The error occured near `\pgfplots@createcolormap@context'}% +} + % Ok, we parsed the next single spec. % #1: the width % #2,#3,#4 RGB values. \def\pgfplots@createcolormap@nextRGB#1#2#3#4{% + \def\pgfplots@createcolormap@colspace@actual{rgb}% + \def\pgfplots@createcolormap@col@comps@actual{3}% + \pgfplots@createcolormap@nextcolor{#1}{#2}{#3}{#4}{}% +}% + +% #1: h +% #2...#5: the color components (at least 3 non-empty, can be 4). +\def\pgfplots@createcolormap@nextcolor#1#2#3#4#5{% \ifdim#2pt<0pt - \pgfplots@createcolormap@rgbrangeexception{#2}{#3}{#4}% + \pgfplots@createcolormap@rangeexception0{#2}% \fi \ifdim#3pt<0pt - \pgfplots@createcolormap@rgbrangeexception{#2}{#3}{#4}% + \pgfplots@createcolormap@rangeexception1{#3}% \fi \ifdim#4pt<0pt - \pgfplots@createcolormap@rgbrangeexception{#2}{#3}{#4}% + \pgfplots@createcolormap@rangeexception2{#4}% \fi \ifdim#2pt>1pt - \pgfplots@createcolormap@rgbrangeexception{#2}{#3}{#4}% + \pgfplots@createcolormap@rangeexception0{#2}% \fi \ifdim#3pt>1pt - \pgfplots@createcolormap@rgbrangeexception{#2}{#3}{#4}% + \pgfplots@createcolormap@rangeexception1{#3}% \fi \ifdim#4pt>1pt - \pgfplots@createcolormap@rgbrangeexception{#2}{#3}{#4}% + \pgfplots@createcolormap@rangeexception2{#4}% + \fi + \if4\pgfplots@createcolormap@col@comps@actual + \ifdim#5pt<0pt + \pgfplots@createcolormap@rangeexception3{#5}% + \fi + \ifdim#5pt>1pt + \pgfplots@createcolormap@rangeexception3{#5}% + \fi + \fi + \def\pgfplots@loc@TMPb{\pgfplots@createcolormap@nextcolor@{#1}{#2}{#3}{#4}{#5}}% + \ifx\pgfplots@createcolormap@colspace@actual\pgfplots@createcolormap@colspace + \else + \ifx\pgfplots@createcolormap@colspace\pgfutil@empty + \let\pgfplots@createcolormap@colspace=\pgfplots@createcolormap@colspace@actual + \let\pgfplots@createcolormap@col@comps=\pgfplots@createcolormap@col@comps@actual + \else + % Oh. We need to convert the color space! + \edef\pgfplots@loc@TMPa{{\pgfplots@createcolormap@colspace@actual}{#2,#3,#4\if4\pgfplots@createcolormap@col@comps@actual,#5\fi}}% + \expandafter\pgfutil@convertcolorspec\pgfplots@loc@TMPa{\pgfplots@createcolormap@colspace}{\pgfplots@loc@TMPa}% + % invoke + % \pgfplots@createcolormap@nextcolor@{#1}{C1}{C2}{C3}{C4}. + % We need to compute C1 ... C4 : + \def\pgf@colmarshal{{#1}}% + \expandafter\pgf@uncomma\pgfplots@loc@TMPa,,% + \if4\pgfplots@createcolormap@col@comps + \else + % ok, we have C4={}. Append it: + \edef\pgf@colmarshal{\pgf@colmarshal{}}% + \fi + \def\pgfplots@loc@TMPb{\expandafter\pgfplots@createcolormap@nextcolor@\pgf@colmarshal}% + \fi \fi + \pgfplots@loc@TMPb +}% +\def\pgfplots@createcolormap@nextcolor@#1#2#3#4#5{% +%\message{processing color #1=(#2,#3,#4,#5) with \pgfplots@createcolormap@col@comps@actual\space components^^J}% % compute 'h': \pgfmathparse{#1}% \let\pgfplots@createcolormap@MAX=\pgfmathresult @@ -270,14 +417,19 @@ \ifdim\c@pgfplots@createcolormap pt=\pgfplots@loc@TMPb pt % omit the last. \else - \pgfmathparse{\pgfplots@createcolormap@lastR + \c@pgfplots@createcolormap/\pgfplots@loc@TMPb * ( #2 - \pgfplots@createcolormap@lastR )}% - \let\pgfplots@createcolormap@nextR=\pgfmathresult - \pgfmathparse{\pgfplots@createcolormap@lastG + \c@pgfplots@createcolormap/\pgfplots@loc@TMPb * ( #3 - \pgfplots@createcolormap@lastG )}% - \let\pgfplots@createcolormap@nextG=\pgfmathresult - \pgfmathparse{\pgfplots@createcolormap@lastB + \c@pgfplots@createcolormap/\pgfplots@loc@TMPb * ( #4 - \pgfplots@createcolormap@lastB )}% + \pgfmathparse{\pgfplots@createcolormap@lastA + \c@pgfplots@createcolormap/\pgfplots@loc@TMPb * ( #2 - \pgfplots@createcolormap@lastA )}% + \let\pgfplots@createcolormap@nextA=\pgfmathresult + \pgfmathparse{\pgfplots@createcolormap@lastB + \c@pgfplots@createcolormap/\pgfplots@loc@TMPb * ( #3 - \pgfplots@createcolormap@lastB )}% + \let\pgfplots@createcolormap@nextB=\pgfmathresult + \pgfmathparse{\pgfplots@createcolormap@lastC + \c@pgfplots@createcolormap/\pgfplots@loc@TMPb * ( #4 - \pgfplots@createcolormap@lastC )}% + \let\pgfplots@createcolormap@nextC=\pgfmathresult + \if4\pgfplots@createcolormap@col@comps + \pgfmathparse{\pgfplots@createcolormap@lastD + \c@pgfplots@createcolormap/\pgfplots@loc@TMPb * ( #4 - \pgfplots@createcolormap@lastD )}% + \let\pgfplots@createcolormap@nextD=\pgfmathresult + \fi % \edef\pgfplots@loc@TMPa{% - \noexpand\pgfplotsarraypushback{\pgfplots@createcolormap@nextR,\pgfplots@createcolormap@nextG,\pgfmathresult}% + \noexpand\pgfplotsarraypushback{\pgfplots@createcolormap@nextA,\pgfplots@createcolormap@nextB,\pgfplots@createcolormap@nextC\if4\pgfplots@createcolormap@col@comps,\pgfplots@createcolormap@nextD\fi}% \noexpand\to}% \expandafter\pgfplots@loc@TMPa\expandafter{\pgfplots@createcolormap@name}% \fi @@ -285,11 +437,12 @@ \fi \fi \fi - \def\pgfplots@loc@TMPa{\pgfplotsarraypushback{#2,#3,#4}\to}% + \edef\pgfplots@loc@TMPa{\noexpand\pgfplotsarraypushback{#2,#3,#4\if4\pgfplots@createcolormap@col@comps,#5\fi}\noexpand\to}% \expandafter\pgfplots@loc@TMPa\expandafter{\pgfplots@createcolormap@name}% - \edef\pgfplots@createcolormap@lastR{#2}% - \edef\pgfplots@createcolormap@lastG{#3}% - \edef\pgfplots@createcolormap@lastB{#4}% + \edef\pgfplots@createcolormap@lastA{#2}% + \edef\pgfplots@createcolormap@lastB{#3}% + \edef\pgfplots@createcolormap@lastC{#4}% + \edef\pgfplots@createcolormap@lastD{#5}% }% \def\pgfplots@createcolormap@nextRGB@consider@reinterpolation#1\relax{% \pgf@xa=#1pt @@ -318,19 +471,20 @@ % Shows debug info about colormap #1 into the console. \def\pgfplots@colormap@showdebuginfofor#1{% - \message{Debug info for color map '#1':}% - \message{(Transformed) Range: [0:\pgfplotscolormaprange]; }% - \message{H: \csname pgfpl@cm@#1@h\endcsname; }% - \message{H:^{-1}: \csname pgfpl@cm@#1@invh\endcsname; }% + \message{Debug info for color map '#1':^^J}% + \message{(Transformed) Range: [0:\pgfplotscolormaprange]; ^^J}% + \message{H: \csname pgfpl@cm@#1@h\endcsname; ^^J}% + \message{H:^{-1}: \csname pgfpl@cm@#1@invh\endcsname; ^^J}% \pgfplotsarraysizetomacro{pgfpl@cm@#1}\to\pgfplots@loc@TMPa - \message{Size: \pgfplots@loc@TMPa; }% - \message{RGB Values: }% + \message{Size: \pgfplots@loc@TMPa; ^^J}% + \message{Colorspace: \csname pgfpl@cm@#1@colspace\endcsname^^JValues (\csname pgfpl@cm@#1@col@comps\endcsname\space components each): ^^J}% \begingroup \c@pgf@counta=0 \pgfplotsarrayforeachungrouped{pgfpl@cm@#1}\as\elem{% \message{\#\the\c@pgf@counta: \elem; }% \advance\c@pgf@counta by1 }% + \message{^^J}% \endgroup } @@ -358,11 +512,15 @@ }% }% \toks3=\expandafter{\pgfplots@serialize@list}% + \toks4=\expandafter{\expandafter\def\csname pgfpl@cm@#1@colspace\endcsname}% + \toks5=\expandafter{\expandafter\def\csname pgfpl@cm@#1@col@comps\endcsname}% \xdef\pgfplots@glob@TMPa{% \the\toks0 {\csname pgfpl@cm@#1@h\endcsname}% \the\toks1 {\csname pgfpl@cm@#1@invh\endcsname}% \noexpand\def\noexpand\pgfplots@loc@TMPa{\the\toks3 }% \the\toks2 + \the\toks4 {\csname pgfpl@cm@#1@colspace\endcsname}% + \the\toks5 {\csname pgfpl@cm@#1@col@comps\endcsname}% }% \endgroup \let#2=\pgfplots@glob@TMPa @@ -395,7 +553,11 @@ \def\pgfplots@loc@TMPb{}% \def\pgfplots@loc@TMPc{}% \pgfplotsarrayforeachungrouped{pgfpl@cm@#1}\as\cdata{% - \edef\cdata{\expandafter\pgfplotscolormaptopdffunction@convertcdata\cdata\relax}% + \if4\csname pgfpl@cm@#1@col@comps\endcsname + \edef\cdata{\expandafter\pgfplotscolormaptopdffunction@convertcdata@four\cdata\relax}% + \else + \edef\cdata{\expandafter\pgfplotscolormaptopdffunction@convertcdata\cdata\relax}% + \fi \ifnum\c@pgf@counta>0 \t@pgfplots@toka=\expandafter{\pgfplotsretval}% \xdef\pgfplotsretval{% @@ -428,6 +590,7 @@ \endgroup }% \def\pgfplotscolormaptopdffunction@convertcdata#1,#2,#3\relax{#1 #2 #3}% +\def\pgfplotscolormaptopdffunction@convertcdata@four#1,#2,#3,#4\relax{#1 #2 #3 #4}% % Invokes '#2' if a color map named '#1' exists and '#3' if no such color map exists. \def\pgfplotscolormapifdefined#1#2#3{\pgfplotsarrayifdefined{pgfpl@cm@#1}{#2}{#3}}% @@ -459,6 +622,7 @@ \def\pgfplotscolormaptoshadingspec#1#2#3{% \pgfplotscolormapassertexists{#1}% \begingroup + \def\pgfplots@rgb{rgb}% \pgfmathparse{#2}% \expandafter\pgfmathdivide@\expandafter{\pgfmathresult}{\pgfplotscolormaprange}% \let\pgfplots@loc@TMPb=\pgfmathresult @@ -467,12 +631,23 @@ \c@pgf@counta=0 \let#3=\pgfutil@empty \pgfplotsarrayforeachungrouped{pgfpl@cm@#1}\as\pgfplotscolormaptoshadingspec@TMP{% - \ifnum\c@pgf@counta=0 - \edef\pgfplots@loc@TMPc{rgb(0pt)=(\pgfplotscolormaptoshadingspec@TMP)}% - \else - \pgf@yb=\c@pgf@counta\pgf@ya - \edef\pgfplots@loc@TMPc{rgb(\the\pgf@yb)=(\pgfplotscolormaptoshadingspec@TMP)}% + \pgf@yb=\c@pgf@counta\pgf@ya + \edef\pgfplots@colspace{\csname pgfpl@cm@#1@colspace\endcsname}% + % FIXME : PGF shadings accept only RGB! + \if1\pgfplotscolormaptoshadingspectorgb + \ifx\pgfplots@colspace\pgfplots@rgb + \else + \pgfutil@ifundefined{pgfpl@cm@#1@warned}{% + \expandafter\gdef\csname pgfpl@cm@#1@warned\endcsname{1}% + \pgfplots@warning{I am about to convert colormap '#1' from \pgfplots@colspace\space to rgb (which might be lossy). Perhaps the choice 'colorbar sampled={surf,shader=interp}' yields better results since it supports \pgfplots@colspace.}% + }{% + }% + \edef\pgf@tempcolor{{\pgfplots@colspace}{\pgfplotscolormaptoshadingspec@TMP}}% + \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgfplotscolormaptoshadingspec@TMP}% + \def\pgfplots@colspace{rgb}% + \fi \fi + \edef\pgfplots@loc@TMPc{\pgfplots@colspace(\the\pgf@yb)=(\pgfplotscolormaptoshadingspec@TMP)}% \ifx#3\pgfutil@empty \t@pgfplots@toka={}% \else @@ -485,6 +660,7 @@ \pgfmath@smuggleone#3% \endgroup }% +\def\pgfplotscolormaptoshadingspectorgb{1}% % The same as \pgfplotscolormaptoshadingspec, but this here yields the % *reversed* sequence. @@ -501,10 +677,20 @@ % end is fixed to '0'. \def\pgfplotscolormaprange{1000} -% Linearly maps the number #4 into the colormap #5 and returns the interpolated RGB triple -% into \pgfmathresult. +\def\pgfplotscolormapgetcolorspace#1{% + \edef\pgfplotsretval{\csname pgfpl@cm@#1@colspace\endcsname}% +}% +\def\pgfplotscolormapgetcolorcomps#1{% + \edef\pgfplotsretval{\csname pgfpl@cm@#1@col@comps\endcsname}% +}% + + +% Linearly maps the number #4 into the colormap #5 and returns the +% interpolated colors into \pgfmathresult. The result will be a triple +% for an RGB colormap and it will contain four numbers for CMYK. The +% components of the result will be in the range [0:1]. % -% [#1:#2] the number range of the data source. This is required to +% [#1:#2] the number range of the data source (i.e. of #4). This is required to % map into the colormap. % [#3] (optional) the quantity % s := \pgfplotscolormaprange / (#2-#1). @@ -564,6 +750,8 @@ % without '.0' suffix: \def\pgfplots@discardperiod##1.##2\relax{\def\pgfplotscolormapfind@intervalno{##1}}% \expandafter\pgfplots@discardperiod\pgfmathresult\relax + \pgfmathsubtract@{\pgfplotscolormapfind@transformedx@divh}{\pgfplotscolormapfind@intervalno}% + \let\pgfplots@loc@factor=\pgfmathresult %\message{mapping [#1,#2] -> [0,\pgfplotscolormaprange] yielded phi(#4) = \pgfplotscolormapfind@transformedx, situated in interval no \pgfplotscolormapfind@intervalno.}% % Step 2: interpolate the desired RGB value using vector valued % interpolation on the identified interval. @@ -573,7 +761,11 @@ \pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#5}\to\pgfplotscolormapfind@rgb@RIGHT %\message{After lookup: the corresponding RGB interval boundaries are [\pgfplotscolormapfind@rgb@LEFT: \pgfplotscolormapfind@rgb@RIGHT].}% \edef\pgfplots@loc@TMPa{\pgfplotscolormapfind@rgb@LEFT:\pgfplotscolormapfind@rgb@RIGHT}% - \expandafter\pgfplotscolormapfind@interpolate\pgfplots@loc@TMPa\relax + \if4\csname pgfpl@cm@#5@col@comps\endcsname + \expandafter\pgfplotscolormapfind@interpolate@four\pgfplots@loc@TMPa\relax + \else + \expandafter\pgfplotscolormapfind@interpolate\pgfplots@loc@TMPa\relax + \fi \pgfmath@smuggleone\pgfmathresult \endgroup %\message{-> got finally mapping(#4, #5) = RGB'\pgfmathresult'.}% @@ -588,26 +780,33 @@ % R: \pgfmathsubtract@{#4}{#1}% \let\pgfplotscolormapfind@Cdiff=\pgfmathresult - \pgfmathsubtract@{\pgfplotscolormapfind@transformedx@divh}{\pgfplotscolormapfind@intervalno}% - \expandafter\pgfmathmultiply@\expandafter{\pgfmathresult}{\pgfplotscolormapfind@Cdiff}% + \pgfmathmultiply@{\pgfplots@loc@factor}{\pgfplotscolormapfind@Cdiff}% \expandafter\pgfmathadd@\expandafter{\pgfmathresult}{#1}% \let\RED=\pgfmathresult % G: \pgfmathsubtract@{#5}{#2}% \let\pgfplotscolormapfind@Cdiff=\pgfmathresult - \pgfmathsubtract@{\pgfplotscolormapfind@transformedx@divh}{\pgfplotscolormapfind@intervalno}% - \expandafter\pgfmathmultiply@\expandafter{\pgfmathresult}{\pgfplotscolormapfind@Cdiff}% + \pgfmathmultiply@{\pgfplots@loc@factor}{\pgfplotscolormapfind@Cdiff}% \expandafter\pgfmathadd@\expandafter{\pgfmathresult}{#2}% \let\GREEN=\pgfmathresult % B: \pgfmathsubtract@{#6}{#3}% \let\pgfplotscolormapfind@Cdiff=\pgfmathresult - \pgfmathsubtract@{\pgfplotscolormapfind@transformedx@divh}{\pgfplotscolormapfind@intervalno}% - \expandafter\pgfmathmultiply@\expandafter{\pgfmathresult}{\pgfplotscolormapfind@Cdiff}% + \pgfmathmultiply@{\pgfplots@loc@factor}{\pgfplotscolormapfind@Cdiff}% \expandafter\pgfmathadd@\expandafter{\pgfmathresult}{#3}% \let\BLUE=\pgfmathresult \edef\pgfmathresult{\RED,\GREEN,\BLUE}% }% +\def\pgfplotscolormapfind@interpolate@four#1,#2,#3,#4:#5,#6,#7,#8\relax{% + \pgfplotscolormapfind@interpolate#1,#2,#3:#5,#6,#7\relax + \let\CMY=\pgfmathresult + \pgfmathsubtract@{#8}{#4}% + \let\pgfplotscolormapfind@Cdiff=\pgfmathresult + \pgfmathmultiply@{\pgfplots@loc@factor}{\pgfplotscolormapfind@Cdiff}% + \expandafter\pgfmathadd@\expandafter{\pgfmathresult}{#4}% + \let\K=\pgfmathresult + \edef\pgfmathresult{\CMY,\K}% +} % Performs a direct color access into color map '#2' using an index % '#1'. @@ -655,6 +854,7 @@ \fi }% + \pgfutil@definecolor{mapped color}{rgb}{0,0,0}% make sure this color exists. It will be overwritten if needed. \pgfplotscreatecolormap{hot}{color(0cm)=(blue); color(1cm)=(yellow); color(2cm)=(orange); color(3cm)=(red)} @@ -670,7 +870,7 @@ {#1} {\pgfkeysvalueof{/pgfplots/colormap name}} %\message{Color for current point is RGB '\pgfmathresult' (determined using meta 'phi(\pgfplotspointmeta) = \pgfplotspointmetatransformed')}% - \def\pgfplots@loc@TMPb{\pgfutil@definecolor{mapped color}{rgb}}% + \def\pgfplots@loc@TMPb{\pgfutil@definecolor{mapped color}{\csname pgfpl@cm@\pgfkeysvalueof{/pgfplots/colormap name}@colspace\endcsname}}% \expandafter\pgfplots@loc@TMPb\expandafter{\pgfmathresult}% }% diff --git a/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code.tex b/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code.tex index 60df282f8bb..2dacf8f7458 100644 --- a/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code.tex +++ b/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code.tex @@ -161,6 +161,7 @@ \expandafter\def\expandafter\pgfplots@command@to@string@@\pgfplots@glob@TMPa#1\pgfplots@EOI#2{% \def#2{#1}% }% +\def\pgfplotscommandtostring#1#2{\pgfplots@command@to@string{#1}{#2}}% % As \pgfplots@command@to@string, but it works for commands accepting % arguments. More precisely, #2 will be a string (!) of the form @@ -205,7 +206,9 @@ % \pgfplotsutil@ifdefinedui{\csname abc\endcsname} -> no % \pgfplotsutil@ifdefinedui{a_file_name} -> no \def\pgfplotsutil@ifdefinedui#1#2#3{% - \def\pgfplotsutil@@arg@ifdefined{#1}% + {\toks0={#1}% this construction is necessary to handle '#' characters in '#1' + \xdef\pgfplotsutil@@arg@ifdefined{\the\toks0}% + }% \pgfplots@command@to@string\pgfplotsutil@@arg@ifdefined\pgfplotsutil@@arg@ifdefined \expandafter\pgfplotsutil@trim\expandafter{\pgfplotsutil@@arg@ifdefined}% \pgfutil@ifundefined{\pgfplotsretval}{#3}{#2}% @@ -214,7 +217,9 @@ % '#1' after '#1' has been normalized. % It invokes '#3' if '#1#2' is defined and '#4' if not. \def\pgfplotsutil@ifdefinedui@withsuffix#1#2#3#4{% - \def\pgfplotsutil@@arg@ifdefined{#1}% + {\toks0={#1}% + \xdef\pgfplotsutil@@arg@ifdefined{\the\toks0}% + }% \pgfplots@command@to@string\pgfplotsutil@@arg@ifdefined\pgfplotsutil@@arg@ifdefined \expandafter\pgfplotsutil@trim\expandafter{\pgfplotsutil@@arg@ifdefined}% \pgfutil@ifundefined{\pgfplotsretval #2}{#4}{#3}% @@ -304,7 +309,7 @@ \edef\pgfmathresult{#2}% \fi }% -\def\pgfplotsmathlessthan#1#2{\ifdim#1 pt<#2 pt \pgfmathfloatcomparisontrue\else\pgfmathfloatcomparisonfalse\fi} +\def\pgfplotsmathlessthan#1#2{\ifdim#1pt<#2pt \pgfmathfloatcomparisontrue\else\pgfmathfloatcomparisonfalse\fi} % Re-define two-argument function for min and max. % The pgfmath engine now uses a variable number of arguments. @@ -555,6 +560,7 @@ % Discards any token up to (and including) \relax. \def\pgfplots@gobble@until@relax#1\relax{}% +\def\pgfplots@gobble@until@EOI#1\pgfplots@EOI{}% % A (simple) replacement for \foreach which % 1. does NOT scope the argument @@ -573,13 +579,24 @@ % scopes. % % This loop *can* be nested. -\def\pgfplotsforeachungrouped#1{\pgfplotsforeachungrouped@{#1}}% -\long\def\pgfplotsforeachungrouped@#1in #2#3{% - \pgfplotsforeachungrouped@isuniform{#2}% - \ifpgfplots@loc@tmp - \pgfplotsforeachungroupeduniform@{#1}#2\relax{#3}% +\def\pgfplotsforeachungrouped#1{% + \pgfutil@ifnextchar/{\pgfplotsforeachungrouped@{#1}}{\pgfplotsforeachungrouped@{#1}/{}}% +}% +\long\def\pgfplotsforeachungrouped@#1/#2in #3#4{% + \def\pgfplots@foreach@loc@TMPa{#2}% + \ifx\pgfplots@foreach@loc@TMPa\pgfutil@empty + \pgfplotsforeachungrouped@isuniform{#3}% + \ifpgfplots@loc@tmp + % special handling: + % \foreach #1 in {a,b,...,c} can be improved: + \pgfplotsforeachungroupeduniform@{#1}#3\relax{#4}% + \else + % invoke \foreach #1 in {#3} and transport results: + \pgfplotsforeachungroupednonuniform@#1{#3}{#4}% + \fi \else - \pgfplotsforeachungroupednonuniform@#1{#2}{#3}% + % invoke \foreach #1/#2 in {#3} and transport results: + \pgfplotsforeachungroupedslashed@#1/#2{#3}{#4}% \fi } \let\pgfplots@original@pgfmathadd@=\pgfmathadd@ @@ -659,6 +676,25 @@ #3% }% } +\long\def\pgfplotsforeachungroupedslashed@#1/#2#3#4{% + \pgfplotsapplistXXglobalnewempty + \foreach\pgfplots@foreach@loc@TMPa/\pgfplots@foreach@loc@TMPb in {#3} {% + \edef\pgfplots@foreach@loc@TMPa{\pgfplots@foreach@loc@TMPa/\pgfplots@foreach@loc@TMPb}% + \expandafter\pgfplotsapplistXXglobalpushback\expandafter{\pgfplots@foreach@loc@TMPa,}% + }% + \pgfplotsapplistXXgloballet\pgfplots@foreach@loc@TMPa + \pgfplotsapplistXXglobalclear + \expandafter\pgfplotsforeachentryinCSVisterminated\expandafter\pgfplots@foreach@loc@TMPa\expandafter{\pgfplots@foreach@loc@TMPa}{% + \expandafter\pgfplotsforeachungroupedslashed@@\pgfplots@foreach@loc@TMPa\pgfplots@EOI + \let#1=\pgfplots@foreach@loc@TMPa + \let#2=\pgfplots@foreach@loc@TMPb + #4% + }% +} +\def\pgfplotsforeachungroupedslashed@@#1/#2\pgfplots@EOI{% + \def\pgfplots@foreach@loc@TMPa{#1}% + \def\pgfplots@foreach@loc@TMPb{#2}% +}% % Sets \ifpgfplots@loc@tmp to true if and only if '#1' is of the form % #1 = <number1>,<number2>,...,<number3>. @@ -741,6 +777,12 @@ % Both, #1 and #2 will be provided as floating point numbers unless % configured otherwise with \pgfplotsforeachlogarithmicsetoutput, % see above. +% +% Arithmethics will be carried out with the math class +% '\pgfplotsforeachlogarithmicmathid'. +% This macro should expand to something which is usable inside of +% \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{....} +% the default is 'float' % % FIXME : THIS CAN'T BE NESTED YET! \def\pgfplotsforeachlogarithmicungrouped[#1]#2/#3{\pgfplotsforeachlogarithmicungrouped@[#1]{#2}{#3}}% @@ -749,18 +791,18 @@ % \pgfplots@foreach@loc@TMPd = N in fixed point % \pgfplots@foreach@loc@TMPc = N-1 in float : \edef\pgfplots@plot@samples@@{#1}% - \pgfmathfloatcreate{1}{1.0}{0}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{one}% \let\pgfplots@foreach@loc@TMPa=\pgfmathresult - \pgfmathfloatparsenumber{\pgfplots@plot@samples@@}% - \expandafter\pgfmathfloatsubtract@\expandafter{\pgfmathresult}{\pgfplots@foreach@loc@TMPa}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{parsenumber}{\pgfplots@plot@samples@@}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{op}{subtract}{{\pgfmathresult}{\pgfplots@foreach@loc@TMPa}}% \let\pgfplots@foreach@loc@TMPc=\pgfmathresult % \edef\pgfplots@loc@TMPb{#4}% \expandafter\pgfplotsforeachlogarithmicungrouped@readdomain\pgfplots@loc@TMPb\relax % compute mesh width into \pgfplots@foreach@loc@TMPc: % \pgfplots@foreach@loc@TMPc := h := ( log(xmax) - log(xmin) ) / (N-1) - \pgfmathfloatsubtract@{\pgfplots@foreach@loc@TMPb}{\pgfplots@foreach@loc@TMPa}% - \pgfmathfloatdivide@{\pgfmathresult}{\pgfplots@foreach@loc@TMPc}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{op}{subtract}{{\pgfplots@foreach@loc@TMPb}{\pgfplots@foreach@loc@TMPa}}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{op}{divide}{{\pgfmathresult}{\pgfplots@foreach@loc@TMPc}}% \let\pgfplots@foreach@loc@TMPc=\pgfmathresult % % apply local scoping here: @@ -772,13 +814,14 @@ \pgfutil@loop \ifnum\c@pgf@counta<\pgfplots@plot@samples@@ % compute exp(log(min) + i * h) - \expandafter\pgfmathfloatparsenumber\expandafter{\the\c@pgf@counta}% - \expandafter\pgfmathfloatmultiply@\expandafter{\pgfmathresult}{\pgfplots@foreach@loc@TMPc}% - \expandafter\pgfmathfloatadd@\expandafter{\pgfmathresult}{\pgfplots@foreach@loc@TMPa}% + \edef\pgfplots@loc@TMPa{\the\c@pgf@counta}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{parsenumber}{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{op}{multiply}{{\pgfmathresult}{\pgfplots@foreach@loc@TMPc}}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{op}{add}{{\pgfmathresult}{\pgfplots@foreach@loc@TMPa}}% \let\pgfplots@loc@TMPa=\pgfmathresult \pgfplotsforeachlogarithmicungrouped@finalizeresult% \let#3=\pgfmathresult - \pgfmathfloatexp@{\pgfplots@loc@TMPa}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{exp}{\pgfplots@loc@TMPa}% \pgfplotsforeachlogarithmicungrouped@finalizeresult% \let#2=\pgfmathresult % @@ -798,16 +841,16 @@ \def\pgfplotsforeachlogarithmicungrouped@finalizeresult{}% +\def\pgfplotsforeachlogarithmicmathid{float} + % defines % \pgfplots@foreach@loc@TMPa := log(firstintervalpt) % and % \pgfplots@foreach@loc@TMPb := log(secondintervalpt) \def\pgfplotsforeachlogarithmicungrouped@readdomain#1:#2\relax{% - \pgfmathfloatparsenumber{#1}% - \pgfmathfloatln@{\pgfmathresult}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{log}{#1}% \let\pgfplots@foreach@loc@TMPa=\pgfmathresult - \pgfmathfloatparsenumber{#2}% - \pgfmathfloatln@{\pgfmathresult}% + \pgfplotscoordmath{\pgfplotsforeachlogarithmicmathid}{log}{#2}% \let\pgfplots@foreach@loc@TMPb=\pgfmathresult } @@ -820,7 +863,7 @@ \def\pgfplots@logfileopen#1{% \immediate\write-1{PGFPlots: reading {#1}}% \pgfutil@ifundefined{tikzifexternalizingcurrent}{% - % version not up-to-date!? + % version not up-to-date or external lib not loaded? }{% % adjust the .dep file only if we are externalizing. % Otherwise, it may be overwritten by \pgfplotstableread @@ -851,15 +894,23 @@ \begingroup \c@pgf@counta=#2\relax \c@pgf@countb=#1\relax - \c@pgf@countc=\c@pgf@countb - \ifnum\c@pgf@counta=0 - \pgfplots@error{Can't compute \the\c@pgf@countb\space mod \the\c@pgf@counta\space -- this yields division by zero (second argument is zero)!}% - \edef\pgfmathresult{#1}% + \ifnum\c@pgf@counta=2 + \ifodd\c@pgf@countb + \def\pgfmathresult{1}% + \else + \def\pgfmathresult{0}% + \fi \else - \divide\c@pgf@countc by\c@pgf@counta - \multiply\c@pgf@countc by\c@pgf@counta - \advance\c@pgf@countb by-\c@pgf@countc - \edef\pgfmathresult{\the\c@pgf@countb}% + \c@pgf@countc=\c@pgf@countb + \ifnum\c@pgf@counta=0 + \pgfplots@error{Can't compute \the\c@pgf@countb\space mod \the\c@pgf@counta\space -- this yields division by zero (second argument is zero)!}% + \edef\pgfmathresult{#1}% + \else + \divide\c@pgf@countc by\c@pgf@counta + \multiply\c@pgf@countc by\c@pgf@counta + \advance\c@pgf@countb by-\c@pgf@countc + \edef\pgfmathresult{\the\c@pgf@countb}% + \fi \fi \pgfmath@smuggleone\pgfmathresult \endgroup @@ -967,6 +1018,81 @@ \def\pgfplots@strcmp@rest{#2}% }% +% Takes two dimensional cartesian coordinates #1,#2 and +% defines the macros #3 and #4 to contain the associated polar +% coordinates. +% +% #1: x +% #2: y +% #3: a macro which will be filled with the angle (in degrees) +% #4: a macro which will be filled with the radius +\def\pgfplotsmathcarttopol#1#2#3#4{% + \pgfplotsmathcarttopol@{#1}{#2}{#3}{#4}{default}% +}% +\def\pgfplotsmathcarttopolbasic#1#2#3#4{% + \pgfplotsmathcarttopol@{#1}{#2}{#3}{#4}{pgfbasic}% +}% +% #5: the math engine to use (\pgfplotscoordmath argument) +\def\pgfplotsmathcarttopol@#1#2#3#4#5{% + \begingroup + \pgfplotscoordmath{#5}{parsenumber}{#1}% + \let\pgfplots@x=\pgfmathresult + \pgfplotscoordmath{#5}{parsenumber}{#2}% + \let\pgfplots@y=\pgfmathresult + \pgfplotscoordmath{#5}{op}{veclen}{{\pgfplots@x}{\pgfplots@y}}% + \let\pgfplots@r=\pgfmathresult + \pgfplotscoordmath{#5}{if is}{\pgfplots@r}{0}{% + \pgfplotscoordmath{#5}{parsenumber}{0}% + }{% + \pgfplotscoordmath{#5}{op}{divide}{{\pgfplots@x}{\pgfplots@r}}% + \let\pgfplots@quot=\pgfmathresult + \pgfplotscoordmath{#5}{op}{acos}{{\pgfplots@quot}}% + % + \pgfplotscoordmath{#5}{if is}{\pgfplots@y}{-}{% + \let\pgfplots@acos=\pgfmathresult + \pgfplotscoordmath{#5}{parsenumber}{-1}% + \pgfplotscoordmath{#5}{op}{multiply}{{\pgfmathresult}{\pgfplots@acos}}% + }{}% + }% + \let\pgfplots@deg=\pgfmathresult + \xdef\pgfplots@glob@TMPa{\noexpand\def\noexpand#3{\pgfplots@deg}\noexpand\def\noexpand#4{\pgfplots@r}}% + \endgroup + \pgfplots@glob@TMPa +}% + +% Takes two dimensional polar coordinates #1,#2 and +% defines the macros #3 and #4 to contain the associated cartesian +% coordinates. +% +% #1: angle (in degrees) +% #2: radius +% #3: a macro which will be filled with the x value +% #4: a macro which will be filled with the y value +\def\pgfplotsmathpoltocart#1#2#3#4{% + \pgfplotsmathpoltocart@{#1}{#2}{#3}{#4}{default}% +}% +\def\pgfplotsmathpoltocartbasic#1#2#3#4{% + \pgfplotsmathpoltocart@{#1}{#2}{#3}{#4}{pgfbasic}% +}% +% #5: the math engine to use (\pgfplotscoordmath argument) +\def\pgfplotsmathpoltocart@#1#2#3#4#5{% + \begingroup + \pgfplotscoordmath{#5}{parsenumber}{#1}% + \let\pgfplots@deg=\pgfmathresult + \pgfplotscoordmath{#5}{parsenumber}{#2}% + \let\pgfplots@r=\pgfmathresult + \pgfplotscoordmath{#5}{op}{sin}{{\pgfplots@deg}}% + \pgfplotscoordmath{#5}{op}{multiply}{{\pgfplots@r}{\pgfmathresult}}% + \let\pgfplots@y=\pgfmathresult + \pgfplotscoordmath{#5}{op}{cos}{{\pgfplots@deg}}% + \pgfplotscoordmath{#5}{op}{multiply}{{\pgfplots@r}{\pgfmathresult}}% + \let\pgfplots@x=\pgfmathresult + \xdef\pgfplots@glob@TMPa{\noexpand\def\noexpand#3{\pgfplots@x}\noexpand\def\noexpand#4{\pgfplots@y}}% + \endgroup + \pgfplots@glob@TMPa +}% + + \pgfutil@ifundefined{pgfmathdeclarefunction}{% % BACKWARDS COMPATIBILITY: We have PGF 2.00 : @@ -1184,17 +1310,17 @@ % #4: code to invoke in case arg1>=arg2 % the iflessthan method will be invoked within local scopes. /pgfplots/fixed </.style={% - /pgfplots/iflessthan/.code args={##1##2##3##4}{\ifdim##1pt<##2pt\relax##3\else##4\fi},% + /pgfplots/iflessthan/.code args={##1##2##3##4}{\ifdim##1pt<##2pt\relax##3\else ##4\fi},% }, /pgfplots/fixed <, /pgfplots/fixed >/.style={% - /pgfplots/iflessthan/.code args={##1##2##3##4}{\ifdim##1pt>##2pt\relax##3\else##4\fi},% + /pgfplots/iflessthan/.code args={##1##2##3##4}{\ifdim##1pt>##2pt\relax##3\else ##4\fi},% }, /pgfplots/int </.style={% - /pgfplots/iflessthan/.code args={##1##2##3##4}{\ifnum##1<##2\relax##3\else##4\fi},% + /pgfplots/iflessthan/.code args={##1##2##3##4}{\ifnum##1<##2\relax##3\else ##4\fi},% }, /pgfplots/int >/.style={% - /pgfplots/iflessthan/.code args={##1##2##3##4}{\ifnum##1>##2\relax##3\else##4\fi},% + /pgfplots/iflessthan/.code args={##1##2##3##4}{\ifnum##1>##2\relax##3\else ##4\fi},% }, /pgfplots/float </.style={% /pgfplots/iflessthan/.code args={##1##2##3##4}{% @@ -1303,12 +1429,136 @@ \let\pgfplots@auxwrite=\pgfplots@auxwrite@latex }% +% sorts three elements. +% +% #1,#2,#3 are three macros containing the input. +% On output, these macros are redefined to represent the sorted range. +% The values of these macros must be a <dimen>, followed by anything +% else (but no \relax please) +% +% Example: +% \def\A{10pt furthervalues} +% \def\B{4pt value of b} +% \def\C{1pt value of c} +% \pgfplotsutilsortthree\A\B\C +% -> +% \A={1pt value of c} +% \B={4pt value of b} +% \C={10pt furthervalues} +% +% It uses insertion sort. +\def\pgfplotsutilsortthree#1#2#3{% + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#1\relax + \afterassignment\pgfplots@gobble@until@relax \pgf@xb=#2\relax + \ifdim\pgf@xa>\pgf@xb + \let\pgfplots@loc@TMPa=#2% + \let#2=#1% + \let#1=\pgfplots@loc@TMPa% + \fi + % first two are sorted. + % + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#2\relax + \afterassignment\pgfplots@gobble@until@relax \pgf@xb=#3\relax + \let\pgfplots@loc@TMPa=#3% + \ifdim\pgf@xa>\pgf@xb + \let#3=#2% + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#1\relax + \ifdim\pgf@xa>\pgf@xb + \let#2=#1% + \let#1=\pgfplots@loc@TMPa% + \else + \let#2=\pgfplots@loc@TMPa% + \fi + \fi + % ok. +}% + +% Like \pgfplotsutilsortthree, but for four elements (of the same +% form, see \pgfplotsutilsortthree). +% +% It uses insertion sort. +\def\pgfplotsutilsortfour#1#2#3#4{% + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#1\relax + \afterassignment\pgfplots@gobble@until@relax \pgf@xb=#2\relax + \ifdim\pgf@xa>\pgf@xb + \let\pgfplots@loc@TMPa=#2% + \let#2=#1% + \let#1=\pgfplots@loc@TMPa% + \fi + % first two are sorted. + % + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#2\relax + \afterassignment\pgfplots@gobble@until@relax \pgf@xb=#3\relax + \let\pgfplots@loc@TMPa=#3% + \ifdim\pgf@xa>\pgf@xb + \let#3=#2% + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#1\relax + \ifdim\pgf@xa>\pgf@xb + \let#2=#1% + \let#1=\pgfplots@loc@TMPa% + \else + \let#2=\pgfplots@loc@TMPa% + \fi + \fi + % ok, first three are sorted. + % + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#3\relax + \afterassignment\pgfplots@gobble@until@relax \pgf@xb=#4\relax + \let\pgfplots@loc@TMPa=#4% + \ifdim\pgf@xa>\pgf@xb + \let#4=#3% + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#2\relax + \ifdim\pgf@xa>\pgf@xb + \let#3=#2% + \afterassignment\pgfplots@gobble@until@relax \pgf@xa=#1\relax + \ifdim\pgf@xa>\pgf@xb + \let#2=#1% + \let#1=\pgfplots@loc@TMPa% + \else + \let#2=\pgfplots@loc@TMPa% + \fi + \else + \let#3=\pgfplots@loc@TMPa% + \fi + \fi + % ok, first four are sorted. +}% + +% A variant of \pgfutil@ifnextchar which allows the '#' character +% inside of either '#2' or '#3'. +% +% It is slightly more expensive and relies on \t@pgfplots@tokc +\long\def\pgfplotsutil@ifnextchar#1#2#3{% + \let\pgfplotsutil@reserved@d=#1% + \t@pgfplots@tokc={#2}% + \edef\pgfplotsutil@reserved@a{\the\t@pgfplots@tokc}% + \t@pgfplots@tokc={#3}% + \def\pgfplotsutil@reserved@b{\the\t@pgfplots@tokc}% + \futurelet\pgfplotsutil@let@token\pgfplotsutil@ifnch} +\def\pgfplotsutil@ifnch{% + \ifx\pgfplotsutil@let@token\pgfplotsutil@sptoken + \let\pgfplotsutil@reserved@c\pgfplotsutil@xifnch + \else + \ifx\pgfplotsutil@let@token\pgfplotsutil@reserved@d + \let\pgfplotsutil@reserved@c\pgfplotsutil@reserved@a + \else + \let\pgfplotsutil@reserved@c\pgfplotsutil@reserved@b + \fi + \fi + \pgfplotsutil@reserved@c} +{% + \def\:{\global\let\pgfplotsutil@sptoken= } \: + \def\:{\pgfplotsutil@xifnch} \expandafter\gdef\: {\futurelet\pgfplotsutil@let@token\pgfplotsutil@ifnch} +} + \input pgfplotsliststructure.code.tex \input pgfplotsliststructureext.code.tex \input pgfplotsarray.code.tex +\input pgfplotsmatrix.code.tex \input pgfplotstableshared.code.tex \input pgfplotsdeque.code.tex \input pgfplotsbinary.code.tex +\input pgfplotsutil.verb.code.tex \usepgfplotslibrary{surfshading} diff --git a/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.verb.code.tex b/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.verb.code.tex new file mode 100644 index 00000000000..8590ba908d6 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.verb.code.tex @@ -0,0 +1,97 @@ +%-------------------------------------------- +% +% Package pgfplots +% +% Copyright 2007-2011 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 +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +%-------------------------------------------- +% +% This source file contains helper utilities for verbatim character +% processing. + + +% +% USAGE: +% \beginpgfplotsverbatim[result/.code={\message{I read #1}}] +% <verbatim code> +% \endpgfplotsverbatim +% +% The verbatim code MUST start at the line after the ']' (or after +% \beginpgfplotsverbatim if there is no ']') +\def\beginpgfplotsverbatim{\pgfutil@ifnextchar[{\beginpgfplotsverbatim@}{\beginpgfplotsverbatim@[]}} +\def\beginpgfplotsverbatim@[#1]{% + \begingroup + \pgfqkeys{/pgfplots/verb}{#1}% + \pgfplots@verbatim@prepare@collect + \beginpgfplotsverbatim@gobbleuntileol +} + +\begingroup +\catcode`\|=0 +\catcode`\\=12 +|gdef|endpgfplotsverbatim{\endpgfplotsverbatim}% +|endgroup + +\expandafter\long\expandafter\def\expandafter\pgfplots@verbatim@collect@until\expandafter#\expandafter1\endpgfplotsverbatim{% + \begingroup + \pgfplots@verbatim@newline@handler + \xdef\pgfplots@glob@TMPa{#1}% + \endgroup + \pgfkeysgetvalue{/pgfplots/verb/result/.@cmd}\pgfplots@loc@TMPb + \global\let\pgfplots@glob@TMPb=\pgfplots@loc@TMPb + \endgroup% restore old catcodes etc. + \expandafter\pgfplots@glob@TMPb\expandafter{\pgfplots@glob@TMPa}\pgfeov% +}% + +\begingroup +\long\def\pgfplots@loc@TMPa{ +}%^^M}% +\catcode`\^^M=13 % +\gdef\beginpgfplotsverbatim@gobbleuntileol^^M{\pgfplots@verbatim@collect@until}% +\gdef\pgfplots@verbatim@newline@toHATHATJ{\def^^M{^^J}}% +\xdef\pgfplots@verbatim@newline@IDENTITY{\noexpand\long\noexpand\def\noexpand^^M{\pgfplots@loc@TMPa}}% +\endgroup + +\pgfkeys{ + /pgfplots/verb/result/.code={% + \pgfplots@error{Please use \string\beginpgfplotsverbatim[result/.code=....] to configure what to do with the content of \string\beginpgfplotsverbatim...\endpgfplotsverbatim\space (or use \string\pgfplotsset{verb/.cd,result/.code=....} in your preamble)}% + }, + /pgfplots/verb/newline handler/.is choice, + /pgfplots/verb/newline handler/to outfile/.code= + {\let\pgfplots@verbatim@newline@handler=\pgfplots@verbatim@newline@toHATHATJ}, + /pgfplots/verb/newline handler/identity/.code= + {\let\pgfplots@verbatim@newline@handler=\pgfplots@verbatim@newline@IDENTITY}, + /pgfplots/verb/newline handler/identity, +} + +\def\pgfplots@verbatim@prepare@collect{% + \def\do##1{\catcode`##1=12 }\dospecials + \catcode`\^^M=13 + \catcode`\^^J=12 + \catcode`\^^I=12 +}% + +\def\pgfplots@verbatim@restore@catcodes{% + \catcode`\^^M=5 + \catcode`\^^J=10 + \catcode`\^^I=10 + % this is important to get \scantokens to work: otherwise, it will + % eat up the ^^M chars: + \endlinechar=`\^^M + \newlinechar=\endlinechar +}% + +\endinput |