% 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[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/frontendlayer/tikz/tikz.code.tex,v 1.27 2008/02/13 19:48:11 tantau Exp $ % Always-present libraries: \usepgflibrary{plothandlers} % TikZ is a key family \pgfkeys{/tikz/.is family} \def\tikzset{\pgfqkeys{/tikz}} \newdimen\tikz@lastx \newdimen\tikz@lasty \newdimen\tikz@lastxsaved \newdimen\tikz@lastysaved \newdimen\tikzleveldistance \newdimen\tikzsiblingdistance \newbox\tikz@figbox \newbox\tikz@tempbox \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 \def\tikz@addoption#1{\expandafter\def\expandafter\tikz@options\expandafter{\tikz@options#1}} \def\tikz@addmode#1{\expandafter\def\expandafter\tikz@mode\expandafter{\tikz@mode#1}} \def\tikz@addtransform#1{% \ifx\tikz@transform\relax% #1% \else% \expandafter\def\expandafter\tikz@transform\expandafter{\tikz@transform#1}% \fi% } % TikZ options: % This command is supported for compatibility only: \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}} % 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}% }% \def\tikz@dashphase{0pt} \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}} \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% \def\tikz@double@color{#1}% \fi% \tikz@addmode{\tikz@mode@doubletrue}% \fi} \tikzoption{double distance}{% \pgfmathsetlength{\pgf@x}{#1}% \edef\tikz@double@width@distance{\the\pgf@x}% \tikz@addmode{\tikz@mode@doubletrue}} \def\tikz@double@width@distance{0.6pt} \def\tikz@double@color{white} % 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}}} % 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}} % 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% }% }% } % 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} \tikzoption{shade}[]{\tikz@addmode{\tikz@mode@shadetrue}} \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}} \let\tikz@fillcolor=\pgfutil@empty \let\tikz@strokecolor=\pgfutil@empty % Pattern options \tikzset{pattern/.code=\PackageError{tikz}{You need to say \string\usetikzlibrary{patterns}}{}, pattern color/.style=pattern} % Shading 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/.is if=tikz@transparency@group} % 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 \tikzoption{pin}{\pgfutil@ifnextchar[{\tikz@parse@pin}{\tikz@parse@pin[]}#1\pgf@nil} \tikzoption{pin distance}{\def\tikz@pin@distance{#1}} \tikzoption{pin edge}{\def\tikz@pin@edge@style{#1}} \tikzoption{tikz@pin@post}[]{% \tikz@compute@direction{\tikz@label@angle}{\tikz@pin@distance}% \global\let\tikz@pin@edge@style@smuggle=\tikz@pin@edge@style% } \tikzoption{tikz@pre@pin@edge}[]{\def\pgf@marshal{\tikzstyle{tikz@pin@options}=} \expandafter\pgf@marshal\expandafter[\tikz@pin@edge@style@smuggle]% } \def\tikz@pin@distance{3ex} \def\tikz@pin@edge@style{} \def\tikz@parse@pin[#1]#2:#3\pgf@nil{% \tikz@add@after@node@path{% \bgroup [current point is local=true] \pgfextra{\let\tikz@save@last@node=\tikzlastnode}% node [every pin,tikz@label@angle=#2,#1,at=(\tikzlastnode.\tikz@label@angle),% after node path={(\tikz@save@last@node) edge[every pin edge,tikz@pre@pin@edge,tikz@pin@options] (\tikzlastnode)}, tikz@pin@post] {#3} \egroup% } } % Label and pin options \tikzoption{label}{\pgfutil@ifnextchar[{\tikz@parse@label}{\tikz@parse@label[]}#1\pgf@nil} \tikzoption{label distance}{\def\tikz@label@distance{#1}} \tikzoption{tikz@label@angle}{\def\tikz@label@angle{#1}\csname tikz@label@angle@is@#1\endcsname} \tikzoption{tikz@label@post}[]{\tikz@compute@direction{\tikz@label@angle}{\tikz@label@distance}} \def\tikz@label@distance{0pt} \def\tikz@parse@label[#1]#2:#3\pgf@nil{% \tikz@add@after@node@path{ \bgroup \pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name}% node [every label,% tikz@label@angle=#2,% #1,% at=(\tikzlastnode.\tikz@label@angle),tikz@label@post]% {#3}% \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#2{% \let\tikz@do@auto@anchor=\relax \c@pgf@counta=#1\relax% \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% \tikz@addtransform{\pgftransformshift{\pgfpointpolar{#1}{#2}}}% } % General node options \tikzoption{name}{\edef\tikz@fig@name{#1}} \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}{\tikzstyle{every node}+=[#1]} \tikzset{alias/.code={\tikz@fig@mustbenamed\expandafter\def\expandafter\tikz@alias\expandafter{\tikz@alias\pgfnodealias{#1}{\tikz@fig@name}}}} \tikzoption{after node path}{\tikz@add@after@node@path{#1}}% \def\tikz@add@after@node@path#1{\expandafter\def\expandafter\tikz@after@node\expandafter{\tikz@after@node#1}} \def\tikzaddafternodepathoption#1{% #1% \expandafter\def\expandafter\tikz@afternodepathoptions\expandafter{\tikz@afternodepathoptions#1}} \let\tikz@afternodepathoptions=\pgfutil@empty \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}} \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{#1}{center}}} \def\tikz@extract@node@dist#1and#2\pgf@stop{% \def\tikz@extracted@node@distance{#1}} \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} \tikzoption{overlay}[]{\pgf@relevantforpicturesizefalse} % 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}} \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% } \def\tikz@time{.5} \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{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{\raggedright\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}} \tikzoption{text badly ragged}[]{\def\tikz@text@action{\raggedright\relax}} \tikzoption{text ragged left}[]% {\def\tikz@text@action{\raggedleft\leftskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}} \tikzoption{text badly ragged left}[]{\def\tikz@text@action{\raggedleft\relax}} \tikzoption{text justified}[]{\def\tikz@text@action{\leftskip\z@\rightskip\z@\relax}} \tikzoption{text centered}[]{\def\tikz@text@action{% \leftskip\z@ plus2em% \rightskip\z@ plus2em% \spaceskip.3333em \xspaceskip.5em% \parfillskip=0pt% \let\\=\@centercr% for latex \relax}} \tikzoption{text badly centered}[]% {\def\tikz@text@action{% \let\\=\@centercr% for latex \parfillskip=0pt% \rightskip\@flushglue% \leftskip\@flushglue\relax}} \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 \def\tikz@text@action{\raggedright\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax} % Arrow options \tikzoption{arrows}{\tikz@processarrows{#1}} \tikzoption{>}{% \tikz@set@pointed{\csname pgf@arrows@invert#1\endcsname}{#1}% \expandafter\tikz@processarrows\expandafter{\tikz@current@arrows}% } \tikzoption{shorten <}{\pgfsetshortenstart{#1}} \tikzoption{shorten >}{\pgfsetshortenend{#1}} \def\tikz@set@pointed#1#2{% \pgfutil@ifundefined{pgf@arrow@code@tikze@>@#2} {% \pgfarrowsdeclarealias{tikzs@<@#2}{tikze@>@#2}{#1}{#2}% \pgfarrowsdeclarereversed{tikzs@>@#2}{tikze@<@#2}{#1}{#2}% \pgfarrowsdeclarecombine*{tikz@|<@#2}{tikz@>|@#2}{#1}{#2}{|}{|}% \pgfarrowsdeclaredouble[\pgflinewidth]{tikzs@<<@#2}{tikze@>>@#2}{#1}{#2}%<< \pgfarrowsdeclarereversed{tikzs@>>@#2}{tikze@<<@#2}{tikzs@<<@#2}{tikze@>>@#2}%<< }{}% \pgfutil@namedef{tikz@special@arrow@start<}{tikzs@<@#2}% \pgfutil@namedef{tikz@special@arrow@end>}{tikze@>@#2}% \pgfutil@namedef{tikz@special@arrow@start>}{tikzs@>@#2}% \pgfutil@namedef{tikz@special@arrow@end<}{tikze@<@#2}% \pgfutil@namedef{tikz@special@arrow@start|<}{tikz@|<@#2}% \pgfutil@namedef{tikz@special@arrow@end>|}{tikz@>|@#2}% \pgfutil@namedef{tikz@special@arrow@start<<}{tikzs@<<@#2}% \pgfutil@namedef{tikz@special@arrow@end>>}{tikze@>>@#2}%<< \pgfutil@namedef{tikz@special@arrow@start>>}{tikzs@<<@#2}%<< \pgfutil@namedef{tikz@special@arrow@end<<}{tikze@>>@#2}%<< } \def\tikz@processarrows#1{% \def\tikz@current@arrows{#1}% \def\tikz@temp{#1}% \ifx\tikz@temp\pgfutil@empty% \else% \tikz@@processarrows#1\@nil \fi% } \def\tikz@@processarrows#1-#2\@nil{% \expandafter\ifx\csname tikz@special@arrow@start#1\endcsname\relax% \pgfsetarrowsstart{#1} \else% \pgfsetarrowsstart{\csname tikz@special@arrow@start#1\endcsname}% \fi% \expandafter\ifx\csname tikz@special@arrow@end#2\endcsname\relax% \pgfsetarrowsend{#2} \else% \pgfsetarrowsend{\csname tikz@special@arrow@end#2\endcsname}% \fi% } \tikz@set@pointed{\pgf@arrows@invertto}{to} \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}{\def\tikz@plot@domain{#1}\expandafter\tikz@plot@samples@recalc\tikz@plot@domain\relax} \tikzoption{range}{\def\tikz@plot@range{#1}} % 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{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{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}{\def\tikz@plot@samples{#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}} \tikzoption{mark options}{\def\tikz@plot@mark@options{#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@mark@options=\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.6,...,5} \def\tikz@plot@samples@recalc#1:#2\relax{% \pgfmathparse{#1}% \let\tikz@temp@start=\pgfmathresult% \pgfmathparse{#2}% \let\tikz@temp@end=\pgfmathresult% \pgfmathparse{\tikz@temp@start+(\tikz@temp@end-\tikz@temp@start)/\tikz@plot@samples}% \edef\tikz@plot@samplesat{\tikz@temp@start,\pgfmathresult,...,\tikz@temp@end}% } \def\tikz@plot@prefix{\jobname.} \def\tikz@plot@id{pgf-plot} \newif\iftikz@plot@parametric \newif\iftikz@plot@raw@gnuplot % To options \tikzoption{to path}{\def\tikz@to@path{#1}} \def\tikz@to@path{-- (\tikztotarget) \tikztonodes} % Tree options \newif\iftikz@child@missing \pgfkeys{/tikz/missing/.is if=tikz@child@missing} \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} \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=\PackageError{tikz}{You need to say \string\usetikzlibrary{snakes}}{}} % Decorations \tikzset{decorate/.code=\PackageError{tikz}{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}{\tikzstyle{every cell}+=[#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 % 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 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 % 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 % % \tikzstyle{help lines}= [color=gray,line width=0.2pt] \tikzstyle{every picture}= [] \tikzstyle{every path}= [] \tikzstyle{every scope}= [] \tikzstyle{every plot}= [] \tikzstyle{every node}= [] \tikzstyle{every child}= [] \tikzstyle{every child node}= [] \tikzstyle{every to}= [] \tikzstyle{every cell}= [] \tikzstyle{every matrix}= [] \tikzstyle{every edge}= [draw] \tikzstyle{every label}= [draw=none,fill=none] \tikzstyle{every pin}= [draw=none,fill=none] \tikzstyle{every pin edge}= [help lines] \tikzstyle{ultra thin}= [line width=0.1pt] \tikzstyle{very thin}= [line width=0.2pt] \tikzstyle{thin}= [line width=0.4pt] \tikzstyle{semithick}= [line width=0.6pt] \tikzstyle{thick}= [line width=0.8pt] \tikzstyle{very thick}= [line width=1.2pt] \tikzstyle{ultra thick}= [line width=1.6pt] \tikzstyle{solid}= [dash pattern=] \tikzstyle{dotted}= [dash pattern=on \pgflinewidth off 2pt] \tikzstyle{densely dotted}= [dash pattern=on \pgflinewidth off 1pt] \tikzstyle{loosely dotted}= [dash pattern=on \pgflinewidth off 4pt] \tikzstyle{dashed}= [dash pattern=on 3pt off 3pt] \tikzstyle{densely dashed}= [dash pattern=on 3pt off 2pt] \tikzstyle{loosely dashed}= [dash pattern=on 3pt off 6pt] \tikzstyle{transparent}= [opacity=0] \tikzstyle{ultra nearly transparent}=[opacity=0.05] \tikzstyle{very nearly transparent}= [opacity=0.1] \tikzstyle{nearly transparent}= [opacity=0.25] \tikzstyle{semitransparent}= [opacity=0.5] \tikzstyle{nearly opaque}= [opacity=0.75] \tikzstyle{very nearly opaque}= [opacity=0.9] \tikzstyle{ultra nearly opaque}= [opacity=0.95] \tikzstyle{opaque}= [opacity=1] \tikzstyle{at start}= [pos=0] \tikzstyle{very near start}= [pos=0.125] \tikzstyle{near start}= [pos=0.25] \tikzstyle{midway}= [pos=0.5] \tikzstyle{near end}= [pos=0.75] \tikzstyle{very near end}= [pos=0.875] \tikzstyle{at end}= [pos=1] \tikzstyle{bend at start}= [bend pos=0,bend={+(0,0)}] \tikzstyle{bend at end}= [bend pos=1,bend={+(0,0)}] \tikzstyle{edge from parent}= [draw] % % 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\pgfutil@color\expandafter{\tikz@key}}% \edef\tikz@textcolor{\tikz@key}% \else% \pgfutil@doifcolorelse{\tikz@key} { % \expandafter\tikz@addoption\expandafter{\expandafter\pgfutil@color\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={/tikz/\tikz@key}{#1}}% \else% \edef\tikz@shape{\tikz@key}% \fi% \fi% }% \fi% \fi% } % % Main TikZ Environment % \def\tikzpicture{\pgfutil@ifnextchar[\tikz@picture{\tikz@picture[]}}%} \def\tikz@picture[#1]{% \pgfpicture% \let\tikz@atbegin@picture=\pgfutil@empty% \let\tikz@atend@picture=\pgfutil@empty% \let\tikz@transform=\relax% \tikz@installcommands\scope[every picture,#1]% \expandafter\tikz@atbegin@picture% \tikz@lib@scope@check% } \def\endtikzpicture{% \tikz@atend@picture% \global\let\pgf@shift@baseline=\pgf@baseline% \global\let\pgf@remember@smuggle=\ifpgfrememberpicturepositiononpage% \endscope% \let\pgf@baseline=\pgf@shift@baseline% \let\ifpgfrememberpicturepositiononpage=\pgf@remember@smuggle% \endpgfpicture} % 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{\pgfutil@ifnextchar[{\tikz@opt}{\tikz@opt[]}} \def\tikz@opt[#1]{\tikzpicture[#1]\pgfutil@ifnextchar\bgroup{\tikz@}{\tikz@@}} \def\tikz@#1{#1\endtikzpicture} \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} { \catcode`\;=\active \gdef\tikz@collectactivesemicolon#1;{#1;\endtikzpicture} } % % Environment for scoping graphic state settings % \def\tikz@scope@env{\pgfutil@ifnextchar[\tikz@@scope@env{\tikz@@scope@env[]}} \def\tikz@@scope@env[#1]{% \pgfscope% \begingroup% \let\tikz@atbegin@scope=\pgfutil@empty% \let\tikz@atend@scope=\pgfutil@empty% \let\tikz@options=\pgfutil@empty% \let\tikz@mode=\pgfutil@empty% \tikz@transparency@groupfalse% \tikzset{every scope/.try,#1}% \tikz@options% \iftikz@transparency@group\pgftransparencygroup\fi% \expandafter\tikz@atbegin@scope% \tikz@lib@scope@check% } \def\endtikz@scope@env{% \tikz@atend@scope% \iftikz@transparency@group\endpgftransparencygroup\fi% \endgroup% \endpgfscope% \tikz@lib@scope@check% } % % Install the abbreviated commands % \def\tikz@installcommands{% \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% \let\tikz@origscope=\scope% \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@origcoordinate=\coordinate% \let\tikz@origmatrix=\matrix% \let\tikz@origcalendar=\calendar% % \tikz@deactivatthings% % \let\scope=\tikz@scope@env% \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\useasboundingbox{\path[use as bounding box]} \def\node{\tikz@path@overlay{node}} \def\coordinate{\tikz@path@overlay{coordinate}} \def\matrix{\tikz@path@overlay{node[matrix]}} \def\calendar{\tikz@lib@cal@calendar}% } \ifx\tikz@lib@cal@calendar\@undefined \def\tikz@lib@cal@calendar{\PackageError{tikz}{You need to load the calendar library}{}} \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{% \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% \let\scope=\tikz@origscope% \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\coordinate=\tikz@origcoordinate% \let\matrix=\tikz@origmatrix% \let\calendar=\tikz@origcalendar% } { \catcode`\;=12 \gdef\tikz@nonactivesemicolon{;} \catcode`\:=12 \gdef\tikz@nonactivecolon{:} \catcode`\|=12 \gdef\tikz@nonactivebar{|} \catcode`\;=\active \catcode`\:=\active \catcode`\|=\active \catcode`\"=\active \gdef\tikz@activesemicolon{;}% \gdef\tikz@activecolon{:}% \gdef\tikz@activebar{|}% \gdef\tikz@activequotes{"}% \gdef\tikz@deactivatthings{% \def;{\tikz@nonactivesemicolon} \def:{\tikz@nonactivecolon} \def|{\tikz@nonactivebar} } } % 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}}} \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;{\only<#1>{\tikz@@command@path#2;}} { \catcode`\;=\active \long\global\def\tikz@eargactivesemicolon<#1>#2;{\only<#1>{\tikz@@command@path#2;}} } \def\tikz@@command@path{% \edef\tikzscope@linewidth{\the\pgflinewidth}% \begingroup% \let\tikz@options=\pgfutil@empty% \let\tikz@mode=\pgfutil@empty% \let\tikz@moveto@waiting=\relax% \let\tikz@timer=\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=1000\relax% \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\@let@token=% } \newcount\tikz@expandcount % Central dispatcher for commands \def\tikz@handle{% \let\@next=\tikz@expand% \ifx\@let@token(%) \let\@next=\tikz@movetoabs% \else% \ifx\@let@token+% \let\@next=\tikz@movetorel% \else% \ifx\@let@token-% \let\@next=\tikz@lineto% \else% \ifx\@let@token.% \let\@next=\tikz@dot% \else% \ifx\@let@token r% \let\@next=\tikz@rect% \else% \ifx\@let@token n% \let\@next=\tikz@fig% \else% \ifx\@let@token[%] \let\@next=\tikz@parse@options% \else% \ifx\@let@token c% \let\@next=\tikz@cchar% \else% \ifx\@let@token\bgroup% \let\@next=\tikz@beginscope% \else% \ifx\@let@token\egroup% \let\@next=\tikz@endscope% \else% \ifx\@let@token;% \let\@next=\tikz@finish% \else% \let\@next=\tikz@handle@more% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \@next% } % Continued... \def\tikz@handle@more{% \ifx\@let@token a% \let\@next=\tikz@arcA% \else% \ifx\@let@token e% \let\@next=\tikz@e@char% \else% \ifx\@let@token g% \let\@next=\tikz@grid% \else% \ifx\@let@token s% \let\@next=\tikz@sine% \else% \ifx\@let@token |% \let\@next=\tikz@vh@lineto% \else% \ifx\@let@token p% \let\@next=\tikz@pchar% \pgfsetmovetofirstplotpoint% \else% \ifx\@let@token t% \let\@next=\tikz@to% \else% \ifx\@let@token\pgfextra% \let\@next=\tikz@extra% \else% \ifx\@let@token\foreach% \let\@next=\tikz@foreach% \else% \ifx\@let@token\pgf@stop% \let\@next=\relax% \else% \ifx\@let@token\par% \let\@next=\tikz@scan@next@command% \else% \ifx\@let@token d% \let\@next=\tikz@decoration% \else% \ifx\@let@token l% \let\@next=\tikz@let@command% \else% \let\@next=\tikz@expand% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \@next% } \def\tikz@pchar{\pgfutil@ifnextchar l{\tikz@plot}{\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@@e@char dge{% \pgfutil@ifnextchar f{\tikz@edgetoparent}{\tikz@edge@plain}}% \def\tikz@finish{% % Rendering pipeline % % Step 1: Decorate path % \iftikz@decoratepath% \tikz@lib@dec@decorate@path% \fi% % % Step 1: 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% % % Reset modes % \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% \pgfsetfadingforcurrentpath{\tikz@path@fading}{\tikz@do@fade@transform}% \else% \pgfsetfading{\tikz@path@fading}{\tikz@do@fade@transform}% \fi% \tikz@mode@fade@pathfalse% no more fading... }% \fi% % Rendering pipeline % % Step 2: Install scope fading % \iftikz@mode@fade@scope% \iftikz@fade@adjust% \pgfsetfadingforcurrentpath{\tikz@scope@fading}{\tikz@do@fade@transform}% \else% \pgfsetfading{\tikz@scope@fading}{\tikz@do@fade@transform}% \fi% \tikz@mode@fade@scopefalse% \fi% % % Step 3: Setup options % \ifx\tikz@options\pgfutil@empty% \else% \pgfsys@beginscope% \begingroup% \tikz@options% \fi% % % Step 4: Do a fill if shade 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% \pgfsys@fill% \tikz@mode@fillfalse% no more filling... \fi% \fi% % % Step 5: Do a shade if necessary. % \iftikz@mode@shade% \pgfsyssoftpath@getcurrentpath\tikz@temppath \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path \pgfsyssoftpath@setcurrentpath\tikz@temppath% \pgfshadepath{\tikz@shading}{\tikz@shade@angle}% \tikz@mode@shadefalse% no more shading... \fi% % % Step 6: Double stroke, if necessary % \iftikz@mode@draw% \iftikz@mode@double% % Change line width \begingroup% \pgfsys@beginscope% \pgf@x=2\pgflinewidth% \advance\pgf@x by\tikz@double@width@distance% \pgflinewidth=\pgf@x% \pgfsetlinewidth{\the\pgflinewidth}% \fi% \fi% % % Step 7: Do stroke/fill/clip as needed % \edef\tikz@temp{\noexpand\pgfusepath{% \iftikz@mode@fill fill,\fi% \iftikz@mode@draw draw,\fi% \iftikz@mode@clip clip,\fi% }}% \tikz@temp% \tikz@mode@fillfalse% no more filling % % Step 8: Double stroke, if necessary % \iftikz@mode@draw% \iftikz@mode@double% \pgfsyssoftpath@setcurrentpath\pgf@last@used@path% reinstall \pgf@x=\tikz@double@width@distance% \pgfsetlinewidth{\the\pgf@x}% \pgfsetstrokecolor{\tikz@double@color}% \pgfsyssoftpath@flushcurrentpath% \pgfsys@stroke% \pgfsys@endscope% \ifpgf@drawarrows% set in pgfusepath... \pgf@add@arrows@as@needed% \fi% \endgroup% \fi% \fi% \tikz@mode@drawfalse% no more stroking % % Step 9: Postactions % \tikz@postactions% % % Step 10: Add labels and nodes % \box\tikz@figbox% % % Step 11: Close option brace % \ifx\tikz@options\pgfutil@empty% \else% \endgroup% \pgfsys@endscope% \iftikz@mode@clip% \PackageError{tikz}{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@lib@scope@check% } \let\tikz@lib@scope@check\pgfutil@empty% this is a hook for the scopes library % Extra actions \def\tikz@extra@preaction#1{% {% \pgfsys@beginscope% \setbox\tikz@figbox=\box\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\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% \PackageError{tikz}{Giving up on this path. Did you forget a semicolon?}{}% \let\@next=\tikz@finish% \else% \let\@next=\tikz@@expand \fi% \@next} \def\tikz@@expand{% \expandafter\tikz@scan@next@command\@let@token} % Syntax for scopes: % {scoped path commands} \def\tikz@beginscope{\begingroup\tikz@scan@next@command} \def\tikz@endscope{% \global\setbox\tikz@tempbox=\box\tikz@figbox% \xdef\tikz@scope@save@lastx{\the\tikz@lastx}% \xdef\tikz@scope@save@lasty{\the\tikz@lasty}% \iftikz@current@point@local% \endgroup% \else% \xdef\tikz@scope@save@lastxsaved{\the\tikz@lastxsaved}% \xdef\tikz@scope@save@lastysaved{\the\tikz@lastysaved}% \endgroup% \tikz@lastxsaved=\tikz@scope@save@lastxsaved% \tikz@lastysaved=\tikz@scope@save@lastysaved% \fi% \tikz@lastx=\tikz@scope@save@lastx% \tikz@lasty=\tikz@scope@save@lasty% \setbox\tikz@figbox=\box\tikz@tempbox% \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} % % Example: % % \draw (0,0) \foreach \x in {1,2,3} {-- (\x,0) circle (1cm)} -- (5,5); \def\tikz@foreach{% \def\pgffor@beginhook{\setbox\tikz@figbox=\box\tikz@tempbox\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=\copy\tikz@figbox\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% \setbox\tikz@figbox=\box\tikz@tempbox\tikz@scan@next@command}% \global\setbox\tikz@tempbox=\copy\tikz@figbox% \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% } } % % 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: % \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 % wainting: \edef\tikz@moveto@waiting{\tikz@shapeborder@name}% \else% \pgfpathmoveto{\tikz@last@position}% \let\tikz@moveto@waiting=\relax% \fi% \tikz@scan@next@command% } \let\tikz@moveto@waiting=\relax % normally, nothing is waiting... \def\tikz@flush@moveto{% \ifx\tikz@moveto@waiting\relax% \else% \pgfpathmoveto{\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}}% \pgfpathmoveto{\pgfqpoint{\pgf@x}{\pgf@y}}% \fi% \let\tikz@moveto@waiting=\relax% } % % Collecting labels on the path % \def\tikz@collect@coordinate@onpath#1coordinate{% \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){}} \def\tikz@collect@label@onpath#1node{% \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath node}% \tikz@collect@label@scan#1} \def\tikz@collect@label@scan#1{% \pgfutil@ifnextchar({\tikz@collect@paran#1}% {\pgfutil@ifnextchar[{\tikz@collect@options#1}% {\pgfutil@ifnextchar\bgroup{\tikz@collect@arg#1}% {#1}}}% }%}} \def\tikz@collect@paran#1(#2){% \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath(#2)}% \tikz@collect@label@scan#1% } \def\tikz@collect@options#1[#2]{% \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath[#2]}% \tikz@collect@label@scan#1% } \def\tikz@collect@arg#1#2{% \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{#2}}% #1% } \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% } % Syntax for lineto: % -- \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{\pgfsetlinetofirstplotpoint\expandafter\tikz@plot\pgfutil@gobble}% {\tikz@scan@one@point{\tikz@@lineto}}}}} \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% \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: % -| \def\tikz@hv@lineto{% \pgfutil@ifnextchar n {\tikz@collect@label@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}% \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: % |- \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 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}% \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% \tikz@path@close{\expandafter\pgfpoint\pgfsyssoftpath@lastmoveto}% \def\pgfstrokehook{}% \let\tikz@timer=\@undefined% \tikz@scan@next@command% } % Syntax for options: % [options] \def\tikz@parse@options#1]{% \tikzset{#1}% \tikz@lib@dec@hook% for decorations... \tikz@scan@next@command% } \let\tikz@lib@dec@hook=\relax % Syntax for edges: % edge [options] (coordinate) % edge [options] node {node text} (coordinate) \def\tikz@edge@plain{% \begingroup% \tikz@to@use@whom% \let\tikz@to@or@edge@function=\tikz@do@edge% \tikz@to@or@edge} % Syntax for to paths: % to [options] (coordinate) % to [options] node {node text} (coordinate) \def\tikz@to o{% \tikz@to@use@last@coordinate% \let\tikz@to@or@edge@function=\tikz@do@to% \tikz@to@or@edge} \def\tikz@to@or@edge{\pgfutil@ifnextchar[\tikz@@to@or@edge{\tikz@@to@or@edge[]}}%} \def\tikz@@to@or@edge[#1]{% \def\tikz@@to@local@options{[#1]}% \let\tikz@collected@onpath=\pgfutil@empty% \tikz@@to@collect% } \def\tikz@@to@collect{% \pgfutil@ifnextchar(\tikz@@to@or@edge@coordinate {\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@@to@collect}% {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@@to@collect} {\PackageError{tikz}{( 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{% \setbox\tikz@figbox=\hbox\bgroup% \unhbox\tikz@figbox% \hbox\bgroup \bgroup% \pgfinterruptpath% \pgfscope% \let\tikz@transform=\pgfutil@empty% \let\tikz@options=\pgfutil@empty% \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@transform% % Typeset node: \tikz@atbegin@to% \path[style=every edge]\tikz@@to@local@options(\tikztostart)\tikz@to@path;% \tikz@atend@to% \endpgfscope% \endpgfinterruptpath% \egroup \egroup% \egroup% \global\setbox\tikz@tempbox=\copy\tikz@figbox% \endgroup% \setbox\tikz@figbox=\box\tikz@tempbox% \tikz@scan@next@command% } \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{\tikz@atbegin@to}% [style=every to]\tikz@@to@local@options\tikz@to@path% \pgfextra{\tikz@atend@to}% } \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 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% \tikz@node@is@a@labeltrue% \tikz@scan@next@command [style=edge from parent,#1] \tikz@edge@to@parent@path% } % 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 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@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\@next=} \def\tikz@curveCdot.{% \ifx\@next.% \else% \PackageError{tikz}{Dot expected}{}% \fi% \tikz@updatecurrenttrue% \tikz@curveCcheck% } \def\tikz@curveCcheck{% \pgfutil@ifnextchar n% {\tikz@collect@label@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}}% \pgfpathmoveto{\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% \tikz@scan@next@command% } % Syntax for rectangles: % rectangle \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 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% \pgfpathmoveto{\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% \pgfpathmoveto{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}% \def\pgfstrokehook{}% \tikz@scan@next@command% } % Syntax for grids: % grid \def\tikz@grid rid{% \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@scan@one@point\tikz@gridB}% \def\tikz@gridB#1{% \tikz@make@last@position{#1}% {% \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}}% } \tikz@scan@next@command% } % 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]{% \begingroup% \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}{% \PackageError{tikz}{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] #1}}% \else% \def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{% set samples \tikz@plot@samples; plot [x=\tikz@plot@domain] #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@figbox=\hbox{% \unhbox\tikz@figbox% \hbox{{% \pgfinterruptpath% \pgfscope% \let\tikz@options=\pgfutil@empty% \let\tikz@transform=\pgfutil@empty% \expandafter\tikzset\expandafter{\tikz@plot@mark@options}% \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=\copy\tikz@figbox% \endgroup% \setbox\tikz@figbox=\box\tikz@tempbox% \tikz@make@last@position{\tikz@@@temp}% \tikz@scan@next@command% } \pgfdeclareplotmark{ball} {% \def\tikz@shading{ball}% \shade (0,0) circle (\pgfplotmarksize);% } % Syntax for cosine curves: % cos \def\tikz@cosine s{\tikz@scan@one@point\tikz@@cosine} \def\tikz@@cosine#1{% \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 \def\tikz@sine in{\tikz@scan@one@point\tikz@@sine} \def\tikz@@sine#1{% \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 \def\tikz@parabola arabola{% \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@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@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: \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}}}% \endgroup% \expandafter\pgfpathparabola\tikz@parabola@b% \tikz@scan@next@command% } % Syntax for circles: % circle (radius) % % Syntax for ellipses: % ellipse (x-radius and y-radius) % % 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{% \pgfutil@ifnextchar(\tikz@@@circle{%) \advance\tikz@expandcount by -1% \ifnum\tikz@expandcount<0\relax% \let\@next=\tikz@@circle@scangiveup% \else% \let\@next=\tikz@@circle@scanexpand% \fi% \@next% }% } \def\tikz@@circle@scanexpand{\expandafter\tikz@@circle} \def\tikz@@circle@scangiveup#1{\PackageError{tikz}{Cannot parse this radius}{}#1{\tikz@scan@next@command}} \def\tikz@@@circle(#1){% \pgfutil@in@{ and }{#1}% \ifpgfutil@in@% \tikz@@ellipseB(#1)% \else% \tikz@@ellipseB({#1} and {#1})% \fi% \tikz@scan@next@command% } \def\tikz@@ellipseB(#1 and #2){% \pgfmathparse{#1}% \let\tikz@ellipse@x=\pgfmathresult% \ifpgfmathunitsdeclared% \pgfmathparse{#2}% \let\tikz@ellipse@y=\pgfmathresult% \ifpgfmathunitsdeclared% \pgfpathellipse{\tikz@last@position}{% \pgfqpoint{\tikz@ellipse@x pt}{0pt}}{\pgfpoint{0pt}{\tikz@ellipse@y pt}}% \else% \PackageError{tikz}{You cannot mix dimensions and dimensionless values in an ellipse}{}% \fi% \else% \pgfmathparse{#2}% \let\tikz@ellipse@y=\pgfmathresult% \ifpgfmathunitsdeclared% \PackageError{tikz}{You cannot mix dimensions and dimensionless values in an ellipse}{}% \else% \pgfpathellipse{\tikz@last@position}{% \pgfpointxy{\tikz@ellipse@x}{0}}{\pgfpointxy{0}{\tikz@ellipse@y}}% \fi% \fi% } % Syntax 1 for arcs: % arc (start angle:end angle:radius) % % Syntax 2 for arcs: % arc (start angle:end angle:x-radius and y-radius) % % radius can be dimensionless, then the arc is in the xy-coordinate system \def\tikz@arcA rc{% \tikz@flush@moveto% \pgfutil@ifnextchar({\tikz@@arcto}{\expandafter\tikz@arcA\expandafter r\expandafter c}} \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% } \def\tikz@parse@arc@and(#1:#2:#3 and #4){% \pgfmathparse{#3}% \let\tikz@arc@x=\pgfmathresult% \ifpgfmathunitsdeclared% \pgfmathparse{#4}% \let\tikz@arc@y=\pgfmathresult% \ifpgfmathunitsdeclared% \tikz@@@arcfinal{\pgfpatharc{#1}{#2}{\tikz@arc@x pt and \tikz@arc@y pt}} {\pgfpointpolar{#1}{\tikz@arc@x pt and \tikz@arc@y pt}} {\pgfpointpolar{#2}{\tikz@arc@x pt and \tikz@arc@y pt}}% \else% \PackageError{tikz}{You cannot mix dimensions and dimensionless values in an arc}{}% \fi% \else% \pgfmathparse{#4}% \let\tikz@arc@y=\pgfmathresult% \ifpgfmathunitsdeclared% \PackageError{tikz}{You cannot mix dimensions and dimensionless values in an arc}{}% \else% \tikz@@@arcfinal{\pgfpatharcaxes{#1}{#2}{\pgfpointxy{\tikz@arc@x}{0}}{\pgfpointxy{0}{\tikz@arc@y}}} {\pgfpointpolarxy{#1}{\tikz@arc@x and \tikz@arc@y}}{\pgfpointpolarxy{#2}{\tikz@arc@x and \tikz@arc@y}}% \fi% \fi% } \def\tikz@@@arcfinal#1#2#3{% #1% \pgf@process{#2}% \advance\tikz@lastx by-\pgf@x% \advance\tikz@lasty by-\pgf@y% \pgf@process{#3}% \advance\tikz@lastx by\pgf@x% \advance\tikz@lasty by\pgf@y% \tikz@lastxsaved=\tikz@lastx% \tikz@lastysaved=\tikz@lasty% \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)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[options] (node name) {label text} % % all of [options], (node name) and {label text} are optional. There % can be multiple options before the label text as in % node[draw] (a) [rotate=10] {text} % % A label text always ``ends'' the node. \def\tikz@fig ode{% \edef\tikz@save@line@width{\the\pgflinewidth}% \begingroup% \let\tikz@fig@name=\pgfutil@empty% \begingroup% \tikz@is@matrixfalse% \let\nodepart=\tikz@nodepart% \let\tikz@options=\pgfutil@empty% \let\tikz@after@node=\pgfutil@empty% \let\tikz@afternodepathoptions=\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}}% \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\bgroup{\tikz@fig@main}% {\PackageError{tikz}{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){\edef\tikz@fig@name{#1}\tikz@@scan@fig}% \def\tikz@fig@scan@options[#1]{\tikzset{#1}\tikz@@scan@fig}% \let\tikz@node@reset@hook=\pgfutil@empty% \let\tikz@node@begin@hook=\pgfutil@empty% \def\tikz@fig@main{\afterassignment\tikz@@fig@main\let\next=} \def\tikz@@fig@main{% \pgfutil@ifundefined{pgf@sh@s@\tikz@shape}% {\PackageError{tikz}% {Unknown shape ``\tikz@shape.'' Using ``rectangle'' instead}{}% \def\tikz@shape{rectangle}}% {}% \tikzset{every \tikz@shape\space node/.try}% \tikz@node@begin@hook% \iftikz@is@matrix% \let\tikz@next=\tikz@do@matrix% \else% \let\tikz@next=\tikz@do@fig% \fi% \tikz@next% } \def\tikz@do@fig{% \setbox\pgfnodeparttextbox=\hbox% \bgroup% \tikzset{every text node part/.try}% \ifx\tikz@textopacity\pgfutil@empty% \else% \pgfsetfillopacity{\tikz@textopacity}% \pgfsetstrokeopacity{\tikz@textopacity}% \fi% \pgfinterruptpicture% \tikz@textfont% \ifx\tikz@text@width\pgfutil@empty% \else% \begingroup% \pgfutil@minipage[t]{\tikz@text@width}% \tikz@text@action% \fi% \tikz@atbegin@node% \bgroup% \aftergroup\unskip% \ifx\tikz@textcolor\pgfutil@empty% \else% \pgfutil@colorlet{.}{\tikz@textcolor}% \fi% \pgfsetcolor{.}% \setbox\tikz@figbox=\box\voidb@x% \tikz@uninstallcommands% \aftergroup\tikz@fig@collectresetcolor% \ignorespaces% } \def\tikz@fig@collectresetcolor{% \pgfutil@ifnextchar\reset@color% {\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% \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@node\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@figbox=\hbox\bgroup% \setbox\pgfutil@tempboxa=\copy\tikz@figbox% \unhbox\pgfutil@tempboxa% \hbox\bgroup\bgroup% \pgfinterruptpath% \pgfscope% \tikz@options% \setbox\tikz@figbox=\box\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% \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% }% \aftergroup\tikz@do@matrix@cont}% \bgroup% } \def\tikz@do@matrix@cont{% \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 % \setbox\tikz@figbox=\hbox{% \setbox\pgfutil@tempboxa=\copy\tikz@figbox% \unhbox\pgfutil@tempboxa% \hbox{{% \pgfinterruptpath% \pgfscope% \tikz@options% \setbox\tikz@figbox=\box\voidb@x% \pgfmultipartnode{\tikz@shape}{\tikz@anchor}{\tikz@fig@name}{% \pgfutil@tempdima=\pgflinewidth% {\begingroup\tikz@finish}% \global\pgflinewidth=\pgfutil@tempdima% }% \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}% \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@node@smuggle=\tikz@after@node% \global\let\tikz@afternodepathoptions@smuggle=\tikz@afternodepathoptions% % shift box outside group \global\setbox\tikz@tempbox=\copy\tikz@figbox% \endgroup\endgroup% \setbox\tikz@figbox=\box\tikz@tempbox% \pgflinewidth=\tikz@save@line@width% \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@node@smuggle\pgfutil@empty% \else% \tikz@scan@next@command{\pgfextra{\tikz@afternodepathoptions@smuggle}\tikz@after@node@smuggle}\pgf@stop% \fi% \tikz@scan@next@command% } \let\tikz@fig@continue@orig=\tikz@fig@continue % Syntax for parts of nodes: % node ... {... \nodepart{name} ... \nodepart{name} ...} \def\tikz@nodepart#1{% \tikz@atend@node% \unskip% \gdef\tikz@nodepart@name{#1}% \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% % Now start new box: \expandafter\setbox\csname pgfnodepart\tikz@nodepart@name box\endcsname=\hbox% \bgroup% \tikzset{every \tikz@nodepart@name\space node part/.try}% \pgfinterruptpicture% \tikz@textfont% \ifx\tikz@text@width\pgfutil@empty% \else% \begingroup% \pgfutil@minipage[t]{\tikz@text@width}% \tikz@text@action% \fi% \bgroup% \aftergroup\unskip% \ifx\tikz@textcolor\pgfutil@empty% \else% \pgfutil@colorlet{.}{\tikz@textcolor}% \fi% \pgfsetcolor{.}% \setbox\tikz@figbox=\box\voidb@x% \tikz@uninstallcommands% \tikz@atbegin@node% \aftergroup\tikz@fig@collectresetcolor% \ignorespaces% } % % "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% \let\tikz@after@node=\pgfutil@empty% \let\tikz@afternodepathoptions=\pgfutil@empty% \let\tikz@alias=\pgfutil@empty% \let\tikz@transform=\pgfutil@empty% \tikz@decoratepathfalse% \tikz@node@reset@hook% \tikzset{every node/.try,#1}% \ifx\tikz@fig@name\pgfutil@empty% \PackageError{tikz}{Late options must reference some existing node}{}% \fi% \tikz@node@begin@hook% \tikz@alias% \global\let\tikz@last@fig@name=\tikz@fig@name% \global\let\tikz@after@node@smuggle=\tikz@after@node% \global\let\tikz@afternodepathoptions@smuggle=\tikz@afternodepathoptions% \endgroup% \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@node@smuggle\pgfutil@empty% \else% \tikz@scan@next@command{\pgfextra{\tikz@afternodepathoptions@smuggle}\tikz@after@node@smuggle}\pgf@stop% \fi% } % Auto placement \def\tikz@auto@pre{% \begingroup \pgfresetnontranslationattimefalse \pgfslopedattimetrue% \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% } % 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% \let\tikz@options=\pgfutil@empty% \let\tikz@transform=\pgfutil@empty% \tikzset{level/.try=\the\tikztreelevel,level \the\tikztreelevel/.try}% \tikz@transform% \let\tikzparentnode=\tikz@last@fig@name% % Transform to center of node \pgftransformshift{\pgfpointanchor{\tikzparentnode}{\tikz@growth@anchor}}% \tikznumberofcurrentchild=0\relax% \tikz@children@list% \global\setbox\tikz@tempbox=\copy\tikz@figbox% \endgroup% \setbox\tikz@figbox=\box\tikz@tempbox% \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% \foreach#2in{#3}{% \tikznumberofcurrentchild=\c@pgf@counta\relax% \setbox\tikz@figbox=\box\tikz@tempbox% \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% }% \tikznumberofcurrentchild=\c@pgf@counta\relax% \setbox\tikz@figbox=\box\tikz@tempbox% } % 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% \else% \setbox\tikz@figbox=\hbox\bgroup% \unhbox\tikz@figbox% \hbox\bgroup\bgroup% \pgfinterruptpath% \pgfscope% \let\tikz@transform=\pgfutil@empty% \tikzset{every child/.try,#1}% \tikz@options% \tikz@transform% \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 (0,0) \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}% {\tikz@parse@child@node@rest}}} \def\tikz@parse@child@node@rest#1\pgf@stop{\def\tikz@child@node@rest{#1}} \def\tikz@parse@child@node@c c{\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{% \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} {\PackageError{tikz}{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{% \expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text{#1}} \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{\PackageError{tikz}{You need to load a decoration library}{}} % The decorate path command: \def\tikz@lib@dec@decorate@path{\PackageError{tikz}{You need to load a decoration library}{}} % % Syntax for let : % % let \p1 = (coordinate), \p2 = (coordinate),... in % \def\tikz@let@command et#1in{% \PackageError{tikz}{You need to say \string\usetikzlibrary{calc} to use the let command}{}% } % % 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}% } % % 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 coodinate 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@cs@node}% \fi% \pgfpointanchor{\tikz@cs@node}{center}% \else% \pgfpointanchor{\tikz@cs@node}{\tikz@cs@angle}% \fi% \else% \pgfpointanchor{\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% \PackageError{tikz}{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% \PackageError{tikz}{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\@next=\tikz@@scangiveup% \else% \let\@next=\tikz@@scanexpand% \fi% \@next{#1}% }% } \def\tikz@@scanexpand#1{\expandafter\tikz@scan@one@point\expandafter#1} \def\tikz@@scangiveup#1{\PackageError{tikz}{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@@@scan@@absolute#1({% \pgfutil@ifnextchar{$}%$ {\tikz@parse@calculator#1(} {\tikz@scan@no@calculator#1(}% } \def\tikz@scan@no@calculator#1(#2){% \edef\tikz@temp{(#2)}% \expandafter\tikz@@scan@@no@calculator\expandafter#1\tikz@temp% } \def\tikz@@scan@@no@calculator#1(#2){% \pgfutil@in@{cs:}{#2}% \ifpgfutil@in@% \let\@next\tikz@parse@coordinatesystem% \else% \pgfutil@in@{intersection }{#2}% \ifpgfutil@in@% \let\@next\tikz@parse@intersection% \else% \pgfutil@in@|{#2}% \ifpgfutil@in@ \pgfutil@in@{-|}{#2}% \ifpgfutil@in@ \let\@next\tikz@parse@hv% \else% \let\@next\tikz@parse@vh% \fi% \else% \pgfutil@in@:{#2}% \ifpgfutil@in@ \let\@next\tikz@parse@polar% \else% \pgfutil@in@,{#2}% \ifpgfutil@in@% \let\@next\tikz@parse@regular% \else% \let\@next\tikz@parse@node% \fi% \fi% \fi% \fi% \fi% \@next#1(#2)% } \def\tikz@parse@calculator#1($#2$){% \PackageError{tikz}{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} {\PackageError{tikz}{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% \PackageError{tikz}{You cannot mix dimension and dimensionless values for polar coordinates}{} \def\tikz@next{#1{\pgfpointorigin}}% \fi% \else% \tikz@checkunit{#4}% \iftikz@isdimension% \PackageError{tikz}{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{\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\@next{#1{\pgfpoint{#2}{#3}}}% \else% \def\@next{#1{\pgfpointadd{\pgfpoint{#2}{0pt}}{\pgfpointxy{0}{#3}}}}% \fi% \else% \tikz@checkunit{#3}% \iftikz@isdimension% \def\@next{#1{\pgfpointadd{\pgfpoint{0pt}{#3}}{\pgfpointxy{#2}{0}}}}% \else% \def\@next{#1{\pgfpointxy{#2}{#3}}}% \fi% \fi% \fi% \@next% } \def\tikz@parse@splitxyz#1#2#3,#4,{% \def\@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... \expandafter\ifx\csname pgf@sh@ns@#2\endcsname\tikz@coordinate@text% \else \tikz@shapebordertrue% \def\tikz@shapeborder@name{#2}% \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{% \pgfpointanchor{#1}{#2}% } \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% } % 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. % % 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\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`\|} \catcode`\@=11 \catcode`\|=12 \input tikzlibrary\pgf@temp.code.tex \catcode`\@=\csname tikz@library@#1@atcode\endcsname \catcode`\|=\csname tikz@library@#1@barcode\endcsname \fi% }% } % Always-present libraries: \usetikzlibrary{topaths} \endinput