% 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 % -. 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