summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/pgfplots/pgfplotshelpers.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/pgfplots/pgfplotshelpers.sty')
-rw-r--r--Master/texmf-dist/tex/latex/pgfplots/pgfplotshelpers.sty205
1 files changed, 205 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/pgfplots/pgfplotshelpers.sty b/Master/texmf-dist/tex/latex/pgfplots/pgfplotshelpers.sty
new file mode 100644
index 00000000000..203f16379ee
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/pgfplots/pgfplotshelpers.sty
@@ -0,0 +1,205 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Low-level helper methods for string parsing and number conversion.
+%
+% This file comes as part of the pgfplots-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/>.
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\ProvidesPackage{pgfplotshelpers}[2008/31/01 Version 0.9]
+
+\def\prettyprintnumberprecision{2}
+
+\def\pgfmathlog@tonumber#1pt{#1}
+
+% Invokes command #1 with #2 without the 'pt' suffix.
+\def\invokepgf@math@one#1#2{%
+ %\edef\pgfmath@resulttemp{\pgf@sys@tonumber{#2}}%
+ %\expandafter#1\expandafter{\pgfmath@resulttemp}%
+ \edef\pgfmath@resulttemp{{\pgf@sys@tonumber{#2}}}%
+ \expandafter#1\pgfmath@resulttemp%
+}
+
+% Expands #2 using \edef and invokes #1 with the resulting string.
+%
+% Example:
+% \pgfmath@y=7.9pt
+% \pgfmathlog@invoke@expanded\pgfmathexp@{{\pgf@sys@tonumber{\pgfmath@y}}}%
+% will invoke
+% \pgfmathexp@{7.9}
+\def\pgfmathlog@invoke@expanded#1#2{%
+ \edef\pgfmath@resulttemp{#2}%
+ \expandafter#1\pgfmath@resulttemp
+}
+
+% Expands the NUMBER (without units) to a pretty printed string argument: rounded to
+% several digits, discard any suffix zeros etc.
+%
+% It uses \prettyprintnumberprecision digits after the comma.
+\def\prettyprintnumber#1{%
+ \begingroup
+%\tracingmacros=2\tracingcommands=2
+ \edef\argument{#1}%
+ \expandafter\prettyprintnumber@impl\argument.\END
+%\tracingmacros=0\tracingcommands=0
+ \endgroup
+}
+
+\def\prettyprintnumber@impl#1.#2\END{%
+ % This implementation is really bad.
+ % I hope I find time to get something better...
+ \def\tmp{#2}%
+ \ifx\tmp\empty
+ % there was no '.' in the original arg
+ #1
+ \else
+ % ok, there is a dot in the arg.
+ % 1. ROUND
+ % 2. DISCARD ZEROS
+ \toksdef\tokens=2
+ \let\i=\c@pgf@counta
+ \let\lastdigit=\c@pgf@countb
+ \let\numberAsDIM=\pgfmath@x
+ \let\zeroFilledNum=\pgfmath@y
+ \i=0
+ \tokens={}%
+ \def\D{#2}%
+ \def\DOT{.}%
+ \ifx\D\DOT
+ % the number '#1.'
+ \let\D=\empty
+ \else
+ \expandafter\prettyprintnumber@impl@getfirst
+ \prettyprintnumberprecision
+ \of#2%
+ \to\tokens%
+ \nextto\D
+ \count\i
+ \fi
+ %\message{Pretty print: first <= \prettyprintnumberprecision\ digits after period: \the\tokens, (strlen=\the\i), next rounding-relevant-digit: '\D'}%
+ \ifx\D\empty
+ \numberAsDIM=#1\expandafter.\the\tokens pt
+ % Nothing to do - we have our desired precision.
+ \else
+ \lastdigit\expandafter=\D\relax
+% \message{D=\D!}%
+ \ifnum\lastdigit>4
+ \numberAsDIM=#1\expandafter.\expandafter\the\tokens\D pt
+ % round up:
+ % compute numberAsDIM += 0.0000[10-digit]
+ \advance\lastdigit by-10
+ \multiply\lastdigit by-1
+ \tokens={0.}%
+ \loop
+ \ifnum\i>0
+ \tokens=\expandafter{\the\tokens0}%
+ \advance\i by-1
+ \repeat
+ \edef\D{\the\tokens\the\lastdigit pt}%
+ \expandafter\zeroFilledNum\D
+ \ifdim\numberAsDIM<0pt
+ \advance\numberAsDIM by-\zeroFilledNum
+ \else
+ \advance\numberAsDIM by\zeroFilledNum
+ \fi
+ \else
+ \numberAsDIM=#1\expandafter.\the\tokens pt
+ \fi
+ \fi
+ %\message{Pretty print: Result after rounding = \the\numberAsDIM / zeroFilledNum = \the\zeroFilledNum [only defined on up-rounding}%
+ \edef\D{\pgf@sys@tonumber{\numberAsDIM}}%
+ \expandafter\prettyprintnumber@onlyrelevant@digits\D\to\D
+ % FIXME : I could return '\D' as macro!? May thats a better
+ % way...
+ \D
+ \fi
+}
+
+% This macro takes the first \prettyprintnumberprecision digits after
+% the period and squeezes away any trailing zeros.
+%
+% If no digits after the period remain, the period will be discarded
+% as well.
+\def\prettyprintnumber@onlyrelevant@digits#1.#2\to#3{%
+ \begingroup
+ \toksdef\tokens=2
+ \let\i=\c@pgf@counta
+ \let\maxDigits=\c@pgf@countc
+ \let\numsuffixZeros=\c@pgf@countb
+ \tokens={#1.}%
+ \i=0
+ \expandafter\maxDigits\prettyprintnumberprecision
+ \numsuffixZeros=0
+ \prettyprintnumber@onlyrelevant@digits@leftshift#2\to#3
+ \ifnum\numsuffixZeros>0
+ \ifnum\numsuffixZeros=\i
+ \tokens={#1}%
+ \else
+ \maxDigits=\i
+ \advance\maxDigits by-\numsuffixZeros
+ \tokens={#1.}%
+ \i=0
+ \prettyprintnumber@onlyrelevant@digits@leftshift#2\to#3
+ \fi
+ \fi
+ \xdef\pgfplotshelpersTMP{\the\tokens}%
+ \endgroup
+ \let#3=\pgfplotshelpersTMP
+}
+
+
+% shifts the input argument until either no more input is left or
+% \maxDigits entries have been acquired.
+%
+% It also updates \i (will contain the number of acquired elements)
+% and \numsuffixZeros (the number of zeros at the tail of #3 on
+% output).
+\def\prettyprintnumber@onlyrelevant@digits@leftshift#1#2\to#3{%
+ \ifnum\i<\maxDigits
+ \tokens=\expandafter{\the\tokens#1}%
+ \advance\i by1
+ \ifnum#1=0
+ \advance\numsuffixZeros by1
+ \else
+ \numsuffixZeros=0
+ \fi
+ \def\tmp{#2}%
+ \ifx\tmp\empty
+ \else
+ \prettyprintnumber@onlyrelevant@digits@leftshift#2\to#3
+ \fi
+ \fi
+}
+
+\def\prettyprintnumber@impl@getfirst#1\of#2#3.\to#4\nextto#5\count#6{%
+ \edef#5{#3}%
+ #4=\expandafter{\the#4#2}%
+ \advance#6 by1
+ \ifx#5\empty
+ \else
+ \ifnum#6<#1
+ \prettyprintnumber@impl@getfirst #1\of#3.\to#4\nextto#5\count{#6}%
+ \else
+ \prettyprintnumber@impl@firstof#3\to#5
+ \fi
+ \fi
+}
+
+\def\prettyprintnumber@impl@firstof#1#2\to#3{\def#3{#1}}%
+