%--------------------------------------------
%
% Package pgfplots.sty
%
% 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 .
%
%--------------------------------------------
\def\pgfplotsversion{0.9}
\ProvidesPackage{pgfplots}[2008/26/01 Version \pgfplotsversion]
\RequirePackage{xkeyval}[2006/11/18]
\RequirePackage{ifthen}
\RequirePackage{liststructure}
\RequirePackage{tikz}[2007/06/07]
\RequirePackage{pgfmathlog}
\usetikzlibrary{plotmarks}
\def\prefix{pgfplots}
\newcount\axisticknum
\newcount\axis@tickposnum
\newcount\axis@xmode
\newcount\axis@ymode
\newcount\axis@numplots
\newdimen\axis@xcoordminTEX
\newdimen\axis@xcoordmaxTEX
\newdimen\axis@ycoordminTEX
\newdimen\axis@ycoordmaxTEX
\newdimen\axis@tmpa
\newdimen\axis@tmpb
\newif\ifaxis@isuniformtick
\let\axis@TMP=\empty
\let\axis@TMPB=\empty
\def\axis@leftover{}
\def\axis@rightover{}
\def\axisdefaultwidth{240pt}
\def\axisdefaultheight{207pt}
\listnew{\blackwhiteplotspeclist}{%
mark options={fill=gray},mark=*\\%
mark options={fill=gray},mark=square*\\%
mark options={fill=gray},mark=otimes*\\%
mark=star\\%
mark options={fill=gray},mark=diamond*\\%
loosely dashed,mark options={solid,fill=gray},mark=*\\%
loosely dashed,mark options={solid,fill=gray},mark=square*\\%
loosely dashed,mark options={solid,fill=gray},mark=otimes*\\%
loosely dashed,mark options={solid},mark=star\\%
loosely dashed,mark options={solid,fill=gray},mark=diamond*\\%
}
\listnew{\coloredplotspeclist}{%
blue,mark options={fill=blue!80!black},mark=*\\%
red,mark options={fill=red!80!black},mark=square*\\%
brown!60!black,mark options={fill=brown!80!black},mark=otimes*\\%
black,mark=star\\%
blue,mark options={fill=blue!80!black},mark=diamond*\\%
red,loosely dashed,mark options={solid,fill=red!80!black},mark=*\\%
brown!60!black,loosely dashed,mark options={solid,fill=brown!80!black},mark=square*\\%
black,loosely dashed,mark options={solid,fill=gray},mark=otimes*\\%
blue,loosely dashed,mark=star,mark options=solid\\%
red,loosely dashed,mark options={solid,fill=red!80!black},mark=diamond*\\%
}
\listcopy\coloredplotspeclist\to\autoplotspeclist%
%\listcopy\blackwhiteplotspeclist\to\autoplotspeclist%
%--------------------------------------------------
%
% MARKERS:
% mark repeat=3,mark phase=2
% mark options={color=blue,rotate=180}
% ball,ball color=blue
% {*}
% {x}
% {+}
% \usetikzlibrary{plotmarks}
% {-}
% {|}
% {o}
% {asterisk}
% {star}
% {oplus}
% {oplus*}
% {otimes}
% {otimes*}
% {square}
% {square*}
% {triangle}
% {triangle*}
% {diamond}
% {diamond*}
% {pentagon}
% {pentagon*}
%
% LINES:
% line width=2cm
% [snake=zigzag]
% [snake=brace]
% [snake=triangles]
% [snake=coil,segment length=4pt]
% [snake=coil,segment aspect=0]
% [snake=expanding waves,segment angle=7]
% style=solid
% style=dotted
% style=densely dotted
% style=loosely dotted
% style=dashed
% style=densely dashed
% style=loosely dashed
% dash pattern=on 2pt off 3pt on 4pt off 4pt
% dash phase=10pt
% Mit der 'double' und 'double distance' option gibts lustige effekte:
% \draw[draw=white,double=red,very thick] (0,1) -- (1,0);
% \draw[very thick,double distance=2pt] (1,0) arc (180:90:1cm);
%--------------------------------------------------
\tikzstyle{every axis}=[]
\tikzstyle{every axis plot}=[]
\tikzstyle{every axis label}=[]
\tikzstyle{every axis x label}=[at={(0.5,0)},below,yshift=-15pt]
\tikzstyle{every axis y label}=[at={(0,0.5)},xshift=-35pt,rotate=90]
\tikzstyle{every tick}=[very thin,gray]
\tikzstyle{every minor tick}=[]
\tikzstyle{every tick label}=[]
\tikzstyle{every x tick label}=[]
\tikzstyle{every y tick label}=[]
% specifies how and where to draw the axis.
% \tikzstyle{every axis legend}+=[at={(0,0)}]
% will draw it at the lower left corner of the axis while
% \tikzstyle{every axis legend}+=[at={(1,1)}]
% means the upper right corner.
%
% The legend is a 'node' so you can use any tikz option which affects
% nodes. The option 'text width' is set automatically, depending on
% the \legend[textwidth=...] option.
%
% Examples:
% - \tikzstyle{every axis legend}+=[at={(1.02,1)},anchor=north west]
% draws the legend OUTSIDE TOP RIGHT.
%
% - \tikzstyle{every axis legend}+=[at={(1,0.5)},anchor=east,outer sep=0.5cm]
% draws the legend INSIDE MIDDLE RIGHT, separated by 0.5cm from the axis.
\tikzstyle{every axis legend}=[%
anchor=north east,%
shape=rectangle,%
fill=white,%
draw=black,
at={(0.98,0.98)}
]
% at={(1,1)},
% outer sep=0.1cm]
%
% xticklabel:
% im argument kann man '\axisticknum' und '\tick' verwenden.
% '\tick' ist der eintrag aus '\xtick', der gerade bearbeitet wird,
% '\axisticknum' seine nummer.
%
% yticklabel:
% analog zu xticklabel.
%
% xfilter/yfilter
% \def\meinxfilter#1\to#2{\def#2{1.4}}
% xfilter=\meinxfilter
%
% if the filtered coordinate is empty string, it will be skipped.
\define@cmdkeys[\prefix]{axis}[axis@]{%
xmin,xmax,xticklabel,xtick,xtickten,xlabel,%
ymin,ymax,yticklabel,ytick,ytickten,ylabel,%
trimxmin,trimxmax,trimymin,trimymax,%
subtickwidth,tickwidth,%
xfilter,yfilter,%
width,height,%
execute at begin plot,%
execute at end plot,%
x,y}%
% sets \axis@tickposnum to
% left=0
% right=1
% both=2
\define@choicekey[\prefix]{axis}{tickpos}[\val\nr]{left,right,both}{%
\axis@tickposnum=\nr\relax
}
\define@boolkeys[\prefix]{axis}[axis@]{%
xminorticks,%
yminorticks,%
disablelogfilter,%
enlargelimits}[true]
% sets \axis@xmode to
% normal=0
% log=1
\define@choicekey[\prefix]{axis}{xmode}[\val\nr]{normal,log}{%
\axis@xmode=\nr\relax
}
% sets \axis@ymode to
% normal=0
% log=1
\define@choicekey[\prefix]{axis}{ymode}[\val\nr]{normal,log}{%
\axis@ymode=\nr\relax
}
% Options to legend:
% textwidth=auto
% textwidth=none
% textwidth=DIMENSION
\define@cmdkey[\prefix]{legend}[axis@legend@]{textwidth}[auto]{}%
\define@cmdkey[\prefix]{legend}[axis@legend@]{font}[]{}
\long\def\axispreset#1{%
\presetkeys[\prefix]{axis}{#1}{}%
}
\long\def\legendpreset#1{%
\presetkeys[\prefix]{legend}{#1}{}%
}
\presetkeys[\prefix]{axis}{%
xmode=normal,
xmin=,
xmax=,
trimxmin=,
trimxmax=,
xlabel=,
xtick=,
xtickten=,
xticklabel=,
xminorticks=true,
ymode=normal,
ymin=,
ymax=,
trimymin=,
trimymax=,
ylabel=,
ytick=,
ytickten=,
yticklabel=,
yminorticks=true,
tickpos=both,
xfilter=,
yfilter=,
width=,
height=,
subtickwidth=0.1cm,
tickwidth=0.15cm,
x=,% is implicitly set by 'width' and/or '\axisdefaultwidth'
y=,% is implicitly set by 'height' and/or '\axisdefaultheight'
execute at begin plot=,%
execute at end plot=,%
enlargelimits=false,
disablelogfilter=false}{}
\presetkeys[\prefix]{legend}{%
textwidth=auto,
font=}{}
\def\logten{2.302585}
\newcommand{\logi}[1]{%
\ifcase#1
\or0
\or0.693147
\or1.098612
\or1.386294
\or1.60943791
\or1.7917594
\or1.94591014
\or2.07944154
\or2.197224
\fi
}
\newcommand{\show@yticklabel}[2]{{%
\let\ticknum=#1%
\def\tick{#2}%
\axis@yticklabel
}}
% x-Achsenbeschriftung zum #1.ten Tick:
% #1: die ticknum
% #2: der x wert dafuer
\newcommand{\show@xticklabel}[2]{{%
\let\ticknum=#1%
\def\tick{#2}%
\axis@xticklabel
}}
\newcommand{\axisdefaultticklabel}[0]{%
$\tick$%
}
\newcommand{\axisdefaultticklabellog}[0]{%
$10^{\logtologten\tick}$%
}
\newcommand{\showxlabel}{%
\node
[style=every axis label,%
style=every axis x label]
{\axis@xlabel};
}
\newcommand{\showylabel}{%
\node
[style=every axis label,
style=every axis y label]
{\axis@ylabel};
}
% Y-Achsen und Achsenbeschriftung LOG:
% 1: Ticks
\newcommand{\yachse}[1]{%
\axisticknum=0
\foreach \y in {#1} {
%\pgfextracty{\axis@tmpa}{\pgfpointxy{0}{\logten*\y}}%
\pgfextracty{\axis@tmpa}{\pgfpointxy{0}{\y}}%
%
\ifdim\axis@tmpa<\axis@ycoordminTEX
\else
\ifdim\axis@tmpa>\axis@ycoordmaxTEX
\else
% Achsenbeschriftung:
\ifnum\axis@tickposnum=1
\node at
(\axis@xcoordmaxTEX\axis@leftover,\axis@tmpa)
[right,style=every tick label,style=every y tick label]
{\show@yticklabel\axisticknum\y};
\else
\node at
(\axis@xcoordminTEX\axis@leftover,\axis@tmpa)
[left,style=every tick label,style=every y tick label]
{\show@yticklabel\axisticknum\y};
\fi
\global\advance\axisticknum by1
\fi
\fi
\begin{scope}
\clip (\axis@xcoordminTEX\axis@leftover, \axis@ycoordminTEX\axis@leftover)
rectangle (\axis@xcoordmaxTEX\axis@rightover, \axis@ycoordmaxTEX\axis@rightover);
% Y-Achsenticks links und rechts
% in log:
% beachte: log( i*10^k ) = log\i + k\log10 -> male ticks für i=1..9
\ifaxis@yminorticks
\foreach \i in {1,...,9} {
\pgfextracty{\axis@tmpb}{\pgfpointxy{0}{\logi\i}}%
\advance\axis@tmpa by\axis@tmpb
\draw[style=every tick,style=every minor tick]
\ifcase\axis@tickposnum
(\axis@xcoordminTEX\axis@leftover, \axis@tmpa)
-- (\axis@xcoordminTEX+\axis@subtickwidth, \axis@tmpa)
\or
(\axis@xcoordmaxTEX\axis@rightover, \axis@tmpa)
-- (\axis@xcoordmaxTEX-\axis@subtickwidth, \axis@tmpa)
\or
(\axis@xcoordminTEX\axis@leftover, \axis@tmpa)
-- (\axis@xcoordminTEX+\axis@subtickwidth, \axis@tmpa)
(\axis@xcoordmaxTEX\axis@rightover, \axis@tmpa)
-- (\axis@xcoordmaxTEX-\axis@subtickwidth, \axis@tmpa)
\fi
;
}%
\fi
\draw[style=every tick]
\ifcase\axis@tickposnum
(\axis@xcoordminTEX\axis@leftover,\axis@tmpa)
-- (\axis@xcoordminTEX+\axis@tickwidth,\axis@tmpa)
\or
(\axis@xcoordmaxTEX\axis@rightover,\axis@tmpa)
-- (\axis@xcoordmaxTEX-\axis@tickwidth,\axis@tmpa)
\or
(\axis@xcoordminTEX\axis@leftover,\axis@tmpa)
-- (\axis@xcoordminTEX+\axis@tickwidth,\axis@tmpa)
(\axis@xcoordmaxTEX\axis@rightover,\axis@tmpa)
-- (\axis@xcoordmaxTEX-\axis@tickwidth,\axis@tmpa)
\fi
;
\end{scope}
}
}
% X-Achsen und Achsenbeschriftung
% 1: Ticks
\newcommand{\xachse}[1]{%
\axisticknum=0
\foreach \x in {#1} {
% \pgfextractx{\axis@tmpa}{\pgfpointxy{\logten*\x}{0}}%
\pgfextractx{\axis@tmpa}{\pgfpointxy{\x}{0}}%
%
\ifdim\axis@tmpa<\axis@xcoordminTEX
\else
\ifdim\axis@tmpa>\axis@xcoordmaxTEX
\else
% Achsenbeschriftung:
\ifnum\axis@tickposnum=1
\node at
(\axis@tmpa,\axis@ycoordmaxTEX\axis@leftover)
[above,style=every tick label,style=every x tick label]
{\show@xticklabel\axisticknum\x};
\else
\node at
(\axis@tmpa,\axis@ycoordminTEX\axis@leftover)
[below,style=every tick label,style=every x tick label]
{\show@xticklabel\axisticknum\x};
\fi
\global\advance\axisticknum by1
\fi
\fi
\begin{scope}
\clip (\axis@xcoordminTEX\axis@leftover, \axis@ycoordminTEX\axis@leftover)
rectangle (\axis@xcoordmaxTEX\axis@rightover, \axis@ycoordmaxTEX\axis@rightover);
% Y-Achsenticks links und rechts
% in log:
% beachte: log( i*10^k ) = log\i + k\log10 -> male ticks für i=1..9
\ifaxis@xminorticks
\foreach \i in {1,...,9} {
\pgfextractx{\axis@tmpb}{\pgfpointxy{\logi\i}{0}}%
\advance\axis@tmpa by\axis@tmpb
\draw[style=every tick,style=every minor tick]
\ifcase\axis@tickposnum
(\axis@tmpa, \axis@ycoordminTEX\axis@leftover)
-- (\axis@tmpa, \axis@ycoordminTEX+\axis@subtickwidth)
\or
(\axis@tmpa, \axis@ycoordmaxTEX\axis@rightover)
-- (\axis@tmpa, \axis@ycoordmaxTEX-\axis@subtickwidth)
\or
(\axis@tmpa, \axis@ycoordminTEX\axis@leftover)
-- (\axis@tmpa, \axis@ycoordminTEX+\axis@subtickwidth)
(\axis@tmpa, \axis@ycoordmaxTEX\axis@rightover)
-- (\axis@tmpa, \axis@ycoordmaxTEX-\axis@subtickwidth)
\fi
;
}%
\fi
\draw[style=every tick]
\ifcase\axis@tickposnum
(\axis@tmpa, \axis@ycoordminTEX\axis@leftover)
-- (\axis@tmpa, \axis@ycoordminTEX+\axis@tickwidth)
\or
(\axis@tmpa, \axis@ycoordmaxTEX\axis@rightover)
-- (\axis@tmpa, \axis@ycoordmaxTEX-\axis@tickwidth)
\or
(\axis@tmpa, \axis@ycoordminTEX\axis@leftover)
-- (\axis@tmpa, \axis@ycoordminTEX+\axis@tickwidth)
(\axis@tmpa, \axis@ycoordmaxTEX\axis@rightover)
-- (\axis@tmpa, \axis@ycoordmaxTEX-\axis@tickwidth)
\fi
;
\end{scope}
}
}
\def\axis@rememberplotspec#1{{%
\globaldefs=1
\listpushback#1\to\axis@plotspeclist
\advance\axis@numplots by1%
}}
\def\axis@getautoplotspec into#1{%
\listsize\autoplotspeclist\to\c@pgf@counta
\ifnum\c@pgf@counta=0
\let#1=\empty
\else
\c@pgf@countb=\axis@numplots
\loop
\ifnum\c@pgf@countb<\c@pgf@counta
\else
\advance\c@pgf@countb by-\c@pgf@counta
\repeat
\listselect\c@pgf@countb\of\autoplotspeclist\to#1
%\message{pgfplots.sty: using \string\autoplotspeclist\ specification no\#\the\c@pgf@countb (of \the\c@pgf@counta): #1}%
\fi
}
% The main interface to draw a plot into an axis.
%
% Usage:
% \addplot
% plot coordinates {
% (0,0)
% (1,1)
% };
%
% or
%
% \addplot[color=blue,mark=*]
% plot coordinates {
% (0,0)
% (1,1)
% };
%
% The first syntax will use the next plot specification in the list
% \autoplotspeclist
% and the first will use blue color and * markers.
%
% The linespec. will be used in the legend.
\long\def\addplot{%
\@ifnextchar[{%
\axis@addplotimpl%
}{%
\axis@getautoplotspec into\nextplotspec
% the space after ']' is required here:
% FIXME:
% - \addplot[]plot coordinates is NOT allowed!?
\expandafter\axis@addplotimpl\expandafter[\nextplotspec]
}%
}
\long\def\axis@addplotimpl[#1] #2;{%
% #2 = plot coordinates {...}
\ifx\csname axis@execute at begin plot\endcsname\empty
\else
\csname axis@execute at begin plot\endcsname
\fi
\axis@rememberplotspec{[#1]}
\ifaxis@filtercoords
% FIXME : FREE THIS VARIABLE:
\axis@filtercoords#2\newplotcmdto\axis@filteredcoordinateplotcmd
\ifaxis@draw@at@end
\expandafter\axis@update@limits\axis@filteredcoordinateplotcmd;%
\fi
\def\axis@TMP{\axispath\draw[style=every axis plot,#1] }%
\expandafter\axis@TMP\axis@filteredcoordinateplotcmd;%
%\tracingmacros=2\tracingcommands=2
%\tracingmacros=0\tracingcommands=0
\else
\ifaxis@draw@at@end
\axis@update@limits#2;%
\fi
\axispath\draw[style=every axis plot,#1] #2;%
\fi
\ifx\csname axis@execute at end plot\endcsname\empty
\else
\csname axis@execute at end plot\endcsname
\fi
}%
\long\def\axis@update@limits plot coordinates #1;{%
%\axis@update@limits@forpoint#1\axis@restinto\axis@TMP
\def\axis@TMP{#1}%
\def\axis@TMPB{ }%
\ifx\axis@TMPB\axis@TMP% FIXME isn't there a better way to exclude spaces!?
\let\axis@TMP=\empty
\fi
\loop
\ifx\axis@TMP\empty
\else
\expandafter\axis@update@limits@forpoint\axis@TMP\axis@restinto\axis@TMP
\ifx\axis@TMPB\axis@TMP% FIXME isn't there a better way to exclude spaces!?
\let\axis@TMP=\empty
\fi
\repeat
}
% #1: optional white spaces (will be ignored). FIXME is there a better
% way? I could not get \ignorespaces into this ...
\long\def\axis@update@limits@forpoint#1(#2,#3)#4\axis@restinto#5{%
\ifaxis@autocompute@xlim
\pgfmathlog@invoke@expanded\pgfmathmin@{{\axis@xmin}{#2}}%
\let\axis@xmin=\pgfmathresult
\pgfmathlog@invoke@expanded\pgfmathmax@{{\axis@xmax}{#2}}%
\let\axis@xmax=\pgfmathresult
\fi
\ifaxis@autocompute@ylim
\pgfmathlog@invoke@expanded\pgfmathmin@{{\axis@ymin}{#3}}%
\let\axis@ymin=\pgfmathresult
\pgfmathlog@invoke@expanded\pgfmathmax@{{\axis@ymax}{#3}}%
\let\axis@ymax=\pgfmathresult
\fi
\def#5{#4}%
\axis@limits@are@computedtrue
}
% Filters coordinates and writes a new, modified 'plot coordinates'
% command to macro #2.
\long\def\axis@filtercoords plot coordinates #1\newplotcmdto#2{%
%\edef#2{plot coordinates \verb|}|}%
\let#2=\empty
\def\axis@TMP{#1}%
\def\axis@TMPB{ }%
\ifx\axis@TMPB\axis@TMP% FIXME isn't there a better way to exclude spaces!?
\let\axis@TMP=\empty
\fi
\loop
\ifx\axis@TMP\empty
\else
\expandafter\axis@filter@point\axis@TMP\appendto#2\axis@restinto\axis@TMP
\ifx\axis@TMPB\axis@TMP% FIXME isn't there a better way to exclude spaces!?
\let\axis@TMP=\empty
\fi
\repeat
\edef#2{plot coordinates {#2}}%
}
% #1: optional white spaces (will be ignored). FIXME is there a better
% way? I could not get \ignorespaces into this ...
\long\def\axis@filter@point#1(#2,#3)#4\appendto#5\axis@restinto#6{%
\ifx\axis@xfilter\empty
\def\axis@filter@tmpx{#2}%
\else
\let\axis@filter@tmpx=\empty
\axis@xfilter#2\to\axis@filter@tmpx\relax
\fi
\ifx\axis@yfilter\empty
\def\axis@filter@tmpy{#3}%
\else
\let\axis@filter@tmpy=\empty
\axis@yfilter#3\to\axis@filter@tmpy\relax
\fi
\ifx\axis@filter@tmpx\empty
\message{NOTE: coordinate (#2,#3) has been dropped because of the x-coordinate filter.}%
\else
\ifx\axis@filter@tmpy\empty
\message{NOTE: coordinate (#2,#3) has been dropped because of the y-coordinate filter.}%
\else
\edef#5{#5 (\axis@filter@tmpx,\axis@filter@tmpy)}%
\fi
\fi
\def#6{#4}%
}
\long\def\axispath#1;{%
\ifaxis@draw@at@end
\listpushback{#1;}\to\axis@draw@stored@plots%
\else
#1;%
\fi
}
% Assigns a legend.
% Syntax:
% \legend{entry 1\\entry2\\entry3}
% or
% \legend[OPTIONS]{entry 1\\entry2\\}
%
% where OPTIONS is
% - textwidth=auto | DIMEN | none
% like
% \legend[textwidth=auto]{entry 1\\entry2\\}
% \legend[textwidth=2cm}{...}
% \legend[textwidth=none}{...}
%
% The option "textwidth=auto" chooses the correct width automatically;
% the option "textwidth=none" does not perform any line breaking and
% "textwidth=DIMEN" uses the fixed dimenion DIMEN for the (total)
% width of the legend.
%
% - font={...}
% \legend[font=\Huge}{...}
\newcommand{\legend}[2][]{
{%
\globaldefs=1% this will ONLY store the options and the legend into global variables
\setkeys[\prefix]{legend}{#1}%
\def\axis@TMP{#2}%
\ifx\axis@TMP\empty
\else
\listnew\axis@legend{#2}%
\fi
}
}
\newcommand{\addlegendentry}[1]{%
{%
\globaldefs=1% this will ONLY store the options and the legend into global variables
\listpushback#1\to\axis@legend
}%
}
\def\getnextlegend{{%
\globaldefs=1
\listcheckempty\axis@plotspeclist
\iflistempty
\let\axis@curplotlist=\empty
\else
\listpopfront\axis@plotspeclist\to\axis@curplotlist
\fi
%
\listcheckempty\axis@legend
\iflistempty
\let\axis@curlegend=\empty
\else
\listpopfront\axis@legend\to\axis@curlegend
\fi
\advance\axis@numplots by-1
}}
\def\axis@setlegendfont{%
\tikz@textfont
\axis@legend@font
}
% Helper function for \axis@createlegend
% It assigns the TOTAL width of the legend node to
% the dimension register #1 and the option to #2 as macro.
% Arguments:
% #1 a temporary dimension register which will be filled with the
% width.
% #2 a macro name which will be filled with 'text width=XXXX'.
% WARNING:
% this function use the variables
% - \axis@legend@textwidth (from keyval, see above)
% - \axis@TMP
% - \legendCOORDC
% - \legendHSEP
\def\axis@legend@determinewidth\to#1\optionto#2{%
\def\axis@TMP{auto}%
\ifx\axis@legend@textwidth\axis@TMP
% OPTION
% \legend[textwidth=auto]
%
% STEP 1: maximum width legend entries
#1=0cm
\begingroup
\listforeach\axis@legend\as\axis@curlegend{%
\setbox0=\hbox{{%
\pgfutil@selectfont% RESTORE normal fonts (have been resetted by PGF)
\axis@setlegendfont
\axis@curlegend%
}}%
\ifdim\wd0>#1
\global#1=\wd0
\fi
}%
\endgroup
% STEP 2: add plot spec width:
\expandafter\axis@tmpb\legendCOORDC
\advance#1 by\axis@tmpb
% STEP 3: hspace between plot spec and legend:
\advance#1 by\legendHSEP
%\advance#1 by1pt% FIXME I don't know why there was to few place!?
\def#2{text width=\the#1,}%
\else
\def\axis@TMP{none}%
\ifx\axis@legend@textwidth\axis@TMP
% OPTION
% \legend[textwidth=none]
% don't make a '\node[text width=XX]' option:
#1=0cm
\def#2{}%
\else
% OPTION
% \legend[textwidth=2cm]
% just use it:
\expandafter#1\axis@legend@textwidth
\def#2{text width=\the#1,}%
\fi
\fi
%
}
\newcommand\axis@createlegend{%
\listcheckempty\axis@legend
\iflistempty
\else
%
\def\legendHSEP{5pt}%
\def\legendCOORDB{0.3cm}%
\def\legendCOORDC{0.6cm}%
%
\axis@legend@determinewidth\to\pgf@xa\optionto\axis@TMP
%
%
% This code here invokes
% \node[,
% ...
% ]
% where \axis@TMP contains a "text width=XXX" option.
%DEBUG:
%\draw[red] (0,0) rectangle (1,1);
\expandafter\node\expandafter[\axis@TMP%
style=every axis legend]
{%
\loop\ifnum0<\axis@numplots
\getnextlegend
\ifx\axis@curlegend\empty
\else
\vbox{%
\noindent
\begin{minipage}[c]{\legendCOORDC}%
\tikz
\expandafter\draw\axis@curplotlist
[mark repeat=2,mark phase=2]
plot coordinates {
(0cm,0cm)
(\legendCOORDB,0cm)
(\legendCOORDC,0cm)};%
\hss
\end{minipage}
%\expandafter\hskip\legendHSEP
\axis@setlegendfont
\axis@curlegend
}%
\fi
\repeat
};
\fi
}
% Checks whether the argument to xtick or ytick is a UNIFORM tick
% sequence.
%
% A uniform tick sequence is 0,...,10 and 3,4,5 and -5,-4,-2 but
% NOT 0,2,4 or 4,10.
%
% Furthermore, any NON-integer tick arguments are also assumed to be
% NOT uniform.
%
% INPUT:
% #1: a tick argument (i.e. something which can be put to
% \foreach \x in {#1})
%
% OUTPUT:
% \axis@isuniformticktrue
% or
% \axis@isuniformtickfalse
% depending on the check.
% This variable will be set globally.
\def\axis@checkisuniformLOGtick#1{%
\begingroup
\global\axis@isuniformticktrue
\newif\ifisfirst
\isfirsttrue
\foreach \x in {#1}{%
\pgfmathlog@invoke@expanded\pgfmathdivide@{{\x}{\logten}}%
\let\cur=\pgfmathresult
% check whether
% \cur - last == 1 (last = \axis@TMPB)
\ifisfirst
\global\isfirstfalse
\else
\pgfmathlog@invoke@expanded\pgfmathsubtract@{{\cur}{\axis@TMPB}}%
\def\axis@TMP{1.0}%
\ifx\axis@TMP\pgfmathresult
\else
\global\axis@isuniformtickfalse
\breakforeach
\fi
\fi
\global\let\axis@TMPB=\cur
}%
\endgroup
}
\def\skipsuffixzero#1.#2|{
{%
\def\axis@TMP{#2}%
\def\axis@TMPB{0}%
\ifx\axis@TMP\axis@TMPB
\global\def\pgfmathresult{#1}%
\else
\global\def\pgfmathresult{#1.#2}%
\fi
}%
}
% Expands to #1/log(10). It will also skip a suffix '.0'
\def\logtologten#1{%
\pgfmathlog@invoke@expanded\pgfmathdivide@{{#1}{\logten}}%
\expandafter\skipsuffixzero\pgfmathresult|%
\pgfmathresult
}
% helper method which computes log10*\x foreach \x in {#1}.
% The result will be \xdef'ed into #2.
\def\axis@compute@tick@times@logten#1\to#2{%
\global\let#2=\empty
\foreach \axis@TMPB in {#1} {%
\pgfmathlog@invoke@expanded\pgfmathmultiply@{{\axis@TMPB}{\logten}}%
\ifx#2\empty
\xdef#2{\pgfmathresult}%
\else
\xdef#2{#2,\pgfmathresult}%
\fi
}%
}
\def\axis@enlarge@xlim{%
\ifcase\axis@xmode
\pgfmathlog@invoke@expanded\pgfmathsubtract@{{\axis@xmin}{0.5}}%
\let\axis@xmin=\pgfmathresult
\pgfmathlog@invoke@expanded\pgfmathadd@{{\axis@xmax}{0.5}}%
\let\axis@xmax=\pgfmathresult
\or
% compute
% \pgfmathsetmacro{\axis@xmin}{\axis@xmin - 0.5*\logten}%
% \pgfmathsetmacro{\axis@xmax}{\axis@xmax + 0.5*\logten}%
% just a more efficiently (I hope so):
\expandafter\pgfmath@x\logten pt
\divide\pgfmath@x by2
\pgfmathlog@invoke@expanded\pgfmathsubtract@{{\axis@xmin}{\pgf@sys@tonumber{\pgfmath@x}}}%
\let\axis@xmin=\pgfmathresult
\pgfmathlog@invoke@expanded\pgfmathadd@{{\axis@xmax}{\pgf@sys@tonumber{\pgfmath@x}}}%
\let\axis@xmax=\pgfmathresult
\fi
}
\def\axis@enlarge@ylim{%
\ifcase\axis@ymode
\pgfmathlog@invoke@expanded\pgfmathsubtract@{{\axis@ymin}{0.5}}%
\let\axis@ymin=\pgfmathresult
\pgfmathlog@invoke@expanded\pgfmathadd@{{\axis@ymax}{0.5}}%
\let\axis@ymax=\pgfmathresult
\or
% compute
% \pgfmathsetmacro{\axis@ymin}{\axis@ymin - 0.5*\logten}%
% \pgfmathsetmacro{\axis@ymax}{\axis@ymax + 0.5*\logten}%
% just a more efficiently (I hope so):
\expandafter\pgfmath@y\logten pt
\divide\pgfmath@y by2
\pgfmathlog@invoke@expanded\pgfmathsubtract@{{\axis@ymin}{\pgf@sys@tonumber{\pgfmath@y}}}%
\let\axis@ymin=\pgfmathresult
\pgfmathlog@invoke@expanded\pgfmathadd@{{\axis@ymax}{\pgf@sys@tonumber{\pgfmath@y}}}%
\let\axis@ymax=\pgfmathresult
\fi
}
\def\axis@determinedefaultvalues{%
% NOTIZ:
%
% wenn ich AUTOMATISCH aus (x_i,y_i)
% [xy]min und [xy]max ausrechnen will, muss ich
% ggf.
% xmin = min_{i} { untere_gaussklammer(log(x_i) / log10) }
% rechnen
%
\ifx\axis@xmin\empty
\errmessage{Sorry, the argument 'xmin=NUM' is mandatory to draw axes }%
\fi
\ifx\axis@xmax\empty
\errmessage{Sorry, the argument 'xmax=NUM' is mandatory to draw axes }%
\fi
\ifx\axis@ymin\empty
\errmessage{Sorry, the argument 'ymin=NUM' is mandatory to draw axes }%
\fi
\ifx\axis@ymax\empty
\errmessage{Sorry, the argument 'ymax=NUM' is mandatory to draw axes }%
\fi
%
%
\ifx\axis@trimxmin\empty
\else
\pgfmathlog@invoke@expanded\pgfmathmax@{{\axis@xmin}{\axis@trimxmin}}%
\let\axis@xmin=\pgfmathresult
\fi
\ifx\axis@trimxmax\empty
\else
\pgfmathlog@invoke@expanded\pgfmathmin@{{\axis@xmax}{\axis@trimxmax}}%
\let\axis@xmax=\pgfmathresult
\fi
\ifx\axis@trimymin\empty
\else
\pgfmathlog@invoke@expanded\pgfmathmax@{{\axis@ymin}{\axis@trimymin}}%
%\pgfmathmax\axis@ymin\axis@trimymin%
\let\axis@ymin=\pgfmathresult
\fi
\ifx\axis@trimymax\empty
\else
\pgfmathlog@invoke@expanded\pgfmathmin@{{\axis@ymax}{\axis@trimymax}}%
%\pgfmathmin\axis@ymax\axis@trimymax%
\let\axis@ymax=\pgfmathresult
\fi
%
%
\ifnum\axis@xmode=0
\axis@xminorticksfalse
\fi
\ifnum\axis@ymode=0
\axis@yminorticksfalse
\fi
\ifaxis@enlargelimits
% relax the sizes.
%
% Idea: if the user chose his xmin,xmax tight to his data,
% this here will look better.
\axis@enlarge@xlim
\axis@enlarge@ylim
\else
\ifaxis@autocompute@xlim
\axis@enlarge@xlim
\fi
\ifaxis@autocompute@ylim
\axis@enlarge@ylim
\fi
\fi
%
\newif\ifaxis@xisuniform
\newif\ifaxis@yisuniform
\axis@xisuniformtrue
\axis@yisuniformtrue
\newif\ifaxis@needs@check@uniformtick
\axis@needs@check@uniformticktrue
\ifx\axis@xtick\empty
\begingroup
\ifcase\axis@xmode
\pgfmathsetcount{\c@pgf@counta}{\axis@xmin-1}%
\edef\tmp@min{\the\c@pgf@counta}%
\pgfmathsetcount{\c@pgf@counta}{\axis@xmax}%
\edef\tmp@max{\the\c@pgf@counta}%
\xdef\axis@TMP{\tmp@min,...,\tmp@max}%
\aftergroup\axis@needs@check@uniformtickfalse
\or
\ifx\axis@xtickten\empty
% I want ticks at 10^k. So determine k_min and k_max.
\pgfmathsetcount{\c@pgf@counta}{\axis@xmin/\logten-1}%
\pgfmathsetmacro{\tmp@min}{\c@pgf@counta*\logten}%
\pgfmathsetcount{\c@pgf@counta}{\axis@xmax/\logten}%
\pgfmathsetmacro{\tmp@max}{\c@pgf@counta*\logten}%
\pgfmathadd\tmp@min\logten%
\xdef\axis@TMP{\tmp@min,\pgfmathresult,...,\tmp@max}%
\aftergroup\axis@needs@check@uniformtickfalse
\else
\expandafter\axis@compute@tick@times@logten\axis@xtickten\to\axis@TMP
\aftergroup\axis@needs@check@uniformticktrue
\fi
\fi
\endgroup
\let\axis@xtick=\axis@TMP
%\message{pgfplots.sty: xtick set to \axis@xtick [xmode=\the\axis@xmode].}%
\fi
\ifaxis@needs@check@uniformtick
\ifnum\axis@xmode=1
\expandafter\axis@checkisuniformLOGtick\expandafter{\axis@xtick}%
\fi
\ifaxis@isuniformtick
\axis@xisuniformtrue
\else
\axis@xminorticksfalse
\axis@xisuniformfalse
\fi
\fi
%
%
%
\axis@needs@check@uniformticktrue
\ifx\axis@ytick\empty
\begingroup
\ifcase\axis@ymode
\pgfmathsetcount{\c@pgf@counta}{\axis@ymin-1}%
\edef\tmp@min{\the\c@pgf@counta}%
\pgfmathsetcount{\c@pgf@counta}{\axis@ymax}%
\edef\tmp@max{\the\c@pgf@counta}%
\xdef\axis@TMP{\tmp@min,...,\tmp@max}%
\aftergroup\axis@needs@check@uniformtickfalse
\or
\ifx\axis@ytickten\empty
% I want ticks at 10^k. So determine k_min and k_max.
\pgfmathsetcount{\c@pgf@counta}{\axis@ymin/\logten-1}%
\pgfmathsetmacro{\tmp@min}{\c@pgf@counta*\logten}%
\pgfmathsetcount{\c@pgf@counta}{\axis@ymax/\logten}%
\pgfmathsetmacro{\tmp@max}{\c@pgf@counta*\logten}%
\pgfmathadd\tmp@min\logten%
\xdef\axis@TMP{\tmp@min,\pgfmathresult,...,\tmp@max}%
\aftergroup\axis@needs@check@uniformtickfalse
\else
\expandafter\axis@compute@tick@times@logten\axis@ytickten\to\axis@TMP
\aftergroup\axis@needs@check@uniformticktrue
\fi
\fi
\endgroup
\let\axis@ytick=\axis@TMP
%\message{pgfplots.sty: ytick set to \axis@ytick[ymode=\the\axis@ymode.}%
\fi
\ifaxis@needs@check@uniformtick
\ifnum\axis@ymode=1
\expandafter\axis@checkisuniformLOGtick\expandafter{\axis@ytick}%
\fi
\ifaxis@isuniformtick
\axis@yisuniformtrue
\else
\axis@yminorticksfalse
\axis@yisuniformfalse
\fi
\fi
\ifx\axis@xticklabel\empty
\ifcase\axis@xmode
\def\axis@xticklabel{\axisdefaultticklabel}%
\or
\def\axis@xticklabel{\axisdefaultticklabellog}%
\fi
\fi
\ifx\axis@yticklabel\empty
\ifcase\axis@ymode
\def\axis@yticklabel{\axisdefaultticklabel}%
\or
\def\axis@yticklabel{\axisdefaultticklabellog}%
%--------------------------------------------------
% \def\axis@yticklabel{%
% \pgfmathexp\tick
% \expandafter\skipsuffixzero\pgfmathresult|%
% $\pgfmathresult$}%
%--------------------------------------------------
\fi
\fi
}
% Helper method for initsizes.
%
% It computes a scaling such that \axis@width = SCALE * ACTUAL WIDTH.
%
% The actual width is
% c + x*(xmax-xmin)
% based on
% - x*xmax = \axis@xcoordmaxTEX
% - x*xmin = \axis@xcoordminTEX
% - c = estimated, a constant for the axis label/tick labels
%
% Arguments:
% #1: the output argument for the SCALE.
\def\axis@initsizes@getXscale\into#1{%
\expandafter\axis@tmpa\axis@width\relax
% EXPECTED WIDTH = X = \axis@width
% ACTUAL WIDTH = c + x * (xmax-xmin)
% where c is a CONSTANT (for the axis labels/tick labels).
% -> \axis@tmpXscale = (X - c) / (x *(xmax-xmin))
%
% \axis@tmpa := X-c:
\advance\axis@tmpa by-45pt% FIXME determine 'c' correctly!
% \axis@tmpb := x*(xmax-xmin):
\axis@tmpb=\axis@xcoordmaxTEX
\advance\axis@tmpb by-\axis@xcoordminTEX
\pgfmathlog@invoke@expanded\pgfmathdivide@{%
{\pgf@sys@tonumber\axis@tmpa}%
{\pgf@sys@tonumber\axis@tmpb}%
}%
\let#1=\pgfmathresult
%--------------------------------------------------
% \message{pgfplots.sty: Computing 'x' such that 'width = c + x*(xmax-xmin)';
% c=estimated,
% width-c =\the\axis@tmpa,
% x*(xmax[=\the\axis@xcoordmaxTEX] - xmin[=\the\axis@xcoordminTEX)]) = \the\axis@tmpb
% -> x-scale =#1 }%
%--------------------------------------------------
}
% The same as \axis@initsizes@getXscale, just for the height.
\def\axis@initsizes@getYscale\into#1{%
\expandafter\axis@tmpa\axis@height\relax
% EXPECTED WIDTH = X = \axis@width
% ACTUAL WIDTH = c + x * (xmax-xmin)
% where c is a CONSTANT (for the axis labels/tick labels).
% -> \axis@tmpXscale = (X - c) / (x *(xmax-xmin))
%
% \axis@tmpa := X-c:
\advance\axis@tmpa by-45pt% FIXME determine 'c' correctly!
% \axis@tmpb := x*(xmax-xmin):
\axis@tmpb=\axis@ycoordmaxTEX
\advance\axis@tmpb by-\axis@ycoordminTEX
\pgfmathlog@invoke@expanded\pgfmathdivide@{%
{\pgf@sys@tonumber\axis@tmpa}%
{\pgf@sys@tonumber\axis@tmpb}%
}%
\let#1=\pgfmathresult
%--------------------------------------------------
% \message{pgfplots.sty: Computing 'y' such that 'height = c + y*(ymax-ymin)';
% %height=\axis@height,
% c=estimated,
% height-c =\the\axis@tmpa,
% y*(ymax[=\the\axis@ycoordmaxTEX] - ymin[=\the\axis@ycoordminTEX)]) = \the\axis@tmpb
% -> y-scale =#1 }%
%--------------------------------------------------
}
\def\axis@initsizes{%
% INIT.
%
% The axes 'x' and 'y' vectors will be scaled such that the total
% size is (\axisdefaultwidth, \axisdefaultheight).
%
% If the user specifies ONE of width OR height,
% the plot will be resized; keeping the aspect ratio.
\expandafter\pgfmath@x\axisdefaultwidth
\expandafter\pgfmath@y\axisdefaultheight
\pgfmathlog@invoke@expanded\pgfmathdivide@{%
{\pgf@sys@tonumber{\pgfmath@x}}%
{\pgf@sys@tonumber{\pgfmath@y}}%
}%
\let\axis@default@aspect@ratio=\pgfmathresult
%
\pgfpointxy{\axis@xmin}{\axis@ymin}%
\axis@xcoordminTEX=\pgf@x
\axis@ycoordminTEX=\pgf@y
\pgfpointxy{\axis@xmax}{\axis@ymax}%
\axis@xcoordmaxTEX=\pgf@x
\axis@ycoordmaxTEX=\pgf@y
%
%-----------------------------------------
% PROCESS THE 'width' and 'height' options
%-----------------------------------------
%
% FIXME: make these variables LOCAL:
\let\axis@tmpXscale=\empty%
\let\axis@tmpYscale=\empty%
% CASES:
% hasx := 'x' option non-empty
% hasy := 'y' option non-empty
% W := 'width' option non-empty
% H := 'height' option non-empty
%
% hasx hasy
% 0 0 -> work depend on W and H:
% W H
% 0 0 -> use \axisdefaultwidth and \axisdefaultheight
% 0 1 -> determine s:=\axis@tmpYscale and y*=s, x*=s (aspect ratio)
% 1 0 -> determine s:=\axis@tmpXscale and " " "
% 1 1 -> use specified width and height
% 0 1 -> use specified y vector, xscale by 'W' option (NO ASPECT RATIO)
% W
% 0 -> use \axisdefaultwidth
% 1 -> determine s:=\axis@tmpXscale
% 1 0 -> use specified x vector, yscale by 'H' option (NO ASPECT RATIO)
% H
% 0 -> use \axisdefaultheight
% 1 -> determine s:=\axis@tmpYscale
% 1 1 -> use specified x AND y vector (ignore W and H)
%
\ifx\axis@x\empty
\ifx\axis@y\empty
% The case hasx=0, hasy=0, W=0 H=0:
% the other cases for hasx=0, hasy=0 follow below.
\ifx\axis@width\empty\ifx\axis@height\empty
\let\axis@width=\axisdefaultwidth
\let\axis@height=\axisdefaultheight
\fi\fi
\else
% hasx=0, hasy=1, W=0:
\ifx\axis@width\empty
\let\axis@width=\axisdefaultwidth
\fi
\fi
\else
\ifx\axis@y\empty
% hasx=1, hasy=0, H=0
\ifx\axis@height\empty
\let\axis@height=\axisdefaultheight
\fi
\fi
\fi
%
% common code for the cases if one of W,H is 1:
\ifx\axis@x\empty
\ifx\axis@width\empty
\else
\axis@initsizes@getXscale\into\axis@tmpXscale
\fi
\else
\def\axis@tmpXscale{1}%
\fi
%
\ifx\axis@y\empty
\ifx\axis@height\empty
\else
\axis@initsizes@getYscale\into\axis@tmpYscale
\fi
\else
\def\axis@tmpYscale{1}%
\fi
%
\ifx\axis@x\empty\ifx\axis@y\empty
% hasx=0, hasy=0 and ...
%
% -> KEEP ASPECT RATIO!
%
% CASE W=0 H=1:
\ifx\axis@width\empty
\ifx\axis@height\empty
\else
\expandafter\pgfmath@y\axis@height
\pgfmathlog@invoke@expanded\pgfmathmultiply@{%
{\pgf@sys@tonumber{\pgfmath@y}}%
{\axis@default@aspect@ratio}%
}%
\edef\axis@width{\pgfmathresult pt}%
\axis@initsizes@getXscale\into\axis@tmpXscale
\fi
\else% CASE W=1 H=0:
\ifx\axis@height\empty
\expandafter\pgfmath@x\axis@width
\pgfmathlog@invoke@expanded\pgfmathdivide@{%
{\pgf@sys@tonumber{\pgfmath@x}}%
{\axis@default@aspect@ratio}%
}%
\edef\axis@height{\pgfmathresult pt}%
\axis@initsizes@getYscale\into\axis@tmpYscale
\fi
\fi
\fi\fi
% IMPLEMENTATION NOTE:
% if(Xscale=empty or Yscale=empty)
% -> LOGIC ERROR above.
%
% Apply scaling:
\pgfpointxy{\axis@tmpXscale}{\axis@tmpYscale}%
\axis@tmpa=\pgf@x
\axis@tmpb=\pgf@y
\ifx\axis@x\empty
\pgfsetxvec{\pgfpoint{\axis@tmpa}{0pt}}%
\else
\pgfsetxvec{\pgfpoint{\axis@x}{0pt}}%
\fi
\ifx\axis@y\empty
\pgfsetyvec{\pgfpoint{0pt}{\axis@tmpb}}%
\else
\pgfsetyvec{\pgfpoint{0pt}{\axis@y}}%
\fi
%
\pgfpointxy{\axis@xmin}{\axis@ymin}%
\axis@xcoordminTEX=\pgf@x
\axis@ycoordminTEX=\pgf@y
\pgfpointxy{\axis@xmax}{\axis@ymax}%
\axis@xcoordmaxTEX=\pgf@x
\axis@ycoordmaxTEX=\pgf@y
%-----------------------------------------
}
\def\axis@BEGIN@init@and@draw@axis{%
\axis@determinedefaultvalues
\axis@initsizes
% X-Achsenbeschriftung:
% LADE DIE \axis@xtick -variable REIN
\expandafter\xachse\expandafter{\axis@xtick}
%
% Y-Achsen und Achsenbeschriftung:
\expandafter\yachse\expandafter{\axis@ytick}%
% Äußerer Rahmen:
\draw
(\axis@xcoordminTEX, \axis@ycoordminTEX)
rectangle (\axis@xcoordmaxTEX, \axis@ycoordmaxTEX);
\begin{scope}
\clip
(\axis@xcoordminTEX, \axis@ycoordminTEX)
rectangle (\axis@xcoordmaxTEX, \axis@ycoordmaxTEX);
}
\def\axis@END@init@and@draw@axis{%
\end{scope}%
}
% Writes output to \axis@TMP
\def\axis@filter@input@ticks@with@log#1{%
\let\axis@TMP=\empty
\foreach \axis@TMPB in {#1} {%
\expandafter\pgfmathlog@\expandafter{\axis@TMPB}%
\ifx\axis@TMP\empty
\xdef\axis@TMP{\pgfmathresult}%
\else
\xdef\axis@TMP{\axis@TMP,\pgfmathresult}%
\fi
}%
}
% In case of (semi-) logplots, this command will
% - assign a filter which invokes \pgfmathlog@{} for each coordinate
% - replace any user-specified coordinate by its log.
%
% All subsequent commands will then work with logarithmic coordinates.
%
% @see pgfmathlog.sty for details about the implementation of log().
\def\axis@preparelog@filtering{%
\ifnum\axis@xmode=1
% any user-specified axis limits:
\ifx\axis@xmin\empty
\else
\expandafter\pgfmathlog@\expandafter{\axis@xmin}%
\let\axis@xmin=\pgfmathresult
\fi
\ifx\axis@xmax\empty
\else
\expandafter\pgfmathlog@\expandafter{\axis@xmax}%
\let\axis@xmax=\pgfmathresult
\fi
%
% any user specified axis ticks:
\ifx\axis@xtick\empty
\else
\expandafter\axis@filter@input@ticks@with@log\expandafter{\axis@xtick}%
\edef\axis@xtick{\axis@TMP}%
\fi
\ifx\axis@xfilter\empty
\def\addplot@log@compute@xfilter##1\to##2{%
\pgfmathlog@{##1}%
\let##2=\pgfmathresult
}%
\else
\let\axis@xfilter@orig=\axis@xfilter
\def\addplot@log@compute@xfilter##1\to##2{%
\pgfmathlog@{##1}%
\ifx\pgfmathresult\empty
\let##2=\empty
\else
\expandafter\axis@xfilter@orig\pgfmathresult\to##2\relax
\fi
}%
\fi
\def\axis@xfilter{\addplot@log@compute@xfilter}%
\fi
%
\ifnum\axis@ymode=1
% any user-specified axis limits:
\ifx\axis@ymin\empty
\else
\pgfmathlog@\expandafter{\axis@ymin}%
\let\axis@ymin=\pgfmathresult
\fi
\ifx\axis@ymax\empty
\else
\pgfmathlog@\expandafter{\axis@ymax}%
\let\axis@ymax=\pgfmathresult
\fi
%
% any user specified axis ticks:
\ifx\axis@ytick\empty
\else
\expandafter\axis@filter@input@ticks@with@log\expandafter{\axis@ytick}%
\edef\axis@ytick{\axis@TMP}%
\fi
\ifx\axis@yfilter\empty
\def\addplot@log@compute@yfilter##1\to##2{%
\pgfmathlog@{##1}%
\let##2=\pgfmathresult
}%
\else
\let\axis@yfilter@orig=\axis@yfilter
\def\addplot@log@compute@yfilter##1\to##2{%
\pgfmathlog@{##1}%
\ifx\pgfmathresult\empty
\let##2=\empty
\else
\expandafter\axis@yfilter@orig\pgfmathresult\to##2\relax
\fi
}%
\fi
\def\axis@yfilter{\addplot@log@compute@yfilter}%
\fi
}
\newenvironment{axis}[1][]{%
\begingroup
\begin{scope}[style=every axis]
%--------------------------------------------------
% \draw[very thin,color=gray,xstep=1,ystep=\logten]
% (\xcoordmin\axis@leftover,\ycoordmin)
% grid (\xcoordmax\axis@rightover,\ycoordmax);
%--------------------------------------------------
\setkeys[\prefix]{axis}{#1}%
\setkeys[\prefix]{legend}{}%
%
\listnewempty\axis@plotspeclist
\listnewempty\axis@legend
\listnewempty\axis@draw@stored@plots
%
\ifaxis@disablelogfilter
\else
\axis@preparelog@filtering
\fi
%
\newif\ifaxis@filtercoords
\ifx\axis@xfilter\empty
\else
\axis@filtercoordstrue
\fi
\ifx\axis@yfilter\empty
\else
\axis@filtercoordstrue
\fi
%
\axis@numplots=0
%
\newif\ifaxis@autocompute@xlim
\newif\ifaxis@autocompute@ylim
\newif\ifaxis@draw@at@end
\newif\ifaxis@limits@are@computed
\axis@limits@are@computedtrue
\ifx\axis@xmin\empty
\axis@autocompute@xlimtrue
\def\axis@xmin{16300}%
\fi
\ifx\axis@xmax\empty
\axis@autocompute@xlimtrue
\def\axis@xmax{-16300}%
\fi
\ifx\axis@ymin\empty
\axis@autocompute@ylimtrue
\def\axis@ymin{16300}%
\fi
\ifx\axis@ymax\empty
\axis@autocompute@ylimtrue
\def\axis@ymax{-16300}%
\fi
%
\ifaxis@autocompute@xlim
\axis@draw@at@endtrue
\axis@limits@are@computedfalse
\fi
\ifaxis@autocompute@ylim
\axis@draw@at@endtrue
\axis@limits@are@computedfalse
\fi
%
%
\ifaxis@draw@at@end
\else
\axis@BEGIN@init@and@draw@axis
\fi
}{%
\ifaxis@draw@at@end
\ifaxis@limits@are@computed
\else
% EMPTY AXIS:
\def\axis@xmin{0}%
\def\axis@xmax{1}%
\def\axis@ymin{0}%
\def\axis@ymax{1}%
\fi
\axis@BEGIN@init@and@draw@axis
\listforeach\axis@draw@stored@plots\as\plotcmd{\plotcmd}%
\fi
\axis@END@init@and@draw@axis
%
\begin{scope}[%
xshift=+\axis@xcoordminTEX,
yshift=\axis@ycoordminTEX,
x={\axis@xcoordmaxTEX-\axis@xcoordminTEX},
y={\axis@ycoordmaxTEX-\axis@ycoordminTEX}
]%
\showxlabel
\showylabel
\axis@createlegend
\end{scope}%
%
\end{scope}%
\endgroup
}
\newenvironment{semilogxaxis}[1][]{%
\begin{axis}[xmode=log,ymode=normal,#1]
}{%
\end{axis}%
}
\newenvironment{semilogyaxis}[1][]{%
\begin{axis}[xmode=normal,ymode=log,#1]
}{%
\end{axis}%
}
\newenvironment{loglogaxis}[1][]{%
\begin{axis}[xmode=log,ymode=log,#1]
}{%
\end{axis}%
}