summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex1073
1 files changed, 600 insertions, 473 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
index 81f6545897e..71843fb2499 100644
--- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
+++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
@@ -7,83 +7,92 @@
\newif\ifpgfmath@quickparse
\newif\ifpgfmathfloat
\newif\ifpgfmathunitsdeclared
+\newif\ifpgfmathmathunitsdeclared
\newif\ifpgfmathignoreunitscale
\def\pgfmathprint#1{\pgfmathparse{#1}\pgfmathresult}
\def\pgfmathparse{%
- \begingroup%
- \pgfmath@catcodes%
- \pgfmath@quickparsefalse%
- \ifpgfmathfloat%
- \let\pgfmath@parse@next=\pgfmathfloatparsenumber%
- \else%
- \let\pgfmath@parse@next=\pgfmathparse@%
- \fi%
- \pgfmath@parse@next}
+ \begingroup
+ \pgfmath@catcodes
+ \pgfmath@quickparsefalse
+ % Test for the fpu library
+ \ifpgfmathfloat
+ \let\pgfmath@parse@next=\pgfmathfloatparsenumber
+ \else
+ \let\pgfmath@parse@next=\pgfmathparse@
+ \fi
+ \pgfmath@parse@next}
\def\pgfmath@catcodes{% Maybe unecessary.
- \catcode`\==12%
- \catcode`\,=12%
- \catcode`\|=12%
- \catcode`\&=12%
+ \catcode`\==12%
+ \catcode`\,=12%
+ \catcode`\|=12%
+ \catcode`\&=12%
}
\def\pgfmathqparse{%
- \begingroup%
- \pgfmath@catcodes%
- \pgfmath@quickparsetrue%
- \pgfmathparse@}
-
+ \begingroup
+ \pgfmath@catcodes
+ \pgfmath@quickparsetrue
+ \pgfmathparse@}
+
\def\pgfmathparse@#1{%
- % Stuff for calc compatiability.
- \let\real=\pgfmath@calc@real%
- \let\minof=\pgfmath@calc@minof%
- \let\maxof=\pgfmath@calc@maxof%
- \let\ratio=\pgfmath@calc@ratio%
- \let\widthof=\pgfmath@calc@widthof%
- \let\heightof=\pgfmath@calc@heightof%
- \let\depthof=\pgfmath@calc@depthof%
- % Restore font.
- \pgfmath@selectfont%
+ % We are inside a group (opened in |\pgfmathparse| or
+ % |\pgfmathqparse|).
+ % Stuff for calc compatiability.
+ \let\real=\pgfmath@calc@real
+ \let\minof=\pgfmath@calc@minof
+ \let\maxof=\pgfmath@calc@maxof
+ \let\ratio=\pgfmath@calc@ratio
+ \let\widthof=\pgfmath@calc@widthof
+ \let\heightof=\pgfmath@calc@heightof
+ \let\depthof=\pgfmath@calc@depthof
+ % Restore font (defined in pgfmathutil.code.tex)
+ \pgfmath@selectfont
% Expand expression so any reamining CSs are registers
- % or box dimensions (i.e., \wd, \ht, \dp).
+ % or box dimensions (i.e. |\wd|, |\ht|, |\dp|).
\edef\pgfmath@expression{#1}%
- % No units yet.
- \global\pgfmathunitsdeclaredfalse%
+ % No (math) units yet.
+ \global\pgfmathunitsdeclaredfalse
+ \global\pgfmathmathunitsdeclaredfalse
% Set up stack.
\pgfmath@stack@operation={{}{}{}}%
- \pgfmath@stack@operand={{}{}{}}%
- \let\pgfmath@stack@operation@top=\pgfmath@stack@empty%
- \let\pgfmath@stack@operand@top=\pgfmath@stack@empty%
- % An expression always begins with an operand.
- \expandafter\pgfmath@bgroup@strip\expandafter{\pgfmath@expression}%
- \expandafter\pgfmath@parse@@operand\pgfmath@bgroup@stripped @@@@\pgfmath@parse@stop%
-}%
+ \pgfmath@stack@operand={{}{}{}}%
+ \let\pgfmath@stack@operation@top=\pgfmath@stack@empty
+ \let\pgfmath@stack@operand@top=\pgfmath@stack@empty
+ % An expression always begins with an operand.
+ \expandafter\pgfmath@bgroup@strip\expandafter{\pgfmath@expression}%
+ % |\pgfmath@bgroup@stripped| is the result of
+ % |\pgfmath@bgroup@strip|
+ \expandafter\pgfmath@parse@@operand\pgfmath@bgroup@stripped @@@@\pgfmath@parse@stop%
+}
\def\pgfmath@parse@end#1\pgfmath@parse@stop{%
- \pgfmathpostparse%
- \pgfmath@smuggleone\pgfmathresult%
- \endgroup%
- \ignorespaces}%
+ \pgfmathpostparse
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup
+ \ignorespaces}
-\let\pgfmathpostparse=\relax%
+\let\pgfmathpostparse=\relax
% For compatiability with older version.
%
\def\pgfmathscaleresult{%
- \ifpgfmathunitsdeclared%
- \else%
- \ifpgfmathignoreunitscale%
- \else%
- \afterassignment\pgfmath@gobbletilpgfmath@%
+ \ifpgfmathunitsdeclared
+ \else
+ \ifpgfmathignoreunitscale
+ \else
+ \afterassignment\pgfmath@gobbletilpgfmath@%
\pgfmath@x\pgfmathresultunitscale pt\relax\pgfmath@%
\expandafter\pgfmath@x\pgfmathresult\pgfmath@x%
\edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
- \fi%
- \fi%
+ \fi
+ \fi
}
+
\def\pgfmathsetresultunitscale#1{\def\pgfmathresultunitscale{#1}}
+
\def\pgfmathresultunitscale{1}
% Stuff for compatability with the calc package.
@@ -116,19 +125,29 @@
\edef\pgfmath@char@hash{\the\pgfmath@toks}
\def\pgfmath@tokens@make#1#2{%
- \def\pgfmath@prefix{#1}%
- \expandafter\pgfmath@tokens@@make#2{}}
-
+ % Defines for each token or balenced text in |#2| a control sequence
+ % |\pgfmath@token@<#1>@\string<one token from #2>| and stores |#2|
+ % in it.
+ \def\pgfmath@prefix{#1}%
+ % Note the empty group |{}| at the end that ends the loop in
+ % |\pgfmath@token@@make|.
+ \expandafter\pgfmath@tokens@@make#2{}}
+
\def\pgfmath@tokens@@make#1{%
- \def\pgfmath@token{#1}%
- \ifx\pgfmath@token\pgfmath@empty%
- \else%
- \pgfmath@namedef{pgfmath@token@\pgfmath@prefix @\string#1}{#1}%
- \expandafter\pgfmath@tokens@@make%
- \fi}
+ \def\pgfmath@token{#1}%
+ \ifx\pgfmath@token\pgfmath@empty
+ % End of loop: all tokens or balanced texts were parsed.
+ \else
+ \pgfmath@namedef{pgfmath@token@\pgfmath@prefix @\string#1}{#1}%
+ \expandafter\pgfmath@tokens@@make%
+ \fi}
\pgfmath@tokens@make{box}{\wd\ht\dp}
+\ifx\dimexpr\@undefined\else % needed for classic tex
+ \pgfmath@tokens@make{dimexpr}{\dimexpr\glueexpr}
+\fi
\pgfmath@tokens@make{unit}{{bp}{cc}{cm}{dd}{em}{ex}{in}{mm}{pc}{pt}{sp}}
+\pgfmath@tokens@make{mathunit}{{mu}}
\pgfmath@tokens@make{numeric}{.0123456789}
\pgfmath@tokens@make{number}{0123456789}
\pgfmath@tokens@make{functional}{_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ}
@@ -145,39 +164,42 @@
\pgfmath@namedef{pgfmath@base@0B}{2}
% Determine if a register is a count or a dimension/skip register.
-%
\newif\ifpgfmath@dimen@
\def\pgfmath@dimen@#1{%
- \begingroup%
- \afterassignment\pgfmath@dimen@@%
- #1=0.0pt\relax\pgfmath@}
+ \begingroup
+ \afterassignment\pgfmath@dimen@@%
+ #1=0.0pt\relax\pgfmath@}
\def\pgfmath@dimen@@#1#2\pgfmath@{%
- \endgroup%
- \ifx#1.%
- \pgfmath@dimen@false%
- \else%
- \pgfmath@dimen@true%
- \fi}
+ \endgroup
+ \ifx#1.%
+ \pgfmath@dimen@false
+ \else
+ \pgfmath@dimen@true
+ \fi}
\def\pgfmath@parse@ifbgroup#1#2{%
- \let\pgfmath@parse@bgroup@after=#1%
- \let\pgfmath@parse@nobgroup@after=#2%
- \futurelet\pgfmath@token@let%
- \pgfmath@parse@@ifbgroup}
-
+ \let\pgfmath@parse@bgroup@after=#1%
+ \let\pgfmath@parse@nobgroup@after=#2%
+ \futurelet\pgfmath@token@let%
+ \pgfmath@parse@@ifbgroup}
+
\def\pgfmath@parse@@ifbgroup{%
- \ifx\pgfmath@token@let\bgroup%
- \let\pgfmath@parse@next=\pgfmath@parse@@@ifbgroup%
- \else%
- \ifx\pgfmath@token@let\pgfmath@sptoken%
- \let\pgfmath@parse@next=\pgfmath@parse@@@@ifbgroup%
- \else%
- \let\pgfmath@parse@next=\pgfmath@parse@nobgroup@after%
- \fi%
- \fi%
- \pgfmath@parse@next}
-
-\def\pgfmath@parse@@@ifbgroup#1{\pgfmath@parse@bgroup@after\pgfmath@bgroup#1\pgfmath@egroup}
+ \ifx\pgfmath@token@let\bgroup
+ \let\pgfmath@parse@next=\pgfmath@parse@@@ifbgroup
+ \else
+ % |\pgfmath@sptoken| defined in \file{pgfmathutil.code.tex}.
+ \ifx\pgfmath@token@let\pgfmath@sptoken
+ \let\pgfmath@parse@next=\pgfmath@parse@@@@ifbgroup
+ \else
+ \let\pgfmath@parse@next=\pgfmath@parse@nobgroup@after
+ \fi
+ \fi
+ \pgfmath@parse@next}
+
+% I (CJ) *think* it replaces |{| and |}| by |\pgfmath@bgroup| and
+% |\pgfmath@egroup|?
+\def\pgfmath@parse@@@ifbgroup#1{%
+ \pgfmath@parse@bgroup@after\pgfmath@bgroup#1\pgfmath@egroup}
{
\def\:{\pgfmath@parse@@@@ifbgroup}
@@ -185,81 +207,96 @@
}
% Parse an operand.
-%
-\def\pgfmath@parse@operand{\expandafter\pgfmath@parse@@operand\pgfmath@token@next}%
-
-\def\pgfmath@parse@@operand{\pgfmath@parse@ifbgroup{\pgfmath@parse@@operand}{\pgfmath@parse@@operand@}}
-
+\def\pgfmath@parse@operand{%
+ \expandafter\pgfmath@parse@@operand\pgfmath@token@next}
+
+% This is the entry point for the parser. It is called at the end of
+% |\pgfmathparse@| with the following syntax
+% |\expandafter\pgfmath@parse@@operand\pgfmath@bgroup@stripped
+% @@@@\pgfmath@parse@stop|.
+% Note: we are inside a group.
+\def\pgfmath@parse@@operand{%
+ \pgfmath@parse@ifbgroup{\pgfmath@parse@@operand}{\pgfmath@parse@@operand@}}
+
+% An operand is
+% * |+| (unary plus),
+% * |-| (unary minus),
+% * a prefix operator
\def\pgfmath@parse@@operand@#1{%
- \def\pgfmath@token{#1}%
- \ifx\pgfmath@token\pgfmath@char@plus% Ignore.
- \let\pgfmath@parse@next=\pgfmath@parse@@operand%
- \else%
- \ifx\pgfmath@token\pgfmath@char@minus%
- \pgfmath@stack@push@operation{neg}% Unary minus.
- \let\pgfmath@parse@next=\pgfmath@parse@@operand%
- \else%
- \expandafter\ifx\csname pgfmath@operation@\expandafter\string\pgfmath@token @prefix\endcsname\pgfmath@token%
- \let\pgfmath@parse@next=\pgfmath@parse@prefix@operator%
- \else%
- \ifpgfmath@quickparse%
- \let\pgfmath@parse@next=\pgfmath@qparse@operand%
- \else%
- \let\pgfmath@number=\pgfmath@empty%
- \expandafter\ifx\csname pgfmath@token@functional@\string#1\endcsname\relax%
- \let\pgfmath@base=\pgfmath@empty%
- \let\pgfmath@token@next=\pgfmath@token%
- \if#10% Check for octal prefix.
- \def\pgfmath@base{8}%
- \fi%
- \let\pgfmath@parse@next=\pgfmath@parse@number%
- \else%
- \let\pgfmath@function=\pgfmath@token%
- \let\pgfmath@parse@next=\pgfmath@parse@function%
- \fi%
- \fi%
- \fi%
- \fi%
- \fi%
- \pgfmath@parse@next%
+ \def\pgfmath@token{#1}%
+ \ifx\pgfmath@token\pgfmath@char@plus
+ % Unary (prefix) plus
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \else
+ \ifx\pgfmath@token\pgfmath@char@minus
+ % Unary (prefix) minus
+ \pgfmath@stack@push@operation{neg}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand
+ \else
+ % See |\pgfmathdeclareoperator| (below). Note that |+| and |-|
+ % that are also declared as operators have been tested before so
+ % they should never be parsed as binary (infix) operator at this stage.
+ \expandafter\ifx\csname pgfmath@operation@\expandafter\string\pgfmath@token @prefix\endcsname\pgfmath@token
+ \let\pgfmath@parse@next=\pgfmath@parse@prefix@operator
+ \else
+ \ifpgfmath@quickparse
+ \let\pgfmath@parse@next=\pgfmath@qparse@operand
+ \else
+ \let\pgfmath@number=\pgfmath@empty
+ \expandafter\ifx\csname pgfmath@token@functional@\string#1\endcsname\relax%
+ \let\pgfmath@base=\pgfmath@empty%
+ \let\pgfmath@token@next=\pgfmath@token%
+ \if#10% Check for octal prefix.
+ \def\pgfmath@base{8}%
+ \fi%
+ \let\pgfmath@parse@next=\pgfmath@parse@number%
+ \else%
+ \let\pgfmath@function=\pgfmath@token%
+ \let\pgfmath@parse@next=\pgfmath@parse@function%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmath@parse@next%
}
% Parse prefix operators.
%
\def\pgfmath@parse@prefix@operator{%
- \ifx\pgfmath@token\pgfmath@char@quote% Quote character.
- \let\pgfmath@parse@next=\pgfmath@parse@operand@quote%
- \else%
- \ifx\pgfmath@token\pgfmath@char@exclamation% Prefix !.
- \pgfmath@stack@push@operation{not}%
- \let\pgfmath@parse@next=\pgfmath@parse@@operand%
- \else% Anything else, just push and hope.
- \expandafter\pgfmath@stack@push@operation\expandafter{\pgfmath@token}%
- \let\pgfmath@parse@next=\pgfmath@parse@@operand%
- \fi%
- \fi%
- \pgfmath@parse@next%
+ \ifx\pgfmath@token\pgfmath@char@quote% Quote character.
+ \let\pgfmath@parse@next=\pgfmath@parse@operand@quote%
+ \else%
+ \ifx\pgfmath@token\pgfmath@char@exclamation% Prefix !.
+ \pgfmath@stack@push@operation{not}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \else% Anything else, just push and hope.
+ \expandafter\pgfmath@stack@push@operation\expandafter{\pgfmath@token}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \fi%
+ \fi%
+ \pgfmath@parse@next%
}%
% Quote part of an expression.
%
\def\pgfmath@parse@operand@quote#1"{%
- \def\pgfmathresult{#1}%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \pgfmath@parse@@operator%
+ \def\pgfmathresult{#1}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
}
% Quick operand parsing. Should always have units.
% No functions, base conversion, quoting or scientific notation
% are permitted.
\def\pgfmath@qparse@operand{%
- \afterassignment\pgfmath@qparse@@operand%
- \pgfmath@dimen\pgfmath@token}
+ \afterassignment\pgfmath@qparse@@operand%
+ \pgfmath@dimen\pgfmath@token}
\def\pgfmath@qparse@@operand{%
- \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \pgfmath@parse@@operator%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
}
% Parse a number, which can take the form:
@@ -274,337 +311,414 @@
%
\def\pgfmath@parse@number{\pgfmath@parse@ifbgroup{\pgfmath@parse@number}{\pgfmath@parse@number@}}
\def\pgfmath@parse@number@#1{%
- \let\pgfmath@token=\pgfmath@token@next%
- \def\pgfmath@token@next{#1}%
- \pgfmath@parse@@number}
+ \let\pgfmath@token=\pgfmath@token@next%
+ \def\pgfmath@token@next{#1}%
+ \pgfmath@parse@@number}
\def\pgfmath@parse@@number{%
- \ifx\pgfmath@token\pgfmath@egroup@token%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmath@number}%
- \let\pgfmath@parse@next=\pgfmath@parse@@@operator%
- \else%
- \expandafter\ifcat\pgfmath@token\relax% A CS?
- \expandafter\ifx\csname pgfmath@token@box@\expandafter\string\pgfmath@token\endcsname\relax%
- % So, is the CS is a dimension or a count register?
- \expandafter\pgfmath@dimen@\pgfmath@token%
- \ifpgfmath@dimen@% A dimension register.
- \global\pgfmathunitsdeclaredtrue%
- \pgfmath@dimen=\pgfmath@number\pgfmath@token%
- \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \let\pgfmath@parse@next=\pgfmath@parse@operator%
- \else% A count register.
- \pgfmath@count=\pgfmath@token%
- \expandafter\def\expandafter\pgfmath@number\expandafter{\the\pgfmath@count}%
- \expandafter\ifcat\pgfmath@token@next\relax%
- % A CS following a count register should be \wd, \ht or \dp.
- \let\pgfmath@parse@next=\pgfmath@parse@number%
- \else%
- \let\pgfmathresult=\pgfmath@number%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \let\pgfmath@parse@next=\pgfmath@parse@operator%
- \fi%
- \fi%
- \else%
- % This should be a box specification, for example, 0.5\wd\mybox.
- \global\pgfmathunitsdeclaredtrue%
- \pgfmath@dimen=\pgfmath@number\pgfmath@token\pgfmath@token@next%
- \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \let\pgfmath@parse@next=\pgfmath@parse@@operator%
- \fi%
- \else%
- \expandafter\ifx\csname pgfmath@token@numeric@\expandafter\string\pgfmath@token\endcsname\relax%
- % It isn't numeric (i.e., 012345679.), so it might be units...
- \expandafter\ifx\csname pgfmath@token@unit@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax%
- % ...or the exponent characters...
- \expandafter\ifx\csname pgfmath@token@exponent@\pgfmath@token\endcsname\relax%
- % ...or a base prefix...
- \expandafter\ifx\csname pgfmath@base@\pgfmath@number\pgfmath@token\endcsname\relax%
- % ...none of the above...
- \ifx\pgfmath@base\pgfmath@empty%
- \let\pgfmathresult=\pgfmath@number%
- \else%
- \ifx\pgfmath@number\pgfmath@char@zero%
- \let\pgfmathresult=\pgfmath@number%
- \else%
- % Convert from octal.
- \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{8}{10}%
- \fi%
- \fi%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \let\pgfmath@parse@next=\pgfmath@parse@@@operator%
- \else%
- % ...here, it is a base prefix 0x, 0X, 0b or 0B
- \expandafter\let\expandafter\pgfmath@base\expandafter=%
- \csname pgfmath@base@\pgfmath@number\pgfmath@token\endcsname%
- \let\pgfmath@parse@next=\pgfmath@parse@base%
- \fi%
- \else% ... and here, it is the exponent characters.
- \let\pgfmath@parse@next=\pgfmath@parse@exponent%
- \fi%
- \else% ...but here it is units.
- \global\pgfmathunitsdeclaredtrue%
- \pgfmath@dimen=\pgfmath@number\pgfmath@token\pgfmath@token@next\relax%
- \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \let\pgfmath@parse@next=\pgfmath@parse@@operator%
- \fi%
- \else% It is numeric.
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfmath@number%
- \expandafter\expandafter\expandafter{\expandafter\pgfmath@number\pgfmath@token}%
- \ifx\pgfmath@token\pgfmath@char@period%
- \let\pgfmath@base=\pgfmath@empty%
- \fi%
- \let\pgfmath@parse@next=\pgfmath@parse@number%
- \fi%
- \fi%
- \fi%
- \pgfmath@parse@next%
+ \ifx\pgfmath@token\pgfmath@egroup@token%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmath@number}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@@operator%
+ \else%
+ \expandafter\ifcat\pgfmath@token\relax% A CS?
+ \expandafter\ifx\csname pgfmath@token@dimexpr@\expandafter\string\pgfmath@token\endcsname\relax%
+ \expandafter\ifx\pgfmath@token\numexpr%
+ \let\pgfmath@parse@next=\pgfmath@parse@numexpr%
+ \else%
+ \expandafter\ifx\pgfmath@token\muexpr%
+ \let\pgfmath@parse@next=\pgfmath@parse@muexpr%
+ \else%
+ \expandafter\ifx\csname pgfmath@token@box@\expandafter\string\pgfmath@token\endcsname\relax%
+ % So, is the CS is a dimension or a count register?
+ \expandafter\pgfmath@dimen@\pgfmath@token%
+ \ifpgfmath@dimen@% A dimension register.
+ \global\pgfmathunitsdeclaredtrue%
+ \pgfmath@dimen=\pgfmath@number\pgfmath@token%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \else% A count register.
+ \pgfmath@count=\pgfmath@token%
+ \expandafter\def\expandafter\pgfmath@number\expandafter{\the\pgfmath@count}%
+ \expandafter\ifcat\pgfmath@token@next\relax%
+ % A CS following a count register should be \wd, \ht or \dp.
+ \let\pgfmath@parse@next=\pgfmath@parse@number%
+ \else%
+ \let\pgfmathresult=\pgfmath@number%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \fi%
+ \fi%
+ \else%
+ % This should be a box specification, for example, 0.5\wd\mybox.
+ \global\pgfmathunitsdeclaredtrue%
+ \pgfmath@dimen=\pgfmath@number\pgfmath@token\pgfmath@token@next%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operator%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \global\pgfmathunitsdeclaredtrue%
+ \let\pgfmath@parse@next=\pgfmath@parse@dimexpr%
+ \fi%
+ \else%
+ \expandafter\ifx\csname pgfmath@token@numeric@\expandafter\string\pgfmath@token\endcsname\relax%
+ % It isn't numeric (i.e., 012345679.), so it might be units...
+ \expandafter\ifx\csname pgfmath@token@unit@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax%
+ % ...or the exponent characters...
+ \expandafter\ifx\csname pgfmath@token@exponent@\pgfmath@token\endcsname\relax%
+ % ...or a base prefix...
+ \expandafter\ifx\csname pgfmath@base@\pgfmath@number\pgfmath@token\endcsname\relax%
+ % ...or a math unit...
+ \expandafter\ifx\csname pgfmath@token@mathunit@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax%
+ % ...none of the above...
+ \ifx\pgfmath@base\pgfmath@empty%
+ \let\pgfmathresult=\pgfmath@number%
+ \else%
+ \ifx\pgfmath@number\pgfmath@char@zero%
+ \let\pgfmathresult=\pgfmath@number%
+ \else%
+ % Convert from octal.
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{8}{10}%
+ \fi%
+ \fi%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@@operator%
+ \else%
+ % ...here, it is a math unit (mu). Treat it as a pt.
+ \global\pgfmathunitsdeclaredtrue%
+ \global\pgfmathmathunitsdeclaredtrue%
+ \pgfmath@dimen=\pgfmath@number pt\relax%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operator%
+ \fi%
+ \else%
+ % ...here, it is a base prefix 0x, 0X, 0b or 0B
+ \expandafter\let\expandafter\pgfmath@base\expandafter=%
+ \csname pgfmath@base@\pgfmath@number\pgfmath@token\endcsname%
+ \let\pgfmath@parse@next=\pgfmath@parse@base%
+ \fi%
+ \else% ... and here, it is the exponent characters.
+ \let\pgfmath@parse@next=\pgfmath@parse@exponent%
+ \fi%
+ \else% ...but here it is units.
+ \global\pgfmathunitsdeclaredtrue%
+ \pgfmath@dimen=\pgfmath@number\pgfmath@token\pgfmath@token@next\relax%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operator%
+ \fi%
+ \else% It is numeric.
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfmath@number%
+ \expandafter\expandafter\expandafter{\expandafter\pgfmath@number\pgfmath@token}%
+ \ifx\pgfmath@token\pgfmath@char@period%
+ \let\pgfmath@base=\pgfmath@empty%
+ \fi%
+ \let\pgfmath@parse@next=\pgfmath@parse@number%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmath@parse@next%
+}
+
+
+% Parse a \dimexpr
+\def\pgfmath@parse@dimexpr{%
+ \afterassignment\pgfmath@parse@dimexpr@%
+ \expandafter\expandafter\expandafter\pgfmath@dimen\expandafter\pgfmath@token\pgfmath@token@next%
+}
+\def\pgfmath@parse@dimexpr@{%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}
+
+
+% Parse a \muexpr
+\def\pgfmath@parse@muexpr{%
+ \begingroup%
+ \afterassignment\pgfmath@parse@muexpr@%
+ \expandafter\expandafter\expandafter\muskip\expandafter\expandafter\expandafter0\expandafter\pgfmath@token\expandafter\pgfmath@token@next%
+}
+\def\pgfmath@parse@muexpr@{%
+ \expandafter\endgroup%
+ \expandafter\edef\expandafter\pgfmathresult\expandafter{\expandafter\pgfMATH@STRIPMU\the\muskip0}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}
+
+{
+\catcode`\m=12
+\catcode`\u=12
+\gdef\pgfMATH@STRIPMU#1mu{#1}
+}
+
+
+% Parse a \numexpr
+\def\pgfmath@parse@numexpr{%
+ \afterassignment\pgfmath@parse@numexpr@%
+ \expandafter\expandafter\expandafter\pgfmath@count\expandafter\pgfmath@token\pgfmath@token@next%
+}
+\def\pgfmath@parse@numexpr@#1{%
+ \expandafter\def\expandafter\pgfmath@number\expandafter{\the\pgfmath@count}%
+ \def\pgfmath@token@next{#1}%
+ \expandafter\ifcat\pgfmath@token@next\relax%
+ % A CS following a count register should be \wd, \ht or \dp.
+ \let\pgfmath@parse@next=\pgfmath@parse@number%
+ \else%
+ \let\pgfmathresult=\pgfmath@number%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \fi%
+ \pgfmath@parse@next%
}
+
% Parse the exponent of a number.
%
% REMARK: this method will be overwritten by the FPU library. Please
% keep changes consistent...
\def\pgfmath@parse@exponent{%
- \afterassignment\pgfmath@parse@@exponent%
- \pgfmath@count\pgfmath@token@next}
+ \afterassignment\pgfmath@parse@@exponent%
+ \pgfmath@count\pgfmath@token@next}
\def\pgfmath@parse@@exponent{%
- \pgfmathscientific{\pgfmath@number}{\the\pgfmath@count}%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \pgfmath@parse@@operator%
+ \pgfmathscientific{\pgfmath@number}{\the\pgfmath@count}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
}
% Parse binary or hexadecimal numbers (octal numbers done elsehwere).
%
\def\pgfmath@parse@base{%
- \ifnum\pgfmath@base=2\relax%
- \let\pgfmath@parse@next=\pgfmath@parse@binary%
- \else%
- \ifnum\pgfmath@base=16\relax%
- \let\pgfmath@parse@next=\pgfmath@parse@hexadecimal%
- \else%
- \pgfmath@error{Unexpected numerical base `\pgfmath@base'}{}%
- \def\pgfmathresult{0}%
- \let\pgfmath@parse@next=\pgfmath@parse@end%
- \fi%
- \fi%
- \let\pgfmath@number=\pgfmath@empty%
- \expandafter\pgfmath@parse@next\pgfmath@token@next%
+ \ifnum\pgfmath@base=2\relax%
+ \let\pgfmath@parse@next=\pgfmath@parse@binary%
+ \else%
+ \ifnum\pgfmath@base=16\relax%
+ \let\pgfmath@parse@next=\pgfmath@parse@hexadecimal%
+ \else%
+ \pgfmath@error{Unexpected numerical base `\pgfmath@base'}{}%
+ \def\pgfmathresult{0}%
+ \let\pgfmath@parse@next=\pgfmath@parse@end%
+ \fi%
+ \fi%
+ \let\pgfmath@number=\pgfmath@empty%
+ \expandafter\pgfmath@parse@next\pgfmath@token@next%
}
-
+
\def\pgfmath@parse@binary#1{%
- \expandafter\ifx\csname pgfmath@token@binary@#1\endcsname\relax%
- \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{2}{10}%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \def\pgfmath@token@next{#1}%
- \let\pgfmath@parse@next=\pgfmath@parse@operator%
- \else%
- \expandafter\def\expandafter\pgfmath@number\expandafter{\pgfmath@number#1}%
- \let\pgfmath@parse@next=\pgfmath@parse@binary%
- \fi%
- \pgfmath@parse@next%
+ \expandafter\ifx\csname pgfmath@token@binary@#1\endcsname\relax%
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{2}{10}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \def\pgfmath@token@next{#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \else%
+ \expandafter\def\expandafter\pgfmath@number\expandafter{\pgfmath@number#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@binary%
+ \fi%
+ \pgfmath@parse@next%
}
\def\pgfmath@parse@hexadecimal#1{%
- \expandafter\ifx\csname pgfmath@token@hexadecimal@#1\endcsname\relax%
- \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{16}{10}%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \def\pgfmath@token@next{#1}%
- \let\pgfmath@parse@next=\pgfmath@parse@operator%
- \else%
- \expandafter\def\expandafter\pgfmath@number\expandafter{\pgfmath@number#1}%
- \let\pgfmath@parse@next=\pgfmath@parse@hexadecimal%
- \fi%
- \pgfmath@parse@next%
+ \expandafter\ifx\csname pgfmath@token@hexadecimal@#1\endcsname\relax%
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{16}{10}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \def\pgfmath@token@next{#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \else%
+ \expandafter\def\expandafter\pgfmath@number\expandafter{\pgfmath@number#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@hexadecimal%
+ \fi%
+ \pgfmath@parse@next%
}
-
+
% Parse a function.
%
\def\pgfmath@parse@function{\pgfmath@parse@ifbgroup{\pgfmath@parse@function}{\pgfmath@parse@@function}}
\def\pgfmath@parse@function@{\futurelet\pgfmath@token@let\pgfmath@parse@@function}
\def\pgfmath@parse@@function{%
- \ifx\pgfmath@token@let\pgfmath@sptoken%
- \let\pgfmath@token=\pgfmath@empty%
- \let\pgfmath@parse@next=\pgfmath@parse@@@@function%
- \else%
- \let\pgfmath@parse@next=\pgfmath@parse@@@function%
- \fi%
- \pgfmath@parse@next}
+ \ifx\pgfmath@token@let\pgfmath@sptoken%
+ \let\pgfmath@token=\pgfmath@empty%
+ \let\pgfmath@parse@next=\pgfmath@parse@@@@function%
+ \else%
+ \let\pgfmath@parse@next=\pgfmath@parse@@@function%
+ \fi%
+ \pgfmath@parse@next}
\def\pgfmath@parse@@@function#1{%
- \expandafter\ifx\csname pgfmath@token@functional@\expandafter\string#1\endcsname\relax%
- \expandafter\ifx\csname pgfmath@token@number@\expandafter\string#1\endcsname\relax%
- \def\pgfmath@token{#1}% Not from A-Z, a-z, 0-9, or _.
- \let\pgfmath@parse@next=\pgfmath@parse@@@@function%
- \else% It is from 0-9.
- \expandafter\def\expandafter\pgfmath@function\expandafter{\pgfmath@function#1}%
- \let\pgfmath@parse@next=\pgfmath@parse@function@%
- \fi%
- \else% It is from from A-Z, a-z, or _.
- \edef\pgfmath@function{\pgfmath@function#1}%
- \let\pgfmath@parse@next=\pgfmath@parse@function@%
- \fi%
- \pgfmath@parse@next}
+ \expandafter\ifx\csname pgfmath@token@functional@\expandafter\string#1\endcsname\relax%
+ \expandafter\ifx\csname pgfmath@token@number@\expandafter\string#1\endcsname\relax%
+ \def\pgfmath@token{#1}% Not from A-Z, a-z, 0-9, or _.
+ \let\pgfmath@parse@next=\pgfmath@parse@@@@function%
+ \else% It is from 0-9.
+ \expandafter\def\expandafter\pgfmath@function\expandafter{\pgfmath@function#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@function@%
+ \fi%
+ \else% It is from from A-Z, a-z, or _.
+ \edef\pgfmath@function{\pgfmath@function#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@function@%
+ \fi%
+ \pgfmath@parse@next}
\def\pgfmath@parse@@@@function{%
- \expandafter\ifx\csname pgfmath@function@\pgfmath@function\endcsname\relax%
- \pgfmath@error{Unknown function `\pgfmath@function'}{}%
- \def\pgfmathresult{0}%
- \let\pgfmath@parse@next=\pgfmath@parse@end%
- \else%
- \expandafter\ifnum\csname pgfmath@operation@\pgfmath@function @arity\endcsname=0\relax%
- % Functions with zero arity are called directly.
- \csname pgfmath\pgfmath@function @\endcsname%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \let\pgfmath@parse@next=\pgfmath@parse@@operator%
- \else% Otherwise, they are pushed onto the operator stack
- \expandafter\pgfmath@stack@push@operation\expandafter{\pgfmath@function}%
- \let\pgfmath@parse@next=\pgfmath@parse@@operand%
- \fi%
- \fi%
- \expandafter\pgfmath@parse@next\pgfmath@token}
+ \expandafter\ifx\csname pgfmath@function@\pgfmath@function\endcsname\relax%
+ \pgfmath@error{Unknown function `\pgfmath@function'}{}%
+ \def\pgfmathresult{0}%
+ \let\pgfmath@parse@next=\pgfmath@parse@end%
+ \else%
+ \expandafter\ifnum\csname pgfmath@operation@\pgfmath@function @arity\endcsname=0\relax%
+ % Functions with zero arity are called directly.
+ \csname pgfmath\pgfmath@function @\endcsname%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operator%
+ \else% Otherwise, they are pushed onto the operator stack
+ \expandafter\pgfmath@stack@push@operation\expandafter{\pgfmath@function}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \fi%
+ \fi%
+ \expandafter\pgfmath@parse@next\pgfmath@token}
% Parse an operator.
%
\def\pgfmath@parse@operator{\pgfmath@parse@ifbgroup{\pgfmath@parse@operator}{\pgfmath@parse@operator@}}%
\def\pgfmath@parse@operator@#1{% Get one token.
- \let\pgfmath@token=\pgfmath@token@next%
- \def\pgfmath@token@next{#1}%
- \pgfmath@parse@@@operator}
+ \let\pgfmath@token=\pgfmath@token@next%
+ \def\pgfmath@token@next{#1}%
+ \pgfmath@parse@@@operator}
\def\pgfmath@parse@@operator{\pgfmath@parse@ifbgroup{\pgfmath@parse@@operator}{\pgfmath@parse@@operator@}}%
\def\pgfmath@parse@@operator@#1{% Get first token...
- \def\pgfmath@token{#1}%
- \pgfmath@parse@ifbgroup{\pgfmath@parse@@operator@@}{\pgfmath@parse@@operator@@}}%
+ \def\pgfmath@token{#1}%
+ \pgfmath@parse@ifbgroup{\pgfmath@parse@@operator@@}{\pgfmath@parse@@operator@@}}%
\def\pgfmath@parse@@operator@@#1{% ...and second token.
- \def\pgfmath@token@next{#1}%
- \pgfmath@parse@@@operator}
+ \def\pgfmath@token@next{#1}%
+ \pgfmath@parse@@@operator}
\def\pgfmath@parse@@@operator{%
- \expandafter\ifx\csname pgfmath@operator@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax%
- % Not a double character operator.
- \expandafter\ifx\csname pgfmath@operator@\pgfmath@token\endcsname\relax%
- % Not a single character operator.
- \pgfmath@error{Unknown operator `\pgfmath@token' or `\pgfmath@token\pgfmath@token@next'}{}%
- \def\pgfmathresult{0}%
- \let\pgfmath@parse@next=\pgfmath@parse@end%
- \else%
- \expandafter\pgfmath@operation@process\expandafter{\pgfmath@token}%
- \ifx\pgfmath@token\pgfmath@text@@%
- \let\pgfmath@parse@next=\pgfmath@parse@end%
- \else%
- \expandafter\ifx\csname pgfmath@operation@\pgfmath@token @postfix\endcsname\pgfmath@token%
- % Postfix operators are followed by an operator.
- \ifx\pgfmath@token@next\pgfmath@char@leftbracket% Except [.
- \let\pgfmath@parse@next=\pgfmath@parse@operand%
- \else%
- \let\pgfmath@parse@next=\pgfmath@parse@operator%
- \fi%
- \else%
- % Any other operator is followed by an operand.
- \let\pgfmath@parse@next=\pgfmath@parse@operand%
- \fi%
- \fi%
- \fi%
- \else%
- % A double character operator...
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
- \pgfmath@token\expandafter\expandafter\expandafter%
- {\expandafter\pgfmath@token\pgfmath@token@next}%
- \expandafter\pgfmath@operation@process\expandafter{\pgfmath@token}%
- % ...is always followed by an operand.
- \let\pgfmath@parse@next=\pgfmath@parse@@operand%
- \fi%
- \pgfmath@parse@next%
+ \expandafter\ifx\csname pgfmath@operator@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax%
+ % Not a double character operator.
+ \expandafter\ifx\csname pgfmath@operator@\pgfmath@token\endcsname\relax%
+ % Not a single character operator.
+ \pgfmath@error{Unknown operator `\pgfmath@token' or `\pgfmath@token\pgfmath@token@next'}{}%
+ \def\pgfmathresult{0}%
+ \let\pgfmath@parse@next=\pgfmath@parse@end%
+ \else%
+ \expandafter\pgfmath@operation@process\expandafter{\pgfmath@token}%
+ \ifx\pgfmath@token\pgfmath@text@@%
+ \let\pgfmath@parse@next=\pgfmath@parse@end%
+ \else%
+ \expandafter\ifx\csname pgfmath@operation@\pgfmath@token @postfix\endcsname\pgfmath@token%
+ % Postfix operators are followed by an operator.
+ \ifx\pgfmath@token@next\pgfmath@char@leftbracket% Except [.
+ \let\pgfmath@parse@next=\pgfmath@parse@operand%
+ \else%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \fi%
+ \else%
+ % Any other operator is followed by an operand.
+ \let\pgfmath@parse@next=\pgfmath@parse@operand%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ % A double character operator...
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgfmath@token\expandafter\expandafter\expandafter%
+ {\expandafter\pgfmath@token\pgfmath@token@next}%
+ \expandafter\pgfmath@operation@process\expandafter{\pgfmath@token}%
+ % ...is always followed by an operand.
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \fi%
+ \pgfmath@parse@next%
}
% Process an operation.
%
\def\pgfmath@operation@process#1{%
- \def\pgfmath@operator{#1}%
- \ifx\pgfmath@stack@operation@top\pgfmath@stack@empty%
- \else%
- \pgfmath@operation@@process%
- \fi%
- \expandafter\ifx\csname pgfmath@token@specials@#1\endcsname\relax%
- \pgfmath@stack@push@operation{#1}%
- \fi%
+ \def\pgfmath@operator{#1}%
+ \ifx\pgfmath@stack@operation@top\pgfmath@stack@empty%
+ \else%
+ \pgfmath@operation@@process%
+ \fi%
+ \expandafter\ifx\csname pgfmath@token@specials@#1\endcsname\relax%
+ \pgfmath@stack@push@operation{#1}%
+ \fi%
}
% Process the operation stack.
%
\def\pgfmath@operation@@process{%
- \ifx\pgfmath@stack@operation@top\pgfmath@stack@empty%
- \let\pgfmath@parse@next=\relax%
- \else%
- \ifnum\csname pgfmath@operation@\pgfmath@operator @precedence\endcsname>%
- \csname pgfmath@operation@\pgfmath@stack@operation@top @precedence\endcsname\relax%
- % If the precedence of the scanned operator is greater than the
- % precedence of the operator at the top of the stack, do nothing.
- \let\pgfmath@parse@next=\relax%
- \else%
- \let\pgfmath@stack@operation@last=\pgfmath@stack@operation@top%
- \expandafter\ifx\csname pgfmath@operator@\pgfmath@stack@operation@top\endcsname\relax%
- \pgfmath@function@@@process%
- \else%
- \pgfmath@operator@@@process%
- \fi%
- \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
- \expandafter\ifx\csname pgfmath@token@group@\pgfmath@stack@operation@last\pgfmath@operator\endcsname\relax%
- \let\pgfmath@parse@next=\pgfmath@operation@@process%
- \else%
- \let\pgfmath@parse@next=\relax%
- \fi%
- \fi%
- \fi%
- \pgfmath@parse@next%
+ \ifx\pgfmath@stack@operation@top\pgfmath@stack@empty%
+ \let\pgfmath@parse@next=\relax%
+ \else%
+ \ifnum\csname pgfmath@operation@\pgfmath@operator @precedence\endcsname>%
+ \csname pgfmath@operation@\pgfmath@stack@operation@top @precedence\endcsname\relax%
+ % If the precedence of the scanned operator is greater than the
+ % precedence of the operator at the top of the stack, do nothing.
+ \let\pgfmath@parse@next=\relax%
+ \else%
+ \let\pgfmath@stack@operation@last=\pgfmath@stack@operation@top%
+ \expandafter\ifx\csname pgfmath@operator@\pgfmath@stack@operation@top\endcsname\relax%
+ \pgfmath@function@@@process%
+ \else%
+ \pgfmath@operator@@@process%
+ \fi%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \expandafter\ifx\csname pgfmath@token@group@\pgfmath@stack@operation@last\pgfmath@operator\endcsname\relax%
+ \let\pgfmath@parse@next=\pgfmath@operation@@process%
+ \else%
+ \let\pgfmath@parse@next=\relax%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmath@parse@next%
}
% Process an operator.
%
\def\pgfmath@operator@@@process{% Process an operator.
- \pgfmath@stack@pop@operation\pgfmath@@operator%
- \pgfmath@stack@pop@operand\pgfmath@operand@a%
- \ifcase\csname pgfmath@operation@\pgfmath@@operator @arity\endcsname\relax%
- % Zero arity operators (!).
- \or%
- \pgfmath@operator@@@@process{\pgfmath@operand@a}%
- \or%
- \pgfmath@stack@pop@operand\pgfmath@operand@b%
- \pgfmath@operator@@@@process{\pgfmath@operand@b}{\pgfmath@operand@a}%
- \or%
- \pgfmath@stack@pop@operand\pgfmath@operand@b%
- \expandafter\pgfmath@operator@@@@process\expandafter%
- {\expandafter\pgfmath@operand@b\expandafter}\pgfmath@operand@a%
- \else%
- % No operators with more than tenary arity.
- \fi%
+ \pgfmath@stack@pop@operation\pgfmath@@operator%
+ \pgfmath@stack@pop@operand\pgfmath@operand@a%
+ \ifcase\csname pgfmath@operation@\pgfmath@@operator @arity\endcsname\relax%
+ % Zero arity operators (!).
+ \or%
+ \pgfmath@operator@@@@process{\pgfmath@operand@a}%
+ \or%
+ \pgfmath@stack@pop@operand\pgfmath@operand@b%
+ \pgfmath@operator@@@@process{\pgfmath@operand@b}{\pgfmath@operand@a}%
+ \or%
+ \pgfmath@stack@pop@operand\pgfmath@operand@b%
+ \expandafter\pgfmath@operator@@@@process\expandafter%
+ {\expandafter\pgfmath@operand@b\expandafter}\pgfmath@operand@a%
+ \else%
+ % No operators with more than tenary arity.
+ \fi%
}
\def\pgfmath@operator@@@@process{%
- \csname pgfmath%
- \csname pgfmath@operation@\pgfmath@@operator @name\endcsname%
- @\endcsname}
+ \csname pgfmath%
+ \csname pgfmath@operation@\pgfmath@@operator @name\endcsname%
+ @\endcsname}
% Process a function.
%
\def\pgfmath@function@@@process{% Process a function.
- \ifnum\csname pgfmath@operation@\pgfmath@stack@operation@top @arity\endcsname>0\relax%
- \pgfmath@stack@pop@operation\pgfmath@@function%
- \pgfmath@stack@pop@operand\pgfmath@@operand%
- \ifnum\csname pgfmath@operation@\pgfmath@@function @arity\endcsname>1\relax%
- \ifnum\csname pgfmath@operation@\pgfmath@@function @arity\endcsname>9\relax%
- \csname pgfmath\pgfmath@@function @\endcsname{\pgfmath@@operand}%
- \else%
- \expandafter\pgfmath@function@@@@process\pgfmath@@operand%
- \fi
- \else%
- \expandafter\pgfmath@function@@@@process\expandafter{\pgfmath@@operand}%
- \fi%
- \fi%
+ \ifnum\csname pgfmath@operation@\pgfmath@stack@operation@top @arity\endcsname>0\relax%
+ \pgfmath@stack@pop@operation\pgfmath@@function%
+ \pgfmath@stack@pop@operand\pgfmath@@operand%
+ \ifnum\csname pgfmath@operation@\pgfmath@@function @arity\endcsname>1\relax%
+ \ifnum\csname pgfmath@operation@\pgfmath@@function @arity\endcsname>9\relax%
+ \csname pgfmath\pgfmath@@function @\endcsname{\pgfmath@@operand}%
+ \else%
+ \expandafter\pgfmath@function@@@@process\pgfmath@@operand%
+ \fi
+ \else%
+ \expandafter\pgfmath@function@@@@process\expandafter{\pgfmath@@operand}%
+ \fi%
+ \fi%
}
\def\pgfmath@function@@@@process{\csname pgfmath\pgfmath@@function @\endcsname}
@@ -616,32 +730,32 @@
\let\pgfmath@stack@empty=\pgfmath@empty
\def\pgfmath@stack@push#1#2{%
- \def\pgfmath@stack@top{#2}%
- \expandafter\expandafter\expandafter#1%
- \expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter%
- {\expandafter\pgfmath@stack@top\expandafter}\the#1}}%
+ \def\pgfmath@stack@top{#2}%
+ \expandafter\expandafter\expandafter#1%
+ \expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter%
+ {\expandafter\pgfmath@stack@top\expandafter}\the#1}}%
\def\pgfmath@stack@pop#1#2{\expandafter\pgfmath@stack@@pop\the#1\pgfmath@stack@stop{#1}{#2}}
\def\pgfmath@stack@@pop#1#2#3\pgfmath@stack@stop#4#5{\def#5{#1}#4={{#2}#3}\def\pgfmath@stack@top{#2}}
\def\pgfmath@stack@push@operation#1{%
- \pgfmath@stack@push\pgfmath@stack@operation{#1}%
- \let\pgfmath@stack@operation@top=\pgfmath@stack@top}
+ \pgfmath@stack@push\pgfmath@stack@operation{#1}%
+ \let\pgfmath@stack@operation@top=\pgfmath@stack@top}
\def\pgfmath@stack@pop@operation#1{%
- \pgfmath@stack@pop\pgfmath@stack@operation{#1}%
- \let\pgfmath@stack@operation@top=\pgfmath@stack@top}
-
+ \pgfmath@stack@pop\pgfmath@stack@operation{#1}%
+ \let\pgfmath@stack@operation@top=\pgfmath@stack@top}
+
% REMARK: This method will be overwritten by the FPU library. Please
% keep any changes consistent.
\def\pgfmath@stack@push@operand#1{%
- \pgfmath@stack@push\pgfmath@stack@operand{#1}%
- \let\pgfmath@stack@operand@top=\pgfmath@stack@top}
+ \pgfmath@stack@push\pgfmath@stack@operand{#1}%
+ \let\pgfmath@stack@operand@top=\pgfmath@stack@top}
\def\pgfmath@stack@pop@operand#1{%
- \pgfmath@stack@pop\pgfmath@stack@operand{#1}%
- \let\pgfmath@stack@operand@top=\pgfmath@stack@top}
-
+ \pgfmath@stack@pop\pgfmath@stack@operand{#1}%
+ \let\pgfmath@stack@operand@top=\pgfmath@stack@top}
+
% Declare an operator for the parser.
%
@@ -649,13 +763,20 @@
% the parser is not fully robust for arbitrary operators.
%
\def\pgfmathdeclareoperator#1#2#3#4#5{%
- \pgfmath@namedef{pgfmath@operator@\string#1}{#1}%
- \pgfmath@namedef{pgfmath@operation@\string#1@name}{#2}%
- \pgfmath@namedef{pgfmath@operation@\string#1@arity}{#3}%
- \pgfmath@namedef{pgfmath@operation@\string#1@#4}{#1}%
- \pgfmath@namedef{pgfmath@operation@\string#1@precedence}{#5}%
+ \ifx\pgfmath@operatorlist\pgfutil@empty
+ \edef\pgfmath@operatorlist{{\string#1}}%
+ \else
+ \edef\pgfmath@operatorlist{\pgfmath@operatorlist,{\string#1}}%
+ \fi
+ \pgfmath@namedef{pgfmath@operator@\string#1}{#1}%
+ \pgfmath@namedef{pgfmath@operation@\string#1@name}{#2}%
+ \pgfmath@namedef{pgfmath@operation@\string#1@arity}{#3}%
+ \pgfmath@namedef{pgfmath@operation@\string#1@#4}{#1}%
+ \pgfmath@namedef{pgfmath@operation@\string#1@precedence}{#5}%
}
+\def\pgfmath@operatorlist{}
+
\pgfmathdeclareoperator{+}{add} {2}{infix}{500}
\pgfmathdeclareoperator{-}{subtract}{2}{infix}{500}
\pgfmathdeclareoperator{*}{multiply}{2}{infix}{700}
@@ -671,7 +792,7 @@
\pgfmathdeclareoperator{<=}{notgreater}{2}{infix} {250}
\pgfmathdeclareoperator{&&}{and} {2}{infix} {200}
\pgfmathdeclareoperator{||}{or} {2}{infix} {200}
-\pgfmathdeclareoperator{!=}{notequalto}{2}{infix} {250}
+\pgfmathdeclareoperator{!=}{notequal} {2}{infix} {250}
\pgfmathdeclareoperator{!} {not} {1}{prefix}{975}
\pgfmathdeclareoperator{?} {ifthenelse}{3}{infix} {100}
\pgfmathdeclareoperator{:} {@@collect} {2}{infix}{101}
@@ -702,11 +823,11 @@
% Begin and end array access [].
%
\def\pgfmath@startindex@#1#2{%
- \expandafter\pgfmatharray@#1{#2}%
- \expandafter\pgfmath@bgroup@strip\expandafter{\pgfmathresult}%
- \ifx\pgfmath@token@let\bgroup%
- \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmathresult}}%
- \fi}
+ \expandafter\pgfmatharray@#1{#2}%
+ \expandafter\pgfmath@bgroup@strip\expandafter{\pgfmathresult}%
+ \ifx\pgfmath@token@let\bgroup%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmathresult}}%
+ \fi}
\def\pgfmath@endindex@{}% Never actually called.
% Begin and end array {}.
@@ -716,57 +837,63 @@
\def\pgfmath@@collect@#1#2{%
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
- \pgfmathresult\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter%
- {\expandafter#1\expandafter}\expandafter{#2}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgfmathresult\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter%
+ {\expandafter#1\expandafter}\expandafter{#2}}%
}
% Collect items separated by ,.
%
\def\pgfmath@collect@#1#2{%
- \expandafter\def\expandafter\pgfmath@collect@original\expandafter{#1}%
- \expandafter\pgfmath@bgroup@strip\expandafter{#1}%
- \ifx\pgfmath@token@let\bgroup%
- \ifx\pgfmath@collect@original\pgfmath@bgroup@stripped%
- \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmath@bgroup@stripped}%
- \else%
- \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmath@bgroup@stripped}}%
- \fi%
- \else%
- \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmath@bgroup@stripped}}%
- \fi%
- \expandafter\pgfmath@bgroup@strip\expandafter{#2}%
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
- \pgfmathresult\expandafter\expandafter\expandafter%
- {\expandafter\pgfmathresult\expandafter{\pgfmath@bgroup@stripped}}%
+ \expandafter\def\expandafter\pgfmath@collect@original\expandafter{#1}%
+ \expandafter\pgfmath@bgroup@strip\expandafter{#1}%
+ \ifx\pgfmath@token@let\bgroup%
+ \ifx\pgfmath@collect@original\pgfmath@bgroup@stripped%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmath@bgroup@stripped}%
+ \else%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmath@bgroup@stripped}}%
+ \fi%
+ \else%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmath@bgroup@stripped}}%
+ \fi%
+ \expandafter\pgfmath@bgroup@strip\expandafter{#2}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgfmathresult\expandafter\expandafter\expandafter%
+ {\expandafter\pgfmathresult\expandafter{\pgfmath@bgroup@stripped}}%
}
% Strip braces from a token sequence.
%
\def\pgfmath@bgroup@strip#1{%
- \def\pgfmath@bgroup@strip@last{#1}%
- \pgfmath@bgroup@@strip{#1}\pgfmath@\pgfmath@@\pgfmath@@@}
+ \def\pgfmath@bgroup@strip@last{#1}%
+ \pgfmath@bgroup@@strip{#1}\pgfmath@\pgfmath@@\pgfmath@@@}
\def\pgfmath@bgroup@strip@#1{%
- \def\pgfmath@bgroup@strip@last{#1}%
- \pgfmath@bgroup@@strip#1\pgfmath@\pgfmath@@\pgfmath@@@}
+ \def\pgfmath@bgroup@strip@last{#1}%
+ \pgfmath@bgroup@@strip#1\pgfmath@\pgfmath@@\pgfmath@@@}
\def\pgfmath@bgroup@pgfmath@{\pgfmath@}
-\def\pgfmath@bgroup@@strip{\futurelet\pgfmath@token@let\pgfmath@bgroup@@@strip}
-\def\pgfmath@bgroup@@@strip#1#2#3\pgfmath@@@{%
- \ifx\pgfmath@token@let\bgroup%
- \def\pgfmath@bgroup@test{#2}%
- \ifx\pgfmath@bgroup@test\pgfmath@bgroup@pgfmath@%
- \def\pgfmath@next{\pgfmath@bgroup@strip@{#1}}%
- \else%
- \let\pgfmath@bgroup@stripped=\pgfmath@bgroup@strip@last%
- \let\pgfmath@next=\relax%
- \fi%
- \else%
- \pgfmath@bgroup@@@@strip#1#2#3%
- \let\pgfmath@next=\relax%
- \fi%
- \pgfmath@next%
-}
+\def\pgfmath@bgroup@@strip{%
+ \futurelet\pgfmath@token@let\pgfmath@bgroup@@@strip}
-\def\pgfmath@bgroup@@@@strip#1\pgfmath@\pgfmath@@{\def\pgfmath@bgroup@stripped{#1}}%
+\def\pgfmath@bgroup@@@strip#1#2#3\pgfmath@@@{%
+ \ifx\pgfmath@token@let\bgroup
+ \def\pgfmath@bgroup@test{#2}%
+ \ifx\pgfmath@bgroup@test\pgfmath@bgroup@pgfmath@
+ \def\pgfmath@next{\pgfmath@bgroup@strip@{#1}}%
+ \else
+ \let\pgfmath@bgroup@stripped=\pgfmath@bgroup@strip@last
+ \let\pgfmath@next=\relax
+ \fi
+ \else
+ \pgfmath@bgroup@@@@strip#1#2#3%
+ \let\pgfmath@next=\relax
+ \fi
+ \pgfmath@next}
+
+\def\pgfmath@bgroup@@@@strip#1\pgfmath@\pgfmath@@{%
+ \def\pgfmath@bgroup@stripped{#1}}
+
+% Local Variables:
+% tab-width: 2
+% End: \ No newline at end of file