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.
5633 lines
183 KiB
5633 lines
183 KiB
% Copyright 2006 by Till Tantau
|
|
%
|
|
% This file may be distributed and/or modified
|
|
%
|
|
% 1. under the LaTeX Project Public License and/or
|
|
% 2. under the GNU Public License.
|
|
%
|
|
% See the file doc/generic/pgf/licenses/LICENSE for more details.
|
|
|
|
\ProvidesPackageRCS{tikz.code.tex}
|
|
|
|
|
|
\def\tikzerror#1{\pgfutil@packageerror{tikz}{#1}{}}
|
|
|
|
% Always-present libraries (|\usepgflibrary| defined in
|
|
% \file{pgfutil-common.tex}).
|
|
\usepgflibrary{plothandlers}
|
|
|
|
\newdimen\tikz@lastx
|
|
\newdimen\tikz@lasty
|
|
\newdimen\tikz@lastxsaved
|
|
\newdimen\tikz@lastysaved
|
|
\newdimen\tikz@lastmovetox
|
|
\newdimen\tikz@lastmovetoy
|
|
|
|
\newdimen\tikzleveldistance
|
|
\newdimen\tikzsiblingdistance
|
|
|
|
\newbox\tikz@figbox
|
|
\newbox\tikz@figbox@bg
|
|
\newbox\tikz@tempbox
|
|
\newbox\tikz@tempbox@bg
|
|
|
|
\newcount\tikztreelevel
|
|
\newcount\tikznumberofchildren
|
|
\newcount\tikznumberofcurrentchild
|
|
|
|
\newcount\tikz@fig@count
|
|
|
|
\newif\iftikz@node@is@a@label
|
|
\newif\iftikz@snaked
|
|
\newif\iftikz@decoratepath
|
|
|
|
\let\tikz@options\pgfutil@empty
|
|
% |\tikz@addoption| adds \texttt{#1} at the end of the replacement
|
|
% text of |\tikz@options| without expansion.
|
|
\def\tikz@addoption#1{%
|
|
\expandafter\def\expandafter\tikz@options\expandafter{\tikz@options#1}}%
|
|
% Same as |tikz@addoption| for |\tikz@mode|. Note that |\tikz@mode| is
|
|
% initially let to |\pgfutil@empty| later (see path usage options).
|
|
\def\tikz@addmode#1{%
|
|
\expandafter\def\expandafter\tikz@mode\expandafter{\tikz@mode#1}}%
|
|
% Same as |tikz@addoption| for |\tikz@transform|. Works even if
|
|
% |\tikz@transform| is not defined. In that case, nothing is added to
|
|
% |\tikz@transform|: \texttt{#1} is expanded.
|
|
\def\tikz@addtransform#1{%
|
|
\ifx\tikz@transform\relax
|
|
#1%
|
|
\else
|
|
\expandafter\def\expandafter\tikz@transform\expandafter{\tikz@transform#1}%
|
|
\fi
|
|
}%
|
|
|
|
|
|
% TikZ options management.
|
|
|
|
% Setting up the tikz key family (key management needs
|
|
% \file{pgfkeys.code.tex});
|
|
\pgfkeys{/tikz/.is family}%
|
|
|
|
% |\tikzset| is a shortcut to set keys that belongs to the tikz
|
|
% family.
|
|
\def\tikzset{\pgfqkeys{/tikz}}%
|
|
|
|
% Note: |\tikzoption| is supported for compatibility only. |\tikzset|
|
|
% should be used instead.
|
|
\def\tikzoption#1{%
|
|
\pgfutil@ifnextchar[%]
|
|
{\tikzoption@opt{#1}}{\tikzoption@noopt{#1}}}%
|
|
\def\tikzoption@opt#1[#2]#3{%
|
|
\pgfkeysdef{/tikz/#1}{#3}%
|
|
\pgfkeyssetvalue{/tikz/#1/.@def}{#2}}%
|
|
\def\tikzoption@noopt#1#2{%
|
|
\pgfkeysdef{/tikz/#1}{#2}%
|
|
\pgfkeyssetvalue{/tikz/#1/.@def}{\pgfkeysvaluerequired}}%
|
|
|
|
% Baseline options
|
|
\tikzoption{baseline}[0pt]{%
|
|
\pgfutil@ifnextchar(%)
|
|
{\tikz@baseline@coordinate}{\tikz@baseline@simple}#1\@nil}%
|
|
\def\tikz@baseline@simple#1\@nil{\pgfsetbaseline{#1}}%
|
|
\def\tikz@baseline@coordinate#1\@nil{%
|
|
\pgfsetbaselinepointlater{\tikz@scan@one@point\pgfutil@firstofone#1}}%
|
|
|
|
\tikzoption{trim left}[0pt]{\pgfutil@ifnextchar({\tikz@trim@coordinate{left}}{\tikz@trim@simple{left}}#1\@nil}%)%
|
|
\tikzoption{trim right}{\pgfutil@ifnextchar({\tikz@trim@coordinate{right}}{\tikz@trim@simple{right}}#1\@nil}%)%
|
|
\def\tikz@trim@simple#1#2\@nil{\csname pgfsettrim#1\endcsname{#2}}%
|
|
\def\tikz@trim@coordinate#1#2\@nil{\csname pgfsettrim#1pointlater\endcsname{\tikz@scan@one@point\pgfutil@firstofone#2}}%
|
|
|
|
% Draw options
|
|
\tikzoption{line width}{\tikz@semiaddlinewidth{#1}}%
|
|
|
|
\def\tikz@semiaddlinewidth#1{\tikz@addoption{\pgfsetlinewidth{#1}}\pgfmathsetlength\pgflinewidth{#1}}%
|
|
|
|
\tikzoption{cap}{\tikz@addoption{\csname pgfset#1cap\endcsname}}%
|
|
\tikzoption{join}{\tikz@addoption{\csname pgfset#1join\endcsname}}%
|
|
\tikzoption{line cap}{\tikz@addoption{\csname pgfset#1cap\endcsname}}%
|
|
\tikzoption{line join}{\tikz@addoption{\csname pgfset#1join\endcsname}}%
|
|
\tikzoption{miter limit}{\tikz@addoption{\pgfsetmiterlimit{#1}}}%
|
|
|
|
\tikzoption{dash pattern}{% syntax: on 2pt off 3pt on 4pt ...
|
|
\def\tikz@temp{#1}%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\def\tikz@dashpattern{}%
|
|
\tikz@addoption{\pgfsetdash{}{0pt}}%
|
|
\else%
|
|
\def\tikz@dashpattern{}%
|
|
\expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
|
|
\edef\tikz@temp{{\tikz@dashpattern}{\noexpand\tikz@dashphase}}%
|
|
\expandafter\tikz@addoption\expandafter{\expandafter\pgfsetdash\tikz@temp}%
|
|
\fi}%
|
|
\tikzoption{dash phase}{%
|
|
\def\tikz@dashphase{#1}%
|
|
\edef\tikz@temp{{\tikz@dashpattern}{\noexpand\tikz@dashphase}}%
|
|
\expandafter\tikz@addoption\expandafter{\expandafter\pgfsetdash\tikz@temp}%
|
|
}%
|
|
\tikzoption{dash}{\tikz@parse@full@dash#1\pgf@stop}%
|
|
\def\tikz@parse@full@dash#1phase#2\pgf@stop{%
|
|
\def\tikz@dashphase{#2}%
|
|
\def\tikz@temp{#1}%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\def\tikz@dashpattern{}%
|
|
\tikz@addoption{\pgfsetdash{}{0pt}}%
|
|
\else%
|
|
\def\tikz@dashpattern{}%
|
|
\expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
|
|
\edef\tikz@temp{{\tikz@dashpattern}{\noexpand\tikz@dashphase}}%
|
|
\expandafter\tikz@addoption\expandafter{\expandafter\pgfsetdash\tikz@temp}%
|
|
\fi%
|
|
}%
|
|
\def\tikz@dashphase{0pt}%
|
|
\def\tikz@dashpattern{}%
|
|
|
|
\def\tikz@scandashon n#1o{%
|
|
\expandafter\def\expandafter\tikz@dashpattern\expandafter{\tikz@dashpattern{#1}}%
|
|
\pgfutil@ifnextchar\@nil{\pgfutil@gobble}{\tikz@scandashoff}}%
|
|
\def\tikz@scandashoff ff#1o{%
|
|
\expandafter\def\expandafter\tikz@dashpattern\expandafter{\tikz@dashpattern{#1}}%
|
|
\pgfutil@ifnextchar\@nil{\pgfutil@gobble}{\tikz@scandashon}}%
|
|
|
|
% use a decoration to expand the `off' section of a dash pattern.
|
|
% https://tex.stackexchange.com/a/133357
|
|
\tikzset{
|
|
dash expand off/.code={%
|
|
\ifcsname tikz@library@decorations@loaded\endcsname\else
|
|
\tikzerror{You need \string\usetikzlibrary{decorations} for ``dash offexpand''}%
|
|
\fi
|
|
\tikz@addoption{%
|
|
\pgfgetpath\currentpath
|
|
\pgfprocessround{\currentpath}{\currentpath}%
|
|
\pgf@decorate@parsesoftpath{\currentpath}{\currentpath}%
|
|
% Parse \on and \off from the current path
|
|
\edef\on{\expandafter\pgfutil@firstoftwo\tikz@dashpattern}%
|
|
\edef\off{\expandafter\pgfutil@secondoftwo\tikz@dashpattern}%
|
|
% \dashphase = max(\on - \dashphase, 0)
|
|
\pgfmathsubtract@{\on}{\tikz@dashphase}%
|
|
\pgfmathmax@{\pgfmathresult}{0}%
|
|
\edef\dashphase{\the\dimexpr\pgfmathresult pt\relax}%
|
|
% \rest = \pgf@decorate@totalpathlength - \on
|
|
\edef\rest{\expandafter\pgf@sys@tonumber\dimexpr\pgf@decorate@totalpathlength - \on + 2\dimexpr\dashphase\relax\relax}%
|
|
% \onoff = \on + \off
|
|
\edef\onoff{\expandafter\pgf@sys@tonumber\dimexpr\on+\off\relax}%
|
|
% \nfullonoff = max(floor(\rest/\onoff), 1)
|
|
\pgfmathdivide@{\rest}{\onoff}%
|
|
\pgfmathfloor@{\pgfmathresult}%
|
|
\pgfmathmax@{\pgfmathresult}{1}%
|
|
% \offexpand = max(\rest/\nfullonoff - \on, \off)
|
|
\pgfmathdivide@{\rest}{\pgfmathresult}%
|
|
\pgfmathsubtract@{\pgfmathresult}{\on}%
|
|
\pgfmathmax@{\pgfmathresult}{\off}%
|
|
\edef\tikz@marshal{\noexpand\pgfsetdash{{\on}{\pgfmathresult}}{\dashphase}}%
|
|
\tikz@marshal
|
|
}%
|
|
}
|
|
}
|
|
|
|
\tikzoption{draw opacity}{\tikz@addoption{\pgfsetstrokeopacity{#1}}}%
|
|
|
|
% Double draw options
|
|
\tikzoption{double}[]{%
|
|
\def\tikz@temp{#1}%
|
|
\ifx\tikz@temp\tikz@nonetext%
|
|
\tikz@addmode{\tikz@mode@doublefalse}%
|
|
\else%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\else%
|
|
\pgfsetinnerstrokecolor{#1}%
|
|
\fi%
|
|
\tikz@addmode{\tikz@mode@doubletrue}%
|
|
\tikzset{every double/.try}%
|
|
\fi}%
|
|
\tikzoption{double distance}{%
|
|
\pgfmathsetlength{\pgf@x}{#1}%
|
|
\edef\tikz@double@setup{%
|
|
\pgf@x=\the\pgf@x%
|
|
\advance\pgf@x by2\pgflinewidth%
|
|
\pgflinewidth=\pgf@x%
|
|
\noexpand\pgfsetlinewidth{\pgflinewidth}%
|
|
\noexpand\pgfsetinnerlinewidth{\the\pgf@x}%
|
|
}%
|
|
\tikzset{double}}%
|
|
\def\tikz@double@setup{%
|
|
\pgf@x=2\pgflinewidth%
|
|
\advance\pgf@x by0.6pt%
|
|
\pgflinewidth=\pgf@x%
|
|
\pgfsetlinewidth{\pgflinewidth}%
|
|
\pgfsetinnerlinewidth{0.6pt}%
|
|
}%
|
|
\tikzset{double distance between line centers/.code={
|
|
\pgfmathsetlength{\pgf@x}{#1}%
|
|
\edef\tikz@double@setup{%
|
|
\pgf@x=\pgflinewidth%
|
|
\pgf@xa=\the\pgf@x%
|
|
\advance\pgf@x by\pgf@xa%
|
|
\advance\pgf@xa by-\pgflinewidth%
|
|
\pgflinewidth=\pgf@x%
|
|
\noexpand\pgfsetlinewidth{\pgflinewidth}%
|
|
\noexpand\pgfsetinnerlinewidth{\pgf@xa}%
|
|
}%
|
|
\tikzset{double}}}%
|
|
\tikzset{double equal sign distance/.style={double distance between line centers=0.45ex}}%
|
|
|
|
|
|
|
|
|
|
% Fill options
|
|
|
|
\tikzoption{even odd rule}[]{\tikz@addoption{\pgfseteorule}}%
|
|
\tikzoption{nonzero rule}[]{\tikz@addoption{\pgfsetnonzerorule}}%
|
|
|
|
\tikzoption{fill opacity}{\tikz@addoption{\pgfsetfillopacity{#1}}}%
|
|
|
|
|
|
% Joined fill/draw options
|
|
|
|
\tikzoption{opacity}{\tikz@addoption{\pgfsetstrokeopacity{#1}\pgfsetfillopacity{#1}}}%
|
|
|
|
|
|
% Blend mode
|
|
|
|
\tikzset{blend mode/.code={\tikz@addoption{\pgfsetblendmode{#1}}}}%
|
|
|
|
|
|
% Main color options
|
|
\tikzoption{color}{%
|
|
\tikz@addoption{%
|
|
\ifx\tikz@fillcolor\pgfutil@empty%
|
|
\ifx\tikz@strokecolor\pgfutil@empty%
|
|
\else%
|
|
\pgfsys@color@reset@inorderfalse%
|
|
\let\tikz@strokecolor\pgfutil@empty%
|
|
\let\tikz@fillcolor\pgfutil@empty%
|
|
\fi%
|
|
\else%
|
|
\pgfsys@color@reset@inorderfalse%
|
|
\let\tikz@strokecolor\pgfutil@empty%
|
|
\let\tikz@fillcolor\pgfutil@empty%
|
|
\fi%
|
|
\pgfutil@colorlet{tikz@color}{#1}%
|
|
\pgfutil@colorlet{.}{tikz@color}%
|
|
%
|
|
\pgfsetcolor{.}%
|
|
\pgfsys@color@reset@inordertrue%
|
|
}%
|
|
\def\tikz@textcolor{#1}}%
|
|
|
|
|
|
|
|
% Rounding options
|
|
\tikzoption{rounded corners}[4pt]{\pgfsetcornersarced{\pgfpoint{#1}{#1}}}%
|
|
\tikzoption{sharp corners}[]{\pgfsetcornersarced{\pgfpointorigin}}%
|
|
|
|
% Radii and arc options
|
|
\tikzset{x radius/.initial=0pt}%
|
|
\tikzset{y radius/.initial=0pt}%
|
|
\tikzset{%
|
|
radius/.code={%
|
|
\pgfmathparse{#1}%
|
|
\ifpgfmathunitsdeclared
|
|
\pgfkeyssetevalue{/tikz/x radius}{\pgfmathresult pt}%
|
|
\pgfkeyssetevalue{/tikz/y radius}{\pgfmathresult pt}%
|
|
\else
|
|
\pgfkeyssetevalue{/tikz/x radius}{\pgfmathresult}%
|
|
\pgfkeyssetevalue{/tikz/y radius}{\pgfmathresult}%
|
|
\fi
|
|
}%
|
|
}%
|
|
\tikzset{start angle/.initial=}%
|
|
\tikzset{end angle/.initial=}%
|
|
\tikzset{delta angle/.initial=}%
|
|
|
|
|
|
% Coordinate options
|
|
\tikzoption{x}{\tikz@handle@vec{\pgfsetxvec}{\tikz@handle@x}#1\relax}%
|
|
\tikzoption{y}{\tikz@handle@vec{\pgfsetyvec}{\tikz@handle@y}#1\relax}%
|
|
\tikzoption{z}{\tikz@handle@vec{\pgfsetzvec}{\tikz@handle@z}#1\relax}%
|
|
|
|
\def\tikz@handle@vec#1#2{\pgfutil@ifnextchar({\tikz@handle@coordinate#1}{\tikz@handle@single#2}}%
|
|
\def\tikz@handle@coordinate#1{\tikz@scan@one@point#1}%
|
|
\def\tikz@handle@single#1#2\relax{#1{#2}}%
|
|
\def\tikz@handle@x#1{\pgfsetxvec{\pgfpoint{#1}{0pt}}}%
|
|
\def\tikz@handle@y#1{\pgfsetyvec{\pgfpoint{0pt}{#1}}}%
|
|
\def\tikz@handle@z#1{\pgfsetzvec{\pgfpoint{#1}{#1}}}%
|
|
|
|
|
|
% Transformation options
|
|
\tikzoption{scale}{\tikz@addtransform{\pgftransformscale{#1}}}%
|
|
\tikzoption{scale around}{\tikz@addtransform{\def\tikz@aroundaction{\pgftransformscale}\tikz@doaround{#1}}}%
|
|
\tikzoption{xscale}{\tikz@addtransform{\pgftransformxscale{#1}}}%
|
|
\tikzoption{xslant}{\tikz@addtransform{\pgftransformxslant{#1}}}%
|
|
\tikzoption{yscale}{\tikz@addtransform{\pgftransformyscale{#1}}}%
|
|
\tikzoption{yslant}{\tikz@addtransform{\pgftransformyslant{#1}}}%
|
|
\tikzoption{rotate}{\tikz@addtransform{\pgftransformrotate{#1}}}%
|
|
\tikzoption{rotate around}{\tikz@addtransform{\def\tikz@aroundaction{\pgftransformrotate}\tikz@doaround{#1}}}%
|
|
\def\tikz@doaround#1{%
|
|
\edef\tikz@temp{#1}% get rid of active stuff
|
|
\expandafter\tikz@doparseA\tikz@temp%
|
|
}%
|
|
\def\tikz@doparseA#1:{%
|
|
\def\tikz@temp@rot{#1}%
|
|
\tikz@scan@one@point\tikz@doparseB%
|
|
}%
|
|
\def\tikz@doparseB#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\pgftransformshift{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
|
|
\tikz@aroundaction{\tikz@temp@rot}%
|
|
\pgftransformshift{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}%
|
|
}%
|
|
|
|
\tikzoption{shift}{\tikz@addtransform{\tikz@scan@one@point\pgftransformshift#1\relax}}%
|
|
\tikzoption{xshift}{\tikz@addtransform{\pgftransformxshift{#1}}}%
|
|
\tikzoption{yshift}{\tikz@addtransform{\pgftransformyshift{#1}}}%
|
|
\tikzoption{cm}{\tikz@addtransform{\tikz@parse@cm#1\relax}}%
|
|
\tikzoption{reset cm}[]{\tikz@addtransform{\pgftransformreset}}%
|
|
\tikzoption{shift only}[]{\tikz@addtransform{\pgftransformresetnontranslations}}%
|
|
|
|
\def\tikz@parse@cm#1,#2,#3,#4,{%
|
|
\def\tikz@p@cm{{#1}{#2}{#3}{#4}}%
|
|
\tikz@scan@one@point\tikz@parse@cmA}%
|
|
\def\tikz@parse@cmA#1{%
|
|
\expandafter\pgftransformcm\tikz@p@cm{#1}%
|
|
}%
|
|
|
|
\tikzset{transform canvas/.code=%
|
|
{%
|
|
\tikz@addoption
|
|
{%
|
|
{%
|
|
\pgftransformreset%
|
|
\let\tikz@transform=\relax%
|
|
\tikzset{#1}%
|
|
\pgflowlevelsynccm%
|
|
}%
|
|
\pgf@relevantforpicturesizefalse%
|
|
}%
|
|
}%
|
|
}%
|
|
|
|
\tikzset{turn/.code={%
|
|
\pgf@x=0pt%
|
|
\pgf@y\pgf@x%
|
|
\pgf@process{\tikz@tangent}%
|
|
\advance\pgf@x by-\tikz@lastx%
|
|
\advance\pgf@y by-\tikz@lasty%
|
|
\pgfpointnormalised{}% x/y = normalised vector
|
|
\pgf@x=-\pgf@x%
|
|
\pgf@ya=-\pgf@y%
|
|
\pgftransformcm%
|
|
{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@ya}}%
|
|
{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@x}}{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
|
|
}%
|
|
}%
|
|
|
|
\def\tikz@tangent@lookup{%
|
|
\pgfgetpath\tikz@temp%
|
|
\pgfprocesspathextractpoints\tikz@temp%
|
|
\pgfpointsecondlastonpath%
|
|
}%
|
|
|
|
% Code for rotating the xyz coordinate system
|
|
% around the x, y, or z vector.
|
|
%
|
|
\def\tikz@xyz@rotate@let{%
|
|
\let\pgf@z=\pgf@yc%
|
|
\let\pgf@za=\pgf@xc%
|
|
}%
|
|
|
|
\def\tikz@xyz@rotate@xyz@xaxis#1#2#3#4{%
|
|
\tikz@xyz@rotate@let%
|
|
\pgf@x=#1\relax%
|
|
\pgf@ya=#2\relax%
|
|
\pgf@za=#3\relax%
|
|
\pgfmathsin@{#4}\let\tikz@xyz@sin=\pgfmathresult%
|
|
\pgfmathcos@{#4}\let\tikz@xyz@cos=\pgfmathresult%
|
|
\pgf@y=\tikz@xyz@cos\pgf@ya%
|
|
\advance\pgf@y by-\tikz@xyz@sin\pgf@za%
|
|
\pgf@z=\tikz@xyz@sin\pgf@ya%
|
|
\advance\pgf@z by\tikz@xyz@cos\pgf@za%
|
|
}%
|
|
|
|
\def\tikz@xyz@rotate@xyz@yaxis#1#2#3#4{%
|
|
\tikz@xyz@rotate@let%
|
|
\pgf@xa=#1\relax%
|
|
\pgf@y=#2\relax%
|
|
\pgf@za=#3\relax%
|
|
\pgfmathsin@{#4}\let\tikz@xyz@sin=\pgfmathresult%
|
|
\pgfmathcos@{#4}\let\tikz@xyz@cos=\pgfmathresult%
|
|
\pgf@x=\tikz@xyz@cos\pgf@xa%
|
|
\advance\pgf@x by\tikz@xyz@sin\pgf@za%
|
|
\pgf@z=-\tikz@xyz@sin\pgf@xa%
|
|
\advance\pgf@z by\tikz@xyz@cos\pgf@za%
|
|
}%
|
|
|
|
\def\tikz@xyz@rotate@xyz@zaxis#1#2#3#4{%
|
|
\tikz@xyz@rotate@let%
|
|
\pgf@xa=#1\relax%
|
|
\pgf@ya=#2\relax%
|
|
\pgf@z=#3\relax%
|
|
\pgfmathsin@{#4}\let\tikz@xyz@sin=\pgfmathresult%
|
|
\pgfmathcos@{#4}\let\tikz@xyz@cos=\pgfmathresult%
|
|
\pgf@x=\tikz@xyz@cos\pgf@xa%
|
|
\advance\pgf@x by-\tikz@xyz@sin\pgf@ya%
|
|
\pgf@y=\tikz@xyz@sin\pgf@xa%
|
|
\advance\pgf@y by\tikz@xyz@cos\pgf@ya%
|
|
}%
|
|
|
|
\tikzset{rotate around x/.code={%
|
|
\tikz@xyz@rotate@let%
|
|
\pgfmathparse{#1}\let\tikz@xyz@angle=\pgfmathresult%
|
|
\tikz@xyz@rotate@xyz@xaxis{0pt}{1pt}{0pt}{\tikz@xyz@angle}%
|
|
\pgfextract@process\tikz@xyz@rotate@yvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
|
|
\tikz@xyz@rotate@xyz@xaxis{0pt}{0pt}{1pt}{\tikz@xyz@angle}%
|
|
\pgfsetzvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
|
|
\pgfsetyvec{\tikz@xyz@rotate@yvec}%
|
|
},
|
|
rotate around y/.code={%
|
|
\tikz@xyz@rotate@let%
|
|
\pgfmathparse{#1}\let\tikz@xyz@angle=\pgfmathresult%
|
|
\tikz@xyz@rotate@xyz@yaxis{1pt}{0pt}{0pt}{\tikz@xyz@angle}%
|
|
\pgfextract@process\tikz@xyz@rotate@xvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
|
|
\tikz@xyz@rotate@xyz@yaxis{0pt}{0pt}{1pt}{\tikz@xyz@angle}%
|
|
\pgfsetzvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
|
|
\pgfsetxvec{\tikz@xyz@rotate@xvec}%
|
|
},
|
|
rotate around z/.code={%
|
|
\tikz@xyz@rotate@let%
|
|
\pgfmathparse{#1}\let\tikz@xyz@angle=\pgfmathresult%
|
|
\tikz@xyz@rotate@xyz@zaxis{1pt}{0pt}{0pt}{\tikz@xyz@angle}%
|
|
\pgfextract@process\tikz@xyz@rotate@xvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
|
|
\tikz@xyz@rotate@xyz@zaxis{0pt}{1pt}{0pt}{\tikz@xyz@angle}%
|
|
\pgfsetyvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
|
|
\pgfsetxvec{\tikz@xyz@rotate@xvec}%
|
|
},
|
|
}%
|
|
|
|
% Grid options
|
|
\tikzoption{xstep}{\def\tikz@grid@x{#1}}%
|
|
\tikzoption{ystep}{\def\tikz@grid@y{#1}}%
|
|
\tikzoption{step}{\tikz@handle@vec{\tikz@step@point}{\tikz@step@single}#1\relax}%
|
|
\def\tikz@step@single#1{\def\tikz@grid@x{#1}\def\tikz@grid@y{#1}}%
|
|
\def\tikz@step@point#1{\pgf@process{#1}\edef\tikz@grid@x{\the\pgf@x}\edef\tikz@grid@y{\the\pgf@y}}%
|
|
|
|
\def\tikz@grid@x{1cm}%
|
|
\def\tikz@grid@y{1cm}%
|
|
|
|
|
|
% Current point updates
|
|
\newif\iftikz@current@point@local
|
|
\tikzset{current point is local/.is if=tikz@current@point@local}%
|
|
|
|
% Path usage options
|
|
\newif\iftikz@mode@double
|
|
\newif\iftikz@mode@fill
|
|
\newif\iftikz@mode@draw
|
|
\newif\iftikz@mode@clip
|
|
\newif\iftikz@mode@boundary
|
|
\newif\iftikz@mode@shade
|
|
\newif\iftikz@mode@fade@path
|
|
\newif\iftikz@mode@fade@scope
|
|
\let\tikz@mode=\pgfutil@empty
|
|
|
|
\def\tikz@nonetext{none}%
|
|
|
|
\tikzoption{path only}[]{\let\tikz@mode=\pgfutil@empty}%
|
|
\tikzset{
|
|
shade/.is choice,
|
|
shade/.default=true,
|
|
shade/true/.code=\tikz@addmode{\tikz@mode@shadetrue},
|
|
shade/false/.code=\tikz@addmode{\tikz@mode@shadefalse},
|
|
shade/none/.code=\tikz@addmode{\tikz@mode@shadefalse},
|
|
}%
|
|
|
|
\tikzoption{fill}[]{%
|
|
\edef\tikz@temp{#1}%
|
|
\ifx\tikz@temp\tikz@nonetext%
|
|
\tikz@addmode{\tikz@mode@fillfalse}%
|
|
\else%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\else%
|
|
\tikz@addoption{\pgfsetfillcolor{#1}}%
|
|
\def\tikz@fillcolor{#1}%
|
|
\fi%
|
|
\tikz@addmode{\tikz@mode@filltrue}%
|
|
\fi%
|
|
}%
|
|
\tikzoption{draw}[]{%
|
|
\edef\tikz@temp{#1}%
|
|
\ifx\tikz@temp\tikz@nonetext%
|
|
\tikz@addmode{\tikz@mode@drawfalse}%
|
|
\else%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\else%
|
|
\tikz@addoption{\pgfsetstrokecolor{#1}}%
|
|
\def\tikz@strokecolor{#1}%
|
|
\fi%
|
|
\tikz@addmode{\tikz@mode@drawtrue}%
|
|
\fi%
|
|
}%
|
|
\tikzoption{clip}[]{\tikz@addmode{\tikz@mode@cliptrue}}%
|
|
\tikzoption{use as bounding box}[]{\tikz@addmode{\tikz@mode@boundarytrue}}%
|
|
|
|
\tikzoption{save path}{\tikz@addmode{\pgfsyssoftpath@getcurrentpath#1\global\let#1=#1}}%
|
|
\tikzoption{use path}{\tikz@addmode{\pgfsyssoftpath@setcurrentpath#1}}%
|
|
|
|
\let\tikz@fillcolor=\pgfutil@empty
|
|
\let\tikz@strokecolor=\pgfutil@empty
|
|
|
|
% Insert a path using an option
|
|
\tikzset{insert path/.code=\tikz@scan@next@command#1\pgf@stop}%
|
|
|
|
% Pattern options
|
|
\tikzset{pattern/.code=\tikzerror{You need to say \string\usetikzlibrary{patterns}},
|
|
pattern color/.style=pattern}%
|
|
|
|
% Path pictures
|
|
\tikzset{path picture/.code=\tikz@addmode{\def\tikz@path@picture{#1}}}%
|
|
|
|
% Fading options
|
|
\tikzset{path fading/.code={
|
|
\def\tikz@temp{#1}%
|
|
\ifx\tikz@temp\tikz@nonetext%
|
|
\tikz@addmode{\tikz@mode@fade@pathfalse}%
|
|
\else%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\else%
|
|
\def\tikz@path@fading{#1}%
|
|
\fi%
|
|
\tikz@addmode{\tikz@mode@fade@pathtrue}%
|
|
\fi%
|
|
},
|
|
path fading/.default=,
|
|
scope fading/.code={
|
|
\def\tikz@temp{#1}%
|
|
\ifx\tikz@temp\tikz@nonetext%
|
|
\tikz@addmode{\tikz@mode@fade@scopefalse}%
|
|
\else%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\else%
|
|
\def\tikz@scope@fading{#1}%
|
|
\fi%
|
|
\tikz@addmode{\tikz@mode@fade@scopetrue}%
|
|
\fi%
|
|
},
|
|
scope fading/.default=}%
|
|
\tikzset{fit fading/.is if=tikz@fade@adjust}%
|
|
\tikzset{fading transform/.store in=\tikz@fade@transform}%
|
|
\tikzset{fading angle/.style={fading transform={rotate=#1}}}%
|
|
|
|
\newif\iftikz@fade@adjust%
|
|
\tikz@fade@adjusttrue%
|
|
\let\tikz@fade@transform\pgfutil@empty%
|
|
|
|
\pgfutil@colorlet{transparent}{pgftransparent}%
|
|
\def\tikz@do@fade@transform{\let\tikz@transform=\relax\expandafter\tikzset\expandafter{\tikz@fade@transform}}%
|
|
|
|
|
|
|
|
% Transparency groups
|
|
\newif\iftikz@transparency@group%
|
|
\tikzset{/tikz/transparency group/.code=\tikz@transparency@grouptrue\def\tikz@transparency@group@options{isolated=true,#1}\let\tikz@blend@group\pgfutil@empty}%
|
|
\tikzset{/tikz/blend group/.code=\tikz@transparency@grouptrue\def\tikz@transparency@group@options{isolated=true}\def\tikz@blend@group{\pgfsetblendmode{#1}}}%
|
|
|
|
\let\tikz@blend@group\pgfutil@empty
|
|
|
|
% Shading options
|
|
\tikzoption{shading}{\def\tikz@shading{#1}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{shading angle}{\def\tikz@shade@angle{#1}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{top color}{%
|
|
\pgfutil@colorlet{tikz@axis@top}{#1}%
|
|
\pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
|
|
\def\tikz@shading{axis}\def\tikz@shade@angle{0}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{bottom color}{%
|
|
\pgfutil@colorlet{tikz@axis@bottom}{#1}%
|
|
\pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
|
|
\def\tikz@shading{axis}\def\tikz@shade@angle{0}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{middle color}{%
|
|
\pgfutil@colorlet{tikz@axis@middle}{#1}%
|
|
\def\tikz@shading{axis}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{left color}{%
|
|
\pgfutil@colorlet{tikz@axis@top}{#1}%
|
|
\pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
|
|
\def\tikz@shading{axis}\def\tikz@shade@angle{90}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{right color}{%
|
|
\pgfutil@colorlet{tikz@axis@bottom}{#1}%
|
|
\pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
|
|
\def\tikz@shading{axis}\def\tikz@shade@angle{90}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{ball color}{\pgfutil@colorlet{tikz@ball}{#1}\def\tikz@shading{ball}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{inner color}{\pgfutil@colorlet{tikz@radial@inner}{#1}\def\tikz@shading{radial}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
\tikzoption{outer color}{\pgfutil@colorlet{tikz@radial@outer}{#1}\def\tikz@shading{radial}\tikz@addmode{\tikz@mode@shadetrue}}%
|
|
|
|
\def\tikz@shading{axis}%
|
|
\def\tikz@shade@angle{0}%
|
|
|
|
\pgfdeclareverticalshading[tikz@axis@top,tikz@axis@middle,tikz@axis@bottom]{axis}{100bp}{%
|
|
color(0bp)=(tikz@axis@bottom);
|
|
color(25bp)=(tikz@axis@bottom);
|
|
color(50bp)=(tikz@axis@middle);
|
|
color(75bp)=(tikz@axis@top);
|
|
color(100bp)=(tikz@axis@top)}%
|
|
|
|
\pgfutil@colorlet{tikz@axis@top}{gray}%
|
|
\pgfutil@colorlet{tikz@axis@middle}{gray!50!white}%
|
|
\pgfutil@colorlet{tikz@axis@bottom}{white}%
|
|
|
|
\pgfdeclareradialshading[tikz@ball]{ball}{\pgfqpoint{-10bp}{10bp}}{%
|
|
color(0bp)=(tikz@ball!15!white);
|
|
color(9bp)=(tikz@ball!75!white);
|
|
color(18bp)=(tikz@ball!70!black);
|
|
color(25bp)=(tikz@ball!50!black);
|
|
color(50bp)=(black)}%
|
|
|
|
\pgfutil@colorlet{tikz@ball}{blue}%
|
|
|
|
\pgfdeclareradialshading[tikz@radial@inner,tikz@radial@outer]{radial}{\pgfpointorigin}{%
|
|
color(0bp)=(tikz@radial@inner);
|
|
color(25bp)=(tikz@radial@outer);
|
|
color(50bp)=(tikz@radial@outer)}%
|
|
|
|
\pgfutil@colorlet{tikz@radial@inner}{gray}%
|
|
\pgfutil@colorlet{tikz@radial@outer}{white}%
|
|
|
|
|
|
% Pin options
|
|
\tikzset{
|
|
pin distance/.store in=\tikz@pin@distance,
|
|
pin distance=3ex,
|
|
pin position/.store in=\tikz@pin@default@pos,
|
|
pin position=above,
|
|
pin edge/.store in=\tikz@pin@edge@style,
|
|
pin edge={},
|
|
tikz@pin@post/.code={\global\let\tikz@pin@edge@style@smuggle=\tikz@pin@edge@style},
|
|
tikz@pre@pin@edge/.code={%
|
|
\toks0=\expandafter{\tikz@pin@edge@style@smuggle}%
|
|
\edef\pgf@marshal{\noexpand\tikzset{tikz@pin@options/.style={\the\toks0}}}%
|
|
\pgf@marshal
|
|
},%
|
|
}%
|
|
|
|
\tikzset{%
|
|
pin/.code={%
|
|
\begingroup
|
|
\ifnum\the\catcode`\:=\active\relax
|
|
\def\tikz@next{%
|
|
\endgroup
|
|
\tikz@parse@pin@active@i{#1}}%
|
|
\else
|
|
\def\tikz@next{%
|
|
\endgroup
|
|
\pgfutil@ifnextchar[%]
|
|
{\tikz@parse@pin@nonactive}
|
|
{\tikz@parse@pin@nonactive[]}#1:\pgf@nil}%
|
|
\fi
|
|
\tikz@next}}%
|
|
|
|
\begingroup
|
|
\catcode`\:=\active\relax
|
|
|
|
\gdef\tikz@parse@pin@active@i#1{%
|
|
\pgfutil@ifnextchar[%]
|
|
{\tikz@parse@pin@active}
|
|
{\tikz@parse@pin@active[]}#1:\pgf@nil}%
|
|
|
|
\long\gdef\tikz@parse@pin@active[#1]#2:#3\pgf@nil{%
|
|
\def\tikz@temp{#3}%
|
|
\ifx\tikz@temp\pgfutil@empty
|
|
% no position, use default
|
|
\tikz@@parse@pin@active[#1]\tikz@pin@default@pos:#2:\pgf@nil%
|
|
\else
|
|
\tikz@@parse@pin@active[#1]#2:#3\pgf@nil%
|
|
\fi}%
|
|
|
|
\long\gdef\tikz@@parse@pin@active[#1]#2:#3:\pgf@nil{%
|
|
\tikzset{%
|
|
append after command = {%
|
|
\bgroup
|
|
[current point is local = true]
|
|
\pgfextra{\let\tikz@save@last@node=\tikzlastnode\tikz@node@is@a@labelfalse}%
|
|
node [tikz@label@angle = #2,
|
|
anchor=@auto,
|
|
every pin,
|
|
#1,
|
|
append after command = {%
|
|
(\tikz@save@last@node)
|
|
edge [every pin edge,
|
|
tikz@pre@pin@edge,
|
|
tikz@pin@options]
|
|
(\tikzlastnode)},
|
|
tikz@label@post = \tikz@pin@distance,
|
|
tikz@pin@post] {#3}
|
|
\egroup}}}%
|
|
\endgroup
|
|
|
|
\long\def\tikz@parse@pin@nonactive[#1]#2:#3\pgf@nil{%
|
|
\def\tikz@temp{#3}%
|
|
\ifx\tikz@temp\pgfutil@empty
|
|
% no position, use default
|
|
\tikz@@parse@pin@nonactive[#1]\tikz@pin@default@pos:#2:\pgf@nil%
|
|
\else
|
|
\tikz@@parse@pin@nonactive[#1]#2:#3\pgf@nil%
|
|
\fi}%
|
|
|
|
\long\def\tikz@@parse@pin@nonactive[#1]#2:#3:\pgf@nil{%
|
|
\tikzset{%
|
|
append after command = {%
|
|
\bgroup
|
|
[current point is local = true]
|
|
\pgfextra{\let\tikz@save@last@node=\tikzlastnode\tikz@node@is@a@labelfalse}%
|
|
node [tikz@label@angle = #2,
|
|
anchor=@auto,
|
|
every pin,
|
|
#1,
|
|
append after command = {%
|
|
(\tikz@save@last@node)
|
|
edge [every pin edge,
|
|
tikz@pre@pin@edge,
|
|
tikz@pin@options]
|
|
(\tikzlastnode)},
|
|
tikz@label@post = \tikz@pin@distance,
|
|
tikz@pin@post] {#3}
|
|
\egroup}}}%
|
|
|
|
% Label and pin options
|
|
|
|
\tikzset{
|
|
label distance/.store in=\tikz@label@distance,
|
|
label distance=0pt,
|
|
label position/.store in=\tikz@label@default@pos,
|
|
label position=above,
|
|
absolute/.is if=tikz@absolute,
|
|
tikz@label@angle/.store in=\tikz@label@angle
|
|
}%
|
|
|
|
\newif\iftikz@absolute
|
|
\def\tikz@on@text{center}%
|
|
|
|
\tikzset{tikz@label@post/.code 2 args={
|
|
\edef\tikz@label@angle{\tikz@label@angle}%
|
|
\expandafter\pgfkeys@spdef\expandafter\tikz@label@angle\expandafter{\tikz@label@angle}%
|
|
\csname tikz@label@angle@is@\tikz@label@angle\endcsname
|
|
\ifx\tikz@label@angle\tikz@on@text%
|
|
\def\tikz@node@at{\pgfpointanchor{\tikzlastnode}{center}}%
|
|
\def\tikz@anchor{center}%
|
|
\else%
|
|
\iftikz@absolute%
|
|
\pgftransformreset%
|
|
\pgf@process{%
|
|
\pgfpointshapeborder{\tikzlastnode}%
|
|
{\pgfpointadd{\pgfpointanchor{\tikzlastnode}{center}}{\pgfpointpolar{\tikz@label@angle}{1pt}}}}%
|
|
\edef\tikz@node@at{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
\tikz@compute@direction{\tikz@label@angle}%
|
|
\tikz@addtransform{\pgftransformshift{\pgfpointpolar{\tikz@label@angle}{#1}}}%
|
|
\else%
|
|
\pgf@process{\pgfpointanchor{\tikzlastnode}{\tikz@label@angle}}%
|
|
\edef\tikz@node@at{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\pgf@process{\pgfpointanchor{\tikzlastnode}{center}}%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\tikz@label@simplefalse%
|
|
\iftikz@fullytransformed%
|
|
\tikz@label@simpletrue%
|
|
\else
|
|
\ifdim\pgf@xc=\pgf@xb\relax%
|
|
\ifdim\pgf@yc=\pgf@yb\relax%
|
|
\tikz@label@simpletrue%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\iftikz@label@simple%
|
|
\tikz@compute@direction{\tikz@label@angle}%
|
|
\tikz@addtransform{\pgftransformshift{\pgfpointpolar{\tikz@label@angle}{#1}}}%
|
|
\else%
|
|
\pgf@process{\pgfpointnormalised{%
|
|
\pgfpointdiff{\pgfpointtransformed{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgfpointtransformed{\pgfqpoint{\pgf@xb}{\pgf@yb}}}}}%
|
|
\edef\pgf@marshal{%
|
|
\noexpand\tikz@addtransform{\noexpand\pgftransformshift{\noexpand\pgfpointscale{#1}{
|
|
\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}}}%
|
|
\pgf@marshal%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\pgf@x=\pgf@yc%
|
|
\pgf@y=-\pgf@xc%
|
|
\ifx\tikz@anchor\tikz@auto@text%
|
|
\tikz@auto@anchor%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi}
|
|
}%
|
|
|
|
\newif\iftikz@label@simple%
|
|
|
|
\tikzset{%
|
|
label/.code={%
|
|
\begingroup
|
|
\ifnum\the\catcode`\:=\active\relax
|
|
\def\tikz@next{%
|
|
\endgroup
|
|
\tikz@parse@label@active@i{#1}}%
|
|
\else
|
|
\def\tikz@next{%
|
|
\endgroup
|
|
\pgfutil@ifnextchar[%]
|
|
{\tikz@parse@label@nonactive}
|
|
{\tikz@parse@label@nonactive[]}#1:\pgf@nil}%
|
|
\fi
|
|
\tikz@next}}%
|
|
|
|
\begingroup
|
|
\catcode`\:=\active\relax
|
|
|
|
\gdef\tikz@parse@label@active@i#1{%
|
|
\pgfutil@ifnextchar[%]
|
|
{\tikz@parse@label@active}
|
|
{\tikz@parse@label@active[]}#1:\pgf@nil}%
|
|
|
|
\gdef\tikz@parse@label@active[#1]#2:#3\pgf@nil{%
|
|
\def\tikz@temp{#3}%
|
|
\ifx\tikz@temp\pgfutil@empty
|
|
% no position, use default
|
|
\tikz@@parse@label@active[#1]\tikz@label@default@pos:#2:\pgf@nil%
|
|
\else
|
|
\def\tikz@temp{#2}%
|
|
\ifx\tikz@temp\pgfutil@empty
|
|
\tikz@@parse@label@active[#1]\tikz@label@default@pos:#3\pgf@nil%
|
|
\else
|
|
\tikz@@parse@label@active[#1]#2:#3\pgf@nil%
|
|
\fi
|
|
\fi
|
|
}%
|
|
|
|
\gdef\tikz@@parse@label@active[#1]#2:#3:\pgf@nil{%
|
|
\tikzset{%
|
|
append after command = {%
|
|
\bgroup
|
|
[current point is local=true]
|
|
\pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name\tikz@node@is@a@labelfalse}
|
|
node [tikz@label@angle = #2,
|
|
anchor=@auto,
|
|
every label,
|
|
#1,
|
|
tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\scantokens\else\expandafter\pgfutil@firstofone\fi{#3\noexpand}}
|
|
\pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}
|
|
\egroup}}}%
|
|
\endgroup
|
|
|
|
\def\tikz@parse@label@nonactive[#1]#2:#3\pgf@nil{%
|
|
\def\tikz@temp{#3}%
|
|
\ifx\tikz@temp\pgfutil@empty
|
|
% no position, use default
|
|
\tikz@@parse@label@nonactive[#1]\tikz@label@default@pos:#2:\pgf@nil%
|
|
\else
|
|
\def\tikz@temp{#2}%
|
|
\ifx\tikz@temp\pgfutil@empty
|
|
\tikz@@parse@label@nonactive[#1]\tikz@label@default@pos:#3\pgf@nil%
|
|
\else
|
|
\tikz@@parse@label@nonactive[#1]#2:#3\pgf@nil%
|
|
\fi
|
|
\fi
|
|
}%
|
|
|
|
\def\tikz@@parse@label@nonactive[#1]#2:#3:\pgf@nil{%
|
|
\tikzset{%
|
|
append after command = {%
|
|
\bgroup
|
|
[current point is local=true]
|
|
\pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name\tikz@node@is@a@labelfalse}
|
|
node [tikz@label@angle = #2,
|
|
anchor=@auto,
|
|
every label,
|
|
#1,
|
|
tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\scantokens\else\expandafter\pgfutil@firstofone\fi{#3\noexpand}}
|
|
\pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}
|
|
\egroup}}}%
|
|
|
|
\expandafter\def\csname tikz@label@angle@is@right\endcsname{\def\tikz@label@angle{0}}%
|
|
\expandafter\def\csname tikz@label@angle@is@above right\endcsname{\def\tikz@label@angle{45}}%
|
|
\expandafter\def\csname tikz@label@angle@is@above\endcsname{\def\tikz@label@angle{90}}%
|
|
\expandafter\def\csname tikz@label@angle@is@above left\endcsname{\def\tikz@label@angle{135}}%
|
|
\expandafter\def\csname tikz@label@angle@is@left\endcsname{\def\tikz@label@angle{180}}%
|
|
\expandafter\def\csname tikz@label@angle@is@below left\endcsname{\def\tikz@label@angle{225}}%
|
|
\expandafter\def\csname tikz@label@angle@is@below\endcsname{\def\tikz@label@angle{270}}%
|
|
\expandafter\def\csname tikz@label@angle@is@below right\endcsname{\def\tikz@label@angle{315}}%
|
|
|
|
\def\tikz@compute@direction#1{%
|
|
\ifx\tikz@anchor\tikz@auto@text%
|
|
\let\tikz@do@auto@anchor=\relax
|
|
\pgfmathsetcount{\c@pgf@counta}{#1}%
|
|
\ifnum\c@pgf@counta<0\relax
|
|
\advance\c@pgf@counta by 360\relax%
|
|
\fi%
|
|
\ifnum\c@pgf@counta>359\relax
|
|
\advance\c@pgf@counta by-360\relax%
|
|
\fi%
|
|
\ifnum\c@pgf@counta<4\relax%
|
|
\def\tikz@anchor{west}%
|
|
\else\ifnum\c@pgf@counta<87\relax%
|
|
\def\tikz@anchor{south west}%
|
|
\else\ifnum\c@pgf@counta<94\relax%
|
|
\def\tikz@anchor{south}%
|
|
\else\ifnum\c@pgf@counta<177\relax%
|
|
\def\tikz@anchor{south east}%
|
|
\else\ifnum\c@pgf@counta<184\relax%
|
|
\def\tikz@anchor{east}%
|
|
\else\ifnum\c@pgf@counta<267\relax%
|
|
\def\tikz@anchor{north east}%
|
|
\else\ifnum\c@pgf@counta<274\relax%
|
|
\def\tikz@anchor{north}%
|
|
\else\ifnum\c@pgf@counta<357\relax%
|
|
\def\tikz@anchor{north west}%
|
|
\else%
|
|
\def\tikz@anchor{west}%
|
|
\fi\fi\fi\fi\fi\fi\fi\fi%
|
|
\fi%
|
|
}%
|
|
\def\tikz@auto@text{@auto}%
|
|
|
|
% General node options
|
|
\tikzset{
|
|
name/.code={\edef\tikz@fig@name{\tikz@pp@name{#1}}\let\tikz@id@name\tikz@fig@name},%
|
|
name prefix/.initial=,%
|
|
name suffix/.initial=%
|
|
}%
|
|
\def\tikz@pp@name#1{\csname pgfk@/tikz/name prefix\endcsname#1\csname pgfk@/tikz/name suffix\endcsname}%
|
|
|
|
|
|
\tikzset{
|
|
node contents/.code=\def\tikz@node@content{#1},
|
|
pic type/.code=\def\tikz@node@content{#1}, % alias
|
|
}%
|
|
|
|
\tikzset{
|
|
behind path/.code=\def\tikz@whichbox{\tikz@figbox@bg},
|
|
in front of path/.code=\def\tikz@whichbox{\tikz@figbox}
|
|
}%
|
|
\def\tikz@whichbox{\tikz@figbox}%
|
|
|
|
\tikzoption{at}{\tikz@scan@one@point\tikz@set@at#1}%
|
|
\def\tikz@set@at#1{\def\tikz@node@at{#1}}%
|
|
|
|
\tikzoption{shape}{\edef\tikz@shape{#1}}%
|
|
|
|
\tikzoption{nodes}{\tikzset{every node/.append style={#1}}}%
|
|
|
|
\tikzset{alias/.code={%
|
|
\tikz@fig@mustbenamed
|
|
\begingroup
|
|
\toks0=\expandafter{\tikz@alias}%
|
|
\edef\pgf@temp{\noexpand\pgfnodealias{\tikz@pp@name{#1}}{\noexpand\tikz@fig@name}}%
|
|
\toks1=\expandafter{\pgf@temp}%
|
|
\xdef\pgf@marshal{%
|
|
\noexpand\def\noexpand\tikz@alias{\the\toks0 \the\toks1 }%
|
|
}%
|
|
\endgroup
|
|
\pgf@marshal
|
|
}}%
|
|
|
|
% deprecated:
|
|
\def\tikzaddafternodepathoption#1{#1\tikzset{prefix after command={\pgfextra{#1}}}}%
|
|
\tikzset{after node path/.style={append after command={#1}}}%
|
|
|
|
|
|
% Pic options
|
|
\newif\iftikz@node@is@pic
|
|
\tikzset{pic text/.store in=\tikzpictext}%
|
|
\let\tikzpictext\relax
|
|
\tikzset{pic text options/.store in=\tikzpictextoptions}%
|
|
\let\tikzpictextoptions\pgfutil@empty
|
|
|
|
|
|
% Anchoring
|
|
|
|
\tikzoption{anchor}{\def\tikz@anchor{#1}\let\tikz@do@auto@anchor=\relax}%
|
|
|
|
\tikzoption{left}[]{\def\tikz@anchor{east}\tikz@possibly@transform{x}{-}{#1}}%
|
|
\tikzoption{right}[]{\def\tikz@anchor{west}\tikz@possibly@transform{x}{}{#1}}%
|
|
\tikzoption{above}[]{\def\tikz@anchor{south}\tikz@possibly@transform{y}{}{#1}}%
|
|
\tikzoption{below}[]{\def\tikz@anchor{north}\tikz@possibly@transform{y}{-}{#1}}%
|
|
\tikzoption{above left}[]%
|
|
{\def\tikz@anchor{south east}%
|
|
\tikz@possibly@transform{x}{-}{#1}\tikz@possibly@transform{y}{}{#1}}%
|
|
\tikzoption{above right}[]%
|
|
{\def\tikz@anchor{south west}%
|
|
\tikz@possibly@transform{x}{}{#1}\tikz@possibly@transform{y}{}{#1}}%
|
|
\tikzoption{below left}[]%
|
|
{\def\tikz@anchor{north east}%
|
|
\tikz@possibly@transform{x}{-}{#1}\tikz@possibly@transform{y}{-}{#1}}%
|
|
\tikzoption{below right}[]%
|
|
{\def\tikz@anchor{north west}%
|
|
\tikz@possibly@transform{x}{}{#1}\tikz@possibly@transform{y}{-}{#1}}%
|
|
\tikzset{centered/.code=\def\tikz@anchor{center}}%
|
|
|
|
\tikzoption{node distance}{\def\tikz@node@distance{#1}}%
|
|
\def\tikz@node@distance{1cm}%
|
|
|
|
% The following are deprecated:
|
|
\tikzoption{above of}{\tikz@of{#1}{90}}%
|
|
\tikzoption{below of}{\tikz@of{#1}{-90}}%
|
|
\tikzoption{left of}{\tikz@of{#1}{180}}%
|
|
\tikzoption{right of}{\tikz@of{#1}{0}}%
|
|
\tikzoption{above left of}{\tikz@of{#1}{135}}%
|
|
\tikzoption{below left of}{\tikz@of{#1}{-135}}%
|
|
\tikzoption{above right of}{\tikz@of{#1}{45}}%
|
|
\tikzoption{below right of}{\tikz@of{#1}{-45}}%
|
|
\def\tikz@of#1#2{%
|
|
\def\tikz@anchor{center}%
|
|
\let\tikz@do@auto@anchor=\relax%
|
|
\tikz@addtransform{%
|
|
\expandafter\tikz@extract@node@dist\tikz@node@distance and\pgf@stop%
|
|
\pgftransformshift{\pgfpointpolar{#2}{\tikz@extracted@node@distance}}}%
|
|
\def\tikz@node@at{\pgfpointanchor{\tikz@pp@name{#1}}{center}}}%
|
|
\def\tikz@extract@node@dist#1and#2\pgf@stop{%
|
|
\def\tikz@extracted@node@distance{#1}}%
|
|
|
|
\tikzset{
|
|
transform shape nonlinear/.is choice,
|
|
transform shape nonlinear/.default=true,
|
|
transform shape nonlinear/true/.code=\let\tikz@nlt\relax,
|
|
transform shape nonlinear/false/.code=\def\tikz@nlt{\pgfapproximatenonlineartranslation},
|
|
transform shape nonlinear=false,
|
|
}%
|
|
|
|
|
|
\tikzoption{transform shape}[true]{%
|
|
\csname tikz@fullytransformed#1\endcsname%
|
|
\iftikz@fullytransformed%
|
|
\pgfresetnontranslationattimefalse%
|
|
\else%
|
|
\pgfresetnontranslationattimetrue%
|
|
\fi%
|
|
}%
|
|
|
|
\newif\iftikz@fullytransformed
|
|
\pgfresetnontranslationattimetrue%
|
|
|
|
\def\tikz@anchor{center}%
|
|
\def\tikz@shape{rectangle}%
|
|
|
|
\def\tikz@possibly@transform#1#2#3{%
|
|
\let\tikz@do@auto@anchor=\relax%
|
|
\def\tikz@test{#3}%
|
|
\ifx\tikz@test\pgfutil@empty%
|
|
\else%
|
|
\pgfmathsetlength{\pgf@x}{#3}%
|
|
\pgf@x=#2\pgf@x\relax%
|
|
\edef\tikz@marshal{\noexpand\tikz@addtransform{%
|
|
\expandafter\noexpand\csname pgftransform#1shift\endcsname{\the\pgf@x}}}%
|
|
\tikz@marshal%
|
|
\fi%
|
|
}%
|
|
|
|
|
|
% Inter-picture options
|
|
\tikzoption{remember picture}[true]{\csname pgfrememberpicturepositiononpage#1\endcsname}
|
|
\tikzset{
|
|
overlay/.is choice,
|
|
overlay/true/.code={\pgf@relevantforpicturesizefalse},
|
|
overlay/false/.code={\pgf@relevantforpicturesizetrue},
|
|
overlay/.default=true
|
|
}
|
|
|
|
|
|
|
|
% Line/curve label placement options
|
|
\tikzoption{sloped}[true]{\csname pgfslopedattime#1\endcsname}%
|
|
\tikzoption{allow upside down}[true]{\csname pgfallowupsidedownattime#1\endcsname}%
|
|
|
|
\tikzoption{pos}{\edef\tikz@time{#1}\ifx\tikz@time\pgfutil@empty\else\pgfmathsetmacro\tikz@time{\tikz@time}\fi}%
|
|
|
|
\tikzoption{auto}[]{\csname tikz@install@auto@anchor@#1\endcsname}%
|
|
\tikzoption{swap}[]{%
|
|
\def\tikz@temp{left}%
|
|
\ifx\tikz@auto@anchor@direction\tikz@temp%
|
|
\def\tikz@auto@anchor@direction{right}%
|
|
\else%
|
|
\def\tikz@auto@anchor@direction{left}%
|
|
\fi%
|
|
}%
|
|
\tikzset{'/.style=swap}% shorthand
|
|
|
|
|
|
\def\tikz@install@auto@anchor@{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on}%
|
|
\def\tikz@install@auto@anchor@false{\let\tikz@do@auto@anchor=\relax}%
|
|
\def\tikz@install@auto@anchor@left{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on\def\tikz@auto@anchor@direction{left}}%
|
|
\def\tikz@install@auto@anchor@right{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on\def\tikz@auto@anchor@direction{right}}%
|
|
|
|
\let\tikz@do@auto@anchor=\relax%
|
|
|
|
\def\tikz@auto@anchor@on{\csname tikz@auto@anchor@\tikz@auto@anchor@direction\endcsname}
|
|
|
|
\def\tikz@auto@anchor@left{\tikz@auto@pre\tikz@auto@anchor\tikz@auto@post}%
|
|
\def\tikz@auto@anchor@right{\tikz@auto@pre\tikz@auto@anchor@prime\tikz@auto@post}%
|
|
|
|
\def\tikz@auto@anchor@direction{left}%
|
|
|
|
% Text options
|
|
\tikzoption{text}{\def\tikz@textcolor{#1}}%
|
|
\tikzoption{font}{\def\tikz@textfont{#1}}%
|
|
\tikzoption{node font}{\def\tikz@node@textfont{#1}}%
|
|
\tikzoption{text opacity}{\def\tikz@textopacity{#1}}%
|
|
\tikzoption{text width}{\def\tikz@text@width{#1}}%
|
|
\tikzoption{text height}{\def\tikz@text@height{#1}}%
|
|
\tikzoption{text depth}{\def\tikz@text@depth{#1}}%
|
|
\tikzoption{text ragged}[]%
|
|
{\def\tikz@text@action{\pgfutil@raggedright\rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}}%
|
|
\tikzoption{text badly ragged}[]{\def\tikz@text@action{\pgfutil@raggedright\relax}}%
|
|
\tikzoption{text ragged left}[]%
|
|
{\def\tikz@text@action{\pgfutil@raggedleft\leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}}%
|
|
\tikzoption{text badly ragged left}[]{\def\tikz@text@action{\pgfutil@raggedleft\relax}}%
|
|
\tikzoption{text justified}[]{\def\tikz@text@action{\leftskip0pt\rightskip0pt\relax}}%
|
|
\tikzoption{text centered}[]{\def\tikz@text@action{%
|
|
\leftskip0pt plus2em%
|
|
\rightskip0pt plus2em%
|
|
\spaceskip.3333em \xspaceskip.5em%
|
|
\parfillskip=0pt%
|
|
\iftikz@warn@for@narrow@centered\else\hbadness10000\fi%
|
|
\let\\=\@centercr% for latex
|
|
\relax}}%
|
|
\tikzoption{text badly centered}[]%
|
|
{\def\tikz@text@action{%
|
|
\let\\=\@centercr% for latex
|
|
\parfillskip=0pt%
|
|
\rightskip\pgfutil@flushglue%
|
|
\leftskip\pgfutil@flushglue\relax}}%
|
|
\tikzset{badness warnings for centered text/.is if=tikz@warn@for@narrow@centered}%
|
|
\newif\iftikz@warn@for@narrow@centered
|
|
|
|
\def\tikz@text@reset{%
|
|
\let\tikz@text@width=\pgfutil@empty
|
|
\let\tikz@text@height=\pgfutil@empty
|
|
\let\tikz@text@depth=\pgfutil@empty
|
|
\let\tikz@textcolor=\pgfutil@empty
|
|
\let\tikz@textfont=\pgfutil@empty
|
|
\let\tikz@textopacity=\pgfutil@empty
|
|
\let\tikz@node@textfont=\pgfutil@empty
|
|
\def\tikz@text@action{\pgfutil@raggedright\rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}%
|
|
}
|
|
\tikz@text@reset
|
|
|
|
|
|
% Alignment
|
|
\tikzset{
|
|
node halign header/.initial=,
|
|
align/.is choice,
|
|
align/left/.style ={text ragged,node halign header=\tikz@align@left@header},
|
|
align/flush left/.style ={text badly ragged,node halign header=\tikz@align@left@header},
|
|
align/right/.style ={text ragged left,node halign header=\tikz@align@right@header},
|
|
align/flush right/.style ={text badly ragged left,node halign header=\tikz@align@right@header},
|
|
align/center/.style={text centered,node halign header=\tikz@align@center@header},
|
|
align/flush center/.style={text badly centered,node halign header=\tikz@align@center@header},
|
|
align/justify/.style ={text justified,node halign header=\tikz@align@left@header},
|
|
align/none/.style ={text justified,node halign header=},
|
|
}%
|
|
\def\tikz@align@left@header{##\hfil\cr}%
|
|
\def\tikz@align@right@header{\hfil##\cr}%
|
|
\def\tikz@align@center@header{\hfil##\hfil\cr}%
|
|
|
|
|
|
|
|
% Arrow options
|
|
\tikzoption{arrows}{\tikz@processarrows{#1}}%
|
|
|
|
|
|
\tikzoption{>}{\pgfdeclarearrow{name=<->,means={#1}}}%
|
|
\pgfdeclarearrow{name=|<->|, means={>[sep=0pt].|}}%
|
|
|
|
\tikzoption{shorten <}{\pgfsetshortenstart{#1}}%
|
|
\tikzoption{shorten >}{\pgfsetshortenend{#1}}%
|
|
|
|
\def\tikz@processarrows#1{%
|
|
\def\tikz@current@arrows{#1}%
|
|
\def\tikz@temp{#1}%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\else%
|
|
\pgfsetarrows{#1}%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@current@arrows{-}%
|
|
|
|
% Parabola options
|
|
\tikzoption{bend}{\tikz@scan@one@point\tikz@set@parabola@bend#1\relax}%
|
|
\tikzoption{bend pos}{\def\tikz@parabola@bend@factor{#1}}%
|
|
\tikzoption{parabola height}{%
|
|
\def\tikz@parabola@bend@factor{.5}%
|
|
\def\tikz@parabola@bend{\pgfpointadd{\pgfpoint{0pt}{#1}}{\tikz@last@position@saved}}}%
|
|
|
|
\def\tikz@parabola@bend{\tikz@last@position@saved}%
|
|
\def\tikz@parabola@bend@factor{0}%
|
|
|
|
\def\tikz@set@parabola@bend#1{\def\tikz@parabola@bend{#1}}%
|
|
|
|
% Axis options
|
|
\tikzoption{domain}{\edef\tikz@plot@domain{#1}\expandafter\tikz@plot@samples@recalc\tikz@plot@domain\relax}%
|
|
\tikzoption{range}{\def\tikz@plot@range{#1}}%
|
|
\tikzoption{yrange}{\def\tikz@plot@range{#1}}%
|
|
\let\tikz@plot@range=\pgfutil@empty
|
|
\tikzoption{xrange}{\def\tikz@plot@xrange{#1}}%
|
|
\let\tikz@plot@xrange=\pgfutil@empty
|
|
|
|
% Plot options
|
|
\tikzoption{smooth}[]{\let\tikz@plot@handler=\pgfplothandlercurveto}%
|
|
\tikzoption{smooth cycle}[]{\let\tikz@plot@handler=\pgfplothandlerclosedcurve}%
|
|
\tikzoption{sharp plot}[]{\let\tikz@plot@handler\pgfplothandlerlineto}%
|
|
\tikzoption{sharp cycle}[]{\let\tikz@plot@handler\pgfplothandlerpolygon}%
|
|
|
|
\tikzoption{tension}{\pgfsetplottension{#1}}%
|
|
|
|
\tikzoption{xcomb}[]{\let\tikz@plot@handler=\pgfplothandlerxcomb}%
|
|
\tikzoption{ycomb}[]{\let\tikz@plot@handler=\pgfplothandlerycomb}%
|
|
\tikzoption{polar comb}[]{\let\tikz@plot@handler=\pgfplothandlerpolarcomb}%
|
|
\tikzoption{ybar}[]{\let\tikz@plot@handler=\pgfplothandlerybar}%
|
|
\tikzoption{ybar interval}[]{\let\tikz@plot@handler=\pgfplothandlerybarinterval}%
|
|
\tikzoption{xbar interval}[]{\let\tikz@plot@handler=\pgfplothandlerxbarinterval}%
|
|
\tikzoption{xbar}[]{\let\tikz@plot@handler=\pgfplothandlerxbar}%
|
|
\tikzoption{const plot}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlineto}%
|
|
\tikzoption{const plot mark left}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlineto}%
|
|
\tikzoption{const plot mark right}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlinetomarkright}%
|
|
\tikzoption{const plot mark mid}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlinetomarkmid}%
|
|
\tikzoption{jump mark right}[]{\let\tikz@plot@handler=\pgfplothandlerjumpmarkright}%
|
|
\tikzoption{jump mark mid}[]{\let\tikz@plot@handler=\pgfplothandlerjumpmarkmid}%
|
|
\tikzoption{jump mark left}[]{\let\tikz@plot@handler=\pgfplothandlerjumpmarkleft}%
|
|
|
|
\tikzoption{raw gnuplot}[true]{\csname tikz@plot@raw@gnuplot#1\endcsname}%
|
|
\tikzoption{prefix}{\def\tikz@plot@prefix{#1}}%
|
|
\tikzoption{id}{\def\tikz@plot@id{#1}}%
|
|
|
|
\tikzoption{samples}{\pgfmathsetmacro\tikz@plot@samples{max(2,#1)}\expandafter\tikz@plot@samples@recalc\tikz@plot@domain\relax}%
|
|
\tikzoption{samples at}{\def\tikz@plot@samplesat{#1}}%
|
|
\tikzoption{parametric}[true]{\csname tikz@plot@parametric#1\endcsname}%
|
|
|
|
\tikzoption{variable}{\def\tikz@plot@var{#1}}%
|
|
|
|
\tikzoption{only marks}[]{\let\tikz@plot@handler\pgfplothandlerdiscard}%
|
|
|
|
\tikzoption{mark}{%
|
|
\def\tikz@plot@mark{#1}%
|
|
\def\tikz@temp{none}%
|
|
\ifx\tikz@temp\tikz@plot@mark
|
|
\let\tikz@plot@mark=\pgfutil@empty
|
|
\fi
|
|
}%
|
|
\tikzset{
|
|
no marks/.style={mark=none},%
|
|
no markers/.style={mark=none},%
|
|
every mark/.style={},
|
|
mark options/.style={%
|
|
every mark/.style={#1}%
|
|
}}%
|
|
\tikzoption{mark size}{\pgfsetplotmarksize{#1}}%
|
|
|
|
\tikzoption{mark indices}{\def\tikz@mark@list{#1}}%
|
|
\tikzoption{mark phase}{\pgfsetplotmarkphase{#1}}%
|
|
\tikzoption{mark repeat}{\pgfsetplotmarkrepeat{#1}}%
|
|
|
|
\let\tikz@mark@list=\pgfutil@empty
|
|
|
|
\let\tikz@plot@handler=\pgfplothandlerlineto
|
|
\let\tikz@plot@mark=\pgfutil@empty
|
|
|
|
\def\tikz@plot@samples{25}%
|
|
\def\tikz@plot@domain{-5:5}%
|
|
\def\tikz@plot@var{\x}%
|
|
\def\tikz@plot@samplesat{-5,-4.5833333,...,5}%
|
|
\def\tikz@plot@samples@recalc#1:#2\relax{%
|
|
\begingroup
|
|
\pgfmathparse{#1}%
|
|
\let\tikz@temp@start=\pgfmathresult%
|
|
\pgfmathparse{#2}%
|
|
\let\tikz@temp@end=\pgfmathresult%
|
|
\pgfmathsetmacro\tikz@temp@diff{(\tikz@temp@end-\tikz@temp@start)/(\tikz@plot@samples-1)}%
|
|
%
|
|
% this particular item is for backwards compatibility.
|
|
% Pgfplots <= 1.8 called 'samples' in a context where the 'fpu' was
|
|
% active... and I fear there is no simple solution to replace the
|
|
% new \ifdim below. Sorry.
|
|
\pgfkeys{/pgf/fpu/output format/fixed/.try}%
|
|
%
|
|
\pgfmathsetmacro\tikz@temp@diff@abs{abs(\tikz@temp@diff)}%
|
|
\ifdim\tikz@temp@diff@abs pt<0.0001pt\relax%
|
|
\edef\tikz@plot@samplesat{\tikz@temp@start,\tikz@temp@end}%
|
|
\else%
|
|
\pgfmathparse{\tikz@temp@start+\tikz@temp@diff}%
|
|
\edef\tikz@plot@samplesat{\tikz@temp@start,\pgfmathresult,...,\tikz@temp@end}%
|
|
\fi%
|
|
\pgfmath@smuggleone\tikz@plot@samplesat
|
|
\endgroup
|
|
}%
|
|
|
|
|
|
\def\tikz@plot@prefix{\jobname.}%
|
|
\def\tikz@plot@id{pgf-plot}%
|
|
|
|
\newif\iftikz@plot@parametric
|
|
\newif\iftikz@plot@raw@gnuplot
|
|
|
|
|
|
%
|
|
% To and edge options
|
|
%
|
|
\tikzoption{to path}{\def\tikz@to@path{#1}}%
|
|
|
|
\def\tikz@to@path{-- (\tikztotarget) \tikztonodes}%
|
|
|
|
\tikzset{edge macro/.store in=\tikz@edge@macro}%
|
|
\let\tikz@edge@macro\pgfutil@empty
|
|
|
|
\tikzset{
|
|
edge node/.code={
|
|
\expandafter\def\expandafter\tikz@tonodes\expandafter{\tikz@tonodes #1}
|
|
},
|
|
edge label/.style={/tikz/edge node={node[auto]{#1}}},
|
|
edge label'/.style={/tikz/edge node={node[auto,swap]{#1}}},
|
|
}%
|
|
|
|
|
|
% After command options
|
|
\tikzset{
|
|
append after command/.code=\expandafter\def\expandafter\tikz@after@path\expandafter{\tikz@after@path#1},
|
|
prefix after command/.code={%
|
|
\def\tikz@temp{#1}%
|
|
\expandafter\expandafter\expandafter\def%
|
|
\expandafter\expandafter\expandafter\tikz@after@path%
|
|
\expandafter\expandafter\expandafter{%
|
|
\expandafter\tikz@temp\tikz@after@path}%
|
|
},
|
|
}%
|
|
\let\tikz@after@path\pgfutil@empty
|
|
|
|
|
|
% Tree options
|
|
\newif\iftikz@child@missing
|
|
\pgfkeys{/tikz/missing/.is if=tikz@child@missing}%
|
|
|
|
\tikzset{edge from parent macro/.initial=\tikz@edge@from@parent@macro}%
|
|
\def\tikz@edge@from@parent@macro#1#2{
|
|
[style=edge from parent, #1, /utils/exec=\tikz@node@is@a@labeltrue] \tikz@edge@to@parent@path #2}%
|
|
|
|
\tikzoption{edge from parent path}{\def\tikz@edge@to@parent@path{#1}}%
|
|
|
|
\tikzoption{parent anchor}{\def\tikzparentanchor{.#1}\ifx\tikzparentanchor\tikz@border@text\let\tikzparentanchor\pgfutil@empty\fi}%
|
|
\tikzoption{child anchor}{\def\tikzchildanchor{.#1}\ifx\tikzchildanchor\tikz@border@text\let\tikzchildanchor\pgfutil@empty\fi}%
|
|
|
|
\tikzoption{level distance}{\pgfmathsetlength\tikzleveldistance{#1}}%
|
|
\tikzoption{sibling distance}{\pgfmathsetlength\tikzsiblingdistance{#1}}%
|
|
|
|
\tikzoption{growth function}{\let\tikz@grow=#1}%
|
|
|
|
\tikzset{grow siblings on line/.style={growth function=\tikz@grow@direction}}%
|
|
|
|
\tikzoption{growth parent anchor}{\def\tikz@growth@anchor{#1}}%
|
|
\tikzoption{grow}{\tikz@set@growth{#1}\edef\tikz@special@level{\the\tikztreelevel}}%
|
|
\tikzoption{grow'}{\tikz@set@growth{#1}\tikz@swap@growth\edef\tikz@special@level{\the\tikztreelevel}}%
|
|
|
|
\def\tikz@growth@anchor{center}%
|
|
|
|
\def\tikz@special@level{-1}% never
|
|
|
|
\def\tikz@swap@growth{%
|
|
% Swap left and right
|
|
\let\tikz@temp=\tikz@angle@grow@right%
|
|
\let\tikz@angle@grow@right=\tikz@angle@grow@left%
|
|
\let\tikz@angle@grow@left=\tikz@temp%
|
|
}%
|
|
|
|
\def\tikz@set@growth#1{%
|
|
\let\tikz@grow=\tikz@grow@direction%
|
|
\expandafter\ifx\csname tikz@grow@direction@#1\endcsname\relax%
|
|
\c@pgf@counta=#1\relax%
|
|
\else%
|
|
\c@pgf@counta=\csname tikz@grow@direction@#1\endcsname%
|
|
\fi%
|
|
\edef\tikz@angle@grow{\the\c@pgf@counta}%
|
|
\advance\c@pgf@counta by-90\relax%
|
|
\edef\tikz@angle@grow@left{\the\c@pgf@counta}%
|
|
\advance\c@pgf@counta by180\relax%
|
|
\edef\tikz@angle@grow@right{\the\c@pgf@counta}%
|
|
}%
|
|
|
|
\def\tikz@border@text{.border}%
|
|
\let\tikzparentanchor=\pgfutil@empty
|
|
\let\tikzchildanchor=\pgfutil@empty
|
|
\def\tikz@edge@to@parent@path{(\tikzparentnode\tikzparentanchor) -- (\tikzchildnode\tikzchildanchor)}%
|
|
|
|
\tikzleveldistance=15mm%
|
|
\tikzsiblingdistance=15mm%
|
|
|
|
\def\tikz@grow@direction@down{-90}%
|
|
\def\tikz@grow@direction@up{90}%
|
|
\def\tikz@grow@direction@left{180}%
|
|
\def\tikz@grow@direction@right{0}%
|
|
|
|
\def\tikz@grow@direction@south{-90}%
|
|
\def\tikz@grow@direction@north{90}%
|
|
\def\tikz@grow@direction@west{180}%
|
|
\def\tikz@grow@direction@east{0}%
|
|
|
|
\expandafter\def\csname tikz@grow@direction@north east\endcsname{45}%
|
|
\expandafter\def\csname tikz@grow@direction@north west\endcsname{135}%
|
|
\expandafter\def\csname tikz@grow@direction@south east\endcsname{-45}%
|
|
\expandafter\def\csname tikz@grow@direction@south west\endcsname{-135}%
|
|
|
|
\def\tikz@grow@direction{%
|
|
\pgftransformshift{\pgfpointpolar{\tikz@angle@grow}{\tikzleveldistance}}%
|
|
\ifnum\tikztreelevel=\tikz@special@level%
|
|
\else%
|
|
\pgf@xc=.5\tikzsiblingdistance%
|
|
\c@pgf@counta=\tikznumberofchildren%
|
|
\advance\c@pgf@counta by1\relax%
|
|
\pgfutil@tempdima=\c@pgf@counta\pgf@xc%
|
|
\pgftransformshift{\pgfpointpolar{\tikz@angle@grow@left}{\pgfutil@tempdima}}%
|
|
\pgftransformshift{\pgfpointpolar{\tikz@angle@grow@right}{\tikznumberofcurrentchild\tikzsiblingdistance}}%
|
|
\fi%
|
|
}%
|
|
|
|
\tikzset{grow=down}%
|
|
|
|
|
|
% Snakes are in a lib:
|
|
\tikzset{snake/.code=\tikzerror{You need to say \string\usetikzlibrary{snakes}}}%
|
|
|
|
% Decorations
|
|
\tikzset{decorate/.code=\tikzerror{You need to load a decoration library}}%
|
|
|
|
% Matrix options
|
|
\usepgfmodule{matrix}%
|
|
|
|
\tikzoption{matrix}[true]{\csname tikz@is@matrix#1\endcsname}%
|
|
|
|
\tikzoption{matrix anchor}{\def\tikz@matrix@anchor{#1}}%
|
|
|
|
\tikzoption{column sep}{\def\pgfmatrixcolumnsep{#1}}%
|
|
\tikzoption{row sep}{\def\pgfmatrixrowsep{#1}}%
|
|
|
|
\tikzoption{cells}{\tikzset{every cell/.append style={#1}}}%
|
|
|
|
\tikzoption{ampersand replacement}{\def\tikz@ampersand@replacement{#1}}%
|
|
|
|
\newif\iftikz@is@matrix
|
|
\let\tikz@matrix@anchor=\pgfutil@empty
|
|
\let\tikz@ampersand@replacement=\pgfutil@empty
|
|
|
|
|
|
% Automatic shorthand management
|
|
\tikzset{%
|
|
handle active characters in code/.is if=tikz@handle@active@code,
|
|
handle active characters in nodes/.is if=tikz@handle@active@nodes,
|
|
}%
|
|
\newif\iftikz@handle@active@code
|
|
\newif\iftikz@handle@active@nodes
|
|
|
|
|
|
% Execute option
|
|
\tikzoption{execute at begin picture}{\expandafter\def\expandafter\tikz@atbegin@picture\expandafter{\tikz@atbegin@picture#1}}%
|
|
\tikzoption{execute at end picture}{\expandafter\def\expandafter\tikz@atend@picture\expandafter{\tikz@atend@picture#1}}%
|
|
\tikzoption{execute at begin scope}{\expandafter\def\expandafter\tikz@atbegin@scope\expandafter{\tikz@atbegin@scope#1}}%
|
|
\tikzoption{execute at end scope}{\expandafter\def\expandafter\tikz@atend@scope\expandafter{\tikz@atend@scope#1}}%
|
|
\tikzoption{execute at begin to}{\expandafter\def\expandafter\tikz@atbegin@to\expandafter{\tikz@atbegin@to#1}}%
|
|
\tikzoption{execute at end to}{\expandafter\def\expandafter\tikz@atend@to\expandafter{\tikz@atend@to#1}}%
|
|
\tikzoption{execute at begin node}{\expandafter\def\expandafter\tikz@atbegin@node\expandafter{\tikz@atbegin@node#1}}%
|
|
\tikzoption{execute at end node}{\expandafter\def\expandafter\tikz@atend@node\expandafter{\tikz@atend@node#1}}%
|
|
\tikzoption{execute at begin matrix}{\expandafter\def\expandafter\tikz@atbegin@matrix\expandafter{\tikz@atbegin@matrix#1}}%
|
|
\tikzoption{execute at end matrix}{\expandafter\def\expandafter\tikz@atend@matrix\expandafter{\tikz@atend@matrix#1}}%
|
|
\tikzoption{execute at begin cell}{\expandafter\def\expandafter\tikz@atbegin@cell\expandafter{\tikz@atbegin@cell#1}}%
|
|
\tikzoption{execute at end cell}{\expandafter\def\expandafter\tikz@atend@cell\expandafter{\tikz@atend@cell#1}}%
|
|
\tikzoption{execute at empty cell}{\expandafter\def\expandafter\tikz@at@emptycell\expandafter{\tikz@at@emptycell#1}}%
|
|
|
|
\let\tikz@atbegin@picture=\pgfutil@empty
|
|
\let\tikz@atend@picture=\pgfutil@empty
|
|
\let\tikz@atbegin@scope=\pgfutil@empty
|
|
\let\tikz@atend@scope=\pgfutil@empty
|
|
\let\tikz@atbegin@to=\pgfutil@empty
|
|
\let\tikz@atend@to=\pgfutil@empty
|
|
\let\tikz@atbegin@node=\pgfutil@empty
|
|
\let\tikz@atend@node=\pgfutil@empty
|
|
\let\tikz@atbegin@cell=\pgfutil@empty
|
|
\let\tikz@atend@cell=\pgfutil@empty
|
|
\let\tikz@at@emptycell=\pgfutil@empty
|
|
\let\tikz@atbegin@matrix=\pgfutil@empty
|
|
\let\tikz@atend@matrix=\pgfutil@empty
|
|
|
|
|
|
% Pre and post actions
|
|
\tikzset{preaction/.code=\expandafter\def\expandafter\tikz@preactions\expandafter{\tikz@preactions\tikz@extra@preaction{#1}}}%
|
|
\tikzset{postaction/.code=\expandafter\def\expandafter\tikz@postactions\expandafter{\tikz@postactions\tikz@extra@postaction{#1}}}%
|
|
\let\tikz@preactions=\pgfutil@empty
|
|
\let\tikz@postactions=\pgfutil@empty
|
|
|
|
% Styles
|
|
\tikzoption{set style}{\tikzstyle#1}%
|
|
|
|
% Handled in a special way.
|
|
\def\tikzstyle{\pgfutil@ifnextchar\bgroup\tikz@style@parseA\tikz@style@parseB}%
|
|
\def\tikz@style@parseB#1={\tikz@style@parseA{#1}=}%
|
|
\def\tikz@style@parseA#1#2=#3[#4]{% check for an optional argument
|
|
\pgfutil@in@[{#2}%]
|
|
\ifpgfutil@in@%
|
|
\tikz@style@parseC{#1}#2={#4}%
|
|
\else%
|
|
\tikz@style@parseD{#1}#2={#4}%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@style@parseC#1[#2]#3=#4{%
|
|
\pgfkeys{/tikz/#1/.default={#2}}%
|
|
\pgfutil@in@+{#3}%
|
|
\ifpgfutil@in@%
|
|
\pgfkeys{/tikz/#1/.append style={#4}}%
|
|
\else%
|
|
\pgfkeys{/tikz/#1/.style={#4}}%
|
|
\fi}%
|
|
\def\tikz@style@parseD#1#2=#3{%
|
|
\pgfutil@in@+{#2}%
|
|
\ifpgfutil@in@%
|
|
\pgfkeys{/tikz/#1/.append style={#3}}%
|
|
\else%
|
|
\pgfkeys{/tikz/#1/.style={#3}}%
|
|
\fi}%
|
|
|
|
|
|
%
|
|
%
|
|
% Predefined styles
|
|
%
|
|
%
|
|
|
|
\tikzset{help lines/.style= {color=gray,line width=0.2pt}}%
|
|
|
|
\tikzset{every picture/.style= {}}%
|
|
\tikzset{every path/.style= {}}%
|
|
\tikzset{every scope/.style= {}}%
|
|
\tikzset{every plot/.style= {}}%
|
|
\tikzset{every node/.style= {}}%
|
|
\tikzset{every child/.style= {}}%
|
|
\tikzset{every child node/.style= {}}%
|
|
\tikzset{every to/.style= {}}%
|
|
\tikzset{every cell/.style= {}}%
|
|
\tikzset{every matrix/.style= {}}%
|
|
\tikzset{every edge/.style= {draw}}%
|
|
\tikzset{every label/.style= {draw=none,fill=none}}%
|
|
\tikzset{every pin/.style= {draw=none,fill=none}}%
|
|
\tikzset{every pin edge/.style= {help lines}}%
|
|
|
|
\tikzset{ultra thin/.style= {line width=0.1pt}}%
|
|
\tikzset{very thin/.style= {line width=0.2pt}}%
|
|
\tikzset{thin/.style= {line width=0.4pt}}%
|
|
\tikzset{semithick/.style= {line width=0.6pt}}%
|
|
\tikzset{thick/.style= {line width=0.8pt}}%
|
|
\tikzset{very thick/.style= {line width=1.2pt}}%
|
|
\tikzset{ultra thick/.style= {line width=1.6pt}}%
|
|
|
|
\tikzset{solid/.style= {dash pattern=}}%
|
|
\tikzset{dotted/.style= {dash pattern=on \pgflinewidth off 2pt}}%
|
|
\tikzset{densely dotted/.style= {dash pattern=on \pgflinewidth off 1pt}}%
|
|
\tikzset{loosely dotted/.style= {dash pattern=on \pgflinewidth off 4pt}}%
|
|
\tikzset{dashed/.style= {dash pattern=on 3pt off 3pt}}%
|
|
\tikzset{densely dashed/.style= {dash pattern=on 3pt off 2pt}}%
|
|
\tikzset{loosely dashed/.style= {dash pattern=on 3pt off 6pt}}%
|
|
\tikzset{dashdotted/.style= {dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt}}%
|
|
\tikzset{dash dot/.style= {dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt}}%
|
|
\tikzset{densely dashdotted/.style= {dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt}}%
|
|
\tikzset{densely dash dot/.style= {dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt}}%
|
|
\tikzset{loosely dashdotted/.style= {dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt}}%
|
|
\tikzset{loosely dash dot/.style= {dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt}}%
|
|
\tikzset{dashdotdotted/.style= {dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt on \the\pgflinewidth off 2pt}}%
|
|
\tikzset{densely dashdotdotted/.style= {dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt on \the\pgflinewidth off 1pt}}%
|
|
\tikzset{loosely dashdotdotted/.style= {dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt on \the\pgflinewidth off 4pt}}%
|
|
\tikzset{dash dot dot/.style= {dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt on \the\pgflinewidth off 2pt}}%
|
|
\tikzset{densely dash dot dot/.style= {dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt on \the\pgflinewidth off 1pt}}%
|
|
\tikzset{loosely dash dot dot/.style= {dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt on \the\pgflinewidth off 4pt}}%
|
|
|
|
|
|
\tikzset{transparent/.style= {opacity=0}}%
|
|
\tikzset{ultra nearly transparent/.style={opacity=0.05}}%
|
|
\tikzset{very nearly transparent/.style= {opacity=0.1}}%
|
|
\tikzset{nearly transparent/.style= {opacity=0.25}}%
|
|
\tikzset{semitransparent/.style= {opacity=0.5}}%
|
|
\tikzset{nearly opaque/.style= {opacity=0.75}}%
|
|
\tikzset{very nearly opaque/.style= {opacity=0.9}}%
|
|
\tikzset{ultra nearly opaque/.style= {opacity=0.95}}%
|
|
\tikzset{opaque/.style= {opacity=1}}%
|
|
|
|
\tikzset{at start/.style= {pos=0}}%
|
|
\tikzset{very near start/.style= {pos=0.125}}%
|
|
\tikzset{near start/.style= {pos=0.25}}%
|
|
\tikzset{midway/.style= {pos=0.5}}%
|
|
\tikzset{near end/.style= {pos=0.75}}%
|
|
\tikzset{very near end/.style= {pos=0.875}}%
|
|
\tikzset{at end/.style= {pos=1}}%
|
|
|
|
\tikzset{bend at start/.style= {bend pos=0,bend={+(0,0)}}}%
|
|
\tikzset{bend at end/.style= {bend pos=1,bend={+(0,0)}}}%
|
|
|
|
\tikzset{edge from parent/.style= {draw}}%
|
|
|
|
|
|
|
|
% Animation callbacks
|
|
\tikzset{
|
|
animate/.code=\tikzerror{You need to say \string\usetikzlibrary{animations} to use animations}
|
|
}
|
|
|
|
% ID callbacks
|
|
\newif\iftikz@is@node
|
|
\let\tikz@id@name\pgfutil@empty
|
|
\let\tikz@id@hook\pgfutil@empty
|
|
\def\tikz@call@id@hook{\ifx\tikz@id@hook\pgfutil@empty\else\tikz@id@hook\pgfuseid{\tikz@id@name}\fi}%
|
|
|
|
|
|
% RDF stuff
|
|
\let\tikz@clear@rdf@options\relax
|
|
\let\tikz@do@rdf@post@options\relax
|
|
\let\tikz@do@rdf@pre@options\relax
|
|
|
|
|
|
%
|
|
% Setting keys
|
|
%
|
|
|
|
\pgfkeys{/tikz/style/.style=#1}%
|
|
|
|
\pgfkeys{/tikz/.unknown/.code=%
|
|
% Is it a pgf key?
|
|
\let\tikz@key\pgfkeyscurrentname%
|
|
\pgfkeys{/pgf/\tikz@key/.try={#1}}%
|
|
\ifpgfkeyssuccess%
|
|
\else%
|
|
\expandafter\pgfutil@in@\expandafter!\expandafter{\tikz@key}%
|
|
\ifpgfutil@in@%
|
|
% this is a color!
|
|
\expandafter\tikz@addoption\expandafter{\expandafter\tikz@compat@color@set\expandafter{\tikz@key}}%
|
|
\edef\tikz@textcolor{\tikz@key}%
|
|
\else%
|
|
\pgfutil@doifcolorelse{\tikz@key}
|
|
{%
|
|
\expandafter\tikz@addoption\expandafter{\expandafter\tikz@compat@color@set\expandafter{\tikz@key}}%
|
|
\edef\tikz@textcolor{\tikz@key}%
|
|
}%
|
|
{%
|
|
% Ok, second chance: This might be an arrow specification:
|
|
\expandafter\pgfutil@in@\expandafter-\expandafter{\tikz@key}%
|
|
\ifpgfutil@in@%
|
|
% Ah, an arrow spec!
|
|
\expandafter\tikz@processarrows\expandafter{\tikz@key}%
|
|
\else%
|
|
% Ok, third chance: A shape!
|
|
\expandafter\ifx\csname pgf@sh@s@\tikz@key\endcsname\relax%
|
|
\pgfkeys{/errors/unknown key/.expand
|
|
once=\expandafter{\expandafter/\expandafter t\expandafter i\expandafter k\expandafter z\expandafter/\tikz@key}{#1}}%
|
|
\else%
|
|
\edef\tikz@shape{\tikz@key}%
|
|
\fi%
|
|
\fi%
|
|
}%
|
|
\fi%
|
|
\fi%
|
|
}%
|
|
\def\tikz@compat@color@set#1{%
|
|
\pgfutil@color{#1}\pgfutil@colorlet{pgffillcolor}{#1}%
|
|
\expandafter\let\expandafter\pgf@temp\csname\string\color@pgffillcolor\endcsname%
|
|
% for arrow tips:
|
|
\global\let\pgf@strokecolor@global=\pgf@temp
|
|
\global\let\pgf@fillcolor@global=\pgf@temp
|
|
}%
|
|
|
|
\def\tikz@startup@env{%
|
|
\ifnum\the\catcode`\;=\active\relax\expandafter\let\expandafter\tikz@origsemi\expandafter=\tikz@activesemicolon\fi%
|
|
\ifnum\the\catcode`\:=\active\relax\expandafter\let\expandafter\tikz@origcolon\expandafter=\tikz@activecolon\fi%
|
|
\ifnum\the\catcode`\|=\active\relax\expandafter\let\expandafter\tikz@origbar\expandafter=\tikz@activebar\fi%
|
|
\tikz@deactivatthings%
|
|
\iftikz@handle@active@code%
|
|
\tikz@switchoff@shorthands%
|
|
\fi%
|
|
}%
|
|
|
|
%
|
|
% Main TikZ Environment
|
|
%
|
|
\newif\iftikz@inside@picture
|
|
\tikz@inside@picturefalse
|
|
\def\tikz@check@inside@picture{%
|
|
\iftikz@inside@picture%
|
|
\pgfwarning{Nesting tikzpictures is NOT supported}%
|
|
\fi%
|
|
\tikz@inside@picturetrue%
|
|
}
|
|
|
|
\def\tikzpicture{%
|
|
\begingroup%
|
|
\tikz@startup@env%
|
|
\tikz@collect@scope@anims\tikz@picture}%
|
|
\def\tikz@picture[#1]{%
|
|
%\tikz@check@inside@picture%
|
|
\pgfpicture%
|
|
\let\tikz@atbegin@picture=\pgfutil@empty%
|
|
\let\tikz@atend@picture=\pgfutil@empty%
|
|
\let\tikz@transform=\relax%
|
|
\def\tikz@time{.5}%
|
|
\tikz@installcommands%
|
|
\scope[every picture,#1]%
|
|
\iftikz@handle@active@code%
|
|
\tikz@switchoff@shorthands%
|
|
\fi%
|
|
\expandafter\tikz@atbegin@picture%
|
|
\tikz@lib@scope@check%
|
|
}%
|
|
\def\endtikzpicture{%
|
|
\tikz@atend@picture%
|
|
\global\let\pgf@shift@baseline@smuggle=\pgf@baseline%
|
|
\global\let\pgf@trimleft@final@smuggle=\pgf@trimleft%
|
|
\global\let\pgf@trimright@final@smuggle=\pgf@trimright%
|
|
\global\let\pgf@remember@smuggle=\ifpgfrememberpicturepositiononpage%
|
|
\pgf@remember@layerlist@globally
|
|
\endscope%
|
|
\let\pgf@baseline=\pgf@shift@baseline@smuggle%
|
|
\let\pgf@trimleft=\pgf@trimleft@final@smuggle%
|
|
\let\pgf@trimright=\pgf@trimright@final@smuggle%
|
|
\let\ifpgfrememberpicturepositiononpage=\pgf@remember@smuggle%
|
|
\pgf@restore@layerlist@from@global
|
|
\endpgfpicture\endgroup}%
|
|
|
|
|
|
% Inlined picture
|
|
%
|
|
% #1 - some code to be put in a tikzpicture environment.
|
|
%
|
|
% If the command is not followed by braces, everything up to the next
|
|
% semicolon is used as argument.
|
|
%
|
|
% Example:
|
|
%
|
|
% The rectangle \tikz{\draw (0,0) rectangle (1em,1ex)} has width 1em and
|
|
% height 1ex.
|
|
|
|
|
|
\def\tikz{%
|
|
\begingroup%
|
|
\tikz@startup@env%
|
|
\tikz@collect@scope@anims\tikz@opt}%
|
|
\def\tikz@opt[#1]{\tikzpicture[#1]\pgfutil@ifnextchar\bgroup{\tikz@}{\tikz@@single}}%
|
|
\def\tikz@{\bgroup\tikz@auto@end@pathtrue\aftergroup\endtikzpicture\aftergroup\endgroup\let\pgf@temp=}%
|
|
\def\tikz@@single#1{%
|
|
\expandafter\ifx\csname tikz@protected@command\string#1\endcsname\relax%
|
|
\expandafter\tikz@@%
|
|
\else%
|
|
\begingroup\def\tikz@path@do@at@end{\endgroup\endtikzpicture\endgroup}%
|
|
\fi%
|
|
#1%
|
|
}%
|
|
|
|
\expandafter\let\csname tikz@protected@command\string\draw\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\pattern\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\fill\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\filldraw\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\shade\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\shadedraw\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\clip\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\graph\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\useasboundingbox\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\node\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\coordinate\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\matrix\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\datavisualization\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\path\endcsname\pgfutil@empty%
|
|
\expandafter\let\csname tikz@protected@command\string\pic\endcsname\pgfutil@empty%
|
|
|
|
% Comment by TT: I hope I fixed the \tikz \foreach problem. The new
|
|
% version will take a conservative approach and will only do fancy
|
|
% stuff when the next keyword after \tikz is one of the following:
|
|
% \draw, \fill, \filldraw, \graph, \matrix,
|
|
\def\tikz@@{%
|
|
\let\tikz@next=\tikz@collectnormalsemicolon%
|
|
\ifnum\the\catcode`\;=\active\relax%
|
|
\let\tikz@next=\tikz@collectactivesemicolon%
|
|
\fi%
|
|
\tikz@next}%
|
|
\def\tikz@collectnormalsemicolon#1;{#1;\endtikzpicture\endgroup}
|
|
{
|
|
\catcode`\;=\active
|
|
\gdef\tikz@collectactivesemicolon#1;{#1;\endtikzpicture\endgroup}
|
|
}%
|
|
% End old code
|
|
|
|
% Invokes '#1' if the command is invoked within a tikzpicture and
|
|
% '#2' if not.
|
|
\def\tikzifinpicture#1#2{%
|
|
\pgfutil@ifundefined{filldraw}{#2}{#1}% TT: This is a wrong
|
|
% test! Who uses this?...
|
|
}%
|
|
|
|
|
|
\def\tikz@collect@scope@anims#1{%
|
|
\pgfutil@ifnextchar[#1{#1[]}%]
|
|
}%
|
|
|
|
%
|
|
% Environment for scoping graphic state settings
|
|
%
|
|
\def\tikz@scope@env{%
|
|
\pgfscope%
|
|
\begingroup%
|
|
\let\tikz@atbegin@scope=\pgfutil@empty%
|
|
\let\tikz@atend@scope=\pgfutil@empty%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\tikz@clear@rdf@options%
|
|
\let\tikz@mode=\pgfutil@empty%
|
|
\let\tikz@id@name=\pgfutil@empty%
|
|
\tikz@transparency@groupfalse%
|
|
\tikzset{every scope/.try}%
|
|
\tikz@collect@scope@anims\tikz@scope@opt%
|
|
}%
|
|
\def\tikz@scope@opt[#1]{%
|
|
\tikzset{#1}%
|
|
\tikz@options%
|
|
\tikz@do@rdf@pre@options%
|
|
\iftikz@transparency@group\expandafter\pgftransparencygroup\expandafter[\tikz@transparency@group@options]\tikz@blend@group\fi%
|
|
\tikz@is@nodefalse%
|
|
\tikz@call@id@hook%
|
|
\pgfidscope%
|
|
\tikz@do@rdf@post@options%
|
|
\begingroup%
|
|
\let\tikz@id@name\pgfutil@empty%
|
|
\expandafter\tikz@atbegin@scope%
|
|
\expandafter\pgfclearid%
|
|
\tikz@lib@scope@check%
|
|
}%
|
|
\def\endtikz@scope@env{%
|
|
\tikz@atend@scope%
|
|
\endgroup%
|
|
\endpgfidscope%
|
|
\iftikz@transparency@group\endpgftransparencygroup\fi%
|
|
\endgroup%
|
|
\endpgfscope%
|
|
\tikz@lib@scope@check%
|
|
}%
|
|
|
|
|
|
\def\tikz@scoped{\tikz@collect@scope@anims\tikz@scoped@opt}%
|
|
\def\tikz@scoped@opt[#1]{\scope[#1]\pgfutil@ifnextchar\bgroup{\tikz@scoped@}{\tikz@scoped@@single}}%
|
|
\def\tikz@scoped@{\bgroup\tikz@auto@end@pathtrue\aftergroup\endscope\let\pgf@temp=}%
|
|
\def\tikz@scoped@@single#1{%
|
|
\expandafter\ifx\csname tikz@scoped@protected@command\string#1\endcsname\relax%
|
|
\expandafter\tikz@scoped@@%
|
|
\else%
|
|
\begingroup\def\tikz@scoped@path@do@at@end{\endgroup\endscope}%
|
|
\fi%
|
|
#1%
|
|
}%
|
|
\def\tikz@scoped@@{%
|
|
\let\tikz@scoped@next=\tikz@scoped@collectnormalsemicolon%
|
|
\ifnum\the\catcode`\;=\active\relax%
|
|
\let\tikz@scoped@next=\tikz@scoped@collectactivesemicolon%
|
|
\fi%
|
|
\tikz@scoped@next}%
|
|
\def\tikz@scoped@collectnormalsemicolon#1;{#1;\endscope}
|
|
{
|
|
\catcode`\;=\active
|
|
\gdef\tikz@scoped@collectactivesemicolon#1;{#1;\endscope}
|
|
}%
|
|
|
|
|
|
% Install a shortcut command which is only valid inside of a
|
|
% tikzpicture.
|
|
%
|
|
% It works in the same way as the '\path' shortcut does: it introduces
|
|
% a \let#1=#2 at the beginning of tikzpicture.
|
|
%
|
|
% #1: shortcut command inside of tikzpicture
|
|
% #2: real command name
|
|
\def\tikzaddtikzonlycommandshortcutlet#1#2{%
|
|
\expandafter\def\expandafter\tikz@installcommands\expandafter{\tikz@installcommands
|
|
\let#1=#2%
|
|
}%
|
|
}%
|
|
|
|
% Has the same effect as \tikzaddtikzonlycommandshortcutlet but uses
|
|
% \def#1{#2} instead of \let.
|
|
\def\tikzaddtikzonlycommandshortcutdef#1#2{%
|
|
\expandafter\def\expandafter\tikz@installcommands\expandafter{\tikz@installcommands
|
|
\def#1{#2}%
|
|
}%
|
|
}%
|
|
|
|
%
|
|
% Install the abbreviated commands
|
|
%
|
|
\def\tikz@installcommands{%
|
|
\let\tikz@origscope=\scope%
|
|
\let\tikz@origscoped=\scoped%
|
|
\let\tikz@origendscope=\endscope%
|
|
\let\tikz@origstartscope=\startscope%
|
|
\let\tikz@origstopscope=\stopscope%
|
|
\let\tikz@origpath=\path%
|
|
\let\tikz@origagainpath=\againpath%
|
|
\let\tikz@origdraw=\draw%
|
|
\let\tikz@origpattern=\pattern%
|
|
\let\tikz@origfill=\fill%
|
|
\let\tikz@origfilldraw=\filldraw%
|
|
\let\tikz@origshade=\shade%
|
|
\let\tikz@origshadedraw=\shadedraw%
|
|
\let\tikz@origclip=\clip%
|
|
\let\tikz@origuseasboundingbox=\useasboundingbox%
|
|
\let\tikz@orignode=\node%
|
|
\let\tikz@origpic=\pic%
|
|
\let\tikz@origcoordinate=\coordinate%
|
|
\let\tikz@origmatrix=\matrix%
|
|
\let\tikz@origcalendar=\calendar%
|
|
\let\tikz@origdv=\datavisualization%
|
|
\let\tikz@origgraph=\graph%
|
|
%
|
|
\let\scope=\tikz@scope@env%
|
|
\let\scoped=\tikz@scoped%
|
|
\let\endscope=\endtikz@scope@env%
|
|
\let\startscope=\scope%
|
|
\let\stopscope=\endscope%
|
|
\let\path=\tikz@command@path%
|
|
\let\againpath=\tikz@command@againpath%
|
|
%
|
|
\def\draw{\path[draw]}%
|
|
\def\pattern{\path[pattern]}%
|
|
\def\fill{\path[fill]}%
|
|
\def\filldraw{\path[fill,draw]}%
|
|
\def\shade{\path[shade]}%
|
|
\def\shadedraw{\path[shade,draw]}%
|
|
\def\clip{\path[clip]}%
|
|
\def\graph{\path graph}%
|
|
\def\useasboundingbox{\path[use as bounding box]}%
|
|
\def\node{\tikz@path@overlay{node}}%
|
|
\def\pic{\tikz@path@overlay{pic}}%
|
|
\def\coordinate{\tikz@path@overlay{coordinate}}%
|
|
\def\matrix{\tikz@path@overlay{node[matrix]}}%
|
|
\def\calendar{\tikz@lib@cal@calendar}%
|
|
\def\datavisualization{\tikz@lib@datavisualization}%
|
|
}%
|
|
\ifx\tikz@lib@cal@calendar\@undefined
|
|
\def\tikz@lib@cal@calendar{\tikzerror{You need to say \string\usetikzlibrary{calendar} to use the \string\calendar{} command}}%
|
|
\fi
|
|
\ifx\tikz@lib@datavisualization\@undefined
|
|
\def\tikz@lib@datavisualization{\tikzerror{You need to say \string\usetikzlibrary{datavisualization} to use the \string\datavisualization{} command}}%
|
|
\fi
|
|
|
|
\def\tikz@path@overlay#1{%
|
|
\let\tikz@signal@path=\tikz@signal@path% for detection at begin of matrix cell
|
|
\pgfutil@ifnextchar<{\tikz@path@overlayed{#1}}{\path #1}}%
|
|
\def\tikz@path@overlayed#1<#2>{\path<#2> #1}%
|
|
|
|
\def\tikz@uninstallcommands{%
|
|
\let\scope=\tikz@origscope%
|
|
\let\scoped=\tikz@origscoped%
|
|
\let\endscope=\tikz@origendscope%
|
|
\let\startscope=\tikz@origstartscope%
|
|
\let\stopscope=\tikz@origstopscope%
|
|
\let\path=\tikz@origpath%
|
|
\let\againpath=\tikz@origagainpath%
|
|
\let\draw=\tikz@origdraw%
|
|
\let\pattern=\tikz@origpattern%
|
|
\let\fill=\tikz@origfill%
|
|
\let\filldraw=\tikz@origfilldraw%
|
|
\let\shade=\tikz@origshade%
|
|
\let\shadedraw=\tikz@origshadedraw%
|
|
\let\clip=\tikz@origclip%
|
|
\let\useasboundingbox=\tikz@origuseasboundingbox%
|
|
\let\node=\tikz@orignode%
|
|
\let\pic=\tikz@origpic%
|
|
\let\coordinate=\tikz@origcoordinate%
|
|
\let\matrix=\tikz@origmatrix%
|
|
\let\calendar=\tikz@origcalendar%
|
|
\let\datavisualization=\tikz@origdv%
|
|
\let\graph=\tikz@origgraph%
|
|
}%
|
|
|
|
|
|
{%
|
|
\catcode`\;=12
|
|
\gdef\tikz@nonactivesemicolon{;}%
|
|
\catcode`\:=12
|
|
\gdef\tikz@nonactivecolon{:}%
|
|
\catcode`\|=12
|
|
\gdef\tikz@nonactivebar{|}%
|
|
\catcode`\!=12
|
|
\gdef\tikz@nonactiveexlmark{!}%
|
|
\catcode`\;=\active
|
|
\catcode`\:=\active
|
|
\catcode`\|=\active
|
|
\catcode`\"=\active
|
|
\catcode`\!=\active
|
|
\gdef\tikz@activesemicolon{;}%
|
|
\gdef\tikz@activecolon{:}%
|
|
\gdef\tikz@activebar{|}%
|
|
\gdef\tikz@activequotes{"}%
|
|
\global\let\tikz@active@quotes@token="%
|
|
\gdef\tikz@activeexlmark{!}%
|
|
\gdef\tikz@deactivatthings{%
|
|
\def;{\tikz@nonactivesemicolon}%
|
|
\def:{\tikz@nonactivecolon}%
|
|
\def|{\tikz@nonactivebar}%
|
|
\def!{\tikz@nonactiveexlmark}%
|
|
}%
|
|
}%
|
|
|
|
\let\tikz@orig@shorthands\pgfutil@empty
|
|
\def\tikz@switchoff@shorthands{%
|
|
\ifx\tikz@orig@shorthands\pgfutil@empty%
|
|
\edef\tikz@orig@shorthands{%
|
|
\catcode\noexpand`\noexpand\;\the\catcode`\;\relax%
|
|
\catcode\noexpand`\noexpand\:\the\catcode`\:\relax%
|
|
\catcode\noexpand`\noexpand\|\the\catcode`\|\relax%
|
|
\catcode\noexpand`\noexpand\!\the\catcode`\!\relax%
|
|
\catcode\noexpand`\noexpand\,\the\catcode`\,\relax%
|
|
\catcode\noexpand`\noexpand\<\the\catcode`\<\relax%
|
|
\catcode\noexpand`\noexpand\>\the\catcode`\>\relax%
|
|
\catcode\noexpand`\noexpand\"\the\catcode`\"\relax%
|
|
\catcode\noexpand`\noexpand\'\the\catcode`\'\relax%
|
|
\catcode\noexpand`\noexpand\-\the\catcode`\-\relax%
|
|
\catcode\noexpand`\noexpand\=\the\catcode`\=\relax%
|
|
\catcode\noexpand`\noexpand\.\the\catcode`\.\relax%
|
|
\catcode\noexpand`\noexpand\$\the\catcode`\$\relax%
|
|
}%
|
|
\catcode`\;12\relax%
|
|
\catcode`\:12\relax%
|
|
\catcode`\|12\relax%
|
|
\catcode`\!12\relax%
|
|
\catcode`\,12\relax%
|
|
\catcode`\<12\relax%
|
|
\catcode`\>12\relax%
|
|
\catcode`\"12\relax%
|
|
\catcode`\'12\relax%
|
|
\catcode`\-12\relax%
|
|
\catcode`\=12\relax%
|
|
\catcode`\.12\relax%
|
|
\catcode`\$3\relax%
|
|
\fi%
|
|
}%
|
|
|
|
|
|
|
|
% Constructs a path and draws/fills them according to the current
|
|
% settings.
|
|
|
|
\def\tikz@command@path{%
|
|
\let\tikz@signal@path=\tikz@signal@path% for detection at begin of matrix cell
|
|
\pgfutil@ifnextchar[{\tikz@check@earg}%]
|
|
{\pgfutil@ifnextchar<{\tikz@doopt}{\tikz@@command@path}}}%
|
|
\pgfutil@protected\def\tikz@signal@path{\tikz@signal@path}%
|
|
\def\tikz@check@earg[#1]{%
|
|
\pgfutil@ifnextchar<{\tikz@swap@args[#1]}{\tikz@@command@path[#1]}}
|
|
\def\tikz@swap@args[#1]<#2>{\tikz@command@path<#2>[#1]}%
|
|
|
|
\def\tikz@doopt{%
|
|
\let\tikz@next=\tikz@eargnormalsemicolon%
|
|
\ifnum\the\catcode`\;=\active\relax%
|
|
\let\tikz@next=\tikz@eargactivesemicolon%
|
|
\fi%
|
|
\tikz@next}%
|
|
\long\def\tikz@eargnormalsemicolon<#1>#2;{\alt<#1>{\tikz@@command@path#2;}{\tikz@path@do@at@end}}%
|
|
{
|
|
\catcode`\;=\active
|
|
\long\global\def\tikz@eargactivesemicolon<#1>#2;{\alt<#1>{\tikz@@command@path#2;}{\tikz@path@do@at@end}}%
|
|
}
|
|
|
|
\def\tikz@@command@path{%
|
|
\edef\tikzscope@linewidth{\the\pgflinewidth}%
|
|
\begingroup%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\let\tikz@path@do@at@end=\tikz@lib@scope@check%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\tikz@clear@rdf@options%
|
|
\let\tikz@mode=\pgfutil@empty%
|
|
\let\tikz@moveto@waiting=\relax%
|
|
\let\tikz@timer=\relax%
|
|
\let\tikz@tangent=\relax%
|
|
\let\tikz@collected@onpath=\pgfutil@empty%
|
|
\let\tikz@preactions=\pgfutil@empty%
|
|
\let\tikz@postactions=\pgfutil@empty%
|
|
\tikz@snakedfalse%
|
|
\tikz@decoratepathfalse%
|
|
\tikz@node@is@a@labelfalse%
|
|
\tikz@expandcount=100\relax%
|
|
\pgf@path@lastx=0pt%
|
|
\pgf@path@lasty=0pt%
|
|
\tikz@lastx=0pt%
|
|
\tikz@lasty=0pt%
|
|
\tikz@lastxsaved=0pt%
|
|
\tikz@lastysaved=0pt%
|
|
\tikzset{every path/.try}%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
\def\tikz@scan@next@command{%
|
|
\ifx\tikz@collected@onpath\pgfutil@empty%
|
|
\else%
|
|
\tikz@invoke@collected@onpath%
|
|
\fi%
|
|
\afterassignment\tikz@handle\let\pgf@let@token=%
|
|
}%
|
|
\newcount\tikz@expandcount
|
|
\let\tikz@collected@onpath=\pgfutil@empty%
|
|
|
|
% Central dispatcher for commands
|
|
\def\tikz@handle{%
|
|
\let\pgfutil@next=\tikz@expand%
|
|
\ifx\pgf@let@token(%)
|
|
\let\pgfutil@next=\tikz@movetoabs%
|
|
\else%
|
|
\ifx\pgf@let@token+%
|
|
\let\pgfutil@next=\tikz@movetorel%
|
|
\else%
|
|
\ifx\pgf@let@token-%
|
|
\let\pgfutil@next=\tikz@lineto%
|
|
\else%
|
|
\ifx\pgf@let@token.%
|
|
\let\pgfutil@next=\tikz@dot%
|
|
\else%
|
|
\ifx\pgf@let@token r%
|
|
\let\pgfutil@next=\tikz@rect%
|
|
\else%
|
|
\ifx\pgf@let@token n%
|
|
\let\pgfutil@next=\tikz@fig%
|
|
\else%
|
|
\ifx\pgf@let@token[%]
|
|
\let\pgfutil@next=\tikz@parse@options%
|
|
\else%
|
|
\ifx\pgf@let@token c%
|
|
\let\pgfutil@next=\tikz@cchar%
|
|
\else%
|
|
\ifx\pgf@let@token\bgroup%
|
|
\let\pgfutil@next=\tikz@beginscope%
|
|
\else%
|
|
\ifx\pgf@let@token\egroup%
|
|
\let\pgfutil@next=\tikz@endscope%
|
|
\else%
|
|
\ifx\pgf@let@token;%
|
|
\let\pgfutil@next=\tikz@finish%
|
|
\else%
|
|
\let\pgfutil@next=\tikz@handle@more%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\pgfutil@next%
|
|
}%
|
|
|
|
% Continued...
|
|
\def\tikz@handle@more{%
|
|
\ifx\pgf@let@token a%
|
|
\let\pgfutil@next=\tikz@a@char%
|
|
\else%
|
|
\ifx\pgf@let@token e%
|
|
\let\pgfutil@next=\tikz@e@char%
|
|
\else%
|
|
\ifx\pgf@let@token g%
|
|
\let\pgfutil@next=\tikz@g@char%
|
|
\else%
|
|
\ifx\pgf@let@token s%
|
|
\let\pgfutil@next=\tikz@schar%
|
|
\else%
|
|
\ifx\pgf@let@token |%
|
|
\let\pgfutil@next=\tikz@vh@lineto%
|
|
\else%
|
|
\ifx\pgf@let@token p%
|
|
\let\pgfutil@next=\tikz@pchar%
|
|
\pgfsetmovetofirstplotpoint%
|
|
\else%
|
|
\ifx\pgf@let@token t%
|
|
\let\pgfutil@next=\tikz@to%
|
|
\else%
|
|
\ifx\pgf@let@token\pgfextra%
|
|
\let\pgfutil@next=\tikz@extra%
|
|
\else%
|
|
\ifx\pgf@let@token\foreach%
|
|
\let\pgfutil@next=\tikz@foreach%
|
|
\else%
|
|
\ifx\pgf@let@token f%
|
|
\let\pgfutil@next=\tikz@fchar%
|
|
\else%
|
|
\ifx\pgf@let@token\pgf@stop%
|
|
\let\pgfutil@next=\relax%
|
|
\else%
|
|
\ifx\pgf@let@token\par%
|
|
\let\pgfutil@next=\tikz@scan@next@command%
|
|
\else%
|
|
\ifx\pgf@let@token d%
|
|
\let\pgfutil@next=\tikz@decoration%
|
|
\else%
|
|
\ifx\pgf@let@token l%
|
|
\let\pgfutil@next=\tikz@l@char%
|
|
\else%
|
|
\ifx\pgf@let@token:%
|
|
\let\pgfutil@next=\tikz@colon@char%
|
|
\else%
|
|
\let\pgfutil@next=\tikz@expand%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\ifx\pgfutil@next\tikz@expand\else\tikz@expandcount=100\relax\fi%
|
|
\pgfutil@next%
|
|
}%
|
|
|
|
\def\tikz@l@char{%
|
|
\pgfutil@ifnextchar e{\tikz@let@command}{%
|
|
\pgfutil@ifnextchar i{\tikz@lsystem}{%
|
|
\pgfutil@ifnextchar-{\tikz@@lsystem}{\tikz@expand}%
|
|
}%
|
|
}%
|
|
}%
|
|
|
|
\def\tikz@lsystem{%
|
|
\tikzerror{You need to say \string\usetikzlibrary{lindenmayersystems} to draw Lindenmayer systems}
|
|
}%
|
|
|
|
\def\tikz@@lsystem{%
|
|
\tikzerror{You need to say \string\usetikzlibrary{lindenmayersystems} to draw L-systems}
|
|
}%
|
|
|
|
\def\tikz@pchar{\pgfutil@ifnextchar l{\tikz@plot}{\pgfutil@ifnextchar i{\tikz@subpicture}{\tikz@parabola}}}%
|
|
\def\tikz@cchar{%
|
|
\pgfutil@ifnextchar i{\tikz@circle}%
|
|
{\pgfutil@ifnextchar h{\tikz@children}{\tikz@cochar}}}%
|
|
\def\tikz@cochar o{%
|
|
\pgfutil@ifnextchar o{\tikz@coordinate}{\tikz@cosine}}%
|
|
\def\tikz@e@char{%
|
|
\pgfutil@ifnextchar l{\tikz@ellipse}{\tikz@@e@char}}%
|
|
\def\tikz@a@char{%
|
|
\pgfutil@ifnextchar r{\tikz@arcA}{\tikzerror{Arc expected}}}%
|
|
\def\tikz@@e@char dge{%
|
|
\pgfutil@ifnextchar f{\tikz@edgetoparent}{\tikz@edge@plain}}%
|
|
|
|
\def\tikz@schar{\pgfutil@ifnextchar i{\tikz@sine}{\tikz@svg@path}}%
|
|
|
|
\def\tikz@g@char r{\pgfutil@ifnextchar i{\tikz@grid}{\tikz@graph}}%
|
|
|
|
% svg syntax
|
|
% svg[options] {...}
|
|
|
|
\def\tikz@svg@path{%
|
|
\tikzerror{You need to say \string\usetikzlibrary{svg.path} to use the svg path command}
|
|
}%
|
|
|
|
|
|
\def\tikz@finish{%
|
|
% Rendering pipeline
|
|
%
|
|
% Step 1: The path background box
|
|
%
|
|
\box\tikz@figbox@bg%
|
|
%
|
|
% Step 2: Decorate path
|
|
%
|
|
\iftikz@decoratepath%
|
|
\tikz@lib@dec@decorate@path%
|
|
\fi%
|
|
%
|
|
% Step 3: Preactions
|
|
%
|
|
\pgfsyssoftpath@getcurrentpath\tikz@actions@path%
|
|
\edef\tikz@restorepathsize{%
|
|
\global\pgf@pathmaxx=\the\pgf@pathmaxx%
|
|
\global\pgf@pathmaxy=\the\pgf@pathmaxy%
|
|
\global\pgf@pathminx=\the\pgf@pathminx%
|
|
\global\pgf@pathminy=\the\pgf@pathminy%
|
|
}%
|
|
\tikz@preactions%
|
|
%
|
|
% Step 4: Reset modes
|
|
%
|
|
\let\tikz@path@picture=\pgfutil@empty%
|
|
\tikz@mode@fillfalse%
|
|
\tikz@mode@drawfalse%
|
|
\tikz@mode@doublefalse%
|
|
\tikz@mode@clipfalse%
|
|
\tikz@mode@boundaryfalse%
|
|
\tikz@mode@fade@pathfalse%
|
|
\tikz@mode@fade@scopefalse%
|
|
\edef\tikz@pathextend{%
|
|
{\noexpand\pgfqpoint{\the\pgf@pathminx}{\the\pgf@pathminy}}%
|
|
{\noexpand\pgfqpoint{\the\pgf@pathmaxx}{\the\pgf@pathmaxy}}%
|
|
}%
|
|
\tikz@mode% installs the mode settings
|
|
% Path fading counts as an option:
|
|
\iftikz@mode@fade@path%
|
|
\tikz@addoption{%
|
|
\iftikz@fade@adjust%
|
|
\iftikz@mode@draw%
|
|
\pgfsetfadingforcurrentpathstroked{\tikz@path@fading}{\tikz@do@fade@transform}%
|
|
\else%
|
|
\pgfsetfadingforcurrentpath{\tikz@path@fading}{\tikz@do@fade@transform}%
|
|
\fi%
|
|
\else%
|
|
\pgfsetfading{\tikz@path@fading}{\tikz@do@fade@transform}%
|
|
\fi%
|
|
\tikz@mode@fade@pathfalse% no more fading...
|
|
}%
|
|
\fi%
|
|
%
|
|
% Step 5: Install scope fading
|
|
%
|
|
\iftikz@mode@fade@scope%
|
|
\iftikz@fade@adjust%
|
|
\iftikz@mode@draw%
|
|
\pgfsetfadingforcurrentpathstroked{\tikz@scope@fading}{\tikz@do@fade@transform}%
|
|
\else%
|
|
\pgfsetfadingforcurrentpath{\tikz@scope@fading}{\tikz@do@fade@transform}%
|
|
\fi%
|
|
\else%
|
|
\pgfsetfading{\tikz@scope@fading}{\tikz@do@fade@transform}%
|
|
\fi%
|
|
\tikz@mode@fade@scopefalse%
|
|
\fi%
|
|
%
|
|
% Step 5': Setup options
|
|
%
|
|
\ifx\tikz@options\pgfutil@empty%
|
|
\else%
|
|
\pgfsys@beginscope%
|
|
\let\pgfscope@stroke@color=\pgf@strokecolor@global%
|
|
\let\pgfscope@fill@color=\pgf@fillcolor@global%
|
|
\begingroup%
|
|
\tikz@options%
|
|
\fi%
|
|
\tikz@do@rdf@pre@options%
|
|
%
|
|
% Step 5'': Setup animations
|
|
%
|
|
\tikz@is@nodefalse%
|
|
\tikz@call@id@hook%
|
|
\iftikz@mode@clip\else%
|
|
\pgfidscope%
|
|
\tikz@do@rdf@post@options%
|
|
\begingroup%
|
|
\fi% open an animation scope here, unless clipping is done
|
|
%
|
|
% Step 6: Do a fill if shade or a path picture follows.
|
|
%
|
|
\iftikz@mode@fill%
|
|
\iftikz@mode@shade%
|
|
\pgfsyssoftpath@getcurrentpath\tikz@temppath
|
|
\pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
|
|
\pgfsyssoftpath@setcurrentpath\tikz@temppath%
|
|
\pgfsyssoftpath@invokecurrentpath%
|
|
\pgfpushtype%
|
|
\pgfusetype{.path fill}%
|
|
\pgfsys@fill%
|
|
\pgfpoptype%
|
|
\tikz@mode@fillfalse% no more filling...
|
|
\else%
|
|
\ifx\tikz@path@picture\pgfutil@empty%
|
|
\else%
|
|
\pgfsyssoftpath@getcurrentpath\tikz@temppath
|
|
\pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
|
|
\pgfsyssoftpath@setcurrentpath\tikz@temppath%
|
|
\pgfsyssoftpath@invokecurrentpath%
|
|
\pgfpushtype%
|
|
\pgfusetype{.path fill}%
|
|
\pgfsys@fill%
|
|
\pgfpoptype%
|
|
\tikz@mode@fillfalse% no more filling...
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
%
|
|
% Step 7: Do a shade if necessary.
|
|
%
|
|
\iftikz@mode@shade%
|
|
\pgfsyssoftpath@getcurrentpath\tikz@temppath
|
|
\pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
|
|
\pgfsyssoftpath@setcurrentpath\tikz@temppath%
|
|
\pgfpushtype%
|
|
\pgfusetype{.path shade}%
|
|
\pgfshadepath{\tikz@shading}{\tikz@shade@angle}%
|
|
\pgfpoptype%
|
|
\tikz@mode@shadefalse% no more shading...
|
|
\fi%
|
|
%
|
|
% Step 8: Do a path picture if necessary.
|
|
%
|
|
\ifx\tikz@path@picture\pgfutil@empty%
|
|
\else%
|
|
\begingroup%
|
|
\pgfusetype{.path picture}%
|
|
\pgfidscope%
|
|
\pgfsys@beginscope%
|
|
\let\tikz@id@name\pgfutil@empty%
|
|
\pgfclearid%
|
|
\pgfsyssoftpath@getcurrentpath\tikz@temppath
|
|
\pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
|
|
\pgfsyssoftpath@setcurrentpath\tikz@temppath%
|
|
\pgfsyssoftpath@invokecurrentpath%
|
|
\pgfsys@clipnext%
|
|
\pgfsys@discardpath%
|
|
\pgf@relevantforpicturesizefalse%
|
|
\expandafter\def\csname pgf@sh@ns@path picture bounding box\endcsname{rectangle}
|
|
\expandafter\edef\csname pgf@sh@np@path picture bounding box\endcsname{%
|
|
\def\noexpand\southwest{\noexpand\pgfqpoint{\the\pgf@pathminx}{\the\pgf@pathminy}}%
|
|
\def\noexpand\northeast{\noexpand\pgfqpoint{\the\pgf@pathmaxx}{\the\pgf@pathmaxy}}%
|
|
}
|
|
\expandafter\def\csname pgf@sh@nt@path picture bounding box\endcsname{{1}{0}{0}{1}{0pt}{0pt}}
|
|
\expandafter\def\csname pgf@sh@pi@path picture bounding box\endcsname{\pgfpictureid}
|
|
\pgfinterruptpath%
|
|
\tikz@path@picture%
|
|
\endpgfinterruptpath%
|
|
\pgfsys@endscope%
|
|
\endpgfidscope%
|
|
\endgroup%
|
|
\let\tikz@path@picture=\pgfutil@empty%
|
|
\fi%
|
|
%
|
|
% Step 9: Double stroke, if necessary
|
|
%
|
|
\iftikz@mode@draw%
|
|
\iftikz@mode@double%
|
|
% Change line width
|
|
\begingroup%
|
|
\pgfsys@beginscope%
|
|
\tikz@double@setup%
|
|
\fi%
|
|
\fi%
|
|
%
|
|
% Step 10: Do stroke/fill/clip as needed
|
|
%
|
|
\pgfpushtype%
|
|
\edef\tikz@temp{\noexpand\pgfusepath{%
|
|
\iftikz@mode@fill fill,\fi%
|
|
\iftikz@mode@draw draw,\fi%
|
|
\iftikz@mode@clip clip\fi%
|
|
}}%
|
|
\pgfusetype{.path}%
|
|
\tikz@temp%
|
|
\pgfpoptype%
|
|
\tikz@mode@fillfalse% no more filling
|
|
%
|
|
% Step 11: Double stroke, if necessary
|
|
%
|
|
\iftikz@mode@draw%
|
|
\iftikz@mode@double%
|
|
\pgfsys@endscope%
|
|
\endgroup%
|
|
\fi%
|
|
\fi%
|
|
\tikz@mode@drawfalse% no more stroking
|
|
%
|
|
% Step 12: Postactions
|
|
%
|
|
\tikz@postactions%
|
|
%
|
|
% Step 13: Add labels and nodes
|
|
%
|
|
\box\tikz@figbox%
|
|
%
|
|
% Step 14: Close animations
|
|
%
|
|
\iftikz@mode@clip\else\endgroup\endpgfidscope\fi%
|
|
%
|
|
% Step 14: Close option brace
|
|
%
|
|
\ifx\tikz@options\pgfutil@empty%
|
|
\else%
|
|
\endgroup%
|
|
\global\let\pgf@strokecolor@global=\pgfscope@stroke@color%
|
|
\global\let\pgf@fillcolor@global=\pgfscope@fill@color%
|
|
\pgfsys@endscope%
|
|
\iftikz@mode@clip%
|
|
\tikzerror{Extra options not allowed for clipping path command.}%
|
|
\fi%
|
|
\fi%
|
|
\iftikz@mode@clip%
|
|
\aftergroup\pgf@relevantforpicturesizefalse%
|
|
\fi%
|
|
\iftikz@mode@boundary%
|
|
\aftergroup\pgf@relevantforpicturesizefalse%
|
|
\fi%
|
|
\endgroup%
|
|
\global\pgflinewidth=\tikzscope@linewidth%
|
|
\tikz@path@do@at@end%
|
|
}%
|
|
\let\tikz@lib@scope@check\pgfutil@empty% this is a hook for the scopes library
|
|
\def\tikz@path@do@at@end{\tikz@lib@scope@check}%
|
|
\def\tikz@@pathtext{@path}%
|
|
|
|
\def\pgf@outer@auto@adjust@hook{%
|
|
{%
|
|
\tikz@mode@drawfalse%
|
|
\tikz@mode%
|
|
\expandafter%
|
|
}%
|
|
\iftikz@mode@draw\else%
|
|
\pgfkeyslet{/pgf/outer xsep}\pgf@zero@text
|
|
\pgfkeyslet{/pgf/outer ysep}\pgf@zero@text
|
|
\fi%
|
|
}%
|
|
|
|
% Extra actions
|
|
|
|
\def\tikz@extra@preaction#1{%
|
|
{%
|
|
\pgfsys@beginscope%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\path[#1];% do extra path
|
|
\pgfsyssoftpath@setcurrentpath\tikz@actions@path% restore
|
|
\tikz@restorepathsize%
|
|
\pgfsys@endscope%
|
|
}%
|
|
}%
|
|
|
|
\def\tikz@extra@postaction#1{%
|
|
{%
|
|
\pgfsys@beginscope%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\tikz@restorepathsize%
|
|
\path[#1]\pgfextra{\pgfsyssoftpath@setcurrentpath\tikz@actions@path};% do extra path
|
|
\pgf@resetpathsizes%
|
|
\pgfsys@endscope%
|
|
}%
|
|
}%
|
|
|
|
|
|
|
|
\def\tikz@skip#1{\tikz@scan@next@command#1}%
|
|
\def\tikz@expand{%
|
|
\advance\tikz@expandcount by -1%
|
|
\ifnum\tikz@expandcount<0\relax%
|
|
\tikzerror{Giving up on this path. Did you forget a semicolon?}%
|
|
\let\pgfutil@next=\tikz@finish%
|
|
\else%
|
|
\let\pgfutil@next=\tikz@@expand
|
|
\fi%
|
|
\pgfutil@next}%
|
|
|
|
\def\tikz@@expand{%
|
|
\expandafter\tikz@scan@next@command\pgf@let@token}%
|
|
|
|
|
|
|
|
% Syntax for scopes:
|
|
% {scoped path commands}
|
|
|
|
\newif\iftikz@auto@end@path
|
|
|
|
\def\tikz@beginscope{\begingroup\tikz@auto@end@pathfalse\tikz@scan@next@command}%
|
|
\def\tikz@endscope{%
|
|
\iftikz@auto@end@path\expandafter\tikz@finish\expandafter\egroup\else\expandafter\tikz@@endscope\fi%
|
|
}%
|
|
\def\tikz@@endscope{%
|
|
\global\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
\global\let\tikz@tangent@temp\tikz@tangent%
|
|
\edef\tikz@marshal{%
|
|
\tikz@lastx=\the\tikz@lastx%
|
|
\tikz@lasty=\the\tikz@lasty%
|
|
\iftikz@current@point@local%
|
|
\else%
|
|
\tikz@lastxsaved=\the\tikz@lastxsaved%
|
|
\tikz@lastysaved=\the\tikz@lastysaved%
|
|
\ifx\tikz@moveto@waiting\relax%
|
|
\let\tikz@moveto@waiting\relax%
|
|
\else%
|
|
\def\noexpand\tikz@moveto@waiting{\tikz@moveto@waiting}%
|
|
\fi%
|
|
\iftikz@shapeborder%
|
|
\noexpand\tikz@shapebordertrue%
|
|
\def\noexpand\tikz@shapeborder@name{\tikz@shapeborder@name}%
|
|
\else%
|
|
\noexpand\tikz@shapeborderfalse%
|
|
\fi%
|
|
\fi%
|
|
}%
|
|
\expandafter%
|
|
\endgroup\tikz@marshal%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
\let\tikz@tangent\tikz@tangent@temp%
|
|
\tikz@scan@next@command}%
|
|
|
|
|
|
% Syntax for pgfextra:
|
|
% \pgfextra {normal tex text}
|
|
% \pgfextra normal tex text \endpgfextra
|
|
|
|
\def\tikz@extra{\pgfutil@ifnextchar\bgroup\tikz@@extra\relax}%
|
|
\long\def\tikz@@extra#1{#1\tikz@scan@next@command}%
|
|
\let\endpgfextra=\tikz@scan@next@command
|
|
|
|
\def\pgfextra{pgfextra}%
|
|
|
|
|
|
% Syntax for foreach:
|
|
%
|
|
% foreach \var in {list} {path text}
|
|
%
|
|
% or
|
|
%
|
|
% \foreach \var in {list} {path text}
|
|
%
|
|
% Example:
|
|
%
|
|
% \draw (0,0) \foreach \x in {1,2,3} {-- (\x,0) circle (1cm)} -- (5,5);
|
|
|
|
\def\tikz@fchar oreach{\tikz@foreach}%
|
|
|
|
\def\tikz@foreach{%
|
|
\def\pgffor@beginhook{%
|
|
\tikz@lastx=\tikz@foreach@save@lastx%
|
|
\tikz@lasty=\tikz@foreach@save@lasty%
|
|
\tikz@lastxsaved=\tikz@foreach@save@lastxsaved%
|
|
\tikz@lastysaved=\tikz@foreach@save@lastysaved%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
\expandafter\tikz@scan@next@command\pgfutil@firstofone}%
|
|
\def\pgffor@endhook{\pgfextra{%
|
|
\xdef\tikz@foreach@save@lastx{\the\tikz@lastx}%
|
|
\xdef\tikz@foreach@save@lasty{\the\tikz@lasty}%
|
|
\xdef\tikz@foreach@save@lastxsaved{\the\tikz@lastxsaved}%
|
|
\xdef\tikz@foreach@save@lastysaved{\the\tikz@lastysaved}%
|
|
\global\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
\pgfutil@gobble}}%
|
|
\def\pgffor@afterhook{%
|
|
\tikz@lastx=\tikz@foreach@save@lastx%
|
|
\tikz@lasty=\tikz@foreach@save@lasty%
|
|
\tikz@lastxsaved=\tikz@foreach@save@lastxsaved%
|
|
\tikz@lastysaved=\tikz@foreach@save@lastysaved%
|
|
\let\pgffor@beginhook\relax%
|
|
\let\pgffor@endhook\relax%
|
|
\let\pgffor@afterhook\relax%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
\tikz@scan@next@command}%
|
|
\global\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
\xdef\tikz@foreach@save@lastx{\the\tikz@lastx}%
|
|
\xdef\tikz@foreach@save@lasty{\the\tikz@lasty}%
|
|
\xdef\tikz@foreach@save@lastxsaved{\the\tikz@lastxsaved}%
|
|
\xdef\tikz@foreach@save@lastysaved{\the\tikz@lastysaved}%
|
|
\foreach}%
|
|
|
|
|
|
% Syntax for againpath:
|
|
% \againpath \somepathname
|
|
|
|
\def\tikz@command@againpath#1{%
|
|
\pgfextra{%
|
|
\pgfsyssoftpath@getcurrentpath\tikz@temp%
|
|
\expandafter\pgfutil@g@addto@macro\expandafter\tikz@temp\expandafter{#1}%
|
|
\pgfsyssoftpath@setcurrentpath\tikz@temp%
|
|
}%
|
|
}%
|
|
|
|
|
|
% animation syntax
|
|
% :attribute = {...}
|
|
|
|
\def\tikz@colon@char#1=#2{%
|
|
\tikz@scan@next@command{[animate={myself:{#1}={#2}}]}%
|
|
}%
|
|
|
|
|
|
|
|
%
|
|
% When this if is set, a just-scanned point is a shape and its border
|
|
% position still needs to be determined, depending on subsequent
|
|
% commands.
|
|
%
|
|
|
|
\newif\iftikz@shapeborder
|
|
|
|
|
|
% Syntax for moveto:
|
|
% <point>
|
|
\def\tikz@movetoabs{\tikz@moveto(}%
|
|
\def\tikz@movetorel{\tikz@moveto+}%
|
|
\def\tikz@moveto{%
|
|
\tikz@scan@one@point{\tikz@@moveto}}%
|
|
\def\tikz@@moveto#1{%
|
|
\tikz@make@last@position{#1}%
|
|
\iftikz@shapeborder%
|
|
% ok, the moveto will have to wait. flag that we have a moveto in
|
|
% waiting:
|
|
\edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
|
|
\else%
|
|
\tikz@@movetosave{\tikz@last@position}%
|
|
\let\tikz@moveto@waiting=\relax%
|
|
\fi%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
% Wrapper around \pgfpathmoveto that adds a save
|
|
\def\tikz@@movetosave#1{%
|
|
{\pgftransformreset
|
|
\pgf@process{#1}%
|
|
\xdef\tikz@marshal{%
|
|
\tikz@lastmovetox=\the\pgf@x\relax%
|
|
\tikz@lastmovetoy=\the\pgf@y\relax%
|
|
}%
|
|
}%
|
|
\tikz@marshal
|
|
\pgfpathmoveto{#1}%
|
|
}%
|
|
|
|
|
|
\let\tikz@moveto@waiting=\relax % normally, nothing is waiting...
|
|
|
|
\def\tikz@flush@moveto{%
|
|
\ifx\tikz@moveto@waiting\relax%
|
|
\else%
|
|
\tikz@@movetosave{\tikz@last@position}%
|
|
\fi%
|
|
\let\tikz@moveto@waiting=\relax%
|
|
}%
|
|
|
|
|
|
\def\tikz@flush@moveto@toward#1#2#3{%
|
|
% #1 = a point towards which the last moveto should be corrected
|
|
% #2 = a dimension to which the corrected x-coordinate should be stored
|
|
% #3 = a dimension for the corrected y-coordinate
|
|
\ifx\tikz@moveto@waiting\relax%
|
|
% do nothing
|
|
\else%
|
|
\pgf@process{\pgfpointshapeborder{\tikz@moveto@waiting}{#1}}%
|
|
#2=\pgf@x%
|
|
#3=\pgf@y%
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
\tikz@@movetosave{\pgfqpoint{\pgf@x}{\pgf@y}}%
|
|
\fi%
|
|
\let\tikz@moveto@waiting=\relax%
|
|
}%
|
|
|
|
|
|
%
|
|
% Collecting labels on the path
|
|
%
|
|
|
|
\def\tikz@collect@coordinate@onpath#1c{%
|
|
\pgfutil@ifnextchar y{\tikz@cycle@expander@add#1}{\tikz@collect@coordinate@onpath@{#1}}}%
|
|
\def\tikz@collect@coordinate@onpath@#1oordinate{%
|
|
\pgfutil@ifnextchar[{\tikz@@collect@coordinate@opt#1}{\tikz@@collect@coordinate@opt#1[]}}%}%
|
|
\def\tikz@@collect@coordinate@opt#1[#2]{%
|
|
\pgfutil@ifnextchar({\tikz@@collect@coordinate#1[#2]}{%
|
|
\tikz@collect@label@onpath#1node[shape=coordinate,#2]{}}}%}%
|
|
\def\tikz@@collect@coordinate#1[#2](#3){%
|
|
\tikz@collect@label@onpath#1node[shape=coordinate,#2](#3){}}%
|
|
|
|
\newif\iftikz@collect@pic
|
|
|
|
\def\tikz@collect@label@onpath#1node{%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath node}%
|
|
\let\tikz@collect@cont#1%
|
|
\tikz@collect@picfalse%
|
|
\tikz@collect@label@scan}%
|
|
|
|
\def\tikz@collect@pic@onpath#1pic{%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath pic}%
|
|
\let\tikz@collect@cont#1
|
|
\tikz@collect@pictrue%
|
|
\tikz@collect@label@scan}%
|
|
|
|
\def\tikz@collect@label@scan{%
|
|
\pgfutil@ifnextchar f{\tikz@collect@nodes}{%
|
|
\pgfutil@ifnextchar({\tikz@collect@paran}%
|
|
{\pgfutil@ifnextchar[{\tikz@collect@options}%
|
|
{\pgfutil@ifnextchar:{\tikz@collect@animation}%
|
|
{\pgfutil@ifnextchar\bgroup{\tikz@collect@arg}%
|
|
{\tikz@collect@cont}}}}}%
|
|
}%}}%
|
|
|
|
\def\tikz@collect@nodes foreach#1in{%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath foreach#1in}%
|
|
\pgfutil@ifnextchar\bgroup\tikz@collect@nodes@group\tikz@collect@nodes@one%
|
|
}%
|
|
\def\tikz@collect@nodes@one#1{%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath #1}%
|
|
\tikz@collect@label@scan%
|
|
}%
|
|
\def\tikz@collect@nodes@group#1{%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{#1}}%
|
|
\tikz@collect@label@scan%
|
|
}%
|
|
|
|
\def\tikz@collect@animation#1=#2{%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath#1={#2}}%
|
|
\tikz@collect@label@scan%
|
|
}%
|
|
\def\tikz@collect@paran#1){%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath#1)}%
|
|
\tikz@collect@label@scan%
|
|
}%
|
|
\def\tikz@collect@options#1]{%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath#1]}%
|
|
\tikz@collect@label@scan%
|
|
}%
|
|
\def\tikz@collect@arg#1{%
|
|
\iftikz@handle@active@nodes%
|
|
\iftikz@collect@pic%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{#1}}%
|
|
\else%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{\scantokens{#1}}}%
|
|
\fi%
|
|
\else%
|
|
\expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{#1}}%
|
|
\fi%
|
|
\tikz@collect@cont%
|
|
}%
|
|
|
|
\def\tikz@invoke@collected@onpath{%
|
|
\tikz@node@is@a@labeltrue%
|
|
\let\tikz@temp=\tikz@collected@onpath%
|
|
\let\tikz@collected@onpath=\pgfutil@empty%
|
|
\expandafter\tikz@scan@next@command\tikz@temp\pgf@stop%
|
|
\tikz@node@is@a@labelfalse%
|
|
}%
|
|
|
|
|
|
%
|
|
% Macros for the cycle command
|
|
%
|
|
|
|
\def\tikz@cycle@expander#1{\pgfutil@ifnextchar c{\tikz@cycle@expander@{#1}}{#1}}%
|
|
\def\tikz@cycle@expander@#1c{\pgfutil@ifnextchar y{\tikz@cycle@expander@add{#1}}{#1c}}%
|
|
\def\tikz@cycle@expander@add#1ycle{#1(current subpath start)--cycle}%
|
|
|
|
|
|
|
|
|
|
% Syntax for lineto:
|
|
% -- <point>
|
|
|
|
\def\tikz@lineto{%
|
|
\pgfutil@ifnextchar |%
|
|
{\expandafter\tikz@hv@lineto\pgfutil@gobble}%
|
|
{\expandafter\pgfutil@ifnextchar\tikz@activebar{\expandafter\tikz@hv@lineto\pgfutil@gobble}%
|
|
{\expandafter\tikz@lineto@mid\pgfutil@gobble}}}%
|
|
\def\tikz@lineto@mid{%
|
|
\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@lineto@mid}%
|
|
{%
|
|
\pgfutil@ifnextchar c{\tikz@close}{%
|
|
\pgfutil@ifnextchar p{\tikz@lineto@plot@or@pic}{\tikz@scan@one@point{\tikz@@lineto}}}}}%
|
|
\def\tikz@lineto@plot@or@pic p{%
|
|
\pgfutil@ifnextchar i{\tikz@collect@pic@onpath\tikz@lineto@mid p}{%
|
|
\pgfsetlinetofirstplotpoint\tikz@plot}%
|
|
}%
|
|
\def\tikz@@lineto#1{%
|
|
% Record the starting point for later labels on the path:
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}
|
|
\iftikz@shapeborder%
|
|
% ok, target is a shape. recalculate end
|
|
\pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\tikz@last@position}}%
|
|
\tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
|
|
\tikz@flush@moveto@toward{\tikz@last@position}\pgf@x\pgf@y%
|
|
\tikz@path@lineto{\tikz@last@position}%
|
|
\edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\tikz@make@last@position{#1}%
|
|
\edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
|
|
\else%
|
|
% target is a reasonable point...
|
|
% Record the starting point for later labels on the path:
|
|
\tikz@make@last@position{#1}%
|
|
\tikz@flush@moveto@toward{\tikz@last@position}\pgf@x\pgf@y%
|
|
\tikz@path@lineto{\tikz@last@position}%
|
|
\edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\fi%
|
|
\let\tikz@timer=\tikz@timer@line%
|
|
\let\tikz@tangent\tikz@timer@start%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
% snake or lineto?
|
|
\def\tikz@path@lineto#1{%
|
|
\iftikz@snaked%
|
|
{
|
|
\pgfsyssoftpathmovetorelevantfalse%
|
|
\pgfpathsnakesto{\tikz@presnake,{\tikz@snake}{\tikz@mainsnakelength}{\noexpand\tikz@snake@install@trans}{},\tikz@postsnake}{#1}%
|
|
}
|
|
\else%
|
|
\pgfpathlineto{#1}%
|
|
\fi%
|
|
}%
|
|
|
|
% snake or lineto?
|
|
\def\tikz@path@close#1{%
|
|
\iftikz@snaked%
|
|
{%
|
|
\pgftransformreset%
|
|
\pgfpathsnakesto{\tikz@presnake,{\tikz@snake}{\tikz@mainsnakelength}{\noexpand\tikz@snake@install@trans}{},\tikz@postsnake}{#1}%
|
|
}%
|
|
\fi%
|
|
\pgfpathclose%
|
|
}%
|
|
|
|
|
|
% Syntax for lineto horizontal/vertical:
|
|
% -| <point>
|
|
|
|
\def\tikz@hv@lineto{%
|
|
\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@hv@lineto}{
|
|
\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@hv@lineto}%
|
|
{\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@hv@lineto}%
|
|
{\tikz@scan@one@point{\tikz@@hv@lineto}}}}}%
|
|
\def\tikz@@hv@lineto#1{%
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\pgf@yc=\tikz@lasty%
|
|
\tikz@make@last@position{#1}%
|
|
\edef\tikz@tangent{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\pgf@yc}}%
|
|
\tikz@flush@moveto@toward{\pgfqpoint{\tikz@lastx}{\pgf@yc}}\pgf@x\pgf@yc%
|
|
\iftikz@shapeborder%
|
|
% ok, target is a shape. have to work now:
|
|
{%
|
|
\pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\tikz@lastx}{\pgf@yc}}}%
|
|
\tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
|
|
\tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@yc}}%
|
|
\tikz@path@lineto{\tikz@last@position}%
|
|
\xdef\tikz@timer@end@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
|
|
}%
|
|
\let\tikz@timer@end=\tikz@timer@end@temp%
|
|
\edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
|
|
\else%
|
|
\tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@yc}}%
|
|
\tikz@path@lineto{\tikz@last@position}%
|
|
\edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
|
|
\fi%
|
|
\let\tikz@timer=\tikz@timer@hvline%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
% Syntax for lineto vertical/horizontal:
|
|
% |- <point>
|
|
|
|
\def\tikz@vh@lineto-{\tikz@vh@lineto@next}%
|
|
\def\tikz@vh@lineto@next{%
|
|
\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@vh@lineto@next}{%
|
|
\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@vh@lineto@next}%
|
|
{\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@vh@lineto@next}%
|
|
{\tikz@scan@one@point\tikz@@vh@lineto}}}}%
|
|
\def\tikz@@vh@lineto#1{%
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\pgf@xc=\tikz@lastx%
|
|
\tikz@make@last@position{#1}%
|
|
\edef\tikz@tangent{\noexpand\pgfqpoint{\the\pgf@xc}{\the\tikz@lasty}}%
|
|
\tikz@flush@moveto@toward{\pgfqpoint{\pgf@xc}{\tikz@lasty}}\pgf@xc\pgf@y%
|
|
\iftikz@shapeborder%
|
|
% ok, target is a shape. have to work now:
|
|
{%
|
|
\pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\pgf@xc}{\tikz@lasty}}}%
|
|
\tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
|
|
\tikz@path@lineto{\pgfqpoint{\pgf@xc}{\tikz@lasty}}%
|
|
\tikz@path@lineto{\tikz@last@position}%
|
|
\xdef\tikz@timer@end@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
|
|
}%
|
|
\let\tikz@timer@end=\tikz@timer@end@temp%
|
|
\edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
|
|
\else%
|
|
\tikz@path@lineto{\pgfqpoint{\pgf@xc}{\tikz@lasty}}%
|
|
\tikz@path@lineto{\tikz@last@position}%
|
|
\edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\fi%
|
|
\let\tikz@timer=\tikz@timer@vhline%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
% Syntax for cycle:
|
|
% -- cycle
|
|
\def\tikz@close c{%
|
|
\pgfutil@ifnextchar o{\tikz@collect@coordinate@onpath\tikz@lineto@mid c}% oops, a coordinate
|
|
{\tikz@@close c}}%
|
|
\def\tikz@@close cycle{%
|
|
\tikz@flush@moveto%
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}
|
|
\tikz@make@last@position{\expandafter\pgfpoint\pgfsyssoftpath@lastmoveto}%
|
|
\tikz@path@close{\expandafter\pgfpoint\pgfsyssoftpath@lastmoveto}%
|
|
\def\pgfstrokehook{}%
|
|
\edef\tikz@timer@end{%\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\noexpand\pgfqpoint{\the\tikz@lastmovetox}{\the\tikz@lastmovetoy}}%
|
|
\let\tikz@timer=\tikz@timer@line%
|
|
\let\tikz@tangent\tikz@timer@start%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
|
|
% Syntax for options:
|
|
% [options]
|
|
\def\tikz@parse@options#1]{%
|
|
\tikzset{#1}%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
% Syntax for edges:
|
|
% edge [options] (coordinate)
|
|
% edge [options] node {node text} (coordinate)
|
|
% edge :attribute={...} [options] node {node text} (coordinate)
|
|
\def\tikz@edge@plain{%
|
|
\begingroup%
|
|
\ifx\tikz@to@use@whom\pgfutil@undefined\else\tikz@to@use@whom\fi
|
|
\let\tikz@to@or@edge@function=\tikz@do@edge%
|
|
\let\tikz@@to@local@options\pgfutil@empty%
|
|
\let\tikz@collected@onpath=\pgfutil@empty%
|
|
\tikz@to@or@edge}%
|
|
|
|
% Syntax for to paths:
|
|
% to [options] (coordinate)
|
|
% to [options] node {node text} (coordinate)
|
|
% to :attribute={...} [options] node {node text} (coordinate)
|
|
\def\tikz@to o{%
|
|
\tikz@to@use@last@coordinate%
|
|
\let\tikz@to@or@edge@function=\tikz@do@to%
|
|
\let\tikz@@to@local@options\pgfutil@empty%
|
|
\let\tikz@collected@onpath=\pgfutil@empty%
|
|
\tikz@to@or@edge}%
|
|
|
|
\def\tikz@to@or@edge{%
|
|
\pgfutil@ifnextchar[{\tikz@to@or@edge@option}{%
|
|
\pgfutil@ifnextchar:{\tikz@to@or@edge@animation}{%
|
|
\tikz@@to@collect}}%]
|
|
}%
|
|
\def\tikz@to@or@edge@option[#1]{%
|
|
\expandafter\def\expandafter\tikz@@to@local@options\expandafter{\tikz@@to@local@options,#1}%
|
|
\tikz@to@or@edge%
|
|
}%
|
|
\def\tikz@to@or@edge@animation:#1=#2{%
|
|
\expandafter\def\expandafter\tikz@@to@local@options\expandafter{\tikz@@to@local@options,%
|
|
animate={myself:{#1}={#2}}}%
|
|
\tikz@to@or@edge%
|
|
}%
|
|
\def\tikz@@to@collect{%
|
|
\pgfutil@ifnextchar(\tikz@@to@or@edge@coordinate%)
|
|
{\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@@to@collect}%
|
|
{\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@@to@collect}%
|
|
{\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@@to@collect}%
|
|
{\pgfutil@ifnextchar +{\tikz@scan@one@point\tikz@@to@or@edge@math}%
|
|
{\tikzerror{(, +, coordinate, pic, or node expected}%)
|
|
\tikz@@to@or@edge@coordinate()}}}}}%
|
|
}%
|
|
|
|
\def\tikz@@to@or@edge@coordinate({%
|
|
\pgfutil@ifnextchar${%$
|
|
% Ok, parse directly
|
|
\tikz@scan@one@point\tikz@@to@or@edge@math(%
|
|
}{%
|
|
\pgfutil@ifnextchar[{%]
|
|
\tikz@scan@one@point\tikz@@to@or@edge@math(%
|
|
}{%
|
|
\tikz@@to@or@edge@@coordinate(%
|
|
}%
|
|
}%
|
|
}%
|
|
\def\tikz@@to@or@edge@math#1{%
|
|
\pgf@process{#1}%
|
|
\edef\tikztotarget{\the\pgf@x,\the\pgf@y}%
|
|
\tikz@to@or@edge@function%
|
|
}%
|
|
|
|
\def\tikz@@to@or@edge@@coordinate(#1){%
|
|
\def\tikztotarget{#1}%
|
|
\tikz@to@or@edge@function%
|
|
}%
|
|
|
|
\def\tikz@do@edge{%
|
|
\ifx\tikz@edge@macro\pgfutil@empty%
|
|
\setbox\tikz@whichbox=\hbox\bgroup%
|
|
\unhbox\tikz@whichbox%
|
|
\hbox\bgroup
|
|
\bgroup%
|
|
\pgfinterruptpath%
|
|
\pgfscope%
|
|
\let\tikz@transform=\pgfutil@empty%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\tikz@clear@rdf@options%
|
|
\let\tikz@tonodes=\tikz@collected@onpath%
|
|
\def\tikztonodes{{\pgfextra{\tikz@node@is@a@labeltrue}\tikz@tonodes}}%
|
|
\let\tikz@collected@onpath=\pgfutil@empty%
|
|
\tikz@options%
|
|
\tikz@do@rdf@pre@options%
|
|
\pgfidscope%
|
|
\tikz@do@rdf@post@options%
|
|
\tikz@transform%
|
|
\let\tikz@transform=\relax%
|
|
% Typeset node:
|
|
\let\tikz@after@path\pgfutil@empty%
|
|
\tikz@atbegin@to%
|
|
\tikz@enable@edge@quotes%
|
|
\path[style=every edge]\expandafter[\tikz@@to@local@options](\tikztostart)\tikz@to@path
|
|
\pgfextra{\global\let\tikz@after@path@smuggle=\tikz@after@path};%
|
|
\tikz@atend@to%
|
|
\endpgfidscope%
|
|
\endpgfscope%
|
|
\endpgfinterruptpath%
|
|
\egroup
|
|
\egroup%
|
|
\egroup%
|
|
\global\setbox\tikz@tempbox=\box\tikz@whichbox%
|
|
\expandafter\endgroup%
|
|
\expandafter\setbox\tikz@whichbox=\box\tikz@tempbox%
|
|
\else%
|
|
\expandafter\expandafter\expandafter\tikz@edge@macro%
|
|
\expandafter\expandafter\expandafter{\expandafter\tikz@@to@local@options\expandafter}\expandafter{\tikz@collected@onpath}%
|
|
\endgroup%
|
|
\let\tikz@after@path@smuggle=\pgfutil@empty%
|
|
\fi%
|
|
\expandafter\tikz@scan@next@command\tikz@after@path@smuggle%
|
|
}%
|
|
|
|
\def\tikz@do@to{%
|
|
\let\tikz@tonodes=\tikz@collected@onpath%
|
|
\def\tikztonodes{{\pgfextra{\tikz@node@is@a@labeltrue}\tikz@tonodes}}%
|
|
\let\tikz@collected@onpath=\pgfutil@empty%
|
|
\tikz@scan@next@command%
|
|
{%
|
|
\pgfextra{\let\tikz@after@path\pgfutil@empty}%
|
|
\pgfextra{\tikz@atbegin@to}%
|
|
\pgfextra{\tikz@enable@edge@quotes}%
|
|
[style=every to]\expandafter[\tikz@@to@local@options]\tikz@to@path%
|
|
\pgfextra{\tikz@atend@to}%
|
|
\pgf@stop%
|
|
\expandafter\tikz@scan@next@command\expandafter%
|
|
}\tikz@after@path%
|
|
}%
|
|
|
|
|
|
\def\tikz@to@use@last@coordinate{%
|
|
\iftikz@shapeborder%
|
|
\edef\tikztostart{\tikz@shapeborder@name}%
|
|
\else%
|
|
\edef\tikztostart{\the\tikz@lastx,\the\tikz@lasty}%
|
|
\fi%
|
|
}%
|
|
\def\tikz@to@use@last@fig@name{%
|
|
\edef\tikztostart{\tikz@to@last@fig@name}%
|
|
}%
|
|
|
|
|
|
|
|
% Syntax for graph path command:
|
|
% graph [options] {...}
|
|
% See the graph library for details
|
|
|
|
\def\tikz@graph aph{\tikz@lib@graph@parser}%
|
|
|
|
\def\tikz@lib@graph@parser{\pgfutil@ifnextchar[\tikz@graph@error{\tikz@graph@error[]}}%]%
|
|
\def\tikz@graph@error[#1]#2{%
|
|
\tikzerror{You need to say \string\usetikzlibrary{graphs} in order to use the graph syntax}%
|
|
\tikz@lib@graph@parser@done%
|
|
}%
|
|
|
|
\def\tikz@lib@graph@parser@done{%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
|
|
|
|
|
|
% Syntax for edge from parent:
|
|
% edge from parent [options]
|
|
\def\tikz@edgetoparent from parent{\pgfutil@ifnextchar[\tikz@@edgetoparent{\tikz@@edgetoparent[]}}%}%
|
|
\def\tikz@@edgetoparent[#1]{%
|
|
\let\tikz@edge@to@parent@needed=\pgfutil@empty%
|
|
\def\tikz@edgetoparent@options{#1}%
|
|
\begingroup%
|
|
\let\tikz@collected@onpath=\pgfutil@empty%
|
|
\tikz@edgetoparentcollect%
|
|
}%
|
|
\def\tikz@edgetoparentcollect{
|
|
\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@edgetoparentcollect}%
|
|
{%
|
|
\expandafter%
|
|
\endgroup%
|
|
\expandafter\tikz@edgetoparent@rollout\expandafter{\tikz@collected@onpath}%
|
|
}
|
|
}%
|
|
|
|
\def\tikz@edgetoparent@rollout#1{%
|
|
\pgfkeysgetvalue{/tikz/edge from parent macro}\tikz@etop@temp
|
|
\expandafter\tikz@scan@next@command\expandafter\tikz@etop@temp\expandafter{\tikz@edgetoparent@options}{#1}%
|
|
}%
|
|
|
|
|
|
% Syntax for bezier curves
|
|
% .. controls(point) and (point) .. (target)
|
|
% .. controls(point) .. (target)
|
|
% .. (target) % currently not supported
|
|
|
|
\def\tikz@dot.{\tikz@@dot}%
|
|
\def\tikz@@dot{%
|
|
\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@@dot}{%
|
|
\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@@dot}%
|
|
{\pgfutil@ifnextchar c{\tikz@curveto@double}{\tikz@curveto@auto}}}%
|
|
}%
|
|
|
|
\def\tikz@curveto@double co{%
|
|
\pgfutil@ifnextchar o{\tikz@collect@coordinate@onpath\tikz@@dot co}
|
|
{\tikz@cureveto@@double}}%
|
|
\def\tikz@cureveto@@double ntrols#1{%
|
|
\tikz@scan@one@point\tikz@curveA#1%
|
|
}%
|
|
\def\tikz@curveA#1{%
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
{%
|
|
\tikz@lastxsaved=\tikz@lastx%
|
|
\tikz@lastysaved=\tikz@lasty%
|
|
\tikz@make@last@position{#1}%
|
|
\xdef\tikz@curve@first{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
}%
|
|
\pgfutil@ifnextchar a
|
|
{\tikz@curveBand}%
|
|
{\let\tikz@curve@second\tikz@curve@first\tikz@curveCdots}%
|
|
}%
|
|
\def\tikz@curveBand and{%
|
|
\tikz@scan@one@point\tikz@curveB%
|
|
}%
|
|
\def\tikz@curveB#1{%
|
|
\def\tikz@curve@second{#1}%
|
|
\tikz@curveCdots}
|
|
\def\tikz@curveCdots{%
|
|
\afterassignment\tikz@curveCdot\let\pgfutil@next=}%
|
|
\def\tikz@curveCdot.{%
|
|
\ifx\pgfutil@next.%
|
|
\else%
|
|
\tikzerror{Dot expected}%
|
|
\fi%
|
|
\tikz@updatecurrenttrue%
|
|
\tikz@curveCcheck%
|
|
}%
|
|
\def\tikz@curveCcheck{%
|
|
\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@curveCcheck}{%
|
|
\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@curveCcheck}%
|
|
{\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@curveCcheck}
|
|
{\tikz@scan@one@point\tikz@curveC}}}%
|
|
}%
|
|
\def\tikz@curveC#1{%
|
|
\tikz@make@last@position{#1}%
|
|
\edef\tikz@curve@third{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
{%
|
|
\tikz@lastxsaved=\tikz@lastx%
|
|
\tikz@lastysaved=\tikz@lasty%
|
|
\tikz@make@last@position{\tikz@curve@second}%
|
|
\xdef\tikz@curve@second{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
}%
|
|
%
|
|
% Start recalculating things in case start and end are shapes.
|
|
%
|
|
% First, the start:
|
|
\ifx\tikz@moveto@waiting\relax%
|
|
\else%
|
|
\pgf@process{\pgfpointshapeborder{\tikz@moveto@waiting}{\tikz@curve@first}}%
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
\tikz@@movetosave{\pgfqpoint{\pgf@x}{\pgf@y}}%
|
|
\fi%
|
|
\let\tikz@timer@cont@one=\tikz@curve@first%
|
|
\let\tikz@timer@cont@two=\tikz@curve@second%
|
|
% Second, the end:
|
|
\iftikz@shapeborder%
|
|
% ok, target is a shape. recalculate third
|
|
{%
|
|
\pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\tikz@curve@second}}%
|
|
\tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
|
|
\edef\tikz@curve@third{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\pgfpathcurveto{\tikz@curve@first}{\tikz@curve@second}{\tikz@curve@third}%
|
|
\global\let\tikz@timer@end@temp=\tikz@curve@third% move out of group
|
|
}%
|
|
\let\tikz@timer@end=\tikz@timer@end@temp%
|
|
\edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
|
|
\else%
|
|
\pgfpathcurveto{\tikz@curve@first}{\tikz@curve@second}{\tikz@curve@third}%
|
|
\let\tikz@timer@end=\tikz@curve@third
|
|
\let\tikz@moveto@waiting=\relax%
|
|
\fi%
|
|
\let\tikz@timer=\tikz@timer@curve%
|
|
\let\tikz@tangent=\tikz@curve@second%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
|
|
% Syntax for rectangles:
|
|
% rectangle <corner point>
|
|
\def\tikz@rect ectangle{%
|
|
\tikz@flush@moveto%
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\tikz@@rect}%
|
|
\def\tikz@@rect{%
|
|
\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@@rect}{%
|
|
\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@@rect}%
|
|
{\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@@rect}%
|
|
{
|
|
\pgf@xa=\tikz@lastx\relax%
|
|
\pgf@ya=\tikz@lasty\relax%
|
|
\tikz@scan@one@point\tikz@rectB}}}}%
|
|
\def\tikz@rectB#1{%
|
|
\tikz@make@last@position{#1}%
|
|
\edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\let\tikz@timer=\tikz@timer@line%
|
|
\tikz@@movetosave{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\tikz@path@lineto{\pgfqpoint{\pgf@xa}{\tikz@lasty}}%
|
|
\tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
|
|
\tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@ya}}%
|
|
\iftikz@snaked%
|
|
\tikz@path@lineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\fi%
|
|
\pgfpathclose%
|
|
\tikz@@movetosave{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
|
|
\def\pgfstrokehook{}%
|
|
\let\tikz@tangent\relax%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
|
|
|
|
% Syntax for grids:
|
|
% grid <corner point>
|
|
\def\tikz@grid id{%
|
|
\tikz@flush@moveto%
|
|
\pgf@xa=\tikz@lastx\relax%
|
|
\pgf@ya=\tikz@lasty\relax%
|
|
\pgfutil@ifnextchar[{\tikz@gridA}{\tikz@gridA[]}}%}%
|
|
\def\tikz@gridA[#1]{%
|
|
\def\tikz@grid@options{#1}%
|
|
\tikz@cycle@expander{\tikz@scan@one@point\tikz@gridB}}%
|
|
\def\tikz@gridB#1{%
|
|
\tikz@make@last@position{#1}%
|
|
\let\tikz@tangent\relax%
|
|
{%
|
|
\let\tikz@after@path\pgfutil@empty%
|
|
\expandafter\tikzset\expandafter{\tikz@grid@options}
|
|
\tikz@checkunit{\tikz@grid@x}%
|
|
\iftikz@isdimension%
|
|
\pgf@process{\pgfpoint{\tikz@grid@x}{0pt}}%
|
|
\else%
|
|
\pgf@process{\pgfpointxy{\tikz@grid@x}{0}}%
|
|
\fi%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\tikz@checkunit{\tikz@grid@y}%
|
|
\iftikz@isdimension%
|
|
\pgf@process{\pgfpoint{0pt}{\tikz@grid@y}}%
|
|
\else%
|
|
\pgf@process{\pgfpointxy{0}{\tikz@grid@y}}%
|
|
\fi%
|
|
\advance\pgf@xb by\pgf@x%
|
|
\advance\pgf@yb by\pgf@y%
|
|
\pgfpathgrid[stepx=\pgf@xb,stepy=\pgf@yb]%
|
|
{\pgfqpoint{\pgf@xa}{\pgf@ya}}{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
|
|
\expandafter}%
|
|
\expandafter\tikz@scan@next@command\tikz@after@path%
|
|
}%
|
|
|
|
|
|
|
|
% Syntax for plot:
|
|
% plot [local options] ... % starts with a moveto
|
|
% -- plot [local options] ... % starts with a lineto
|
|
\def\tikz@plot lot{%
|
|
\tikz@flush@moveto%
|
|
\pgfutil@ifnextchar[{\tikz@@plot}{\tikz@@plot[]}}%}%
|
|
\def\tikz@@plot[#1]{%
|
|
\let\tikz@tangent\tikz@tangent@lookup%
|
|
\begingroup%
|
|
\let\tikz@after@path\pgfutil@empty%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\tikzset{every plot/.try}%
|
|
\tikzset{#1}%
|
|
\pgfutil@ifnextchar f{\tikz@plot@f}%
|
|
{\pgfutil@ifnextchar c{\tikz@plot@scan@points}%
|
|
{\pgfutil@ifnextchar ({\tikz@plot@expression}{%
|
|
\tikzerror{Cannot parse this plotting data}%
|
|
\endgroup}}}}%
|
|
\def\tikz@plot@f f{\pgfutil@ifnextchar i{\tikz@plot@file}{\tikz@plot@function}}%
|
|
|
|
\def\tikz@plot@file ile#1{\def\tikz@plot@data{\pgfplotxyfile{#1}}\tikz@@@plot}%
|
|
\def\tikz@plot@scan@points coordinates#1{%
|
|
\pgfplothandlerrecord\tikz@plot@data%
|
|
\pgfplotstreamstart%
|
|
\pgfutil@ifnextchar\pgf@stop{\pgfplotstreamend\expandafter\tikz@@@plot\pgfutil@gobble}
|
|
{\tikz@scan@one@point\tikz@plot@next@point}%
|
|
#1\pgf@stop%
|
|
}%
|
|
\def\tikz@plot@next@point#1{%
|
|
\pgfplotstreampoint{#1}%
|
|
\pgfutil@ifnextchar\pgf@stop{\pgfplotstreamend\expandafter\tikz@@@plot\pgfutil@gobble}%
|
|
{\tikz@scan@one@point\tikz@plot@next@point}%
|
|
}%
|
|
\def\tikz@plot@function unction#1{%
|
|
\def\tikz@plot@filename{\tikz@plot@prefix\tikz@plot@id}%
|
|
\iftikz@plot@raw@gnuplot%
|
|
\def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{#1}}%
|
|
\else%
|
|
\iftikz@plot@parametric%
|
|
\def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{%
|
|
set samples \tikz@plot@samples;
|
|
set parametric;
|
|
plot [t=\tikz@plot@domain]
|
|
[\tikz@plot@xrange]
|
|
[\tikz@plot@range]
|
|
#1}}%
|
|
\else%
|
|
\def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{%
|
|
set samples \tikz@plot@samples;
|
|
plot [x=\tikz@plot@domain]
|
|
\ifx\tikz@plot@range\pgfutil@empty\else[\tikz@plot@range]\fi
|
|
#1}}%
|
|
\fi%
|
|
\fi%
|
|
\tikz@@@plot%
|
|
}%
|
|
|
|
\def\tikz@plot@no@resample{%
|
|
\pgfutil@IfFileExists{\tikz@plot@filename.table}%
|
|
{\def\tikz@plot@data{\pgfplotxyfile{\tikz@plot@filename.table}}}%
|
|
{}%
|
|
}%
|
|
|
|
\def\tikz@plot@expression(#1){%
|
|
\edef\tikz@plot@data{\noexpand\pgfplotfunction{\expandafter\noexpand\tikz@plot@var}{\tikz@plot@samplesat}}%
|
|
\expandafter\def\expandafter\tikz@plot@data\expandafter{\tikz@plot@data{\tikz@scan@one@point\pgfutil@firstofone(#1)}}%
|
|
\tikz@@@plot%
|
|
}%
|
|
|
|
\def\tikz@@@plot{%
|
|
\def\pgfplotlastpoint{\pgfpointorigin}%
|
|
\tikz@plot@handler%
|
|
\tikz@plot@data%
|
|
\global\let\tikz@@@temp=\pgfplotlastpoint%
|
|
\ifx\tikz@plot@mark\pgfutil@empty%
|
|
\else%
|
|
% Marks are drawn after the path.
|
|
\setbox\tikz@whichbox=\hbox{%
|
|
\unhbox\tikz@whichbox%
|
|
\hbox{{%
|
|
\pgfinterruptpath%
|
|
\pgfscope%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\let\tikz@transform=\pgfutil@empty%
|
|
\tikzset{every mark}%
|
|
\tikz@options%
|
|
\ifx\tikz@mark@list\pgfutil@empty%
|
|
\pgfplothandlermark{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}}%
|
|
\else
|
|
\pgfplothandlermarklisted{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}}{\tikz@mark@list}%
|
|
\fi
|
|
\tikz@plot@data%
|
|
\endpgfscope
|
|
\endpgfinterruptpath%
|
|
}}%
|
|
}%
|
|
\fi%
|
|
\global\setbox\tikz@tempbox=\box\tikz@whichbox%
|
|
\global\let\tikz@after@path@smuggle=\tikz@after@path
|
|
\expandafter\endgroup%
|
|
\expandafter\setbox\tikz@whichbox=\box\tikz@tempbox%
|
|
\tikz@make@last@position{\tikz@@@temp}%
|
|
\expandafter\tikz@scan@next@command\tikz@after@path@smuggle%
|
|
}%
|
|
|
|
|
|
\pgfdeclareplotmark{ball}
|
|
{%
|
|
\def\tikz@shading{ball}%
|
|
\shade (0pt,0pt) circle (\pgfplotmarksize);%
|
|
}%
|
|
|
|
|
|
|
|
|
|
% Syntax for cosine curves:
|
|
% cos <end of quarter-period>
|
|
\def\tikz@cosine s{\tikz@cycle@expander{\tikz@scan@one@point\tikz@@cosine}}
|
|
\def\tikz@@cosine#1{%
|
|
\let\tikz@tangent\tikz@tangent@lookup%
|
|
\tikz@flush@moveto%
|
|
\pgf@process{#1}%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\advance\pgf@xc by-\tikz@lastx%
|
|
\advance\pgf@yc by-\tikz@lasty%
|
|
\advance\tikz@lastx by\pgf@xc%
|
|
\advance\tikz@lasty by\pgf@yc%
|
|
\tikz@lastxsaved=\tikz@lastx%
|
|
\tikz@lastysaved=\tikz@lasty%
|
|
\tikz@updatecurrenttrue%
|
|
\pgfpathcosine{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
% Syntax for sine curves:
|
|
% sin <end of quarter-period>
|
|
\def\tikz@sine in{\tikz@cycle@expander{\tikz@scan@one@point\tikz@@sine}}
|
|
\def\tikz@@sine#1{%
|
|
\let\tikz@tangent\tikz@tangent@lookup%
|
|
\tikz@flush@moveto%
|
|
\pgf@process{#1}%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\advance\pgf@xc by-\tikz@lastx%
|
|
\advance\pgf@yc by-\tikz@lasty%
|
|
\advance\tikz@lastx by\pgf@xc%
|
|
\advance\tikz@lasty by\pgf@yc%
|
|
\tikz@lastxsaved=\tikz@lastx%
|
|
\tikz@lastysaved=\tikz@lasty%
|
|
\tikz@updatecurrenttrue%
|
|
\pgfpathsine{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
% Syntax for parabolas:
|
|
% parabola[options] bend <coordinate> <coordinate>
|
|
\def\tikz@parabola arabola{%
|
|
\let\tikz@tangent\tikz@tangent@lookup%
|
|
\pgfutil@ifnextchar[{\tikz@parabola@options}{\tikz@parabola@options[]}}%}%
|
|
|
|
\def\tikz@parabola@options[#1]{%
|
|
\def\tikz@parabola@option{#1}%
|
|
\pgfutil@ifnextchar b{\tikz@parabola@scan@bend}{\tikz@cycle@expander{\tikz@scan@one@point\tikz@parabola@semifinal}}}%
|
|
\def\tikz@parabola@scan@bend bend{\tikz@scan@one@point\tikz@parabola@scan@bendB}%
|
|
\def\tikz@parabola@scan@bendB#1{%
|
|
\def\tikz@parabola@bend{#1}%
|
|
\tikz@cycle@expander{\tikz@scan@one@point\tikz@parabola@semifinal}%
|
|
}%
|
|
\def\tikz@parabola@semifinal#1{%
|
|
\tikz@flush@moveto%
|
|
% Save original start:
|
|
\pgf@xb=\tikz@lastx%
|
|
\pgf@yb=\tikz@lasty%
|
|
\tikz@make@last@position{#1}%
|
|
\pgf@xc=\tikz@lastx%
|
|
\pgf@yc=\tikz@lasty%
|
|
\begingroup% now calculate bend:
|
|
\let\tikz@after@path\pgfutil@empty%
|
|
\expandafter\tikzset\expandafter{\tikz@parabola@option}%
|
|
\tikz@lastxsaved=\tikz@parabola@bend@factor\tikz@lastx%
|
|
\tikz@lastysaved=\tikz@parabola@bend@factor\tikz@lasty%
|
|
\advance\tikz@lastxsaved by\pgf@xb%
|
|
\advance\tikz@lastysaved by\pgf@yb%
|
|
\advance\tikz@lastxsaved by-\tikz@parabola@bend@factor\pgf@xb%
|
|
\advance\tikz@lastysaved by-\tikz@parabola@bend@factor\pgf@yb%
|
|
\expandafter\tikz@make@last@position\expandafter{\tikz@parabola@bend}%
|
|
% Calculate delta from bend
|
|
\advance\pgf@xc by-\tikz@lastx%
|
|
\advance\pgf@yc by-\tikz@lasty%
|
|
% Ok, now calculate delta to bend
|
|
\advance\tikz@lastx by-\pgf@xb%
|
|
\advance\tikz@lasty by-\pgf@yb%
|
|
\xdef\tikz@parabola@b{{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}}%
|
|
\expandafter\endgroup%
|
|
\expandafter\expandafter\expandafter\pgfpathparabola\expandafter\tikz@parabola@b%
|
|
\expandafter\tikz@scan@next@command\tikz@after@path%
|
|
}%
|
|
|
|
|
|
% Syntax for circles:
|
|
% circle [options] % where options should set, at least, radius
|
|
% circle (radius) % deprecated
|
|
%
|
|
% Syntax for ellipses:
|
|
% ellipse [options] % identical to circle.
|
|
% ellipse (x-radius and y-radius) % deprecated
|
|
%
|
|
% radii can be dimensionless, then they are in the xy-system
|
|
\def\tikz@circle ircle{\tikz@flush@moveto\tikz@@circle}%
|
|
\def\tikz@ellipse llipse{\tikz@flush@moveto\tikz@@circle}%
|
|
\def\tikz@@circle{%
|
|
\let\tikz@tangent\relax%
|
|
\pgfutil@ifnextchar(\tikz@@@circle
|
|
{\pgfutil@ifnextchar[\tikz@circle@opt{%])
|
|
\advance\tikz@expandcount by -10\relax% go down quickly
|
|
\ifnum\tikz@expandcount<0\relax%
|
|
\let\pgfutil@next=\tikz@@circle@normal%
|
|
\else%
|
|
\let\pgfutil@next=\tikz@@circle@scanexpand%
|
|
\fi%
|
|
\pgfutil@next%
|
|
}}%
|
|
}%
|
|
\def\tikz@@circle@scanexpand{\expandafter\tikz@@circle}%
|
|
\def\tikz@@circle@normal{\tikz@circle@opt[]}%
|
|
|
|
\def\tikz@circle@opt[#1]{%
|
|
{%
|
|
\def\tikz@node@at{\tikz@last@position}%
|
|
\let\tikz@transform=\pgfutil@empty%
|
|
\tikzset{every circle/.try,#1}%
|
|
\pgftransformshift{\tikz@node@at}%
|
|
\tikz@transform%
|
|
\tikz@do@ellipse{\pgfkeysvalueof{/tikz/x radius}}{\pgfkeysvalueof{/tikz/y radius}}
|
|
}%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
\def\tikz@@@circle(#1){%
|
|
{%
|
|
\pgftransformshift{\tikz@last@position}%
|
|
\pgfutil@in@{ and }{#1}%
|
|
\ifpgfutil@in@%
|
|
\tikz@@ellipseB(#1)%
|
|
\else%
|
|
\tikz@do@circle{#1}%
|
|
\fi%
|
|
}%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
\def\tikz@@ellipseB(#1 and #2){%
|
|
\tikz@do@ellipse{#1}{#2}%
|
|
}%
|
|
\def\tikz@do@circle#1{%
|
|
\pgfmathparse{#1}%
|
|
\let\tikz@ellipse@x=\pgfmathresult
|
|
\ifpgfmathunitsdeclared
|
|
\pgfpathellipse{\pgfpointorigin}%
|
|
{\pgfqpoint{\tikz@ellipse@x pt}{0pt}}%
|
|
{\pgfpoint{0pt}{\tikz@ellipse@x pt}}%
|
|
\else
|
|
\pgfpathellipse{\pgfpointorigin}%
|
|
{\pgfpointxy{\tikz@ellipse@x}{0}}%
|
|
{\pgfpointxy{0}{\tikz@ellipse@x}}%
|
|
\fi
|
|
}
|
|
\def\tikz@do@ellipse#1#2{
|
|
\pgfmathparse{#1}%
|
|
\let\tikz@ellipse@x=\pgfmathresult%
|
|
\ifpgfmathunitsdeclared%
|
|
\pgfmathparse{#2}%
|
|
\let\tikz@ellipse@y=\pgfmathresult%
|
|
\ifpgfmathunitsdeclared%
|
|
\pgfpathellipse{\pgfpointorigin}{%
|
|
\pgfqpoint{\tikz@ellipse@x pt}{0pt}}{\pgfpoint{0pt}{\tikz@ellipse@y pt}}%
|
|
\else%
|
|
\tikzerror{You cannot mix dimensions and dimensionless values in an ellipse}%
|
|
\fi%
|
|
\else%
|
|
\pgfmathparse{#2}%
|
|
\let\tikz@ellipse@y=\pgfmathresult%
|
|
\ifpgfmathunitsdeclared%
|
|
\tikzerror{You cannot mix dimensions and dimensionless values in an ellipse}%
|
|
\else%
|
|
\pgfpathellipse{\pgfpointorigin}{%
|
|
\pgfpointxy{\tikz@ellipse@x}{0}}{\pgfpointxy{0}{\tikz@ellipse@y}}%
|
|
\fi%
|
|
\fi%
|
|
}%
|
|
|
|
% Syntax for arcs:
|
|
% arc [options]
|
|
%
|
|
% (The syntax with parentheses is deprecated.)
|
|
\def\tikz@arcA rc{\tikz@flush@moveto\tikz@arc@cont}%
|
|
\def\tikz@arc@cont{%
|
|
\pgfutil@ifnextchar(%)
|
|
{\tikz@@arcto}{%
|
|
\pgfutil@ifnextchar[%]
|
|
{\tikz@arc@opt}%
|
|
{%
|
|
\advance\tikz@expandcount by -10\relax% go down quickly
|
|
\ifnum\tikz@expandcount<0\relax%
|
|
\let\pgfutil@next=\tikz@@arc@normal%
|
|
\else%
|
|
\let\pgfutil@next=\tikz@@arc@scanexpand%
|
|
\fi%
|
|
\pgfutil@next%
|
|
}%
|
|
}%
|
|
}%
|
|
\def\tikz@@arc@scanexpand{\expandafter\tikz@arc@cont}%
|
|
\def\tikz@@arc@normal{\tikz@arc@opt[]}%
|
|
|
|
|
|
\def\tikz@arc@opt[#1]{%
|
|
{%
|
|
\tikzset{every arc/.try,#1}%
|
|
\pgfkeysgetvalue{/tikz/start angle}\tikz@s
|
|
\pgfkeysgetvalue{/tikz/end angle}\tikz@e
|
|
\pgfkeysgetvalue{/tikz/delta angle}\tikz@d
|
|
\ifx\tikz@s\pgfutil@empty%
|
|
\pgfmathsetmacro\tikz@s{\tikz@e-\tikz@d}
|
|
\else
|
|
\ifx\tikz@e\pgfutil@empty%
|
|
\pgfmathsetmacro\tikz@e{\tikz@s+\tikz@d}
|
|
\fi%
|
|
\fi%
|
|
\xdef\pgf@marshal{\noexpand%
|
|
\tikz@do@arc{\tikz@s}{\tikz@e}
|
|
{\pgfkeysvalueof{/tikz/x radius}}
|
|
{\pgfkeysvalueof{/tikz/y radius}}}%
|
|
}%
|
|
\pgf@marshal%
|
|
\tikz@arcfinal%
|
|
}%
|
|
|
|
\def\tikz@@arcto(#1){%
|
|
\edef\tikz@temp{(#1)}%
|
|
\expandafter\tikz@@@arcto@check@slashand\tikz@temp%
|
|
}%
|
|
|
|
\def\tikz@@@arcto@check@slashand(#1:#2:#3){%
|
|
\pgfutil@in@{ and }{#3}%
|
|
\ifpgfutil@in@%
|
|
\tikz@parse@arc@and(#1:#2:#3)%
|
|
\else%
|
|
\tikz@parse@arc@and(#1:#2:{#3} and {#3})%
|
|
\fi%
|
|
\tikz@arcfinal%
|
|
}%
|
|
|
|
\def\tikz@parse@arc@and(#1:#2:#3 and #4){%
|
|
\tikz@do@arc{#1}{#2}{#3}{#4}%
|
|
}%
|
|
\def\tikz@do@arc#1#2#3#4{%
|
|
\let\tikz@tangent\tikz@tangent@lookup%
|
|
\edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\pgfmathsetmacro\tikz@timer@start@angle{#1}%
|
|
\pgfmathsetmacro\tikz@timer@end@angle{#2}%
|
|
\pgfmathparse{#3}%
|
|
\let\tikz@arc@x=\pgfmathresult%
|
|
\ifpgfmathunitsdeclared%
|
|
\pgfmathparse{#4}%
|
|
\let\tikz@arc@y=\pgfmathresult%
|
|
\ifpgfmathunitsdeclared%
|
|
\tikz@@@arcfinal{\pgfpatharc{\tikz@timer@start@angle}{\tikz@timer@end@angle}{\tikz@arc@x pt and \tikz@arc@y pt}}
|
|
{\pgfpointpolar{\tikz@timer@start@angle}{\tikz@arc@x pt and \tikz@arc@y pt}}
|
|
{\pgfpointpolar{\tikz@timer@end@angle}{\tikz@arc@x pt and \tikz@arc@y pt}}%
|
|
\edef\tikz@timer@zero@axis{\noexpand\pgfqpoint{\tikz@arc@x pt}{0pt}}
|
|
\edef\tikz@timer@ninety@axis{\noexpand\pgfqpoint{0pt}{\tikz@arc@y pt}}
|
|
\else%
|
|
\tikzerror{You cannot mix dimensions and dimensionless values in an arc}%
|
|
\fi%
|
|
\else%
|
|
\pgfmathparse{#4}%
|
|
\let\tikz@arc@y=\pgfmathresult%
|
|
\ifpgfmathunitsdeclared%
|
|
\tikzerror{You cannot mix dimensions and dimensionless values in an arc}%
|
|
\else%
|
|
\tikz@@@arcfinal{\pgfpatharcaxes{\tikz@timer@start@angle}{\tikz@timer@end@angle}{\pgfpointxy{\tikz@arc@x}{0}}{\pgfpointxy{0}{\tikz@arc@y}}}
|
|
{\pgfpointpolarxy{\tikz@timer@start@angle}{\tikz@arc@x and \tikz@arc@y}}{\pgfpointpolarxy{\tikz@timer@end@angle}{\tikz@arc@x and \tikz@arc@y}}%
|
|
\pgf@process{\pgfpointxy{\tikz@arc@x}{0}}
|
|
\edef\tikz@timer@zero@axis{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
|
|
\pgf@process{\pgfpointxy{0}{\tikz@arc@y}}
|
|
\edef\tikz@timer@ninety@axis{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
|
|
\fi%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@@@arcfinal#1#2#3{%
|
|
#1%
|
|
\pgf@process{#2}
|
|
\xdef\tikz@arc@save@first{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
\pgf@process{#3}
|
|
\xdef\tikz@arc@save@second{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
}%
|
|
|
|
\def\tikz@arcfinal{%
|
|
\pgf@process{\tikz@arc@save@first}%
|
|
\advance\tikz@lastx by-\pgf@x%
|
|
\advance\tikz@lasty by-\pgf@y%
|
|
\pgf@process{\tikz@arc@save@second}%
|
|
\advance\tikz@lastx by\pgf@x%
|
|
\advance\tikz@lasty by\pgf@y%
|
|
\tikz@lastxsaved=\tikz@lastx%
|
|
\tikz@lastysaved=\tikz@lasty%
|
|
\let\tikz@timer=\tikz@timer@arc%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
|
|
% Syntax for coordinates:
|
|
% coordinate[options] (coordinate name) at (point)
|
|
% where ``at (point)'' is optional
|
|
\def\tikz@coordinate ordinate{%
|
|
\pgfutil@ifnextchar[{\tikz@@coordinate@opt}{\tikz@@coordinate@opt[]}}%
|
|
\def\tikz@@coordinate@opt[#1]{%
|
|
\pgfutil@ifnextchar({\tikz@@coordinate[#1]}
|
|
{\tikz@fig ode[shape=coordinate,#1]{}}}%}%
|
|
\def\tikz@@coordinate[#1](#2){%
|
|
\pgfutil@ifnextchar a{\tikz@@coordinate@at[#1](#2)}
|
|
{\tikz@fig ode[shape=coordinate,#1](#2){}}}%
|
|
\def\tikz@@coordinate@at[#1](#2)a{%
|
|
\pgfutil@ifnextchar t{\tikz@@coordinate@@at[#1](#2)a}%
|
|
{\tikz@fig ode[shape=coordinate,#1](#2){}a}%
|
|
}%
|
|
\def\tikz@@coordinate@@at[#1](#2)at#3({%
|
|
\def\tikz@coordinate@caller{\tikz@fig ode[shape=coordinate,#1](#2)at}%
|
|
\tikz@scan@one@point\tikz@@coordinate@at@math(%
|
|
}%
|
|
\def\tikz@@coordinate@at@math#1{%
|
|
\pgf@process{#1}%
|
|
\edef\tikz@temp{(\the\pgf@x,\the\pgf@y)}%
|
|
\expandafter\tikz@coordinate@caller\tikz@temp{}%
|
|
}%
|
|
|
|
|
|
|
|
% Syntax for nodes:
|
|
% node foreach \var in {list} ... :attribute={...} [options] (node name) at (pos) {label text}
|
|
%
|
|
% all of :attribute, [options], (node name), at(pos), and foreach are
|
|
% optional. There can be multiple options and the ordering is not
|
|
% important as in node[draw] (a) [rotate=10] {text}, *except* that all
|
|
% foreach statements must come first.
|
|
%
|
|
% A label text always ``ends'' the node.
|
|
%
|
|
\def\tikz@fig ode{%
|
|
\pgfutil@ifnextchar a\tikz@test@also{
|
|
\pgfutil@ifnextchar f{\tikz@nodes@start}\tikz@normal@fig}}%
|
|
\def\tikz@test@also a{\pgfutil@ifnextchar l\tikz@node@also{\tikz@normal@fig a}}%
|
|
\def\tikz@normal@fig{%
|
|
\edef\tikz@save@line@width{\the\pgflinewidth}%
|
|
\begingroup%
|
|
\let\tikz@fig@name=\pgfutil@empty%
|
|
\begingroup%
|
|
\tikz@is@matrixfalse%
|
|
\let\nodepart=\tikz@nodepart%
|
|
\let\tikz@atbegin@scope=\pgfutil@empty%
|
|
\let\tikz@atend@scope=\pgfutil@empty%
|
|
\let\tikz@do@after@node=\tikz@scan@next@command%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\tikz@clear@rdf@options%
|
|
\let\tikz@id@name=\pgfutil@empty%
|
|
\let\tikz@after@path=\pgfutil@empty%
|
|
\let\tikz@transform=\pgfutil@empty%
|
|
\let\tikz@mode=\pgfutil@empty%
|
|
\tikz@decoratepathfalse%
|
|
\let\tikz@preactions=\pgfutil@empty%
|
|
\let\tikz@postactions=\pgfutil@empty%
|
|
\let\tikz@alias=\pgfutil@empty%
|
|
\def\tikz@node@at{\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
|
|
\let\tikz@time@for@matrix\tikz@time%
|
|
\let\tikz@node@content\relax%
|
|
\pgfgetpath\tikzpathuptonow%
|
|
\iftikz@node@is@a@label%
|
|
\else%
|
|
\let\tikz@time\pgfutil@empty%
|
|
\fi%
|
|
\tikz@node@reset@hook%
|
|
\tikzset{every node/.try}%
|
|
\tikz@@scan@fig}%
|
|
\def\tikz@@scan@fig{%
|
|
\pgfutil@ifnextchar a{\tikz@fig@scan@at}
|
|
{\pgfutil@ifnextchar({\tikz@fig@scan@name}
|
|
{\pgfutil@ifnextchar[{\tikz@fig@scan@options}%
|
|
{\pgfutil@ifnextchar:{\tikz@fig@scan@animation}%
|
|
{\pgfutil@ifnextchar\bgroup{\tikz@fig@main}%
|
|
{\tikzerror{A node must have a (possibly empty) label text}%
|
|
\tikz@fig@main{}}}}}}}%}}%
|
|
\def\tikz@fig@scan@at at{%
|
|
\tikz@scan@one@point\tikz@@fig@scan@at}%
|
|
\def\tikz@@fig@scan@at#1{%
|
|
\def\tikz@node@at{#1}\tikz@@scan@fig}%
|
|
\def\tikz@fig@scan@name(#1){%
|
|
\pgfkeysvalueof{/tikz/name/.@cmd}#1\pgfeov% CF : this is now ALWAYS consistent with 'name=' option; allows overrides.
|
|
\tikz@@scan@fig}%
|
|
% make it \long to allow \par in "pin" options etc:
|
|
\long\def\tikz@fig@scan@options[#1]{\iftikz@node@is@pic\tikz@enable@pic@quotes\else\tikz@enable@node@quotes\fi\tikzset{#1}\ifx\tikz@node@content\relax\expandafter\tikz@@scan@fig\else\tikz@expand@node@contents\fi}%
|
|
\def\tikz@fig@scan@animation:#1=#2{\tikzset{animate={myself:{#1}={#2}}}\tikz@@scan@fig}%
|
|
\def\tikz@expand@node@contents{%
|
|
\expandafter\tikz@@scan@fig\expandafter{\tikz@node@content}%
|
|
}%
|
|
\let\tikz@node@reset@hook=\pgfutil@empty%
|
|
\let\tikz@node@begin@hook=\pgfutil@empty%
|
|
\def\tikz@fig@main{%
|
|
\iftikz@node@is@pic%
|
|
\tikz@node@is@picfalse%
|
|
\expandafter\tikz@subpicture@handle%
|
|
\else%
|
|
\afterassignment\tikz@@fig@main\expandafter\let\expandafter\next\expandafter=%
|
|
\fi}%
|
|
\def\tikz@@fig@main{%
|
|
\pgfutil@ifundefined{pgf@sh@s@\tikz@shape}%
|
|
{\tikzerror{Unknown shape ``\tikz@shape.'' Using ``rectangle'' instead}%
|
|
\def\tikz@shape{rectangle}}%
|
|
{}%
|
|
\expandafter\xdef\csname tikz@dcl@coord@\tikz@fig@name\endcsname{%
|
|
\csname tikz@scan@point@coordinate\endcsname}%
|
|
\tikzset{every \tikz@shape\space node/.try}%
|
|
\tikz@node@textfont%
|
|
\tikz@node@begin@hook%
|
|
\iftikz@is@matrix%
|
|
\let\tikz@next=\tikz@do@matrix%
|
|
\else%
|
|
\let\tikz@next=\tikz@do@fig%
|
|
\fi%
|
|
\tikz@next%
|
|
}%
|
|
\let\tikz@nodepart@list\pgfutil@empty
|
|
\def\tikz@do@fig{%
|
|
% Ok, reset all node part boxes
|
|
\pgfutil@for\tikz@temp:=\tikz@nodepart@list\do{%
|
|
\expandafter\setbox\csname pgfnodepart\tikz@temp box\endcsname=\box\pgfutil@voidb@x%
|
|
}%
|
|
\setbox\pgfnodeparttextbox=\hbox%
|
|
\bgroup%
|
|
\pgfinterruptpicture%
|
|
\pgfsys@begin@text%
|
|
\pgfsys@text@to@black@hook%
|
|
\tikzset{every text node part/.try}%
|
|
\ifx\tikz@textopacity\pgfutil@empty%
|
|
\else%
|
|
\pgfsetfillopacity{\tikz@textopacity}%
|
|
\pgfsetstrokeopacity{\tikz@textopacity}%
|
|
\fi%
|
|
\ifx\tikz@text@width\pgfutil@empty%
|
|
\tikz@textfont%
|
|
\else%
|
|
\begingroup%
|
|
\pgfmathsetlength{\pgf@x}{\tikz@text@width}%
|
|
\pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}%
|
|
\tikz@textfont%
|
|
\tikz@text@action%
|
|
\fi%
|
|
\tikz@atbegin@node%
|
|
\bgroup%
|
|
\aftergroup\unskip%
|
|
% Some color stuff has been moved from here to outside; this is
|
|
% necessary for support of dvisvgm and of animation
|
|
% snapshots.
|
|
\ifx\tikz@textcolor\pgfutil@empty%
|
|
\else%
|
|
\pgfutil@colorlet{.}{\tikz@textcolor}%
|
|
\pgfutil@color{\tikz@textcolor}%
|
|
\fi%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\tikz@uninstallcommands%
|
|
\iftikz@handle@active@code%
|
|
\tikz@orig@shorthands%
|
|
\let\tikz@orig@shorthands\pgfutil@empty%
|
|
\fi%
|
|
\ifnum\the\catcode`\;=\active\relax\expandafter\let\tikz@activesemicolon=\tikz@origsemi\fi%
|
|
\ifnum\the\catcode`\:=\active\relax\expandafter\let\tikz@activecolon=\tikz@origcolon\fi%
|
|
\ifnum\the\catcode`\|=\active\relax\expandafter\let\tikz@activebar=\tikz@origbar\fi%
|
|
\aftergroup\tikz@fig@collectresetcolor%
|
|
\tikz@signal@halign@check%
|
|
\tikz@text@reset%
|
|
\tikz@halign@check%
|
|
\ignorespaces%
|
|
}%
|
|
\def\tikz@fig@collectresetcolor{%
|
|
% Hacks for special packages that mess with \aftergroup
|
|
\pgfutil@ifnextchar\reset@color% hack for color package
|
|
{\reset@color\afterassignment\tikz@fig@collectresetcolor\let\tikz@temp=}\tikz@fig@boxdone%
|
|
}%
|
|
\def\tikz@fig@boxdone{%
|
|
\tikz@atend@node%
|
|
\ifx\tikz@text@width\pgfutil@empty%
|
|
\else%
|
|
\pgfutil@endminipage%
|
|
\endgroup%
|
|
\fi%
|
|
\pgfsys@end@text%
|
|
\endpgfinterruptpicture%
|
|
\egroup%
|
|
\pgfutil@ifnextchar c{\tikz@fig@mustbenamed\tikz@fig@continue}%
|
|
{\pgfutil@ifnextchar[{\tikz@fig@mustbenamed\tikz@fig@continue}%
|
|
{\pgfutil@ifnextchar t{\tikz@fig@mustbenamed\tikz@fig@continue}
|
|
{\pgfutil@ifnextchar e{\tikz@fig@mustbenamed\tikz@fig@continue}
|
|
{\ifx\tikz@after@path\pgfutil@empty\expandafter\tikz@fig@continue\else\expandafter\tikz@fig@mustbenamed\expandafter\tikz@fig@continue\fi}}}}}%}%
|
|
|
|
\def\tikz@do@matrix{%
|
|
\tikzset{every matrix/.try}%
|
|
\tikz@node@transformations%
|
|
\tikz@fig@mustbenamed%
|
|
\setbox\tikz@whichbox=\hbox\bgroup%
|
|
\unhbox\tikz@whichbox%
|
|
\hbox\bgroup\bgroup%
|
|
\pgfinterruptpath%
|
|
\pgfscope%
|
|
\ifx\tikz@time\pgfutil@empty\let\tikz@time\tikz@time@for@matrix\fi%
|
|
\tikz@options%
|
|
\tikz@do@rdf@pre@options%
|
|
\tikz@is@nodefalse%
|
|
\tikz@call@id@hook%
|
|
\pgfidscope%
|
|
\tikz@do@rdf@post@options%
|
|
\begingroup%
|
|
\let\tikz@id@name\pgfutil@empty%
|
|
\pgfclearid%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\let\tikzmatrixname=\tikz@fig@name%
|
|
\edef\tikz@m@anchor{\ifx\tikz@matrix@anchor\pgfutil@empty\tikz@anchor\else\tikz@matrix@anchor\fi}%
|
|
\expandafter\pgfutil@in@\expandafter{\expandafter.\expandafter}\expandafter{\tikz@m@anchor}%
|
|
\ifpgfutil@in@%
|
|
\expandafter\tikz@matrix@split\tikz@m@anchor\relax%
|
|
\else%
|
|
\def\tikz@matrix@shift{\pgfpointorigin}%
|
|
\fi%
|
|
\let\tikz@transform=\relax%
|
|
\pgfmatrixbeforeassemblenode{\tikzset{every outer matrix/.try}}%
|
|
\pgfmatrix%
|
|
{\tikz@shape}%
|
|
{\tikz@m@anchor}%
|
|
{\tikz@fig@name}%
|
|
{%
|
|
\pgfutil@tempdima=\pgflinewidth%
|
|
{\begingroup\tikz@finish}%
|
|
\global\pgflinewidth=\pgfutil@tempdima%
|
|
}%
|
|
{\tikz@matrix@shift}%
|
|
{%
|
|
\tikz@matrix@make@active@ampersand%
|
|
\def\pgfmatrixbegincode{%
|
|
\pgfsys@beginscope%
|
|
\tikz@common@matrix@code%
|
|
\tikz@atbegin@cell%
|
|
}%
|
|
\def\tikz@common@matrix@code{%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\let\tikz@mode=\pgfutil@empty%
|
|
\tikzset{every cell/.try={\the\pgfmatrixcurrentrow}{\the\pgfmatrixcurrentcolumn}}%
|
|
\tikzset{column \the\pgfmatrixcurrentcolumn/.try}%
|
|
\ifodd\pgfmatrixcurrentcolumn%
|
|
\tikzset{every odd column/.try}%
|
|
\else%
|
|
\tikzset{every even column/.try}%
|
|
\fi%
|
|
\tikzset{row \the\pgfmatrixcurrentrow/.try}%
|
|
\ifodd\pgfmatrixcurrentrow%
|
|
\tikzset{every odd row/.try}%
|
|
\else%
|
|
\tikzset{every even row/.try}%
|
|
\fi%
|
|
\tikzset{row \the\pgfmatrixcurrentrow\space column \the\pgfmatrixcurrentcolumn/.try}%
|
|
\tikz@options%
|
|
}%
|
|
\def\pgfmatrixendcode{%
|
|
\tikz@atend@cell%
|
|
\pgfsys@endscope%
|
|
}%
|
|
\def\pgfmatrixemptycode{%
|
|
\pgfsys@beginscope%
|
|
\tikz@common@matrix@code%
|
|
\tikz@at@emptycell%
|
|
\pgfsys@endscope%
|
|
}%
|
|
\tikz@atbegin@matrix%
|
|
\aftergroup\tikz@do@matrix@cont}%
|
|
\bgroup%
|
|
}%
|
|
\def\tikz@do@matrix@cont{%
|
|
\tikz@atend@matrix%
|
|
\endgroup%
|
|
\endpgfidscope%
|
|
\endpgfscope
|
|
\endpgfinterruptpath%
|
|
\egroup\egroup%
|
|
\egroup%
|
|
%
|
|
\tikz@node@finish%
|
|
}%
|
|
{%
|
|
\catcode`\&=13
|
|
\gdef\tikz@matrix@make@active@ampersand{%
|
|
\ifx\tikz@ampersand@replacement\pgfutil@empty%
|
|
\catcode`\&=13%
|
|
\let&=\pgfmatrixnextcell%
|
|
\else%
|
|
\expandafter\let\tikz@ampersand@replacement=\pgfmatrixnextcell%
|
|
\fi%
|
|
}%
|
|
}%
|
|
|
|
|
|
\def\tikz@matrix@split#1.#2\relax{%
|
|
\def\tikz@m@anchor{text}%
|
|
\def\tikz@matrix@shift{\pgfpointanchor{#1}{#2}}%
|
|
}%
|
|
|
|
\def\tikz@fig@continue{%
|
|
\ifx\tikz@text@width\pgfutil@empty%
|
|
\else%
|
|
\pgfmathsetlength{\pgf@x}{\tikz@text@width}%
|
|
\wd\pgfnodeparttextbox=\pgf@x%
|
|
\fi%
|
|
\ifx\tikz@text@height\pgfutil@empty%
|
|
\else%
|
|
\pgfmathsetlength{\pgf@x}{\tikz@text@height}%
|
|
\ht\pgfnodeparttextbox=\pgf@x%
|
|
\fi%
|
|
\ifx\tikz@text@depth\pgfutil@empty%
|
|
\else%
|
|
\pgfmathsetlength{\pgf@x}{\tikz@text@depth}%
|
|
\dp\pgfnodeparttextbox=\pgf@x%
|
|
\fi%
|
|
%
|
|
% Node transformation
|
|
%
|
|
\tikz@node@transformations%
|
|
\tikz@nlt%
|
|
%
|
|
\setbox\tikz@whichbox=\hbox{%
|
|
\unhbox\tikz@whichbox%
|
|
\hbox{{%
|
|
\pgfinterruptpath%
|
|
\pgfscope%
|
|
\tikz@options%
|
|
\tikz@do@rdf@pre@options%
|
|
\tikz@is@nodetrue%
|
|
\tikz@call@id@hook%
|
|
\pgfidscope%
|
|
\tikz@do@rdf@post@options%
|
|
\let\tikz@id@name\pgfutil@empty%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
% Add color modifications to text box
|
|
\setbox\pgfnodeparttextbox=\hbox{{%
|
|
\pgfsys@begin@text% Colors moved here...
|
|
\ifx\tikz@textcolor\pgfutil@empty%
|
|
\else%
|
|
\pgfutil@colorlet{.}{\tikz@textcolor}%
|
|
\fi%
|
|
\pgfsetcolor{.}%
|
|
\pgfusetype{.text}%
|
|
\pgfidscope%
|
|
\box\pgfnodeparttextbox%
|
|
\endpgfidscope%
|
|
\pgfsys@end@text%
|
|
}}%
|
|
\pgfmultipartnode{\tikz@shape}{\tikz@anchor}{\tikz@fig@name}{%
|
|
\pgfutil@tempdima=\pgflinewidth%
|
|
{\begingroup\tikz@finish}%
|
|
\global\pgflinewidth=\pgfutil@tempdima%
|
|
}%
|
|
\endpgfidscope%
|
|
\endpgfscope%
|
|
\endpgfinterruptpath%
|
|
}}%
|
|
}%
|
|
%
|
|
\tikz@alias%
|
|
\tikz@node@finish%
|
|
}%
|
|
|
|
|
|
\def\tikz@fig@mustbenamed{%
|
|
\ifx\tikz@fig@name\pgfutil@empty%
|
|
% Assign a dummy name
|
|
\global\advance\tikz@fig@count by1\relax
|
|
\edef\tikz@fig@name{tikz@f@\the\tikz@fig@count}%
|
|
\let\tikz@id@name\tikz@fig@name%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@node@transformations{%
|
|
%
|
|
% Possibly, we are ``online''
|
|
%
|
|
\ifx\tikz@time\pgfutil@empty%
|
|
\pgftransformshift{\tikz@node@at}%
|
|
\iftikz@fullytransformed%
|
|
\else%
|
|
\pgftransformresetnontranslations%
|
|
\fi%
|
|
\else%
|
|
\tikz@do@auto@anchor%
|
|
\tikz@timer%
|
|
\fi%
|
|
% Invoke local transformations
|
|
\tikz@transform%
|
|
}%
|
|
|
|
\def\tikz@node@finish{%
|
|
\global\let\tikz@last@fig@name=\tikz@fig@name%
|
|
\global\let\tikz@after@path@smuggle=\tikz@after@path%
|
|
% shift box outside group
|
|
\global\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
\endgroup\endgroup%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
\global\pgflinewidth=\tikz@save@line@width%
|
|
\tikz@do@after@path@smuggle%
|
|
\tikz@node@is@picfalse
|
|
\tikz@do@after@node%
|
|
}%
|
|
\let\tikz@fig@continue@orig=\tikz@fig@continue
|
|
|
|
\def\tikz@do@after@node{\tikz@scan@next@command}%
|
|
|
|
\def\tikz@do@after@path@smuggle{%
|
|
\let\tikz@to@last@fig@name=\tikz@last@fig@name%
|
|
\let\tikz@to@use@whom=\tikz@to@use@last@fig@name%
|
|
\let\tikzlastnode=\tikz@last@fig@name%
|
|
\ifx\tikz@after@path@smuggle\pgfutil@empty%
|
|
\else%
|
|
\ifpgflatenodepositioning%
|
|
\expandafter\expandafter\expandafter\tikz@call@late%
|
|
\expandafter\expandafter\expandafter{\expandafter\tikz@last@fig@name\expandafter}\expandafter{\tikz@after@path@smuggle}%
|
|
\else%
|
|
\tikz@scan@next@command{\tikz@after@path@smuggle}\pgf@stop%
|
|
\fi%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@call@late#1#2{\pgfnodepostsetupcode{#1}{\path[late options={name={#1},append after command={#2}}];}}%
|
|
|
|
\newif\iftikz@do@align
|
|
|
|
% Alignment handling
|
|
\def\tikz@signal@halign@check{%
|
|
\tikz@do@alignfalse
|
|
\ifx\tikz@text@width\pgfutil@empty%
|
|
\pgfkeysgetvalue{/tikz/node halign header}\tikz@align@header%
|
|
\ifx\tikz@align@header\pgfutil@empty%
|
|
\else%
|
|
\tikz@do@aligntrue%
|
|
\fi%
|
|
\fi%
|
|
}
|
|
\def\tikz@halign@check{%
|
|
\iftikz@do@align%
|
|
% Bingo
|
|
\setbox\tikz@align@aligned@box=\box\pgfutil@voidb@x% void
|
|
\let\\=\tikz@align@newline%
|
|
\expandafter\tikz@start@align%
|
|
\fi%
|
|
}%
|
|
\def\tikz@align@newline{\pgfutil@protect\tikz@align@newline@}%
|
|
\def\tikz@align@newline@{\unskip\pgfutil@ifnextchar[\tikz@@align@newline{\tikz@@align@newline[0pt]}}%}%
|
|
\def\tikz@@align@newline[#1]{\egroup\tikz@align@continue\pgfmathparse{#1}\let\tikz@align@temp=\pgfmathresult\tikz@start@align}%
|
|
% Two safe boxes for alignment:
|
|
\let\tikz@align@aligned@box=\pgfnodeparttextbox
|
|
\let\tikz@align@line@box=\tikz@figbox
|
|
|
|
\def\tikz@start@align{%
|
|
% Start collecting text:
|
|
\setbox\tikz@align@line@box=\hbox\bgroup\bgroup%
|
|
\aftergroup\tikz@align@collectresetcolor\ignorespaces%
|
|
}%
|
|
\def\tikz@align@collectresetcolor{%
|
|
\pgfutil@ifnextchar\reset@color%
|
|
{\reset@color\afterassignment\tikz@align@collectresetcolor\let\tikz@temp=}%
|
|
{\tikz@align@end@check}%
|
|
}%
|
|
\def\tikz@align@end@check{%
|
|
\egroup%
|
|
\ifvoid\tikz@align@aligned@box%
|
|
\setbox\tikz@align@aligned@box=\box\tikz@align@line@box%
|
|
\else%
|
|
\setbox\tikz@align@aligned@box=\vbox{%
|
|
\expandafter\expandafter\expandafter\halign\expandafter\expandafter\expandafter{\tikz@align@header%
|
|
\box\tikz@align@aligned@box\cr%
|
|
\noalign{\vskip\tikz@align@temp pt}%
|
|
\unhbox\tikz@align@line@box\unskip\cr}}%
|
|
\fi%
|
|
\pgfutil@ifnextchar\tikz@align@continue{}
|
|
{%
|
|
% Main continue
|
|
\box\tikz@align@aligned@box%
|
|
\egroup%
|
|
}%
|
|
}%
|
|
\def\tikz@align@continue{\tikz@@align@continue}%
|
|
\let\tikz@@align@continue=\pgfutil@empty
|
|
|
|
|
|
\def\tikz@node@also lso{\pgfutil@ifnextchar[\tikz@node@also@opt{\tikz@node@also@opt[]}}%
|
|
\def\tikz@node@also@opt[#1]{
|
|
\pgfutil@ifnextchar(%)
|
|
{\tikz@node@also@opt@cont[#1]}%
|
|
{\tikzerror{Syntax error in node also: ``('' expected.}%
|
|
\tikz@scan@next@command}%
|
|
}%
|
|
\def\tikz@node@also@opt@cont[#1](#2){\tikzset{late options={name=#2,#1}}\tikz@scan@next@command}%
|
|
|
|
|
|
|
|
% Syntax for parts of nodes:
|
|
% node ... {... \nodepart[options]{name} ... \nodepart{name} ...}
|
|
|
|
\def\tikz@nodepart{\pgfutil@ifnextchar[\tikz@@nodepart{\tikz@@nodepart[]}}%}%
|
|
\def\tikz@@nodepart[#1]#2{%
|
|
\tikz@atend@node%
|
|
\unskip%
|
|
\gdef\tikz@nodepart@options{#1}%
|
|
\gdef\tikz@nodepart@name{#2}%
|
|
\global\let\tikz@fig@continue=\tikz@nodepart@continue%
|
|
\pgfutil@ifnextchar x{\egroup\relax}{\egroup\relax}% gobble spaces
|
|
}%
|
|
\def\tikz@nodepart@continue{%
|
|
\global\let\tikz@fig@continue=\tikz@fig@continue@orig%
|
|
\ifx\tikz@nodepart@list\pgfutil@empty%
|
|
\let\tikz@nodepart@list\tikz@nodepart@name%
|
|
\else%
|
|
\edef\tikz@nodepart@list{\tikz@nodepart@list,\tikz@nodepart@name}%
|
|
\fi%
|
|
% Now start new box:
|
|
\expandafter\setbox\csname pgfnodepart\tikz@nodepart@name box\endcsname=\hbox%
|
|
\bgroup%
|
|
\pgfinterruptpicture%
|
|
\pgfsys@begin@text%
|
|
\pgfsys@text@to@black@hook%
|
|
\tikzset{every \tikz@nodepart@name\space node part/.try}%
|
|
\expandafter\tikzset\expandafter{\tikz@nodepart@options}%
|
|
\ifx\tikz@textopacity\pgfutil@empty%
|
|
\else%
|
|
\pgfsetfillopacity{\tikz@textopacity}%
|
|
\pgfsetstrokeopacity{\tikz@textopacity}%
|
|
\fi%
|
|
% Colors moved here...
|
|
\ifx\tikz@textcolor\pgfutil@empty%
|
|
\else%
|
|
\pgfutil@colorlet{.}{\tikz@textcolor}%
|
|
\fi%
|
|
\pgfsetcolor{.}%
|
|
\ifx\tikz@text@width\pgfutil@empty%
|
|
\tikz@textfont%
|
|
\else%
|
|
\begingroup%
|
|
\pgfmathsetlength{\pgf@x}{\tikz@text@width}%
|
|
\pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}%
|
|
\tikz@textfont%
|
|
\tikz@text@action%
|
|
\fi%
|
|
\bgroup%
|
|
\aftergroup\unskip%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\tikz@uninstallcommands%
|
|
\iftikz@handle@active@code%
|
|
\tikz@orig@shorthands%
|
|
\let\tikz@orig@shorthands\pgfutil@empty%
|
|
\fi%
|
|
\ifnum\the\catcode`\;=\active\relax\expandafter\let\tikz@activesemicolon=\tikz@origsemi\fi%
|
|
\ifnum\the\catcode`\:=\active\relax\expandafter\let\tikz@activecolon=\tikz@origcolon\fi%
|
|
\ifnum\the\catcode`\|=\active\relax\expandafter\let\tikz@activebar=\tikz@origbar\fi%
|
|
\tikz@atbegin@node%
|
|
\aftergroup\tikz@fig@collectresetcolor%
|
|
\tikz@signal@halign@check%
|
|
\tikz@text@reset%
|
|
\tikz@halign@check%
|
|
\ignorespaces%
|
|
}%
|
|
|
|
|
|
%
|
|
% Node foreach
|
|
%
|
|
|
|
\def\tikz@nodes@start{%
|
|
\let\tikz@nodes@list\pgfutil@empty%
|
|
\iftikz@node@is@pic%
|
|
\def\tikz@nodes@collect{pic }%
|
|
\else%
|
|
\def\tikz@nodes@collect{node }%
|
|
\fi%
|
|
\tikz@nodes%
|
|
}%
|
|
\def\tikz@nodes foreach{\pgfutil@ifnextchar x\tikz@nodes@\tikz@nodes@}% get rid of spaces
|
|
\def\tikz@nodes@#1in{%
|
|
\expandafter\def\expandafter\tikz@nodes@list\expandafter{\tikz@nodes@list\foreach#1in}%
|
|
\pgfutil@ifnextchar\bgroup\tikz@nodes@group\tikz@nodes@one%
|
|
}%
|
|
\def\tikz@nodes@one#1{%
|
|
\expandafter\def\expandafter\tikz@nodes@list\expandafter{\tikz@nodes@list#1}%
|
|
\pgfutil@ifnextchar f\tikz@nodes\tikz@nodes@scan%
|
|
}%
|
|
\def\tikz@nodes@group#1{%
|
|
\expandafter\def\expandafter\tikz@nodes@list\expandafter{\tikz@nodes@list{#1}}%
|
|
\pgfutil@ifnextchar f\tikz@nodes\tikz@nodes@scan%
|
|
}%
|
|
\def\tikz@nodes@scan{%
|
|
\pgfutil@ifnextchar a{\tikz@nodes@at}%
|
|
{\pgfutil@ifnextchar({\tikz@nodes@name}%
|
|
{\pgfutil@ifnextchar[{\tikz@nodes@opt}%
|
|
{\pgfutil@ifnextchar\bgroup{\tikz@nodes@main}%
|
|
{\tikzerror{Nodes must have a (possibly empty) label text}%
|
|
\tikz@fig@main{}}}}}}%}}%
|
|
|
|
% Look ahead whether the next character is a (. If that is the case, we scan
|
|
% until ), otherwise we grab a single token and append.
|
|
\def\tikz@nodes@at at{\pgfutil@ifnextchar({\tikz@nodes@at@}{\tikz@nodes@at@@}}%
|
|
\def\tikz@nodes@at@#1){%
|
|
\expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect at#1)}%
|
|
\tikz@nodes@scan}%
|
|
\def\tikz@nodes@at@@#1{%
|
|
\expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect at#1}%
|
|
\tikz@nodes@scan}%
|
|
|
|
\def\tikz@nodes@name#1){%
|
|
\expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect#1)}%
|
|
\tikz@nodes@scan}%
|
|
\def\tikz@nodes@opt#1]{%
|
|
\expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect#1]}%
|
|
\tikz@nodes@scan}%
|
|
\def\tikz@nodes@main#1{%
|
|
\iftikz@handle@active@nodes%
|
|
\iftikz@node@is@pic%
|
|
\expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect{#1}}%
|
|
\else%
|
|
\expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect{\scantokens{#1}}}%
|
|
\fi%
|
|
\else%
|
|
\expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect{#1}}%
|
|
\fi%
|
|
% Ok, got everything.
|
|
% Now, start building parse text.
|
|
\global\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
\tikz@nodes@list{%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
\expandafter\tikz@scan@next@command\tikz@nodes@collect\pgfextra\relax%
|
|
\global\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
}%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
|
|
|
|
%
|
|
% "late" options can be used to "redo" a node
|
|
%
|
|
\tikzset{late options/.code=\tikz@late@options{#1}}%
|
|
\def\tikz@late@options#1{%
|
|
% Do a "virtual" node:
|
|
\begingroup%
|
|
\iftikz@shapeborder%
|
|
\let\tikz@fig@name=\tikz@shapeborder@name%
|
|
\else%
|
|
\let\tikz@fig@name=\pgfutil@empty%
|
|
\fi%
|
|
\tikz@is@matrixfalse%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\tikz@clear@rdf@options%
|
|
\let\tikz@after@path=\pgfutil@empty%
|
|
\let\tikz@afternodepathoptions=\pgfutil@empty%
|
|
\let\tikz@alias=\pgfutil@empty%
|
|
\let\tikz@transform=\pgfutil@empty%
|
|
\tikz@decoratepathfalse%
|
|
\tikz@node@reset@hook%
|
|
\tikz@enable@node@quotes%
|
|
\tikzset{every node/.try,#1}%
|
|
\ifx\tikz@fig@name\pgfutil@empty%
|
|
\tikzerror{Late options must reference some existing node}%
|
|
\fi%
|
|
\tikz@node@begin@hook%
|
|
\tikz@alias%
|
|
\tikzgdlatenodeoptionacallback{\tikz@fig@name}%
|
|
\global\let\tikz@last@fig@name=\tikz@fig@name%
|
|
\global\let\tikz@after@path@smuggle=\tikz@after@path%
|
|
\endgroup%
|
|
\tikz@do@after@path@smuggle%
|
|
}%
|
|
|
|
|
|
% Auto placement
|
|
|
|
\def\tikz@auto@pre{%
|
|
\begingroup
|
|
\pgfresetnontranslationattimefalse
|
|
\ifpgfslopedattime
|
|
\pgfslopedattimefalse%
|
|
\else
|
|
\pgfslopedattimetrue%
|
|
\fi
|
|
\pgfallowupsidedownattimetrue%
|
|
\tikz@timer%
|
|
\pgf@x=\pgf@pt@aa pt%
|
|
\pgf@y=\pgf@pt@ab pt%
|
|
\pgfpointnormalised{}%
|
|
}%
|
|
|
|
\def\tikz@auto@post{%
|
|
\global\let\tikz@anchor@smuggle=\tikz@anchor%
|
|
\endgroup%
|
|
\let\tikz@anchor=\tikz@anchor@smuggle%
|
|
}%
|
|
|
|
\def\tikz@auto@anchor{%
|
|
\ifdim\pgf@x>0.05pt%
|
|
\ifdim\pgf@y>0.05pt%
|
|
\def\tikz@anchor{south east}%
|
|
\else\ifdim\pgf@y<-0.05pt%
|
|
\def\tikz@anchor{south west}%
|
|
\else
|
|
\def\tikz@anchor{south}%
|
|
\fi\fi%
|
|
\else\ifdim\pgf@x<-0.05pt%
|
|
\ifdim\pgf@y>0.05pt%
|
|
\def\tikz@anchor{north east}%
|
|
\else\ifdim\pgf@y<-0.05pt%
|
|
\def\tikz@anchor{north west}%
|
|
\else
|
|
\def\tikz@anchor{north}%
|
|
\fi\fi%
|
|
\else%
|
|
\ifdim\pgf@y>0pt%
|
|
\def\tikz@anchor{east}%
|
|
\else%
|
|
\def\tikz@anchor{west}%
|
|
\fi%
|
|
\fi\fi%
|
|
}%
|
|
|
|
\def\tikz@auto@anchor@prime{%
|
|
\ifdim\pgf@x>0.05pt%
|
|
\ifdim\pgf@y>0.05pt%
|
|
\def\tikz@anchor{north west}%
|
|
\else\ifdim\pgf@y<-0.05pt%
|
|
\def\tikz@anchor{north east}%
|
|
\else
|
|
\def\tikz@anchor{north}%
|
|
\fi\fi%
|
|
\else\ifdim\pgf@x<-0.05pt%
|
|
\ifdim\pgf@y>0.05pt%
|
|
\def\tikz@anchor{south west}%
|
|
\else\ifdim\pgf@y<-0.05pt%
|
|
\def\tikz@anchor{south east}%
|
|
\else
|
|
\def\tikz@anchor{south}%
|
|
\fi\fi%
|
|
\else%
|
|
\ifdim\pgf@y>0pt%
|
|
\def\tikz@anchor{west}%
|
|
\else%
|
|
\def\tikz@anchor{east}%
|
|
\fi%
|
|
\fi\fi%
|
|
}%
|
|
|
|
|
|
%
|
|
% Callbacks: Please see the documentation of the graph drawing
|
|
% lib for info on these callbacks
|
|
%
|
|
\def\tikzgdeventcallback#1#2{}%
|
|
\def\tikzgdeventgroupcallback#1{}%
|
|
\def\tikzgdlatenodeoptionacallback#1{}%
|
|
|
|
% Syntax for trees:
|
|
% node {...} child [options] {...} child [options] {...} ...
|
|
% node {...} child [options] foreach \var in {list} [options] {...} ...
|
|
|
|
\def\tikz@children{%
|
|
% Start collecting the children:
|
|
\let\tikz@children@list=\pgfutil@empty%
|
|
\tikznumberofchildren=0\relax%
|
|
\tikz@collect@children c}%
|
|
|
|
\def\tikz@collect@children{\pgfutil@ifnextchar c{\tikz@collect@children@cchar}{\tikz@children@collected}}%
|
|
\def\tikz@collect@children@cchar c{\pgfutil@ifnextchar h{\tikz@collect@child}{\tikz@children@collected c}}%
|
|
\def\tikz@collect@child hild{\pgfutil@ifnextchar[{\tikz@collect@childA}{\tikz@collect@childA[]}}%}%
|
|
\def\tikz@collect@childA[#1]{\pgfutil@ifnextchar f{\tikz@collect@children@foreach[#1]}{\tikz@collect@childB[#1]}}%
|
|
\def\tikz@collect@childB[#1]{%
|
|
\advance\tikznumberofchildren by1\relax
|
|
\expandafter\def\expandafter\tikz@children@list\expandafter{\tikz@children@list \tikz@childnode[#1]}%
|
|
\pgfutil@ifnextchar\bgroup{\tikz@collect@child@code}{\tikz@collect@child@code{}}}%
|
|
\def\tikz@collect@child@code#1{%
|
|
\expandafter\def\expandafter\tikz@children@list\expandafter{\tikz@children@list{#1}}%
|
|
\tikz@collect@children%
|
|
}%
|
|
\def\tikz@collect@children@foreach[#1]foreach#2in#3{%
|
|
\pgfutil@ifnextchar\bgroup{\tikz@collect@children@foreachA{#1}{#2}{#3}}{\tikz@collect@children@foreachA{#1}{#2}{#3}{}}}%
|
|
\def\tikz@collect@children@foreachA#1#2#3#4{%
|
|
\expandafter\def\expandafter\tikz@children@list\expandafter
|
|
{\tikz@children@list\tikz@childrennodes[#1]{#2}{#3}{#4}}%
|
|
\c@pgf@counta=\tikznumberofchildren%
|
|
\foreach#2in{#3}%
|
|
{%
|
|
\global\advance\c@pgf@counta by1\relax%
|
|
}%
|
|
\tikznumberofchildren=\c@pgf@counta%
|
|
\tikz@collect@children%
|
|
}%
|
|
\long\def\tikz@children@collected{%
|
|
\begingroup%
|
|
\advance\tikztreelevel by 1\relax%
|
|
\tikzgdeventgroupcallback{descendants}%
|
|
\let\tikz@options=\pgfutil@empty%
|
|
\tikz@clear@rdf@options%
|
|
\let\tikz@transform=\pgfutil@empty%
|
|
\tikzset{level/.try=\the\tikztreelevel,level \the\tikztreelevel/.try}%
|
|
\tikz@transform%
|
|
\let\tikz@transform=\relax%
|
|
\let\tikzparentnode=\tikz@last@fig@name%
|
|
\ifx\tikz@grow\relax\else%
|
|
% Transform to center of node
|
|
\pgftransformshift{\pgfpointanchor{\tikzparentnode}{\tikz@growth@anchor}}%
|
|
\fi%
|
|
\tikznumberofcurrentchild=0\relax%
|
|
\tikz@children@list%
|
|
\global\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
\endgroup%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
% Syntax for children:
|
|
%
|
|
% child [all children options] foreach \var in {values} [child options] {...}
|
|
\def\tikz@childrennodes[#1]#2#3#4{%
|
|
\c@pgf@counta=\tikznumberofcurrentchild\relax%
|
|
\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
\foreach#2in{#3}{%
|
|
\tikznumberofcurrentchild=\c@pgf@counta\relax%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
\tikz@childnode[#1]{#4}%
|
|
% we must now make the current child number and the figbox survive
|
|
% the group
|
|
\global\c@pgf@counta=\tikznumberofcurrentchild\relax%
|
|
\global\setbox\tikz@tempbox=\box\tikz@figbox%
|
|
\global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
|
|
}%
|
|
\tikznumberofcurrentchild=\c@pgf@counta\relax%
|
|
\setbox\tikz@figbox=\box\tikz@tempbox%
|
|
\setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
|
|
}%
|
|
|
|
|
|
% Syntax for child:
|
|
%
|
|
% child
|
|
%
|
|
% child[options]
|
|
%
|
|
% child[options] {node (name) {child node text} ...
|
|
% edge from parent[options] node {label text} node {label text}}
|
|
|
|
\def\tikz@childnode[#1]#2{%
|
|
\advance\tikznumberofcurrentchild by1\relax%
|
|
{\tikzset{every child/.try,#1}\expandafter}%
|
|
\iftikz@child@missing%
|
|
\tikzgdeventcallback{node}{}%
|
|
\else%
|
|
\setbox\tikz@whichbox=\hbox\bgroup%
|
|
\unhbox\tikz@whichbox%
|
|
\hbox\bgroup\bgroup%
|
|
\pgfinterruptpath%
|
|
\pgfscope%
|
|
\let\tikz@transform=\pgfutil@empty%
|
|
\tikzset{every child/.try,#1}%
|
|
\tikz@options%
|
|
\tikz@transform%
|
|
\let\tikz@transform=\relax%
|
|
\tikz@grow%
|
|
% Typeset node:
|
|
\edef\tikz@parent@node@name{[name=\tikzparentnode-\the\tikznumberofcurrentchild,style=every child node]}%
|
|
\def\tikz@child@node@text{[shape=coordinate]{}}
|
|
\tikz@parse@child@node#2\pgf@stop%
|
|
\expandafter\expandafter\expandafter\node
|
|
\expandafter\tikz@parent@node@name
|
|
\tikz@child@node@text
|
|
\pgfextra{\global\let\tikz@childnode@name=\tikz@last@fig@name};%
|
|
\let\tikzchildnode=\tikz@childnode@name%
|
|
{%
|
|
\def\tikz@edge@to@parent@needed{edge from parent}
|
|
\ifx\tikz@child@node@rest\pgfutil@empty%
|
|
\path edge from parent;%
|
|
\else%
|
|
\path \tikz@child@node@rest \tikz@edge@to@parent@needed;%
|
|
\fi%
|
|
}%
|
|
\endpgfscope%
|
|
\endpgfinterruptpath%
|
|
\egroup\egroup%
|
|
\egroup%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@parse@child@node{%
|
|
\pgfutil@ifnextchar n{\tikz@parse@child@node@n}%
|
|
{\pgfutil@ifnextchar c{\tikz@parse@child@node@c}%
|
|
{\pgfutil@ifnextchar\pgf@stop\tikz@parse@child@node@rest\tikz@parse@child@node@expand}}}%
|
|
\def\tikz@parse@child@node@expand{%
|
|
\advance\tikz@expandcount by-1\relax%
|
|
\ifnum\tikz@expandcount<0\relax%
|
|
\expandafter\tikz@parse@child@node@rest%
|
|
\else%
|
|
\expandafter\expandafter\expandafter\tikz@parse@child@node%
|
|
\fi%
|
|
}%
|
|
\def\tikz@parse@child@node@rest#1\pgf@stop{\tikz@expandcount=100\relax\def\tikz@child@node@rest{#1}}%
|
|
\def\tikz@parse@child@node@c c{\tikz@expandcount=100\pgfutil@ifnextchar o{\tikz@parse@child@node@co}{\tikz@parse@child@node@rest c}}%
|
|
\def\tikz@parse@child@node@co o{\pgfutil@ifnextchar o{\tikz@parse@child@node@coordinate}{\tikz@parse@child@node@rest co}}%
|
|
\def\tikz@parse@child@node@coordinate ordinate{%
|
|
\pgfutil@ifnextchar ({\tikz@@parse@child@node@coordinate}{%
|
|
\def\tikz@child@node@text{[shape=coordinate]{}}%
|
|
\tikz@parse@child@node@rest}}%}%
|
|
\def\tikz@@parse@child@node@coordinate(#1){%
|
|
\pgfutil@ifnextchar a{\tikz@p@c@n@c@at(#1)}{%
|
|
\def\tikz@child@node@text{[shape=coordinate,name=#1]{}}%
|
|
\tikz@parse@child@node@rest}}%
|
|
\def\tikz@p@c@n@c@at(#1)at#2({%
|
|
\def\tikz@child@node@text@pre{[shape=coordinate,name=#1]at}%
|
|
\tikz@scan@one@point\tikz@p@c@n@c@at@math(%
|
|
}%
|
|
\def\tikz@p@c@n@c@at@math#1{%
|
|
\pgf@process{#1}%
|
|
\edef\tikz@marshal{(\the\pgf@x,\the\pgf@y){}}%
|
|
\expandafter\expandafter\expandafter\def%
|
|
\expandafter\expandafter\expandafter\tikz@child@node@text%
|
|
\expandafter\expandafter\expandafter{\expandafter\tikz@child@node@text@pre\tikz@marshal}%
|
|
\tikz@parse@child@node@rest%
|
|
}%
|
|
\def\tikz@parse@child@node@n node{\tikz@expandcount=100%
|
|
\let\tikz@child@node@text=\pgfutil@empty%
|
|
\tikz@p@c@s}%
|
|
\def\tikz@p@c@s{%
|
|
\pgfutil@ifnextchar a{\tikz@p@c@s@at}
|
|
{\pgfutil@ifnextchar ({\tikz@p@c@s@paran}
|
|
{\pgfutil@ifnextchar [{\tikz@p@c@s@bra}
|
|
{\pgfutil@ifnextchar \bgroup{\tikz@p@c@s@group}
|
|
{\tikzerror{Cannot parse this node}}}}}}%}}%
|
|
\def\tikz@p@c@s@at at#1({%
|
|
\tikz@scan@one@point\tikz@p@c@s@at@math(%
|
|
}%
|
|
\def\tikz@p@c@s@at@math#1{%
|
|
\pgf@process{#1}%
|
|
\edef\tikz@marshal{ at(\the\pgf@x,\the\pgf@y)}%
|
|
\expandafter\expandafter\expandafter\def%
|
|
\expandafter\expandafter\expandafter\tikz@child@node@text%
|
|
\expandafter\expandafter\expandafter{\expandafter\tikz@child@node@text\tikz@marshal}
|
|
\tikz@p@c@s}%
|
|
\def\tikz@p@c@s@paran(#1){%
|
|
\expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text(#1)}
|
|
\tikz@p@c@s}%
|
|
\def\tikz@p@c@s@bra[#1]{%
|
|
\expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text[#1]}
|
|
\tikz@p@c@s}%
|
|
\def\tikz@p@c@s@group#1{%
|
|
\iftikz@handle@active@nodes%
|
|
\expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text{\scantokens{#1}}}%
|
|
\else%
|
|
\expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text{#1}}
|
|
\fi%
|
|
\tikz@parse@child@node@rest%
|
|
}%
|
|
|
|
|
|
|
|
%
|
|
% Syntax for decorated subpaths:
|
|
%
|
|
% decorate [option] { subpath }
|
|
%
|
|
\def\tikz@decoration ecorate{%
|
|
\pgfutil@ifnextchar[{\tikz@lib@decoration}{\tikz@lib@decoration[]}%]
|
|
}%
|
|
|
|
\def\tikz@lib@decoration[#1]#2{\tikzerror{You need to load a decoration library}}%
|
|
|
|
% The decorate path command:
|
|
\def\tikz@lib@dec@decorate@path{\tikzerror{You need to load a decoration library}}%
|
|
|
|
|
|
|
|
%
|
|
% Syntax for let :
|
|
%
|
|
% let \p1 = (coordinate), \p2 = (coordinate),... in
|
|
%
|
|
\def\tikz@let@command et#1in{%
|
|
\tikzerror{You need to say \string\usetikzlibrary{calc} to use the let command}%
|
|
\tikz@scan@next@command%
|
|
}%
|
|
|
|
|
|
%
|
|
% Syntax for pictures:
|
|
%
|
|
% as for nodes, but with "pic" instead of "node"
|
|
%
|
|
\newif\iftikz@node@is@pic
|
|
\def\tikz@subpicture ic{\tikz@node@is@pictrue\tikz@scan@next@command node}%
|
|
\def\tikz@subpicture@handle#1{%
|
|
\pgfkeys@spdef\tikz@temp{#1}%
|
|
\expandafter\tikz@subpicture@handle@\expandafter{\tikz@temp}%
|
|
}%
|
|
\def\tikz@subpicture@handle@#1{
|
|
\pgfkeys{/tikz/pics/.cd,#1}%
|
|
\tikz@node@transformations%
|
|
\let\tikz@transform=\relax%
|
|
\let\tikz@picmode\tikz@mode%
|
|
\tikzset{name prefix ../.style/.expanded={/tikz/name prefix=\pgfkeysvalueof{/tikz/name prefix}}}%
|
|
\ifx\tikz@fig@name\pgfutil@empty\else%
|
|
\tikzset{name prefix/.expanded=\tikz@fig@name}%
|
|
\fi%
|
|
\pgfkeysvalueof{/tikz/pics/setup code}%
|
|
\pgfkeysgetvalue{/tikz/pics/code}{\tikz@pic@code}
|
|
\ifx\tikz@pic@code\pgfutil@empty\else%
|
|
\setbox\tikz@whichbox=\hbox\bgroup%
|
|
\unhbox\tikz@whichbox%
|
|
\hbox\bgroup
|
|
\bgroup%
|
|
\pgfinterruptpath%
|
|
\pgfscope%
|
|
\tikz@options%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\tikz@atbegin@scope%
|
|
\scope[every pic/.try]%
|
|
\tikz@pic@code%
|
|
\endscope%
|
|
\tikz@atend@scope%
|
|
\endpgfscope%
|
|
\endpgfinterruptpath%
|
|
\egroup
|
|
\egroup%
|
|
\egroup%
|
|
\fi%
|
|
\pgfkeysgetvalue{/tikz/pics/foreground code}{\tikz@pic@code}
|
|
\ifx\tikz@pic@code\pgfutil@empty\else%
|
|
\setbox\tikz@figbox=\hbox\bgroup%
|
|
\unhbox\tikz@figbox%
|
|
\hbox\bgroup
|
|
\bgroup%
|
|
\pgfinterruptpath%
|
|
\pgfscope%
|
|
\tikz@options%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\tikz@atbegin@scope%
|
|
\scope[every front pic/.try]%
|
|
\tikz@pic@code%
|
|
\endscope%
|
|
\tikz@atend@scope%
|
|
\endpgfscope%
|
|
\endpgfinterruptpath%
|
|
\egroup
|
|
\egroup%
|
|
\egroup%
|
|
\fi%
|
|
\pgfkeysgetvalue{/tikz/pics/background code}{\tikz@pic@code}
|
|
\ifx\tikz@pic@code\pgfutil@empty\else%
|
|
\setbox\tikz@figbox@bg=\hbox\bgroup%
|
|
\unhbox\tikz@figbox@bg%
|
|
\hbox\bgroup
|
|
\bgroup%
|
|
\pgfinterruptpath%
|
|
\pgfscope%
|
|
\tikz@options%
|
|
\setbox\tikz@figbox=\box\pgfutil@voidb@x%
|
|
\setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
|
|
\tikz@atbegin@scope%
|
|
\scope[every behind pic/.try]%
|
|
\tikz@pic@code%
|
|
\endscope%
|
|
\tikz@atend@scope%
|
|
\endpgfscope%
|
|
\endpgfinterruptpath%
|
|
\egroup
|
|
\egroup%
|
|
\egroup%
|
|
\fi%
|
|
\tikz@node@finish%
|
|
}%
|
|
\tikzset{
|
|
pic actions/.code=\tikz@addmode{\tikz@picmode}
|
|
}%
|
|
|
|
% Setting up the picture codes:
|
|
\tikzset{
|
|
pics/setup code/.initial=,
|
|
pics/code/.initial=,
|
|
pics/background code/.initial=,
|
|
pics/foreground code/.initial=
|
|
}%
|
|
|
|
% Defining pictures:
|
|
|
|
\def\tikzdeclarepic#1#2{\pgfkeys{/tikz/#1/.cd,#2}}%
|
|
|
|
\pgfkeysdef{/handlers/.pic}{%
|
|
\edef\pgf@temp{\pgfkeyscurrentpath}%
|
|
\edef\pgf@temp{\expandafter\tikz@smuggle@pics@in\pgf@temp\pgf@stop}%
|
|
\expandafter\pgfkeys\expandafter{\pgf@temp/.style={code={#1}}}%
|
|
}%
|
|
\def\tikz@smuggle@pics@in/tikz/#1\pgf@stop{/tikz/pics/#1}%
|
|
|
|
%
|
|
% Timers
|
|
%
|
|
|
|
\def\tikz@timer@line{%
|
|
\pgftransformlineattime{\tikz@time}{\tikz@timer@start}{\tikz@timer@end}%
|
|
}%
|
|
|
|
\def\tikz@timer@vhline{%
|
|
\ifdim\tikz@time pt<0.5pt% first half
|
|
\pgf@process{\tikz@timer@start}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\tikz@timer@end}%
|
|
\pgf@xb=\tikz@time pt%
|
|
\pgf@xb=2\pgf@xb%
|
|
\edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}{\noexpand\tikz@timer@start}{%
|
|
\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@y}}}%
|
|
\tikz@marshal%
|
|
\else% second half
|
|
\pgf@process{\tikz@timer@start}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\tikz@timer@end}%
|
|
\pgf@xb=\tikz@time pt%
|
|
\pgf@xb=2\pgf@xb%
|
|
\advance\pgf@xb by-1pt%
|
|
\edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
|
|
{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@y}}{\noexpand\tikz@timer@end}}%
|
|
\tikz@marshal%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@timer@hvline{%
|
|
\ifdim\tikz@time pt<0.5pt% first half
|
|
\pgf@process{\tikz@timer@start}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\tikz@timer@end}%
|
|
\pgf@xb=\tikz@time pt%
|
|
\pgf@xb=2\pgf@xb%
|
|
\edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}{\noexpand\tikz@timer@start}{%
|
|
\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@ya}}}%
|
|
\tikz@marshal%
|
|
\else% second half
|
|
\pgf@process{\tikz@timer@start}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\tikz@timer@end}%
|
|
\pgf@xb=\tikz@time pt%
|
|
\pgf@xb=2\pgf@xb%
|
|
\advance\pgf@xb by-1pt%
|
|
\edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
|
|
{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@ya}}{\noexpand\tikz@timer@end}}%
|
|
\tikz@marshal%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@timer@curve{%
|
|
\pgftransformcurveattime{\tikz@time}{\tikz@timer@start}{\tikz@timer@cont@one}{\tikz@timer@cont@two}{\tikz@timer@end}%
|
|
}%
|
|
|
|
|
|
\def\tikz@timer@arc{%
|
|
\pgfmathcos@{\tikz@timer@start@angle}%
|
|
\let\tikz@angle@cos\pgfmathresult%
|
|
\pgfmathsin@{\tikz@timer@start@angle}%
|
|
\let\tikz@angle@sin\pgfmathresult%
|
|
\pgftransformarcaxesattime{\tikz@time}{%
|
|
\pgfpointdiff{%
|
|
\pgfpointadd{%
|
|
\pgfpointscale{\tikz@angle@cos}{\tikz@timer@zero@axis}%
|
|
}{%
|
|
\pgfpointscale{\tikz@angle@sin}{\tikz@timer@ninety@axis}%
|
|
}%
|
|
}%
|
|
{\tikz@timer@start}%
|
|
}%
|
|
{\tikz@timer@zero@axis}%
|
|
{\tikz@timer@ninety@axis}%
|
|
{\tikz@timer@start@angle}{\tikz@timer@end@angle}%
|
|
}%
|
|
|
|
|
|
|
|
%
|
|
% Coordinate systems
|
|
%
|
|
|
|
\def\tikzdeclarecoordinatesystem#1#2{%
|
|
\expandafter\def\csname tikz@parse@cs@#1\endcsname(##1){%
|
|
\pgf@process{%
|
|
#2%
|
|
\global\let\tikz@smubble@b=\tikz@shapeborder@name%
|
|
}%
|
|
\let\tikz@shapeborder@name=\tikz@smubble@b%
|
|
\edef\tikz@return@coordinate{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
|
|
}%
|
|
\def\tikzaliascoordinatesystem#1#2{%
|
|
\edef\pgf@marshal{\noexpand\let\expandafter\noexpand\csname
|
|
tikz@parse@cs@#1\endcsname=\expandafter\noexpand\csname
|
|
tikz@parse@cs@#2\endcsname}%
|
|
\pgf@marshal%
|
|
}%
|
|
|
|
|
|
% Default coordinate systems:
|
|
|
|
\tikzdeclarecoordinatesystem{canvas}
|
|
{%
|
|
\tikzset{cs/.cd,x=0pt,y=0pt,#1}%
|
|
\pgfpoint{\tikz@cs@x}{\tikz@cs@y}%
|
|
}%
|
|
|
|
\tikzdeclarecoordinatesystem{canvas polar}
|
|
{%
|
|
\tikzset{cs/.cd,angle=0,radius=0cm,#1}%
|
|
\pgfpointpolar{\tikz@cs@angle}{\tikz@cs@xradius and \tikz@cs@yradius}%
|
|
}%
|
|
|
|
\tikzdeclarecoordinatesystem{xyz}
|
|
{%
|
|
\tikzset{cs/.cd,x=0,y=0,z=0,#1}%
|
|
\pgfpointxyz{\tikz@cs@x}{\tikz@cs@y}{\tikz@cs@z}%
|
|
}%
|
|
|
|
\tikzdeclarecoordinatesystem{xyz polar}
|
|
{%
|
|
\tikzset{cs/.cd,angle=0,radius=0,#1}%
|
|
\pgfpointpolarxy{\tikz@cs@angle}{\tikz@cs@xradius and \tikz@cs@yradius}%
|
|
}%
|
|
\tikzaliascoordinatesystem{xy polar}{xyz polar}%
|
|
|
|
|
|
\tikzdeclarecoordinatesystem{node}
|
|
{%
|
|
\tikzset{cs/.cd,name=,anchor=none,angle=none,#1}%
|
|
\ifx\tikz@cs@anchor\tikz@nonetext%
|
|
\ifx\tikz@cs@angle\tikz@nonetext%
|
|
\expandafter\ifx\csname pgf@sh@ns@\tikz@cs@node\endcsname\tikz@coordinate@text%
|
|
\else
|
|
\aftergroup\tikz@shapebordertrue%
|
|
\edef\tikz@shapeborder@name{\tikz@pp@name{\tikz@cs@node}}%
|
|
\fi%
|
|
\pgfpointanchor{\tikz@pp@name{\tikz@cs@node}}{center}%
|
|
\else%
|
|
\pgfpointanchor{\tikz@pp@name{\tikz@cs@node}}{\tikz@cs@angle}%
|
|
\fi%
|
|
\else%
|
|
\pgfpointanchor{\tikz@pp@name{\tikz@cs@node}}{\tikz@cs@anchor}%
|
|
\fi%
|
|
}%
|
|
|
|
% Intersection coordinates
|
|
\tikzset{cs/first line/.code=\def\tikz@cs@line@a{#1}\def\tikz@cs@type@a{line}}%
|
|
\tikzset{cs/second line/.code=\def\tikz@cs@line@b{#1}\def\tikz@cs@type@b{line}}%
|
|
|
|
\tikzset{cs/first node/.code=\tikz@cs@unpack{\tikz@cs@node@a}{\tikz@cs@type@a}{#1}}%
|
|
\tikzset{cs/second node/.code=\tikz@cs@unpack{\tikz@cs@node@b}{\tikz@cs@type@b}{#1}}%
|
|
|
|
\def\tikz@cs@unpack#1#2#3{%
|
|
\expandafter\ifx\csname pgf@sh@ns@#3\endcsname\relax%
|
|
\tikzerror{Undefined node ``#3''}%
|
|
\else%
|
|
\def#1{#3}%
|
|
\edef#2{\csname pgf@sh@ns@#3\endcsname}%
|
|
\fi%
|
|
}%
|
|
|
|
\tikzset{cs/solution/.initial=1}%
|
|
|
|
\tikzset{cs/horizontal line through/.store in=\tikz@cs@hori@line}%
|
|
\tikzset{cs/vertical line through/.store in=\tikz@cs@vert@line}%
|
|
|
|
\tikzdeclarecoordinatesystem{intersection}
|
|
{%
|
|
\tikzset{cs/.cd,#1}%
|
|
\expandafter\ifx\csname tikz@intersect@\tikz@cs@type@a @and@\tikz@cs@type@b\endcsname\relax%
|
|
\tikzerror{I do not know how to compute the intersection
|
|
of a \tikz@cs@type@a and a \tikz@cs@type@b. Try saying
|
|
\string\usetikzlibrary{calc}}%
|
|
\pgfpointorigin%
|
|
\else%
|
|
\csname tikz@intersect@\tikz@cs@type@a @and@\tikz@cs@type@b\endcsname%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@intersect@line@and@line{%
|
|
\expandafter\tikz@scan@one@point\expandafter\tikz@parse@line\tikz@cs@line@a%
|
|
\pgf@xa=\pgf@xc%
|
|
\pgf@ya=\pgf@yc%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\expandafter\tikz@scan@one@point\expandafter\tikz@parse@line\tikz@cs@line@b%
|
|
\edef\pgf@marshal{%
|
|
{\noexpand\pgfpointintersectionoflines%
|
|
{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
|
|
{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
|
|
{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
|
|
{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}}%
|
|
\pgf@marshal%
|
|
}%
|
|
|
|
\def\tikz@parse@line#1--{%
|
|
\pgf@process{#1}%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\tikz@scan@one@point\pgf@process%
|
|
}%
|
|
|
|
|
|
\tikzdeclarecoordinatesystem{perpendicular}
|
|
{%
|
|
\tikzset{cs/.cd,#1}%
|
|
\expandafter\tikz@scan@one@point\expandafter\tikz@parse@intersection@a\tikz@cs@hori@line%
|
|
\expandafter\tikz@scan@one@point\expandafter\tikz@parse@intersection@b\tikz@cs@vert@line%
|
|
\pgfqpoint{\the\pgf@xb}{\the\pgf@ya}
|
|
}%
|
|
|
|
\tikzdeclarecoordinatesystem{barycentric}
|
|
{%
|
|
{%
|
|
\pgf@xa=0pt% point
|
|
\pgf@ya=0pt%
|
|
\pgf@xb=0pt% sum
|
|
\tikz@bary@dolist#1,=,%
|
|
\pgfmathparse{1/\the\pgf@xb}%
|
|
\global\pgf@x=\pgfmathresult\pgf@xa%
|
|
\global\pgf@y=\pgfmathresult\pgf@ya%
|
|
}%
|
|
}%
|
|
|
|
\def\tikz@bary@dolist#1=#2,{%
|
|
\def\tikz@temp{#1}%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\else
|
|
\pgf@process{\pgfpointanchor{#1}{center}}%
|
|
\pgfmathparse{#2}%
|
|
\advance\pgf@xa by\pgfmathresult\pgf@x%
|
|
\advance\pgf@ya by\pgfmathresult\pgf@y%
|
|
\advance\pgf@xb by\pgfmathresult pt%
|
|
\expandafter\tikz@bary@dolist%
|
|
\fi%
|
|
}%
|
|
|
|
\tikzset{cs/x/.store in=\tikz@cs@x}%
|
|
\tikzset{cs/y/.store in=\tikz@cs@y}%
|
|
\tikzset{cs/z/.store in=\tikz@cs@z}%
|
|
\tikzset{cs/angle/.store in=\tikz@cs@angle}%
|
|
\tikzset{cs/x radius/.store in=\tikz@cs@xradius}%
|
|
\tikzset{cs/y radius/.store in=\tikz@cs@yradius}%
|
|
\tikzset{cs/radius/.style={/tikz/cs/x radius=#1,/tikz/cs/y radius=#1}}%
|
|
\tikzset{cs/name/.store in=\tikz@cs@node}%
|
|
\tikzset{cs/anchor/.store in=\tikz@cs@anchor}%
|
|
|
|
|
|
|
|
%
|
|
% Coordinate management
|
|
%
|
|
|
|
|
|
% Last position visited
|
|
\def\tikz@last@position{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
|
|
\def\tikz@last@position@saved{\pgfqpoint{\tikz@lastxsaved}{\tikz@lastysaved}}%
|
|
|
|
% Make given point the last position visited
|
|
\def\tikz@make@last@position#1{%
|
|
\pgf@process{#1}%
|
|
\tikz@lastx=\pgf@x\relax%
|
|
\tikz@lasty=\pgf@y\relax%
|
|
\iftikz@updatecurrent%
|
|
\tikz@lastxsaved=\pgf@x\relax%
|
|
\tikz@lastysaved=\pgf@y\relax%
|
|
\fi%
|
|
\tikz@updatecurrenttrue%
|
|
}%
|
|
|
|
\newif\iftikz@updatecurrent
|
|
\tikz@updatecurrenttrue
|
|
|
|
|
|
|
|
% Scanner: Scans a point or a relative point.
|
|
% It then calls the first parameter with the argument set to an
|
|
% appropriate pgf command representing that point.
|
|
|
|
\def\tikz@scan@one@point#1{%
|
|
\let\tikz@to@use@whom=\tikz@to@use@last@coordinate%
|
|
\tikz@shapeborderfalse%
|
|
\pgfutil@ifnextchar+{\tikz@scan@relative#1}{\tikz@scan@absolute#1}}%
|
|
\def\tikz@scan@absolute#1{%
|
|
\pgfutil@ifnextchar({\tikz@scan@@absolute#1}%)
|
|
{%
|
|
\advance\tikz@expandcount by -1%
|
|
\ifnum\tikz@expandcount<0\relax%
|
|
\let\pgfutil@next=\tikz@@scangiveup%
|
|
\else%
|
|
\let\pgfutil@next=\tikz@@scanexpand%
|
|
\fi%
|
|
\pgfutil@next{#1}%
|
|
}%
|
|
}%
|
|
\def\tikz@@scanexpand#1{\expandafter\tikz@scan@one@point\expandafter#1}%
|
|
\def\tikz@@scangiveup#1{\tikzerror{Cannot parse this coordinate}#1{\pgfpointorigin}}%
|
|
\def\tikz@scan@@absolute#1({%
|
|
\pgfutil@ifnextchar[% uhoh... options!
|
|
{\def\tikz@scan@point@recall{#1}\tikz@scan@options}%
|
|
{\tikz@@@scan@@absolute#1(}%
|
|
}%
|
|
|
|
\def\tikz@scan@options[#1]#2{%
|
|
\def\tikz@scan@point@options{#1}%
|
|
\tikz@@@scan@@absolute\tikz@scan@handle@options(#2%
|
|
}%
|
|
|
|
\def\tikz@scan@handle@options#1{%
|
|
{%
|
|
% Ok, compute point with options set and zero transformation
|
|
% matrix:
|
|
\pgftransformreset%
|
|
\let\tikz@transform=\pgfutil@empty%
|
|
\expandafter\tikzset\expandafter{\tikz@scan@point@options}%
|
|
\tikz@transform%
|
|
\pgf@process{\pgfpointtransformed{#1}}%
|
|
\xdef\tikz@marshal{\expandafter\noexpand\tikz@scan@point@recall{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
|
|
}%
|
|
\tikz@marshal%
|
|
}%
|
|
|
|
\def\tikz@ensure@dollar@catcode{%
|
|
\ifnum\catcode`\$=3 %
|
|
\else
|
|
\tikzerror{Sorry, some package has redefined the meaning of the
|
|
math-mode dollar sign. This is incompatible with tikz and its calc
|
|
library and might cause unrecoverable errors}%
|
|
% only show error once:
|
|
\global\let\tikz@ensure@dollar@catcode=\relax
|
|
\fi
|
|
}%
|
|
|
|
\def\tikz@@@scan@@absolute#1({%
|
|
\tikz@ensure@dollar@catcode
|
|
\pgfutil@ifnextchar{$}%$
|
|
{\tikz@parse@calculator#1(}
|
|
{\tikz@scan@no@calculator#1(}%
|
|
}%
|
|
\def\tikz@scan@no@calculator#1(#2){%
|
|
\edef\tikz@scan@point@coordinate{(#2)}%
|
|
\expandafter\tikz@@scan@@no@calculator\expandafter#1\tikz@scan@point@coordinate%
|
|
}%
|
|
\def\tikz@@scan@@no@calculator#1(#2){%
|
|
\pgfutil@in@{cs:}{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\pgfutil@next\tikz@parse@coordinatesystem%
|
|
\else%
|
|
\pgfutil@in@{intersection }{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\pgfutil@next\tikz@parse@intersection%
|
|
\else%
|
|
\pgfutil@in@|{#2}%
|
|
\ifpgfutil@in@
|
|
\pgfutil@in@{-|}{#2}%
|
|
\ifpgfutil@in@
|
|
\let\pgfutil@next\tikz@parse@hv%
|
|
\else%
|
|
\let\pgfutil@next\tikz@parse@vh%
|
|
\fi%
|
|
\else%
|
|
\pgfutil@in@:{#2}%
|
|
\ifpgfutil@in@
|
|
\let\pgfutil@next\tikz@parse@polar%
|
|
\else%
|
|
\pgfutil@in@,{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\pgfutil@next\tikz@parse@regular%
|
|
\else%
|
|
\let\pgfutil@next\tikz@parse@node%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\pgfutil@next#1(#2)%
|
|
}%
|
|
|
|
\def\tikz@parse@calculator#1($#2$){%
|
|
\tikzerror{You need to say \string\usetikzlibrary{calc} for coordinate calculation}%
|
|
#1{\pgfpointorigin}%
|
|
}%
|
|
|
|
\def\tikz@parse@coordinatesystem#1(#2 cs:#3){%
|
|
\let\tikz@return@coordinate=\pgfpointorigin%
|
|
\pgfutil@ifundefined{tikz@parse@cs@#2}
|
|
{\tikzerror{Unknown coordinate system '#2'}}
|
|
{\csname tikz@parse@cs@#2\endcsname(#3)}%
|
|
\expandafter#1\expandafter{\tikz@return@coordinate}%
|
|
}%
|
|
|
|
|
|
\newif\iftikz@isdimension
|
|
\def\tikz@checkunit#1{%
|
|
\pgfmathparse{#1}%
|
|
\let\iftikz@isdimension=\ifpgfmathunitsdeclared%
|
|
}%
|
|
|
|
\def\tikz@parse@polar#1(#2:#3){%
|
|
\pgfutil@ifundefined{tikz@polar@dir@#2}
|
|
{\tikz@@parse@polar#1({#2}:{#3})}
|
|
{\tikz@@parse@polar#1(\csname tikz@polar@dir@#2\endcsname:{#3})}%
|
|
}%
|
|
\def\tikz@@parse@polar#1(#2:#3){%
|
|
\pgfutil@in@{ and }{#3}%
|
|
\ifpgfutil@in@%
|
|
\edef\tikz@args{({#2}:#3)}%
|
|
\else%
|
|
\edef\tikz@args{({#2}:{#3} and {#3})}%
|
|
\fi%
|
|
\expandafter\tikz@@@parse@polar\expandafter#1\tikz@args%
|
|
}%
|
|
\def\tikz@@@parse@polar#1(#2:#3 and #4){%
|
|
\tikz@checkunit{#3}%
|
|
\iftikz@isdimension%
|
|
\tikz@checkunit{#4}%
|
|
\iftikz@isdimension%
|
|
\def\tikz@next{#1{\pgfpointpolar{#2}{#3 and #4}}}%
|
|
\else%
|
|
\tikzerror{You cannot mix dimension and dimensionless values for polar coordinates}
|
|
\def\tikz@next{#1{\pgfpointorigin}}%
|
|
\fi%
|
|
\else%
|
|
\tikz@checkunit{#4}%
|
|
\iftikz@isdimension%
|
|
\tikzerror{You cannot mix dimension and dimensionless values for polar coordinates}
|
|
\def\tikz@next{#1{\pgfpointorigin}}%
|
|
\else%
|
|
\def\tikz@next{#1{\pgfpointpolarxy{#2}{#3 and #4}}}%
|
|
\fi%
|
|
\fi%
|
|
\tikz@next%
|
|
}%
|
|
\def\tikz@polar@dir@up{90}%
|
|
\def\tikz@polar@dir@down{-90}%
|
|
\def\tikz@polar@dir@left{180}%
|
|
\def\tikz@polar@dir@right{0}%
|
|
\def\tikz@polar@dir@north{90}%
|
|
\def\tikz@polar@dir@south{-90}%
|
|
\def\tikz@polar@dir@east{0}%
|
|
\def\tikz@polar@dir@west{180}%
|
|
\expandafter\def\csname tikz@polar@dir@north east\endcsname{45}%
|
|
\expandafter\def\csname tikz@polar@dir@north west\endcsname{135}%
|
|
\expandafter\def\csname tikz@polar@dir@south east\endcsname{-45}%
|
|
\expandafter\def\csname tikz@polar@dir@south west\endcsname{-135}%
|
|
|
|
|
|
% MW:
|
|
% Check to see if the y-coordinate is inside {}. If it is, scan it and
|
|
% reinsert it into the stream inside an extra group.
|
|
%
|
|
\def\tikz@parse@regular#1(#2,{%
|
|
\pgfutil@ifnextchar\bgroup{\tikz@@parse@regular#1{#2}}{\tikz@@@parse@regular#1{#2}}%
|
|
}%
|
|
\def\tikz@@parse@regular#1#2#3{%
|
|
\pgfutil@ifnextchar[{% Uh oh! An array index.
|
|
\tikz@@@parse@regular#1{#2}{#3}}%
|
|
{\tikz@@@parse@regular#1{#2}{{#3}}}}%
|
|
|
|
% Originally \def\tikz@parse@regular#1(#2,#3){%
|
|
%
|
|
\def\tikz@@@parse@regular#1#2#3){%
|
|
\pgfutil@in@,{#3}%
|
|
\ifpgfutil@in@%
|
|
\tikz@parse@splitxyz{#1}{#2}#3,%
|
|
\else%
|
|
\tikz@checkunit{#2}%
|
|
\iftikz@isdimension%
|
|
\tikz@checkunit{#3}%
|
|
\iftikz@isdimension%
|
|
\def\pgfutil@next{#1{\pgfpoint{#2}{#3}}}%
|
|
\else%
|
|
\def\pgfutil@next{#1{\pgfpointadd{\pgfpoint{#2}{0pt}}{\pgfpointxy{0}{#3}}}}%
|
|
\fi%
|
|
\else%
|
|
\tikz@checkunit{#3}%
|
|
\iftikz@isdimension%
|
|
\def\pgfutil@next{#1{\pgfpointadd{\pgfpoint{0pt}{#3}}{\pgfpointxy{#2}{0}}}}%
|
|
\else%
|
|
\def\pgfutil@next{#1{\pgfpointxy{#2}{#3}}}%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\pgfutil@next%
|
|
}%
|
|
|
|
\def\tikz@parse@splitxyz#1#2#3,#4,{%
|
|
\def\pgfutil@next{#1{\pgfpointxyz{#2}{#3}{#4}}}%
|
|
}%
|
|
|
|
\def\tikz@coordinate@text{coordinate}%
|
|
|
|
\def\tikz@parse@node#1(#2){%
|
|
\pgfutil@in@.{#2}% Ok, flag this
|
|
\ifpgfutil@in@
|
|
\tikz@calc@anchor#2\tikz@stop%
|
|
\else%
|
|
\tikz@calc@anchor#2.center\tikz@stop% to be on the save side, in
|
|
% case iftikz@shapeborder is ignored...
|
|
\ifcsname pgf@sh@ns@\tikz@pp@name{#2}\endcsname
|
|
\expandafter\ifx\csname pgf@sh@ns@\tikz@pp@name{#2}\endcsname\tikz@coordinate@text%
|
|
\else
|
|
\tikz@shapebordertrue%
|
|
\def\tikz@shapeborder@name{\tikz@pp@name{#2}}%
|
|
\fi%
|
|
\fi
|
|
\fi%
|
|
\edef\tikz@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
|
|
\tikz@marshal%
|
|
}%
|
|
|
|
\def\tikz@calc@anchor#1.#2\tikz@stop{%
|
|
% Check if a shape with name prefix exists, otherwise try the global name
|
|
% without prefix.
|
|
\ifcsname pgf@sh@ns@\tikz@pp@name{#1}\endcsname%
|
|
\pgfpointanchor{\tikz@pp@name{#1}}{#2}%
|
|
\else
|
|
\pgfpointanchor{#1}{#2}%
|
|
\fi
|
|
}%
|
|
|
|
|
|
\def\tikz@parse@hv#1(#2){%
|
|
\pgfutil@in@{ -| }{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\tikz@next=\tikz@parse@hvboth%
|
|
\else%
|
|
\pgfutil@in@{ -|}{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\tikz@next=\tikz@parse@hvleft%
|
|
\else%
|
|
\pgfutil@in@{-| }{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\tikz@next=\tikz@parse@hvright%
|
|
\else%
|
|
\let\tikz@next=\tikz@parse@hvdone%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\tikz@next#1(#2)}%
|
|
\def\tikz@parse@hvboth#1(#2 -| #3){\tikz@parse@vhdone#1({#3}|-{#2})}%
|
|
\def\tikz@parse@hvleft#1(#2 -|#3){\tikz@parse@vhdone#1({#3}|-{#2})}%
|
|
\def\tikz@parse@hvright#1(#2-| #3){\tikz@parse@vhdone#1({#3}|-{#2})}%
|
|
\def\tikz@parse@hvdone#1(#2-|#3){\tikz@parse@vhdone#1({#3}|-{#2})}%
|
|
|
|
\def\tikz@parse@vh#1(#2){%
|
|
\pgfutil@in@{ |- }{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\tikz@next=\tikz@parse@vhboth%
|
|
\else%
|
|
\pgfutil@in@{ |-}{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\tikz@next=\tikz@parse@vhleft%
|
|
\else%
|
|
\pgfutil@in@{|- }{#2}%
|
|
\ifpgfutil@in@%
|
|
\let\tikz@next=\tikz@parse@vhright%
|
|
\else%
|
|
\let\tikz@next=\tikz@parse@vhdone%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\tikz@next#1(#2)}%
|
|
\def\tikz@parse@vhboth#1(#2 |- #3){\tikz@parse@vhdone#1({#2}|-{#3})}%
|
|
\def\tikz@parse@vhleft#1(#2 |-#3){\tikz@parse@vhdone#1({#2}|-{#3})}%
|
|
\def\tikz@parse@vhright#1(#2|- #3){\tikz@parse@vhdone#1({#2}|-{#3})}%
|
|
\def\tikz@parse@vhdone#1(#2|-#3){%
|
|
{%
|
|
\tikz@@@scan@@absolute\tikz@parse@vh@mid(#2)%
|
|
\tikz@@@scan@@absolute\tikz@parse@vh@end(#3)%
|
|
\xdef\tikz@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}}%
|
|
}%
|
|
\tikz@marshal%
|
|
}%
|
|
\def\tikz@parse@vh@mid#1{\pgf@process{#1}\pgf@xa=\pgf@x}%
|
|
\def\tikz@parse@vh@end#1{\pgf@process{#1}\pgf@ya=\pgf@y}%
|
|
|
|
\def\tikz@parse@intersection#1(intersection{%
|
|
\pgfutil@ifnextchar o{%
|
|
\tikz@parse@main@intersection#1 1%
|
|
}{%
|
|
\tikz@parse@main@intersection#1%
|
|
}%
|
|
}%
|
|
\def\tikz@parse@main@intersection#1#2of #3 and #4){%
|
|
\tikzset{cs/solution=#2}%
|
|
\pgfutil@in@{--}{#3}%
|
|
\ifpgfutil@in@%
|
|
\tikz@reparse@line{first}#3\pgf@stop%
|
|
\else%
|
|
\tikzset{cs/first node=#3}%
|
|
\fi%
|
|
\pgfutil@in@{--}{#4}%
|
|
\ifpgfutil@in@%
|
|
\tikz@reparse@line{second}#4\pgf@stop%
|
|
\else%
|
|
\tikzset{cs/second node=#4}%
|
|
\fi%
|
|
\tikz@parse@cs@intersection()% advanced hackery...
|
|
\edef\pgf@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
|
|
\pgf@marshal%
|
|
}%
|
|
\def\tikz@reparse@line#1#2--#3\pgf@stop{%
|
|
\tikzset{cs/#1 line={(#2)--(#3)}}%
|
|
}%
|
|
|
|
|
|
\def\tikz@parse@intersection@a#1{\pgf@process{#1}\pgf@xa=\pgf@x\pgf@ya=\pgf@y}%
|
|
\def\tikz@parse@intersection@b#1{\pgf@process{#1}\pgf@xb=\pgf@x\pgf@yb=\pgf@y}%
|
|
|
|
\def\tikz@scan@relative#1+{%
|
|
\pgfutil@ifnextchar+{\tikz@scan@plusplus#1}{\tikz@scan@oneplus#1}}%
|
|
|
|
\def\tikz@scan@plusplus#1+{%
|
|
\def\tikz@doafter{#1}%
|
|
\tikz@scan@absolute\tikz@add%
|
|
}%
|
|
\def\tikz@add#1{%
|
|
\tikz@doafter{\pgfpointadd{#1}{\tikz@last@position@saved}}%
|
|
}%
|
|
\def\tikz@scan@oneplus#1{%
|
|
\def\tikz@doafter{#1}%
|
|
\tikz@updatecurrentfalse%
|
|
\tikz@scan@absolute\tikz@add%
|
|
}%
|
|
|
|
|
|
|
|
%
|
|
% Quote handling
|
|
%
|
|
|
|
\let\tikz@enable@node@quotes\relax
|
|
\let\tikz@enable@edge@quotes\relax
|
|
\let\tikz@enable@pic@quotes\relax
|
|
|
|
|
|
|
|
% Loading further libraries
|
|
|
|
% Include a library file.
|
|
%
|
|
% #1 = List of names of library file.
|
|
%
|
|
% Description:
|
|
%
|
|
% This command includes a list of TikZ library files. For each file X in the
|
|
% list, the file tikzlibraryX.code.tex is included, provided this has
|
|
% not been done earlier.
|
|
%
|
|
% For the convenience of Context users, both round and square brackets
|
|
% are possible for the argument.
|
|
%
|
|
% If no file tikzlibraryX.code.tex exists, the file
|
|
% pgflibraryX.code.tex is tried instead. If this file, also, does not
|
|
% exist, an error message is printed.
|
|
%
|
|
% Example:
|
|
%
|
|
% \usetikzlibrary{arrows}
|
|
% \usetikzlibrary[patterns,topaths]
|
|
|
|
\def\usetikzlibrary{\pgfutil@ifnextchar[{\use@tikzlibrary}{\use@@tikzlibrary}}%}%
|
|
\def\use@tikzlibrary[#1]{\use@@tikzlibrary{#1}}%
|
|
\def\use@@tikzlibrary#1{%
|
|
\edef\pgf@list{#1}%
|
|
\pgfutil@for\pgf@temp:=\pgf@list\do{%
|
|
\expandafter\pgfkeys@spdef\expandafter\pgf@temp\expandafter{\pgf@temp}%
|
|
\ifx\pgf@temp\pgfutil@empty
|
|
\else
|
|
\expandafter\ifx\csname tikz@library@\pgf@temp @loaded\endcsname\relax%
|
|
\expandafter\global\expandafter\let\csname tikz@library@\pgf@temp @loaded\endcsname=\pgfutil@empty%
|
|
\expandafter\edef\csname tikz@library@#1@atcode\endcsname{\the\catcode`\@}
|
|
\expandafter\edef\csname tikz@library@#1@barcode\endcsname{\the\catcode`\|}
|
|
\expandafter\edef\csname tikz@library@#1@dollarcode\endcsname{\the\catcode`\$}
|
|
\catcode`\@=11
|
|
\catcode`\|=12
|
|
\catcode`\$=3
|
|
\pgfutil@InputIfFileExists{tikzlibrary\pgf@temp.code.tex}{}{
|
|
\pgfutil@IfFileExists{pgflibrary\pgf@temp.code.tex}{%
|
|
\expandafter\usepgflibrary\expandafter{\pgf@temp}%
|
|
}{%
|
|
\tikzerror{I did not find the tikz library
|
|
'\pgf@temp'. I looked for files named
|
|
tikzlibrary\pgf@temp.code.tex and
|
|
pgflibrary\pgf@temp.code.tex, but neither
|
|
could be found in the current texmf trees.}
|
|
}}%
|
|
\catcode`\@=\csname tikz@library@#1@atcode\endcsname
|
|
\catcode`\|=\csname tikz@library@#1@barcode\endcsname
|
|
\catcode`\$=\csname tikz@library@#1@dollarcode\endcsname
|
|
\fi%
|
|
\fi
|
|
}%
|
|
}%
|
|
|
|
|
|
% Always-present libraries:
|
|
|
|
\usetikzlibrary{topaths}%
|
|
|
|
|
|
|
|
|
|
\endinput
|
|
|