Current File : //usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex |
% Copyright 2006, 2018 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.
\ProvidesFileRCS{pgfcorearrows.code.tex}
% Define a new (meta) arrow or a shorthand
%
% #1 = key--value pairs
%
% Description:
%
% This command is used to define a new arrow tip kind. For more
% details on the description of the keys, please see the pgfmanual.
%
% name = Name of the arrow. If the name contains a dash
% (hyphen), the text before the hyphen is the start name
% and the text behind it the end name.
%
% means = If set, none of the below options may be
% given. The effect is that whenever the arrow is
% used, it gets replaced by this "text", which is
% parsed by the parser.
%
% setup code = Code that does "precomputations". These will be
% executed only once for each combination of the
% dependencies. At the end of this code, you can use
% \savethe and \save to "save" computed values, which
% will then be available inside the "code". Values needed
% only for the "... end" keys and the convex hull do not
% need to be saved since these are also executed only
% once.
% drawing code = Code for drawing the arrow. When the cache key is set to
% true, which is the default, the code will be protocolled
% and the resulting code is inserted using \pgflowlevelobj.
% cache = Boolean that decides whether the arrow can be cached. The
% default is true, so you have to say cache=false to switch
% caching off. In this case, each time the arrow is drawn,
% its code is simply executed. This allows you to put things
% like text or shadings in arrow tips.
% bending mode = Can be set to "orthogonal", "polar", or
% "none". Defaults to "orthogonal".
% defaults = A list of "default" options for the arrow tip. These
% are executed as if they were given to the arrow tip in
% brackets. This is useful for setting up default values.
% parameters = A list of comma-separated macro names on whose values
% the appearance of the arrow tip depends. When an arrow
% tip is used, these macros are expanded. If an
% arrow tip was already installed with the same macro
% names (and caching is true), the cached code is
% used. Note that when you use dimensions here, add \the.
%
% Inside the setup code, the following macros are available:
%
% \pgfarrowssettipend
% The code should draw an arrow pointing "right along the x
% axis". The "tip" key specifies how far the arrow goes
% along the x axis, that is, it should be the x coordinate
% of the very tip of the arrow. In previous versions this
% was called the "right extend". The value passed to this
% key should be some code that sets the dimension
% "\pgfarrowresult", which is \let to be equal to
% \pgf@x. A \relax will be added after the code provided
% here, so you can write things like "\pgfarrowresult=1pt".
% \pgfarrowssetbackend
% The leftmost x-coordinate that is still part of the
% arrow tip (the "back end" of the arrow"). This coordinate
% will be used when multiple arrow tips are
% composed. Defaults to 0pt.
% \pgfarrowssetlineend
% The x-coordinate where a line should stop inside the arrow
% tip so that it gets "obscured" by the arrow. Defaults to 0pt.
% \pgfarrowssetvisualtipend
% When the arrow tip is drawn in flex mode, it is rotated
% such that the x-coordinates of "visual tip end" and "visual
% back end" lie on the path. Defaults to \pgfarrowssettipend.
% \pgfarrowssetvisualbackend
% See above. Defaults to \pgfarrowssetbackend
\def\pgfdeclarearrow#1{%
\let\pgf@decl@arrow@defaults\pgfutil@empty%
\let\pgf@decl@arrow@means\relax%
\let\pgf@decl@arrow@code\relax%
\pgfkeys{/pgf/@arrows decl/.cd,
name=,
setup code=,
cache=true,
bending mode=orthogonal,
parameters=,%
#1%
}%
\ifx\pgf@decl@arrow@name@end\pgfutil@empty%
\pgferror{Declaring unnamed arrow}%
\else%
\pgf@arrow@letter{name@end}%
\pgf@arrow@letter{name@start}%
\expandafter\let\csname pgf@ar@start@\pgf@decl@arrow@name@start\endcsname\pgf@decl@arrow@name@end%
\expandafter\let\expandafter\pgf@old@code\csname pgf@ar@code@\pgf@decl@arrow@name@end\endcsname%
\expandafter\let\expandafter\pgf@old@means\csname pgf@ar@means@\pgf@decl@arrow@name@end\endcsname%
\ifx\pgf@decl@arrow@code\relax%
\ifx\pgf@decl@arrow@means\relax%
\pgferror{You must set either the 'means' or the drawing code' keys for arrow tip '\pgf@decl@arrow@name@end'}%
\else%
\ifx\pgf@old@code\relax%
\let\pgf@arrow@tip@sequence\pgfutil@empty%
\let\pgf@arrow@translate\relax%
\expandafter\let\expandafter\pgf@arrows@direct\csname pgf@arrows@direct@name@end@\pgf@decl@arrow@means\endcsname%
\ifx\pgf@arrows@direct\relax%
\let\pgf@arrows@options\pgfutil@empty%
\expandafter\pgfarrows@initial@parser\pgf@decl@arrow@means[]\pgf@stop%
\else%
\let\pgf@arrow@tip@sequence\pgf@arrows@direct%
\fi%
\pgf@arrow@letter@\pgf@arrow@tip@sequence{means}%
\expandafter\let\csname pgf@ar@code@\pgf@decl@arrow@name@end\endcsname\relax%
\else%
\pgferror{Arrow tip '\pgf@decl@arrow@name@end' was already
defined with key 'drawing code' previously and you cannot change this}%
\fi%
\fi%
\else%
\ifx\pgf@decl@arrow@means\relax%
\ifx\pgf@old@means\relax%
\pgf@arrow@letter{code}%
\pgf@arrow@letter{defaults}%
\pgf@arrow@letter{setup}%
\pgf@arrow@letter{bending@mode}%
\pgf@arrow@letter{par}%
\expandafter\let\csname pgf@ar@do@cache@\pgf@decl@arrow@name@end\endcsname\pgf@decl@arrow@cache%
\else%
\pgferror{Arrow tip '\pgf@decl@arrow@name@end' was already
defined with key 'means' previously and you cannot change this}%
\fi%
\else%
\pgferror{You cannot set both the 'means' and also the 'drawing code'
keys for arrow tip '\pgf@decl@arrow@name@end'}%
\fi%
\fi%
\fi%
}
\def\pgf@arrow@letter#1{%
\expandafter\pgf@arrow@letter@\expandafter{\csname pgf@decl@arrow@#1\endcsname}{#1}%
}
\def\pgf@arrow@letter@#1#2{%
\expandafter\let\csname pgf@ar@#2@\pgf@decl@arrow@name@end\endcsname#1%
}
\pgfkeys{
/pgf/@arrows decl/.cd,
name/.code={%
\pgfutil@in@-{#1}%
\ifpgfutil@in@%
\pgf@arrows@name@decomp#1\pgf@stop%
\else%
\def\pgf@decl@arrow@name@end{#1}\let\pgf@decl@arrow@name@start\pgf@decl@arrow@name@end%
\fi},
means/.store in=\pgf@decl@arrow@means,
setup code/.store in=\pgf@decl@arrow@setup,
drawing code/.store in=\pgf@decl@arrow@code,
cache/.store in=\pgf@decl@arrow@cache,
bending mode/.is choice,
bending mode/none/.code=\let\pgf@decl@arrow@bending@mode\pgfutil@empty,
bending mode/orthogonal/.code=\def\pgf@decl@arrow@bending@mode{\pgfpointcurvilinearbezierorthogonal},
bending mode/polar/.code=\def\pgf@decl@arrow@bending@mode{\pgfpointcurvilinearbezierpolar},
parameters/.store in=\pgf@decl@arrow@par,
defaults/.code={%
\let\pgf@arrows@options\pgfutil@empty%
\pgfkeys{/pgf/arrow keys/.cd,#1}%
\let\pgf@decl@arrow@defaults\pgf@arrows@options%
}
}
\def\pgf@arrows@name@decomp#1-#2\pgf@stop{%
\def\pgf@decl@arrow@name@start{#1}%
\def\pgf@decl@arrow@name@end{#2}%
}
% Handler for defining arrow tips:
%
% Description:
%
% When you write "my name/.tip = arrow spec", this has the same
% effect as writing \pgfdeclarearrow{name = my name, means = arrow spec}.
\pgfkeys{/handlers/.tip/.code=%
\expandafter\expandafter\expandafter\pgf@arrows@unravel\pgfkeyscurrentpath/\pgf@stop%
\expandafter\pgf@arrows@key@call\expandafter{\pgf@arrows@unravelled}{#1}}
\def\pgf@arrows@unravel#1/{\pgfutil@ifnextchar\pgf@stop{\def\pgf@arrows@unravelled{#1}\pgfutil@gobble}{\pgf@arrows@unravel}}
\def\pgf@arrows@key@call#1#2{\pgfdeclarearrow{name={#1},means={#2}}}
% Draw an arrow
%
% #1 = arrow specification
%
% Description:
%
% Draws the arrow in the given specification (and "end"
% specification). The arrow will be drawn such that it touches the
% origin "from the left", that is, the arrow will lie completely in
% the half plane with negative $x$ values and the tip will end exactly
% at the origin.
\def\pgfarrowdraw#1{%
{%
\pgfsetarrowsend{#1}%
\pgf@arrow@compute@shortening\pgf@end@tip@sequence%
\pgf@arrow@draw@arrow\pgf@end@tip@sequence\pgf@xb%
}%
}
% Compute the length of an arrow
%
% #1 = arrow specification
%
% Description:
%
% In \pgf@x, this will return the total length of the arrow given as
% #1, in \pgf@xa it will return the distance from the tip to the line
% end.
\def\pgfarrowtotallength#1{%
{%
\pgfsetarrowsend{#1}%
\pgf@arrow@compute@shortening\pgf@end@tip@sequence%
\expandafter\expandafter\expandafter%
}%
\expandafter\expandafter\expandafter\pgf@x\expandafter\the\expandafter\pgf@xb\expandafter\pgf@xa\the\pgf@xa%
}
% Sets the end arrow tip
%
% #1 = An arrow specification
%
% Description:
%
% An "arrow specification" is a sequence of names of meta arrow tips
% together with options in brackets. In detail:
%
% In #1, consider the text from the start up to the first bracket. If
% this text is the name of a (meta) arrow tip, we use this arrow tip
% with the provided options. If it is the name of a arrow tip
% shorthand, this shorthand is expanded and the options are applied to
% each arrow tip inside the shorthand. If the text is neither or the
% above, the first letter of text is treated as a shorthand without
% options.
%
% The special arrow tip "." is used to indicate the end of the line.
%
% \pgfsetarrowsend{stealth[reversed]}
% \pgfsetarrowsend{stealth[length=1pt] . stealth[length=2pt]}
% \pgfsetarrowsend{>>>}
% \pgfsetarrowsend{>.>}
\def\pgfsetarrowsend#1{%
\let\pgf@arrow@tip@sequence\pgfutil@empty%
\pgf@arrows@translatefalse%
\expandafter\let\expandafter\pgf@arrows@direct\csname pgf@arrows@direct@name@end@#1\endcsname%
\ifx\pgf@arrows@direct\relax%
\edef\pgf@marshal{\noexpand\pgfarrows@initial@parser#1[]\noexpand\pgf@stop}%
\pgf@marshal%
\else%
\let\pgf@arrow@tip@sequence\pgf@arrows@direct%
\fi%
\let\pgf@end@tip@sequence\pgf@arrow@tip@sequence%
}
\newif\ifpgf@arrows@translate
\def\pgfarrows@initial@parser{%
\pgfutil@ifnextchar[\pgfarrows@initial@parser@{\pgfarrows@initial@parser@[]}}%}
\def\pgfarrows@initial@parser@[#1]{%
\let\pgf@arrows@options\pgfutil@empty%
\pgfkeys{/pgf/arrow keys/.cd,#1}%
\let\pgf@arrows@options@initial\pgf@arrows@options%
\pgfarrows@parser%
}
\def\pgfarrows@parser#1[{%
\pgfkeys@spdef\pgf@temp{#1}%
\ifx\pgf@temp\pgfutil@empty%
\let\pgf@next\pgf@arrows@empty%
\else%
\ifx\pgf@temp\pgf@dot@text%
\let\pgf@next\pgf@arrows@dot@parsed%
\else%
\let\pgf@untranslated\pgf@temp%
\ifpgf@arrows@translate%
\pgf@arrow@swapper%
\fi%
% Now, let's see what we do with this...
\expandafter\ifx\csname pgf@ar@code@\pgf@temp\endcsname\relax
\expandafter\ifx\csname pgf@ar@means@\pgf@temp\endcsname\relax
% #1 should start with a single-char shorthands
\let\pgf@next\pgf@arrows@single@char@parser%
\let\pgf@temp\pgf@untranslated%
\else%
% #1 is a shorthand!
\let\pgf@next\pgf@arrows@shorthand@parsed%
\fi%
\else%
% #1 is a meta arrow!
\let\pgf@next\pgf@arrows@meta@parsed%
\fi%
\fi%
\fi%
\expandafter\pgf@next\pgf@temp[%
}
\def\pgf@arrows@empty[#1]{%
\pgfutil@ifnextchar\pgf@stop\pgf@arrows@parser@done\pgfarrows@parser%
}
\def\pgf@arrows@single@char@parser#1{%
\def\pgf@temp{#1}%
\ifx\pgf@temp\pgf@dot@text%
\let\pgf@next\pgf@arrows@dot@parsed%
\else%
\let\pgf@untranslated\pgf@temp%
\ifpgf@arrows@translate%
\pgf@arrow@swapper%
\fi%
\expandafter\ifx\csname pgf@ar@code@\pgf@temp\endcsname\relax
\expandafter\ifx\csname pgf@ar@means@\pgf@temp\endcsname\relax
\let\pgf@temp\pgf@untranslated%
\let\pgf@next\pgf@arrows@unknown%
\else%
\let\pgf@next\pgf@arrows@shorthand@parsed%
\fi%
\else%
\let\pgf@next\pgf@arrows@meta@parsed%
\fi
\fi
\expandafter\pgf@next\pgf@temp[]%
}
\def\pgf@arrows@unknown#1[]#2[#3]{%
\pgferror{Unknown arrow tip kind '#1#2'}%
}
\def\pgf@arrows@meta@parsed#1[#2]{%
% Ok, run the keys #2. This will add commands to \pgf@arrows@options:
%
\let\pgf@arrows@options\pgf@arrows@options@initial%
\pgfkeys{/pgf/arrow keys/.cd,#2}%
% Append the arrow and its options to the arrow tip sequence:
\expandafter\pgf@arrows@meta@set\expandafter{\pgf@arrows@options}{#1}{\pgf@arrow@handle}%
\pgfutil@ifnextchar\pgf@stop\pgf@arrows@parser@done\pgfarrows@parser%
}
\def\pgf@arrows@parser@done#1{%
}
\def\pgf@arrows@dot@parsed#1[#2]{%
\pgf@arrows@append@to@tips{\pgf@arrow@handle@dot}%
\pgfutil@ifnextchar\pgf@stop\pgf@arrows@parser@done\pgfarrows@parser%
}
\def\pgf@arrows@meta@set#1#2#3{%
\pgf@arrows@append@to@tips{#3{#2}{#1}}%
}
\def\pgf@arrows@append@to@tips#1{%
\let\pgf@tempa\pgf@arrow@tip@sequence%
\def\pgf@tempb{#1}%
\ifpgf@arrows@translate%
\let\pgf@tempa\pgf@tempb%
\let\pgf@tempb\pgf@arrow@tip@sequence%
\fi%
\expandafter\expandafter\expandafter\def%
\expandafter\expandafter\expandafter\pgf@arrow@tip@sequence%
\expandafter\expandafter\expandafter{\expandafter\pgf@tempa\pgf@tempb}%
}
\def\pgf@arrows@shorthand@parsed#1[#2]{%
\let\pgf@arrows@options\pgf@arrows@options@initial%
\pgfkeys{/pgf/arrow keys/.cd,#2}%
\ifx\pgf@arrows@options\pgfutil@empty%
\expandafter\pgf@arrows@append@to@tips\expandafter{%
\expandafter\pgf@arrow@handle@shorthand@empty\expandafter{\csname pgf@ar@means@#1\endcsname}}%
\else%
\expandafter\expandafter\expandafter\pgf@arrows@meta@set\expandafter\expandafter\expandafter{%
\expandafter\pgf@arrows@options\expandafter}\expandafter{\csname pgf@ar@means@#1\endcsname}{\pgf@arrow@handle@shorthand}%
\fi%
\pgfutil@ifnextchar\pgf@stop\pgf@arrows@parser@done\pgfarrows@parser%
}
% General handler:
\def\pgf@arrow@handle@shorthand@empty#1{#1}
\def\pgf@arrow@handle@shorthand#1#2{%
\def\pgf@temp@opt{#2}%
\expandafter\expandafter\expandafter\def%
\expandafter\expandafter\expandafter\pgf@arrows@nested@options@temp%
\expandafter\expandafter\expandafter{\expandafter\pgf@temp@opt\pgf@arrows@nested@options}%
\expandafter\let\expandafter\pgf@arrows@nested@options\expandafter\pgf@arrows@nested@options@temp%
\expandafter#1% all these expandafters to avoid creating groups, but having the options nest
\expandafter\def\expandafter\pgf@arrows@nested@options\expandafter{\pgf@arrows@nested@options}%
}
\let\pgf@arrows@nested@options\pgfutil@empty
% Sets the start arrow tip
%
% #1 = An arrow specification
%
% Description:
%
% This works like \pgfsetarrowsend, only the order of the tips in the
% arrow specification is reversed and the "reversed names" are used.
%
% \pgfsetarrowsend{<<}
% \pgfsetarrowsend{>.>}
\def\pgfsetarrowsstart#1{%
\let\pgf@arrow@tip@sequence\pgfutil@empty%
\pgf@arrows@translatetrue%
\expandafter\let\expandafter\pgf@arrows@direct\csname pgf@arrows@direct@name@start@#1\endcsname%
\ifx\pgf@arrows@direct\relax%
\edef\pgf@marshal{\noexpand\pgfarrows@initial@parser#1[]\noexpand\pgf@stop}%
\pgf@marshal%
\else%
\let\pgf@arrow@tip@sequence\pgf@arrows@direct%
\fi%
\let\pgf@start@tip@sequence\pgf@arrow@tip@sequence%
}
\def\pgf@arrow@swapper{%
\expandafter\let\expandafter\pgf@temp\csname pgf@ar@start@\pgf@temp\endcsname%
\ifx\pgf@temp\relax%
\def\pgf@temp{undefined}%
\fi%
}
\let\pgf@start@tip@sequence\pgfutil@empty
\let\pgf@end@tip@sequence\pgfutil@empty
\expandafter\def\csname pgf@arrows@direct@name@start@\endcsname{}
\expandafter\def\csname pgf@arrows@direct@name@end@\endcsname{}
% Predefined lengths and ifs
\newdimen\pgfarrowsep
\newif\ifpgfarrowswap
\newif\ifpgfarrowreversed
\newif\ifpgfarrowharpoon
\newif\ifpgfarrowopen
\let\pgf@arrows@stroke@color\pgfutil@empty
\let\pgf@arrows@fill@color\pgfutil@empty
\def\pgfarrows@length@scale{1}
\def\pgfarrows@width@scale{1}
\def\pgfarrows@slant{0}
\let\pgfarrows@scale@list\pgfutil@empty
\def\pgfarrowsaddtolengthscalelist#1{\expandafter\def\expandafter\pgfarrows@scale@list\expandafter{\pgfarrows@scale@list#1\pgfarrows@length@scale#1}}
\def\pgfarrowsaddtowidthscalelist#1{\expandafter\def\expandafter\pgfarrows@scale@list\expandafter{\pgfarrows@scale@list#1\pgfarrows@width@scale#1}}
\pgfkeys{
/pgf/arrow keys/.cd,
scale/.code={%
\pgfmathparse{#1}%
\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@length@scale\expandafter{\pgfmathresult}}%
\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@width@scale\expandafter{\pgfmathresult}}%
},
scale length/.code={\pgfmathparse{#1}\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@length@scale\expandafter{\pgfmathresult}}},
scale width/.code={\pgfmathparse{#1}\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@width@scale\expandafter{\pgfmathresult}}},
slant/.code={\pgfmathparse{#1}\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@slant\expandafter{\pgfmathresult}}},
sep/.code={
\pgfarrowsthreeparameters{#1}%
\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\pgfarrowslinewidthdependent\pgfarrowstheparameters\pgfarrowsep\pgf@x}%
},
sep/.default=0.88pt .3 1,
%
swap/.code=\pgfarrowsaddtooptions{\ifpgfarrowswap\pgfarrowswapfalse\else\pgfarrowswaptrue\fi},
reversed/.code=\pgfarrowsaddtooptions{\ifpgfarrowreversed\pgfarrowreversedfalse\else\pgfarrowreversedtrue\fi},
harpoon/.is choice,
harpoon/.default=true,
harpoon/true/.code=\pgfarrowsaddtooptions{\pgfarrowharpoontrue},
harpoon/false/.code=\pgfarrowsaddtooptions{\pgfarrowharpoonfalse},
left/.style={harpoon},
right/.style={harpoon,swap},
%
color/.code=\pgfarrowsaddtooptions{\def\pgf@arrows@stroke@color{#1}},
fill/.code={%
\def\pgf@temp{#1}%
\ifx\pgf@temp\pgf@nonetext%
\pgfarrowsaddtooptions{\pgfarrowopentrue}
\else
\pgfarrowsaddtooptions{\pgfarrowopenfalse\def\pgf@arrows@fill@color{#1}}
\fi
},
fill/.value required,
open/.style={fill=none},
.unknown/.code={
\expandafter\pgfutil@in@\expandafter!\expandafter{\pgfkeyscurrentname}%
\ifpgfutil@in@%
% this is a color!
\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgf@arrows@stroke@color\expandafter{\pgfkeyscurrentname}}%
\else%
\pgfutil@doifcolorelse{\pgfkeyscurrentname}
{%
\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgf@arrows@stroke@color\expandafter{\pgfkeyscurrentname}}%
}
{%
\edef\pgf@temp{\pgfkeyscurrentname}%
\pgfkeys{/errors/unknown key/.expand once=\expandafter{\pgf@temp}{#1}}%
}
\fi
}
}
\def\pgf@nonetext{none}
\def\pgfarrowsaddtooptions#1{\expandafter\def\expandafter\pgf@arrows@options\expandafter{\pgf@arrows@options#1}}
\def\pgfarrowsaddtolateoptions#1{\expandafter\def\expandafter\pgf@arrows@options\expandafter{\pgf@arrows@options\pgf@arrows@add@to@late@options{#1}}}
\def\pgf@arrows@add@to@late@options#1{\expandafter\def\expandafter\pgf@arrows@late@options\expandafter{\pgf@arrows@late@options#1}}
\def\pgfarrowsthreeparameters#1{%
\pgfarrowsthreeparameters@#1 +0 +0 +0 \pgf@stop%
}
\def\pgfarrowsthreeparameters@#1 #2 #3 #4\pgf@stop{%
\pgfmathsetlength\pgf@x{#1}%
\pgfmathsetmacro\pgf@temp@a{#2}%
\pgfmathsetmacro\pgf@temp@b{#3}%
\edef\pgfarrowstheparameters{{\the\pgf@x}{\pgf@temp@a}{\pgf@temp@b}}%
}
\def\pgfarrowsfourparameters#1{%
\pgfarrowsfourparameters@#1 +0 +0 +0 \pgf@stop%
}
\def\pgfarrowsfourparameters@#1:#2 #3 #4 #5\pgf@stop{%
\pgfmathsetmacro\pgf@temp@z{#1}%
\pgfmathsetlength\pgf@x{#2}%
\pgfmathsetmacro\pgf@temp@a{#3}%
\pgfmathsetmacro\pgf@temp@b{#4}%
\edef\pgfarrowstheparameters{{\pgf@temp@z}{\the\pgf@x}{\pgf@temp@a}{\pgf@temp@b}}%
}
\def\pgfarrows@angle@setup#1#2#3#4{%
\pgfarrowslinewidthdependent{#2}{#3}{#4}
\pgf@xc\pgf@x
\pgf@yc#1 pt%
\pgf@yc.5\pgf@yc%
\pgfpointpolar{\pgf@yc}{\pgf@xc}
\pgfarrowlength\pgf@x%
\pgf@y2\pgf@y%
\expandafter\pgf@arrows@add@to@late@options\expandafter{\expandafter\pgfarrowwidth\the\pgf@y}%
}
\def\pgfarrows@angle@setup@prime#1{%
\pgf@yc#1 pt %
\pgf@yc=0.5\pgf@yc
\pgfmathtan@{\pgf@sys@tonumber\pgf@yc}%
\pgfarrowwidth\pgfmathresult\pgfarrowlength%
\pgfarrowwidth2\pgfarrowwidth%
}
\def\pgfarrowslinewidthdependent#1#2#3{%
\pgf@x#1%
\ifdim\pgfinnerlinewidth>0pt%
\pgf@arrows@inner@line@width@dep{#2}{#3}%
\else%
\advance\pgf@x by#2\pgflinewidth%
\fi%
}
\def\pgf@arrows@inner@line@width@dep#1#2{%
% #1*((1-#2/2)*full line width - (#2/2) * inner line width)
% Compute "real" line width
\pgf@xa\pgflinewidth%
\pgf@xb-.5\pgflinewidth%
\pgf@xb#2\pgf@xb%
\advance\pgf@xa by\pgf@xb%
\pgf@xb\pgfinnerlinewidth%
\pgf@xb-.5\pgf@xb
\advance\pgf@xa by#2\pgf@xb%
\advance\pgf@x by#1\pgf@xa%
}
\def\pgfarrowslengthdependent#1#2#3#4{%
#4#1%
\advance#4by#2\pgfarrowlength%
\advance#4by#3\pgflinewidth%
}
% Build the full name:
\def\pgf@arrow@fullname#1{pgf@@ar@#1@\the\pgflinewidth @\pgfinnerlinewidth @\ifpgfarrowreversed r\fi @\pgf@arrows@stroke@color @\pgf@arrows@fill@color @\csname pgf@ar@par@#1\endcsname}
\def\pgf@arrow@id@count{0}%
% Compute the arrow id of an arrow
%
% #1 = arrow name
% #2 = options
%
% Description:
%
% Returns the an id in \pgf@arrow@id that identifies the instantiation
% of the given arrow. If the arrow was not instantiated, this happens now.
\def\pgfarrows@getid#1#2{%
% Execute options:
\let\pgf@arrows@late@options\pgfutil@empty%
% 1. Defaults:
\csname pgf@ar@defaults@#1\endcsname%
% 2. Scope:
\pgf@arrows@options@scope
% 3. Local:
#2\relax%
% 4. Nested:
\pgf@arrows@nested@options%
% 5. Last options:
\pgf@arrows@late@options%
% 6. Scaling:
\pgfarrows@scale@list%
% Now, test:
\expandafter\global\expandafter\let\expandafter\pgf@arrow@id\csname\pgf@arrow@fullname{#1}\endcsname\relax%
\ifx\pgf@arrow@id\relax%
\pgf@arrows@instantiate{#1}
\fi%
}
\def\pgf@arrows@instantiate#1{%
% Not defined. Rats!
% Allocate new id:
\pgfutil@tempcnta\pgf@arrow@id@count\relax%
\advance\pgfutil@tempcnta by1\relax%
\xdef\pgf@arrow@id@count{\the\pgfutil@tempcnta}%
\expandafter\global\expandafter\let\csname\pgf@arrow@fullname{#1}\endcsname\pgf@arrow@id@count%
\global\let\pgf@arrow@id\pgf@arrow@id@count%
{%
\pgfclearid%
\csname pgf@ar@setup@#1\endcsname%
% Handle reversal
\ifpgfarrowreversed%
% Compute transformation:
\pgf@arrows@handle@reverse%
\fi%
% Save computed values
\expandafter\global\expandafter\let\csname pgf@ar@saves@\pgf@arrow@id\endcsname\pgf@arrows@saves%
\expandafter\global\expandafter\let\csname pgf@ar@hull@\pgf@arrow@id\endcsname\pgf@arrows@convexhull%
\expandafter\xdef\csname pgf@ar@ends@\pgf@arrow@id\endcsname{{\pgf@arrows@the@tipend}{\pgf@arrows@the@backend}{\pgf@arrows@the@lineend}}%
\expandafter\xdef\csname pgf@ar@visual@\pgf@arrow@id\endcsname{{\pgf@arrows@the@visualtipend}{\pgf@arrows@the@visualbackend}{}}%
% Save code (needed for bending)
\edef\pgf@arrow@code{%
\ifpgfarrowreversed\noexpand\pgftransformxscale{-1}\fi%
\expandafter\noexpand\csname pgf@ar@code@#1\endcsname%
}%
\expandafter\global\expandafter\let\csname pgf@ar@inst@code@\pgf@arrow@id\endcsname\pgf@arrow@code%
% Should we cache?
\expandafter\ifx\csname pgf@ar@do@cache@#1\endcsname\pgf@truetext%
\pgfsysprotocol@getcurrentprotocol\pgf@arrow@temp%
{%
\pgfinterruptpath%
\let\pgfusepath=\pgf@nousepath@here%
\pgf@relevantforpicturesizefalse%
\pgftransformreset%
\pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
\pgfsysprotocol@bufferedtrue%
\pgfscope%
\pgf@arrow@code%
\endpgfscope%
\pgfsysprotocol@getcurrentprotocol\pgf@@arrow@temp%
\expandafter\gdef\expandafter\pgf@arrow@code\expandafter{\expandafter\pgfsysprotocol@literal\expandafter{\pgf@@arrow@temp}}%
\endpgfinterruptpath%
}%
\pgfsysprotocol@setcurrentprotocol\pgf@arrow@temp%
\fi%
\expandafter\global\expandafter\let\csname pgf@ar@cache@\pgf@arrow@id\endcsname\pgf@arrow@code%
}%
}
\def\pgf@truetext{true}
% Ok, now run setup:
\def\pgf@arrows@copy@tipend{\pgf@arrows@the@tipend}
\def\pgf@arrows@copy@backend{\pgf@arrows@the@backend}
\def\pgf@arrows@copy@lineend{\pgf@arrows@the@lineend}
\def\pgf@arrows@zeropt{0pt}%
\let\pgf@arrows@saves\pgfutil@empty%
\let\pgf@arrows@convexhull\pgfutil@empty%
\let\pgf@arrows@the@tipend\pgf@arrows@zeropt%
\let\pgf@arrows@the@backend\pgf@arrows@zeropt%
\let\pgf@arrows@the@lineend\pgf@arrows@zeropt%
\let\pgf@arrows@the@visualtipend\pgf@arrows@copy@tipend%
\let\pgf@arrows@the@visualbackend\pgf@arrows@copy@backend%
\def\pgf@arrows@handle@reverse{%
\pgf@x\pgf@arrows@the@visualtipend\pgf@x-\pgf@x%
\pgf@y\pgf@arrows@the@visualbackend\pgf@y-\pgf@y
\edef\pgf@arrows@the@visualtipend{\the\pgf@y}%
\edef\pgf@arrows@the@visualbackend{\the\pgf@x}%
\pgf@x\pgf@arrows@the@tipend\pgf@x-\pgf@x%
\pgf@y\pgf@arrows@the@backend\pgf@y-\pgf@y
\edef\pgf@arrows@the@tipend{\the\pgf@y}%
\edef\pgf@arrows@the@backend{\the\pgf@x}%
\pgf@x\pgf@arrows@the@lineend\pgf@x-\pgf@x\edef\pgf@arrows@the@lineend{\the\pgf@x}%
\let\pgf@temp\pgf@arrows@convexhull%
\let\pgf@arrows@convexhull\pgfutil@empty%
\let\pgf@arrow@hull@point\pgf@arrow@hull@point@reverse%
\pgf@temp%
}
\def\pgf@arrow@hull@point@reverse#1#2{%
\pgf@x#1%
\pgfarrowshullpoint{-\pgf@x}{#2}%
}
\def\pgf@nousepath@here#1{\pgferror{The definition of an arrow may not use \string\pgfusepath}}
\def\pgfarrowssavethe#1{%
\expandafter\expandafter\expandafter\def%
\expandafter\expandafter\expandafter\pgf@arrows@saves%
\expandafter\expandafter\expandafter{\expandafter\pgf@arrows@saves\expandafter#1\the#1\relax}
}
\def\pgfarrowssave#1{%
\expandafter\expandafter\expandafter\def%
\expandafter\expandafter\expandafter\pgf@arrows@saves%
\expandafter\expandafter\expandafter{\expandafter\pgf@arrows@saves\expandafter\def\expandafter#1\expandafter{#1}}
}
\def\pgfarrowshullpoint#1#2{%
\pgf@x#1\relax%
\pgf@y#2\relax%
\edef\pgf@arrows@temp{\noexpand\pgf@arrows@convexhull\noexpand\pgf@arrow@hull@point{\the\pgf@x}{\the\pgf@y}}%
\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@arrows@convexhull\expandafter\expandafter\expandafter{\pgf@arrows@temp}%
}
\def\pgfarrowsupperhullpoint#1#2{%
\pgf@x#1\relax%
\pgf@y#2\relax%
\ifdim\pgf@y>0pt
\edef\pgf@arrows@temp{\noexpand\pgf@arrows@convexhull\noexpand\pgf@arrow@hull@point{\the\pgf@x}{\the\pgf@y}\ifpgfarrowharpoon\else\noexpand\pgf@arrow@hull@point{\the\pgf@x}{-\the\pgf@y}\fi}%
\else
\edef\pgf@arrows@temp{\noexpand\pgf@arrows@convexhull\noexpand\pgf@arrow@hull@point{\the\pgf@x}{\the\pgf@y}}%
\fi
\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@arrows@convexhull\expandafter\expandafter\expandafter{\pgf@arrows@temp}%
}
\def\pgfarrowssettipend#1{\pgf@x#1\edef\pgf@arrows@the@tipend{\the\pgf@x}}
\def\pgfarrowssetbackend#1{\pgf@x#1\edef\pgf@arrows@the@backend{\the\pgf@x}}
\def\pgfarrowssetlineend#1{\pgf@x#1\edef\pgf@arrows@the@lineend{\the\pgf@x}}
\def\pgfarrowssetvisualtipend#1{\pgf@x#1\edef\pgf@arrows@the@visualtipend{\the\pgf@x}}
\def\pgfarrowssetvisualbackend#1{\pgf@x#1\edef\pgf@arrows@the@visualbackend{\the\pgf@x}}
% Internal computation of the line end (shortening) for an arrow
%
% #1 = arrow tip list
%
% Description:
%
% \pgf@xa will contain the necessary path shortening for the given
% arrow tip list, \pgf@xb will contain the total length of the arrow
% tip list (sum of the differences between tip end and back end plus
% the seps).
\def\pgf@arrow@compute@shortening#1{%
\let\pgf@arrow@handle\pgf@arrow@compute@shortening@
\let\pgf@arrow@handle@dot\pgf@arrow@after@line@endtrue%
\pgf@arrow@after@line@endfalse%
\pgf@xa0pt%
\pgf@xb0pt%
#1%
}
\newif\ifpgf@arrow@after@line@end
\def\pgf@arrow@compute@shortening@#1#2{%
{\pgfarrows@getid{#1}{#2}\ifnum\pgf@arrow@flex@mode>0\relax\global\pgf@precise@shorteningtrue\fi\expandafter}\expandafter\pgf@x\the\pgfarrowsep%
\expandafter\expandafter\expandafter\pgf@arrow@cont@short\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
}
\def\pgf@dot@text{.}
\def\pgf@arrow@cont@short#1#2#3{% tip end, back end, line end, sep
\advance\pgf@xb by#1%
\pgf@xc#2%
\advance\pgf@xb by-\pgf@xc%
\advance\pgf@xb by\pgf@x%
\ifpgf@arrow@after@line@end%
\advance\pgf@xa by#1%
\advance\pgf@xa by\pgf@x%
\pgf@xc#2%
\advance\pgf@xa by-\pgf@xc%
\else%
\pgf@xa#1%
\advance\pgf@xa by\pgf@x%
\pgf@xc#3%
\advance\pgf@xa by-\pgf@xc%
\fi%
}
\def\pgf@arrow@rigid@arrow#1#2{%
{%
\pgf@xb=#2%
\pgftransformxshift{-\pgf@xb}%
\let\pgf@arrow@handle\pgf@arrow@rigid
\let\pgf@arrow@handle@dot\relax%
#1%
}%
}
\def\pgf@arrow@rigid#1#2{%
% Prepare:
{%
\pgfarrows@getid{#1}{#2}%
% Do shift:
\expandafter\expandafter\expandafter\pgf@arrow@drawer@shift\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
% Do slant:
\ifdim\pgfarrows@slant pt=0pt%
\else%
\pgftransformxslant{\pgfarrows@slant}%
\fi%
% do swap:
\ifpgfarrowswap%
\pgftransformyscale{-1}%
\fi%
{%
\csname pgf@ar@saves@\pgf@arrow@id\endcsname%
\pgf@arrows@rigid@hull%
}%
\expandafter}%
% Transform to next tip:
\expandafter\pgftransformxshift\expandafter{\the\pgf@xc}%
}
% Draw an arrow
%
% #1 = arrow tip list
% #2 = total length of the arrow (the value of \pgf@xb computed by
% \pgf@arrow@compute@shortening)
%
% Description:
%
% Draws an arrow tip list. The coordinate system must have been
% transformed so that the to-be-drawn arrow points right and should
% "end" at the origin.
\def\pgf@arrow@draw@arrow#1#2{%
{%
\pgf@xb=#2%
\pgftransformxshift{-\pgf@xb}%
\let\pgf@arrow@handle\pgf@arrow@drawer
\let\pgf@arrow@handle@dot\relax%
#1%
}%
}
\def\pgf@arrow@drawer#1#2{%
% Prepare:
{%
\pgfarrows@getid{#1}{#2}%
% Do shift:
\expandafter\expandafter\expandafter\pgf@arrow@drawer@shift\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
% Do slant:
\ifdim\pgfarrows@slant pt=0pt%
\else%
\pgftransformxslant{\pgfarrows@slant}%
\fi%
% do swap:
\ifpgfarrowswap%
\pgftransformyscale{-1}%
\fi%
{%
\csname pgf@ar@saves@\pgf@arrow@id\endcsname%
\pgfscope%
\pgf@arrows@color@setup%
\pgflowlevelsynccm\csname pgf@ar@cache@\pgf@arrow@id\endcsname%
\endpgfscope%
\pgf@arrows@rigid@hull%
}%
\expandafter}%
% Transform to next tip:
\expandafter\pgftransformxshift\expandafter{\the\pgf@xc}%
}
\def\pgf@arrows@color@setup@restore@std@colors{%
% we want to allow 'arrows={fill=pgffillcolor}'. To this end, we have to ensure that \string\color@pgffillcolor is known.
% we can safely keep the macro in the current TeX group since it has global character anyway.
%
% Note that declaring \string\color@pgfstrokecolor as \global macro causes save stack issues and should be avoided.
\pgfutil@namelet{\string\color@pgfstrokecolor}{pgf@strokecolor@global}%
\pgfutil@namelet{\string\color@pgffillcolor}{pgf@fillcolor@global}%
%
}%
\def\pgf@arrows@color@setup{%
\ifx\pgf@arrows@stroke@color\pgfutil@empty\else\pgfsetstrokecolor{\pgf@arrows@stroke@color}\fi%
\ifx\pgf@arrows@fill@color\pgfutil@empty%
\ifx\pgf@strokecolor@global\pgf@fillcolor@global
\else
\pgf@arrows@color@setup@restore@std@colors
\pgfsetfillcolor{pgfstrokecolor}%
\fi%
\else%
\pgf@arrows@color@setup@restore@std@colors
\pgfsetfillcolor{\pgf@arrows@fill@color}%
\fi%
}
\def\pgf@arrow@drawer@shift#1#2#3{% tip end, back end, line end, sep
\pgf@xb#2\pgftransformxshift{-\pgf@xb}%
\pgf@xc#1%
\advance\pgf@xc by\pgfarrowsep%
\advance\pgf@xc by-\pgf@xb%
}
\def\pgf@arrows@rigid@hull{%
\ifpgf@relevantforpicturesize%
% Do bb update:
\expandafter\let\expandafter\pgf@temp\csname pgf@ar@hull@\pgf@arrow@id\endcsname%
\ifx\pgf@temp\pgfutil@empty\else%
\let\pgf@arrow@hull@point\pgf@arrow@hull@point@first%
\pgf@temp%
\pgf@arrow@update@bb%
\fi%
\fi
}
% Convex hull stuff:
\def\pgf@arrow@hull@point@first#1#2{%
% {\pgfsys@beginscope\pgfpathcircle{\pgfqpoint{#1}{#2}}{0.5pt}\pgfusepathqfill\pgfsys@endscope}%
\pgf@x#1\pgf@y#2%
\pgf@xa\pgf@pt@aa\pgf@x%
\advance\pgf@xa by\pgf@pt@ba\pgf@y%
\pgf@ya\pgf@pt@ab\pgf@x%
\advance\pgf@ya by\pgf@pt@bb\pgf@y%
\pgf@xb\pgf@xa\pgf@yb\pgf@ya%
\let\pgf@arrow@hull@point\pgf@arrow@hull@point@other%
}
\def\pgf@arrow@hull@point@other#1#2{%
% {\pgfsys@beginscope\pgfpathcircle{\pgfqpoint{#1}{#2}}{0.5pt}\pgfusepathqfill\pgfsys@endscope}%
\pgfutil@tempdima#1\pgfutil@tempdimb#2%
\pgf@x\pgf@pt@aa\pgfutil@tempdima%
\advance\pgf@x by\pgf@pt@ba\pgfutil@tempdimb%
\pgf@y\pgf@pt@ab\pgfutil@tempdima%
\advance\pgf@y by\pgf@pt@bb\pgfutil@tempdimb%
\ifdim\pgf@x<\pgf@xa\pgf@xa\pgf@x\else\ifdim\pgf@x>\pgf@xb\pgf@xb\pgf@x\fi\fi%
\ifdim\pgf@y<\pgf@ya\pgf@ya\pgf@y\else\ifdim\pgf@y>\pgf@yb\pgf@yb\pgf@y\fi\fi%
}
\def\pgf@arrow@update@bb{%
\advance\pgf@xa by\pgf@pt@x%
\advance\pgf@ya by\pgf@pt@y%
\advance\pgf@xb by\pgf@pt@x%
\advance\pgf@yb by\pgf@pt@y%
\ifdim\pgf@picmaxx=-16000pt\relax%
\global\pgf@picminx\pgf@xa%
\global\pgf@picmaxx\pgf@xb%
\global\pgf@picminy\pgf@ya%
\global\pgf@picmaxy\pgf@yb%
\else%
\ifdim\pgf@xa<\pgf@picminx\global\pgf@picminx\pgf@xa\fi%
\ifdim\pgf@ya<\pgf@picminy\global\pgf@picminy\pgf@ya\fi%
\ifdim\pgf@xb>\pgf@picmaxx\global\pgf@picmaxx\pgf@xb\fi%
\ifdim\pgf@yb>\pgf@picmaxy\global\pgf@picmaxy\pgf@yb\fi%
\fi%
}
% Sets arrows
%
% #1 = An arrow specification of the form
% <start spec>-<end spec>. This will call \pgfsetstartarrow{start
% spec} and \pgfsetendarrow{end spec}.
%
% Alternatively, it may be of the form [options]. In this case,
% the arrow options are set for the local scope and all arrows in
% the current scope will have these options set.
%
% Example:
%
% \pgfsetarrows{-to}
\def\pgfsetarrows#1{\pgf@arrows#1\pgf@stop}
\def\pgf@arrows{\pgfutil@ifnextchar[\pgf@arrows@test@opt\pgf@arrows@}%}
\def\pgf@arrows@#1-#2\pgf@stop{%
\pgfsetarrowsstart{#1}%
\pgfsetarrowsend{#2}%
}
\def\pgf@arrows@test@opt[{%
\pgfutil@ifnextchar-{\pgf@arrows@[}%} go back to normal reading for compat. reasons.
\pgf@arrows@test@opt@%
}
\def\pgf@arrows@test@opt@#1]{%
\pgfutil@ifnextchar\pgf@stop{%
\let\pgf@arrows@options\pgf@arrows@options@scope%
\pgfkeys{/pgf/arrow keys/.cd,#1}%
\let\pgf@arrows@options@scope\pgf@arrows@options%
% Ok, setup the options
\pgfutil@gobble%
}{%
\pgf@arrows@[#1]% Oops: go back to normal mode
}%
}
\let\pgf@arrows@options@scope\pgfutil@empty
%
% Predefined arrows:
%
% A dot is used to indicate the end of the line:
\pgfdeclarearrow{
name = .,
drawing code =
}
% An underscore adds a space as in >_> or >_ >. However, it will be
% faster to say ">[sep] >" or ">[sep=2pt] >".
\pgfdeclarearrow{
name = _,
defaults = {sep},
drawing code =
}
% Default shorthands:
\pgfdeclarearrow{ name = To, means = } % forward declaration
\pgfdeclarearrow{ name = Bar, means = } % forward declaration
\pgfkeys{
<-> /.tip = {To},
>-< /.tip = {>[reversed]},
| /.tip = {Bar}
}
% Compatibility with old arrow system:
\pgfkeys {}
\def\pgf@arrows@direct@def#1#2{\expandafter\pgf@arrows@direct@def@\expandafter{\csname pgf@ar@means@#2\endcsname}{#1}}
\def\pgf@arrows@direct@def@#1#2{\expandafter\def\csname pgf@arrows@direct@name@#2\endcsname{\pgf@arrow@handle@shorthand@empty{#1}}}
\pgf@arrows@direct@def{start@[}{]}
\pgf@arrows@direct@def{start@]}{[}
\pgf@arrows@direct@def{start@spaced [}{spaced ]}
\pgf@arrows@direct@def{start@spaced ]}{spaced [}
\pgf@arrows@direct@def{end@[}{[}
\pgf@arrows@direct@def{end@]}{]}
\pgf@arrows@direct@def{end@spaced [}{spaced [}
\pgf@arrows@direct@def{end@spaced ]}{spaced ]}
\def\pgfsetarrowoptions#1#2{\expandafter\def\csname pgf@arrow@compat@opt@#1\endcsname{#2}}
\def\pgfgetarrowoptions#1{\csname pgf@arrow@compat@opt@#1\endcsname}
\def\pgfarrowsdeclare#1#2#3#4{%
\pgfdeclarearrow{ name ={#1}-{#2}, setup code ={#3}, drawing code={#4}, parameters/.expand once={\csname pgf@arrow@compat@opt@#2\endcsname}}%
\expandafter\def\csname pgf@arrow@compat@opt@#2\endcsname{0}}
\def\pgfarrowsleftextend#1{\pgfmathsetlength\pgf@xa{#1}\pgfarrowssetbackend{\pgf@xa}}
\def\pgfarrowsrightextend#1{\pgfmathsetlength\pgf@xb{#1}\pgfarrowssettipend{\pgf@xb}}
\def\pgfarrowsdeclarealias#1#2#3#4{\pgfdeclarearrow{ name ={#1}-{#2}, means ={#4} } }
\def\pgfarrowsdeclarereversed#1#2#3#4{\pgfdeclarearrow{ name ={#1}-{#2}, means={{#4}[reversed]}}}
\def\pgfarrowsdeclarecombine{\pgfutil@ifnextchar*{\pgfarrowsdeclarecombine@star}{\pgf@@arrowsdeclarecombine}}
\def\pgf@@arrowsdeclarecombine{\pgfutil@ifnextchar[{\pgf@arrowsdeclarecombine}{\pgf@arrowsdeclarecombine[0pt]}}
\def\pgf@arrowsdeclarecombine[#1]#2#3#4#5#6#7{\def\pgf@@temp{#1}\ifx\pgf@@temp\pgf@linewidthtext\def\pgf@@temp{+0pt 1}\fi%
\pgfdeclarearrow{name ={#2}-{#3}, means={#5[sep/.expand once=\pgf@@temp]#6}}}
\def\pgf@linewidth@text{\pgflinewidth}
\def\pgfarrowsdeclarecombine@star*{\pgfutil@ifnextchar[{\pgf@arrowsdeclarecombine@star}{\pgf@arrowsdeclarecombine@star[0pt]}}
\def\pgf@arrowsdeclarecombine@star[#1]#2#3#4#5#6#7{\def\pgf@@temp{#1}\ifx\pgf@@temp\pgf@linewidthtext\def\pgf@@temp{+0pt 1}\fi%
\pgfdeclarearrow{name ={#2}-{#3}, means={#5[sep/.expand once=\pgf@@temp].#6}}}
\def\pgfarrowsdeclaredouble{\pgfutil@ifnextchar[{\pgf@arrowsdeclaredouble}{\pgf@arrowsdeclaredouble[0pt]}}
\def\pgf@arrowsdeclaredouble[#1]#2#3#4#5{\pgfarrowsdeclarecombine[#1]{#2}{#3}{#4}{#5}{#4}{#5}}
\def\pgfarrowsdeclaretriple{\pgfutil@ifnextchar[{\pgf@arrowsdeclaretriple}{\pgf@arrowsdeclaretriple[0pt]}}
\def\pgf@arrowsdeclaretriple[#1]#2#3#4#5{ \pgfarrowsdeclarecombine[#1]{pgf@trip@#2}{pgf@trip@#3}{#4}{#5}{#4}{#5}%
\pgfarrowsdeclarecombine[#1]{#2}{#3}{pgf@trip@#2}{pgf@trip@#3}{#4}{#5}}
\def\pgf@linewidthtext{\pgflinewidth}
\pgfarrowsdeclare{stealth}{stealth}
{
\pgfutil@tempdima=0.28pt%
\pgfutil@tempdimb=\pgflinewidth%
\ifdim\pgfinnerlinewidth>0pt%
\pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
\fi%
\advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
\pgfarrowsleftextend{+-3\pgfutil@tempdima}
\pgfarrowsrightextend{+5\pgfutil@tempdima}
}
{
\pgfutil@tempdima=0.28pt%
\pgfutil@tempdimb=\pgflinewidth%
\ifdim\pgfinnerlinewidth>0pt%
\pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
\fi%
\advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
\pgfpathmoveto{\pgfqpoint{5\pgfutil@tempdima}{0pt}}
\pgfpathlineto{\pgfqpoint{-3\pgfutil@tempdima}{4\pgfutil@tempdima}}
\pgfpathlineto{\pgfpointorigin}
\pgfpathlineto{\pgfqpoint{-3\pgfutil@tempdima}{-4\pgfutil@tempdima}}
\pgfusepathqfill
}
\pgfarrowsdeclarereversed{stealth reversed}{stealth reversed}{stealth}{stealth}
\pgfarrowsdeclare{to}{to}
{
\pgfutil@tempdima=-0.84pt%
\advance\pgfutil@tempdima by-1.3\pgflinewidth%
\pgfutil@tempdimb=0.21pt%
\advance\pgfutil@tempdimb by.625\pgflinewidth%
\pgfarrowsleftextend{+\pgfutil@tempdima}
\pgfarrowsrightextend{+\pgfutil@tempdimb}
}
{
\pgfutil@tempdima=0.28pt%
\advance\pgfutil@tempdima by.3\pgflinewidth%
\pgfsetlinewidth{0.8\pgflinewidth}
\pgfsetdash{}{+0pt}
\pgfsetroundcap
\pgfsetroundjoin
\pgfpathmoveto{\pgfqpoint{-3\pgfutil@tempdima}{4\pgfutil@tempdima}}
\pgfpathcurveto
{\pgfqpoint{-2.75\pgfutil@tempdima}{2.5\pgfutil@tempdima}}
{\pgfqpoint{0pt}{0.25\pgfutil@tempdima}}
{\pgfqpoint{0.75\pgfutil@tempdima}{0pt}}
\pgfpathcurveto
{\pgfqpoint{0pt}{-0.25\pgfutil@tempdima}}
{\pgfqpoint{-2.75\pgfutil@tempdima}{-2.5\pgfutil@tempdima}}
{\pgfqpoint{-3\pgfutil@tempdima}{-4\pgfutil@tempdima}}
\pgfusepathqstroke
}
\pgfkeys{To /.tip = to}
\pgfarrowsdeclare{to reversed}{to reversed}
{
\pgfutil@tempdima=-0.21pt%
\advance\pgfutil@tempdima by-0.475\pgflinewidth%
\pgfutil@tempdimb=0.98pt%
\advance\pgfutil@tempdimb by1.45\pgflinewidth%
\pgfarrowsleftextend{+\pgfutil@tempdima}
\pgfarrowsrightextend{+\pgfutil@tempdimb}
}
{
\pgfutil@tempdima=0.28pt%
\advance\pgfutil@tempdima by.3\pgflinewidth%
\pgfsetlinewidth{+0.8\pgflinewidth}
\pgfsetdash{}{+0pt}
\pgfsetroundcap
\pgfsetroundjoin
\pgfpathmoveto{\pgfqpoint{3.5\pgfutil@tempdima}{4\pgfutil@tempdima}}
\pgfpathcurveto
{\pgfqpoint{3.25\pgfutil@tempdima}{2.5\pgfutil@tempdima}}
{\pgfqpoint{0.5\pgfutil@tempdima}{0.25\pgfutil@tempdima}}
{\pgfqpoint{-0.25\pgfutil@tempdima}{0\pgfutil@tempdima}}
\pgfpathcurveto
{\pgfqpoint{0.5\pgfutil@tempdima}{-0.25\pgfutil@tempdima}}
{\pgfqpoint{3.25\pgfutil@tempdima}{-2.5\pgfutil@tempdima}}
{\pgfqpoint{3.5\pgfutil@tempdima}{-4\pgfutil@tempdima}}
\pgfusepathqstroke
}
\pgfarrowsdeclare{latex}{latex}
{
\pgfutil@tempdima=0.28pt%
\pgfutil@tempdimb=\pgflinewidth%
\ifdim\pgfinnerlinewidth>0pt%
\pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
\fi%
\advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
\pgfarrowsleftextend{+-1\pgfutil@tempdima}
\pgfarrowsrightextend{+9\pgfutil@tempdima}
}
{
\pgfutil@tempdima=0.28pt%
\pgfutil@tempdimb=\pgflinewidth%
\ifdim\pgfinnerlinewidth>0pt%
\pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
\fi%
\advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
\pgfpathmoveto{\pgfqpoint{9\pgfutil@tempdima}{0pt}}
\pgfpathcurveto
{\pgfqpoint{6.3333\pgfutil@tempdima}{.5\pgfutil@tempdima}}
{\pgfqpoint{2\pgfutil@tempdima}{2\pgfutil@tempdima}}
{\pgfqpoint{-1\pgfutil@tempdima}{3.75\pgfutil@tempdima}}
\pgfpathlineto{\pgfqpoint{-1\pgfutil@tempdima}{-3.75\pgfutil@tempdima}}
\pgfpathcurveto
{\pgfqpoint{2\pgfutil@tempdima}{-2\pgfutil@tempdima}}
{\pgfqpoint{6.3333\pgfutil@tempdima}{-.5\pgfutil@tempdima}}
{\pgfqpoint{9\pgfutil@tempdima}{0pt}}
\pgfusepathqfill
}
\pgfarrowsdeclarereversed{latex reversed}{latex reversed}{latex}{latex}
\pgfarrowsdeclare{@bar}{@bar}
{
\pgfarrowsleftextend{+-0.25\pgflinewidth}
\pgfarrowsrightextend{+.75\pgflinewidth}
}
{
\pgfutil@tempdima=2pt%
\advance\pgfutil@tempdima by1.5\pgflinewidth%
\pgfsetdash{}{+0pt}
\pgfsetrectcap
\pgfpathmoveto{\pgfqpoint{0.25\pgflinewidth}{-\pgfutil@tempdima}}
\pgfpathlineto{\pgfqpoint{0.25\pgflinewidth}{\pgfutil@tempdima}}
\pgfusepathqstroke
}
\pgfkeys{Bar /.tip = @bar}
\pgfarrowsdeclare{space}{space}
{
\pgfutil@tempdima=0.88pt%
\advance\pgfutil@tempdima by.3\pgflinewidth%
\pgfarrowsleftextend{0pt}
\pgfarrowsrightextend{\pgfutil@tempdima}
}
{}
\endinput