You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
298 lines
8.3 KiB
298 lines
8.3 KiB
% 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{}
|
|
|
|
% Helper macros for \pgfmath@ifregister
|
|
%
|
|
\def\pgfmath@grabv#1#2#3#4#5#6#7\pgfmath@grabv{#2#3#4#5\ifx#6!!\fi}
|
|
\def\pgfmath@ifskip@extract#1{\expandafter\pgfmath@grabv\meaning#1!!!!!!\pgfmath@grabv}
|
|
\def\pgfmath@iftoks@extract#1{\expandafter\pgfmath@grabv\meaning#1!!!!!!\pgfmath@grabv}
|
|
|
|
\def\pgfmath@grabvi#1#2#3#4#5#6#7#8\pgfmath@grabvi{#2#3#4#5#6\ifx#7!!\fi}
|
|
\def\pgfmath@ifdimen@extract#1{\expandafter\pgfmath@grabvi\meaning#1!!!!!!\pgfmath@grabvi}
|
|
\def\pgfmath@ifcount@extract#1{\expandafter\pgfmath@grabvi\meaning#1!!!!!!\pgfmath@grabvi}
|
|
|
|
\def\pgfmath@grabvii#1#2#3#4#5#6#7#8#9\pgfmath@grabvii{#2#3#4#5#6#7\ifx#8!!\fi}
|
|
\def\pgfmath@ifmuskip@extract#1{\expandafter\pgfmath@grabvii\meaning#1!!!!!!\pgfmath@grabvii}
|
|
|
|
% \pgfmath@ifdimen@unguarded
|
|
%
|
|
% Check if #2 is a register of type #1.
|
|
% Credits to Frank: https://tex.stackexchange.com/a/56905
|
|
%
|
|
% #1 register type (count, dimen, skip, muskip, toks)
|
|
% #2 single token
|
|
%
|
|
\def\pgfmath@ifregister@unguarded#1#2{%
|
|
\expandafter\ifx\csname\csname pgfmath@if#1@extract\endcsname{#2}\expandafter\endcsname\csname #1\endcsname
|
|
\expandafter\pgfutil@firstoftwo
|
|
\else
|
|
\expandafter\pgfutil@secondoftwo
|
|
\fi}
|
|
|
|
% \pgfmath@ifregister
|
|
%
|
|
% Checks if a token is a a certain type of register
|
|
%
|
|
% #1 register type (count, dimen, skip, muskip, toks)
|
|
% #2 single token
|
|
%
|
|
\def\pgfmath@ifregister#1#2{%
|
|
\pgfutil@IfUndefined{pgfmath@if#1@extract}%
|
|
{\errmessage{Package PGF Math Error: Cannot test for #1 register}}%
|
|
{\pgfutil@IfUndefined{\csname pgfmath@if#1@extract\endcsname{#2}}%
|
|
{\pgfutil@secondoftwo}}%
|
|
{\pgfmath@ifregister@unguarded{#1}{#2}}}
|
|
|
|
% \pgfmath@ensureregister
|
|
%
|
|
% Ensure a control sequence exists as a TeX count/dimen register.
|
|
%
|
|
% #1 - count or dimen.
|
|
% #2 - a control sequence.
|
|
%
|
|
\def\pgfmath@ensureregister#1#2{%
|
|
\pgfmath@ifregister{#1}{#2}%
|
|
{}%
|
|
{\csname new#1\endcsname#2}%
|
|
}
|
|
|
|
% 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@tempdimb\pgfutil@tempdimb
|
|
|
|
\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{\errmessage{Package #1 Error: #2.}}%
|
|
\else%
|
|
\let\pgfmath@PackageError\PackageError%
|
|
\fi%
|
|
|
|
\def\pgfmath@error#1#2{%
|
|
\pgfmath@PackageError{PGF Math}{%
|
|
#1%
|
|
\pgfutil@ifundefined{pgfmath@expression}{}{ (in '\pgfmath@expression')}%
|
|
}{#2}%
|
|
}
|
|
\def\pgfmath@warning#1{%
|
|
\pgfmath@PackageWarning{PGF Math}{%
|
|
#1%
|
|
\pgfutil@ifundefined{pgfmath@expression}{}{ (in '\pgfmath@expression')}%
|
|
}%
|
|
}
|
|
|
|
% \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{}%
|
|
|
|
|
|
\def\pgfmath@namedef#1{\expandafter\def\csname#1\endcsname}
|
|
\def\pgfmath@nameedef#1{\expandafter\edef\csname#1\endcsname}
|
|
|
|
% \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
|
|
%
|
|
% #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}%
|
|
}
|
|
|
|
\let\pgfmathreturn=\pgfmath@returnone
|
|
|
|
% \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}}
|
|
|
|
\let\pgfmathsmuggle=\pgfmath@smuggleone
|
|
|