diff options
author | Karl Berry <karl@freefriends.org> | 2008-02-23 00:49:54 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2008-02-23 00:49:54 +0000 |
commit | 4fc1af1461e934c39f8f5e10d5d8788681d82223 (patch) | |
tree | 7716e8a3e8787a3d11c5ce728d21b808f786ce7d /Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex | |
parent | 6f5a4edf390b6e05291d7a4b816782b14122a205 (diff) |
tikz/pgf 2.0 first attempt (22feb08)
git-svn-id: svn://tug.org/texlive/trunk@6741 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex | 3909 |
1 files changed, 3909 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex new file mode 100644 index 00000000000..cb8ad420ea8 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex @@ -0,0 +1,3909 @@ +% 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: +% <point> +\def\tikz@movetoabs{\tikz@moveto(} +\def\tikz@movetorel{\tikz@moveto+} +\def\tikz@moveto{% + \tikz@scan@one@point{\tikz@@moveto}} +\def\tikz@@moveto#1{% + \tikz@make@last@position{#1}% + \iftikz@shapeborder% + % ok, the moveto will have to wait. flag that we have a moveto in + % 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: +% -- <point> + +\def\tikz@lineto{% + \pgfutil@ifnextchar |% + {\expandafter\tikz@hv@lineto\pgfutil@gobble}% + {\expandafter\pgfutil@ifnextchar\tikz@activebar{\expandafter\tikz@hv@lineto\pgfutil@gobble}% + {\expandafter\tikz@lineto@mid\pgfutil@gobble}}} +\def\tikz@lineto@mid{% + \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@lineto@mid}% + {% + \pgfutil@ifnextchar c{\tikz@close}{% + \pgfutil@ifnextchar p{\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: +% -| <point> + +\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: +% |- <point> + +\def\tikz@vh@lineto-{\tikz@vh@lineto@next} +\def\tikz@vh@lineto@next{% + \pgfutil@ifnextchar n + {\tikz@collect@label@onpath\tikz@vh@lineto@next} + {\pgfutil@ifnextchar 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 <corner point> +\def\tikz@rect ectangle{% + \tikz@flush@moveto% + \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% + \tikz@@rect}% +\def\tikz@@rect{% + \pgfutil@ifnextchar n + {\tikz@collect@label@onpath\tikz@@rect} + {\pgfutil@ifnextchar 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 <corner point> +\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 <end of quarter-period> +\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 <end of quarter-period> +\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 <coordinate> <coordinate> +\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 |