summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex265
1 files changed, 265 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex
new file mode 100644
index 00000000000..db2c38fa350
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex
@@ -0,0 +1,265 @@
+% Copyright 2007 Mark Wibrow
+%
+% but subject to the LaTeX Project Public License
+% (http://www.latex-project.org/lppl.txt)
+%
+% and the GNU Public License
+% (http://www.gnu.org/licenses/gpl.txt)
+%
+
+% This file defines utilities common to the \pgfmath files.
+%
+% Version 1.414213 29/9/2007
+
+\def\pgfmathincluded{}
+
+% \pgfmath@ensureregister
+%
+% Ensure a control sequence exists as a TeX count/dimen register.
+%
+% #1 - count or dimen.
+% #2 - a control sequence.
+%
+\newbox\pgfmath@box%
+\def\pgfmath@ensureregister#1#2{%
+ \setbox\pgfmath@box\hbox\bgroup% In case #2 is a defined macro. Unlikely, but you never know...
+ \afterassignment\pgfmath@@ensureregister%
+ \noexpand#20.0pt\let\pgfmath@temp\relax\relax\pgfmath@#2#1\pgfmath@}
+
+\def\pgfmath@@ensureregister#1#2\pgfmath@#3#4#5\pgfmath@{%
+ \egroup%
+ \ifx#4c%
+ \ifx#1.% Already a count register.
+ \else%
+ \csname newcount\endcsname#3% This gets round \outer in plain TeX.
+ \fi%
+ \else%
+ \ifx#4d%
+ \ifx\let#1% Already a dimen register.
+ \else%
+ \csname newdimen\endcsname#3%
+ \fi%
+ \fi%
+ \fi%
+}
+
+% Check registers exist. If not, create them.
+%
+\pgfmath@ensureregister{dimen}{\pgf@x}
+\pgfmath@ensureregister{dimen}{\pgf@xa}
+\pgfmath@ensureregister{dimen}{\pgf@xb}
+\pgfmath@ensureregister{dimen}{\pgf@xc}
+
+\pgfmath@ensureregister{dimen}{\pgf@y}
+\pgfmath@ensureregister{dimen}{\pgf@ya}
+\pgfmath@ensureregister{dimen}{\pgf@yb}
+\pgfmath@ensureregister{dimen}{\pgf@yc}
+
+\pgfmath@ensureregister{dimen}{\pgfutil@tempdima}
+\pgfmath@ensureregister{dimen}{\pgfutil@tempdimb}
+
+\pgfmath@ensureregister{count}{\c@pgf@counta}
+\pgfmath@ensureregister{count}{\c@pgf@countb}
+\pgfmath@ensureregister{count}{\c@pgf@countc}
+\pgfmath@ensureregister{count}{\c@pgf@countd}
+
+\pgfmath@ensureregister{count}{\pgfutil@tempcnta}
+\pgfmath@ensureregister{count}{\pgfutil@tempcntb}
+
+% Alias for \pgfmath.
+%
+\let\pgfmath@x\pgf@x
+\let\pgfmath@xa\pgf@xa
+\let\pgfmath@xb\pgf@xb
+\let\pgfmath@xc\pgf@xc
+
+\let\pgfmath@y\pgf@y
+\let\pgfmath@ya\pgf@ya
+\let\pgfmath@yb\pgf@yb
+\let\pgfmath@yc\pgf@yc
+
+\let\pgfmath@tempdima\pgfutil@tempdima
+\let\pgfmath@tempdima\pgfutil@tempdima
+
+\let\c@pgfmath@counta\c@pgf@counta
+\let\c@pgfmath@countb\c@pgf@countb
+\let\c@pgfmath@countc\c@pgf@countc
+\let\c@pgfmath@countd\c@pgf@countd
+
+\let\pgfmath@tempcnta\pgfutil@tempcnta
+\let\pgfmath@tempcntb\pgfutil@tempcntb
+
+% Now check if pgfutil and pgf@sys stuff exists. If it does, fine.
+% Just \let pgfmath versions. If not, define pgfmath versions (Arghhh).
+%
+
+% \...ifnextchar
+%
+\ifx\pgfutil@ifnextchar\pgfmath@undefined%
+ \long\def\pgfmath@ifnextchar#1#2#3{%
+ \let\pgfmath@reserved@d#1%
+ \def\pgfmath@reserved@a{#2}%
+ \def\pgfmath@reserved@b{#3}%
+ \futurelet\pgfmath@let@token\pgfmath@ifnch}
+ \def\pgfmath@ifnch{%
+ \ifx\pgfmath@let@token\pgfmath@sptoken%
+ \let\pgfmath@reserved@c\pgfmath@xifnch%
+ \else%
+ \ifx\pgfmath@let@token\pgfmath@reserved@d%
+ \let\pgfmath@reserved@c\pgfmath@reserved@a%
+ \else%
+ \let\pgfmath@reserved@c\pgfmath@reserved@b%
+ \fi%
+ \fi%
+ \pgfmath@reserved@c}
+ {%
+ \def\:{\global\let\pgfmath@sptoken= } \:
+ \def\:{\pgfmath@xifnch} \expandafter\gdef\: {\futurelet\pgfmath@let@token\pgfmath@ifnch}
+ }%
+\else%
+ \let\pgfmath@ifnextchar\pgfutil@ifnextchar%
+ % Still need to define \pgfmath@sptoken (cannot \let).
+ {%
+ \def\:{\global\let\pgfmath@sptoken= } \:
+ }%
+\fi%
+
+% \...ifundefined
+%
+\ifx\pgfutil@ifundefined\pgfmath@undefined%
+ \long\def\pgfmath@ifundefined#1{%
+ \expandafter\ifx\csname#1\endcsname\relax%
+ \expandafter\pgfmath@firstoftwo%
+ \else%
+ \expandafter\pgfmath@secondoftwo%
+ \fi}%
+\else%
+ \let\pgfmath@ifundefined\pgfutil@ifundefined%
+\fi%
+
+% \...selectfont
+%
+\ifx\pgfutil@selectfont\pgfmath@undefined%
+ \ifx\selectfont\pgfmath@undefined%
+ \let\pgfmath@selectfont\rm% Plain TeX and ConTeXt.
+ \else%
+ \let\pgfmath@selectfont\selectfont% LaTeX.
+ \fi%
+\else%
+ \let\pgfmath@selectfont\pgfutil@selectfont%
+\fi%
+
+% New definition easier than fussing around with let.
+%
+\newif\ifpgfmath@in@
+\def\pgfmath@in@#1#2{%
+ \def\pgfmath@in@@##1#1##2##3\pgfmath@in@@{%
+ \ifx\pgfmath@in@##2\pgfmath@in@false\else\pgfmath@in@true\fi}%
+ \pgfmath@in@@#2#1\pgfmath@in@\pgfmath@in@@}
+
+
+% \...tonumber
+%
+\ifx\pgf@sys@tonumber\pgfmath@undefined%
+ {\catcode`\p=12\catcode`\t=12\gdef\Pgf@geT#1pt{#1}}
+ \def\pgfmath@tonumber#1{\expandafter\Pgf@geT\the#1}
+\else%
+ \let\pgfmath@tonumber\pgf@sys@tonumber%
+\fi%
+
+
+% \PackageWarning and \PackageError
+%
+\ifx\PackageWarning\pgfmath@undefined
+ \def\pgfmath@PackageWarning#1#2{\immediate\write-1{Package #1: Warning! #2.}}%
+\else%
+ \let\pgfmath@PackageWarning\PackageWarning%
+\fi%
+\ifx\PackageError\pgfmath@undefined
+ \def\pgfmath@PackageError#1#2#3{\immediate\write-1{Package #1: Error! #2.}}%
+\else%
+ \let\pgfmath@PackageError\PackageError%
+\fi%
+
+\def\pgfmath@error#1#2{\pgfmath@PackageError{PGF Math}{#1}{#2}}
+\def\pgfmath@warning#1{\pgfmath@PackageWarning{PGF Math}{#1}}
+
+% \pgfmath@pt
+%
+% Needed to test for 'pt' resulting from expansion using \the.
+%
+{\catcode`\p=12\catcode`\t=12\gdef\PgfmaTh@PT{pt}}
+\edef\pgfmath@pt{\PgfmaTh@PT}%
+
+% \pgfmath@empty
+%
+% A handy macro.
+%
+\def\pgfmath@empty{}
+
+\def\pgfmath@firstoftwo#1#2{#1}
+\def\pgfmath@secondoftwo#1#2{#2}
+
+% \pgfmath@gobbletilpgfmath@
+%
+% Gobble stream until \pgfmath@ {which is undefined}.
+%
+\def\pgfmath@gobbletilpgfmath@#1\pgfmath@{}
+\def\pgfmath@gobbleone#1{}%
+
+
+% \pgfmathloop
+%
+% A version of the standard TeX and LaTeX
+% \loop, with an additional macro \pgfmathcounter
+% (which is *not* a TeX counter) which keeps
+% track of the iterations.
+%
+\newif\ifpgfmathcontinueloop
+\def\pgfmathloop#1\repeatpgfmathloop{%
+ \def\pgfmathcounter{1}%
+ \def\pgfmath@iterate{%
+ #1\relax%
+ {% Do this inside a group, just in case...
+ \c@pgfmath@counta\pgfmathcounter%
+ \advance\c@pgfmath@counta1\relax%
+ \xdef\pgfmathloop@temp{\the\c@pgfmath@counta}%
+ }%
+ \edef\pgfmathcounter{\pgfmathloop@temp}%
+ \expandafter\pgfmath@iterate\fi}%
+ \pgfmath@iterate\let\pgfmath@iterate\relax}
+\let\repeatpgfmathloop\fi
+\def\pgfmathbreakloop{\let\pgfmath@iterate\relax}%
+
+% \pgfmath@returnone
+%
+% \edef \pfgmathresult to the value of #1 after the end
+% of a group, which *must directly follow*.
+%
+% #1 - a dimension representing a number or dimension.
+%
+% Changed by TT: made faster and simpler since it is used
+% *heavily*. #1 must be something that can be assigned to a
+% dimension.
+%
+\def\pgfmath@returnone#1\endgroup{%
+ \pgfmath@x#1%
+ \edef\pgfmath@temp{\pgfmath@tonumber{\pgfmath@x}}%
+ \expandafter\endgroup\expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmath@temp}%
+}
+
+
+% \pgfmath@returntwo
+%
+% Removed by TT: not used.
+
+
+% \pgfmath@smuggleone
+%
+% Smuggle a macro outside a group.
+%
+% Changed by TT: Speedup by insisting, that smuggleone is directly
+% followed by \endgroup
+%
+\def\pgfmath@smuggleone#1\endgroup{%
+ \expandafter\endgroup\expandafter\def\expandafter#1\expandafter{#1}}