% Copyright 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{pgfcorepathusage.code.tex} % Stroke/fill/clip/etc. the current path. Depending on the options, % the current path will be stroked/filled/clipped/etc. If no options % are given, the path is stroked. If multiple options are given, all % of them are performed (in a sensible order). % % #1 = action(s) to be applied to the current path. Valid actions are: % stroke - strokes the path. % draw - strokes the path and adds arrow tips. % tips - adds arrow tips. % fill - fills the path. % clip - clip the path. % discard - Discards the path. Same effect as having an empty % options list. % % Example: % % % Draws an edge. % \pgfpathmoveto{\pgfxy(0,0)} % \pgfpathlineto{\pgfxy(0,1)} % \pgfpathlineto{\pgfxy(1,0)} % \pgfusepath{stroke} \pgfkeys{ /pgf/stroke/.code=\let\pgf@up@stroke\pgf@up@stroke@text\pgf@up@path@neededtrue, /pgf/draw/.code=\let\pgf@up@stroke\pgf@up@stroke@text\pgf@up@path@neededtrue, /pgf/fill/.code=\let\pgf@up@fill\pgf@up@fill@text\pgf@up@path@neededtrue, /pgf/clip/.code=\let\pgf@up@clip\pgf@up@clip@text\pgf@up@path@neededtrue, /pgf/discard/.code=, /pgf/use as bounding box/.code=\let\pgf@up@bb\pgf@do@up@bb, /pgf/arrow keys/flex/.code=\pgferror{You need to say \string\usetikzlibrary{bending} for flexing and bending arrows}, /pgf/arrow keys/flex'/.code=\pgferror{You need to say \string\usetikzlibrary{bending} for flexing and bending arrows}, /pgf/arrow keys/bend/.code=\pgferror{You need to say \string\usetikzlibrary{bending} for flexing and bending arrows}, /pgf/arrow keys/quick/.code=\pgfarrowsaddtooptions{\let\pgf@arrow@flex@mode\pgf@arrow@mode@is@quick}, } \pgfkeys{ /pgf/.cd, tips/.is choice, tips/.default=true, tips/proper/.code=\let\pgf@tips@mode\pgf@tips@mode@onproper, tips/on proper draw/.code=\let\pgf@tips@mode\pgf@tips@mode@onproperdraw, tips/true/.code=\let\pgf@tips@mode\pgf@tips@mode@true, tips/on draw/.code=\let\pgf@tips@mode\pgf@tips@mode@ondraw, tips/never/.code=\let\pgf@tips@mode\pgf@tips@mode@false, tips/false/.code=\let\pgf@tips@mode\pgf@tips@mode@false, } \def\pgf@tips@mode@onproper{4} \def\pgf@tips@mode@onproperdraw{3} \def\pgf@tips@mode@true{2} \def\pgf@tips@mode@ondraw{1} \def\pgf@tips@mode@false{0} \let\pgf@tips@mode\pgf@tips@mode@ondraw % The following can only be set to "true" using the options in the % module "bending" \newif\ifpgf@precise@shortening \def\pgf@arrow@mode@is@quick{0} \let\pgf@arrow@flex@mode\pgf@arrow@mode@is@quick \newif\ifpgf@up@path@needed \newif\ifpgf@up@draw@arrows \def\pgf@up@stroke@text{stroke} \def\pgf@up@fill@text{fill} \def\pgf@up@clip@text{clip} \def\pgf@do@up@bb{\pgf@relevantforpicturesizefalse} \def\pgfusepath#1{% \pgf@up@path@neededfalse% \pgf@up@draw@arrowsfalse% \let\pgf@up@stroke\pgfutil@empty% \let\pgf@up@fill\pgfutil@empty% \let\pgf@up@clip\pgfutil@empty% \let\pgf@up@bb\pgfutil@empty% \pgfset{#1}% \expandafter\def\expandafter\pgf@up@action\expandafter{\csname pgfsys@\pgf@up@fill\pgf@up@stroke\endcsname}% \ifnum\pgf@tips@mode=2\relax% \pgf@up@path@neededtrue% \fi% \ifnum\pgf@tips@mode=4\relax% \pgf@up@path@neededtrue% \fi% \ifpgf@up@path@needed% \else% \pgfsyssoftpath@setcurrentpath\pgfutil@empty% \fi% \ifx\pgf@up@stroke\pgfutil@empty% \ifx\pgf@up@fill\pgfutil@empty% \let\pgf@up@action=\pgfutil@empty% \ifx\pgf@up@clip\pgfutil@empty% \else% % only clipping \let\pgf@up@action=\pgfsys@discardpath% \fi% \fi% \fi% \pgfsyssoftpath@getcurrentpath\pgf@last@processed@path \pgfprocessround{\pgf@last@processed@path}{\pgf@last@processed@path}% change the path \pgfsyssoftpath@setcurrentpath\pgf@last@processed@path% % % Check whether the path is stroked. If so, add half the line width % to the bounding box. % \ifpgf@relevantforpicturesize% \ifx\pgf@up@stroke\pgfutil@empty% \else% \ifdim\pgf@picmaxx=-16000pt\relax% \else% \pgf@x=\pgf@pathminx\advance\pgf@x by-.5\pgflinewidth% \ifdim\pgf@x<\pgf@picminx\global\pgf@picminx\pgf@x\fi% \pgf@y=\pgf@pathminy\advance\pgf@y by-.5\pgflinewidth% \ifdim\pgf@y<\pgf@picminy\global\pgf@picminy\pgf@y\fi% \pgf@x=\pgf@pathmaxx\advance\pgf@x by.5\pgflinewidth% \ifdim\pgf@x>\pgf@picmaxx\global\pgf@picmaxx\pgf@x\fi% \pgf@y=\pgf@pathmaxy\advance\pgf@y by.5\pgflinewidth% \ifdim\pgf@y>\pgf@picmaxy\global\pgf@picmaxy\pgf@y\fi% \fi% \fi% \fi% % \ifx\pgf@up@clip\pgfutil@empty% \ifx\pgf@up@stroke\pgfutil@empty% \ifx\pgf@up@action\pgfutil@empty% \ifnum\pgf@tips@mode=2\relax% \pgf@up@draw@arrows@only% \fi% \ifnum\pgf@tips@mode=4\relax% \pgf@up@draw@arrows@only% \fi% \else% \pgfsyssoftpath@invokecurrentpath% \pgf@up@action% \fi% \else% \pgfgetpath\pgf@arrowpath% \pgf@path@setup@tempswa% \pgfprocesscheckclosed{\pgf@arrowpath}{\pgfutil@tempswafalse}% \pgf@path@check@proper% \ifpgfutil@tempswa% \pgf@check@for@arrow@and@animation% \pgf@prepare@end@of@path% \begingroup% \pgf@prepare@start@of@path% \fi% \pgfsyssoftpath@invokecurrentpath% \pgf@up@action% \ifdim\pgfinnerlinewidth>0pt\relax% \pgf@stroke@inner@line% \fi% \ifpgfutil@tempswa% \pgf@add@arrow@at@start% \endgroup% \pgf@add@arrow@at@end% \fi% \fi% \else% \pgfsyssoftpath@invokecurrentpath% \pgfsys@clipnext% \pgf@up@action% \pgf@relevantforpicturesizefalse% \fi% \pgf@up@bb% \pgfsyssoftpath@setcurrentpath\pgfutil@empty% \pgf@resetpathsizes% \ignorespaces% } \def\pgf@path@setup@tempswa{% \ifnum\pgf@tips@mode>0\relax \pgfutil@tempswatrue% \else \pgfutil@tempswafalse% \fi% } \def\pgf@up@draw@arrows@only{% \pgfgetpath\pgf@arrowpath% \pgfutil@tempswatrue% \pgfprocesscheckclosed{\pgf@arrowpath}{\pgfutil@tempswafalse}% \pgf@path@check@proper% \ifpgfutil@tempswa% \pgf@check@for@arrow@and@animation% \pgf@prepare@end@of@path% \begingroup% \pgf@prepare@start@of@path% \pgf@add@arrow@at@start% \endgroup% \pgf@add@arrow@at@end% \fi% } \def\pgf@check@for@arrow@and@animation{\pgfsys@if@fresh@currentid{\pgf@check@for@arrow@and@animation@}{}}% \def\pgf@check@for@arrow@and@animation@{% \expandafter\ifx\csname pgfsysanim@path@is@animated@\pgf@sys@id@current@id @\pgfsys@current@type\endcsname\pgfutil@empty% % Ok, an animation is here! \ifx\pgf@end@tip@sequence\pgfutil@empty% \ifx\pgf@start@tip@sequence\pgfutil@empty% \else% \pgf@check@for@arrow@and@animation@error% \fi% \else% \pgf@check@for@arrow@and@animation@error% \fi% \fi% } \def\pgf@check@for@arrow@and@animation@error{\pgferror{Animated path may not have normal arrow tips. Use a base path with arrow tips}} \def\pgf@path@check@proper{% \ifpgfutil@tempswa% \ifnum\pgf@tips@mode>2\relax% \pgf@path@check@proper@% \fi% \fi% } \def\pgf@path@check@proper@{% {% \pgf@x0pt\pgf@y\pgf@x% \pgfutil@tempswatrue% \let\pgfsyssoftpath@movetotoken\pgf@path@proper@init% \let\pgfsyssoftpath@linetotoken\pgf@path@proper@test%% \let\pgfsyssoftpath@curvetosupportatoken\pgf@path@proper@test% \let\pgfsyssoftpath@curvetosupportbtoken=\pgf@path@proper@test% \let\pgfsyssoftpath@curvetotoken\pgf@path@proper@test% \let\pgfsyssoftpath@rectcornertoken\pgf@path@proper@test% \let\pgfsyssoftpath@rectsizetoken\pgf@path@proper@zero@test% \let\pgfsyssoftpath@closepathtoken\pgf@path@proper@test% % Execute the path: \pgf@arrowpath% \expandafter }% \ifpgfutil@tempswa\pgfutil@tempswafalse\else\pgfutil@tempswatrue\fi% } \def\pgf@path@proper@init#1#2{\pgfutil@tempswatrue\pgf@x#1\pgf@y#2}% \def\pgf@path@proper@test#1#2{% \ifdim\pgf@x=#1\relax\else\pgfutil@tempswafalse\fi% \ifdim\pgf@y=#2\relax\else\pgfutil@tempswafalse\fi} \def\pgf@path@proper@zero@test#1#2{% \ifdim\pgf@x=0pt\relax\else\pgfutil@tempswafalse\fi% \ifdim\pgf@y=0pt\relax\else\pgfutil@tempswafalse\fi} \def\pgf@stroke@inner@line{% \let\pgf@temp@save=\pgf@strokecolor@global \pgfsys@beginscope% {% \pgfsys@setlinewidth{\pgfinnerlinewidth}% \pgfsetstrokecolor{\pgfinnerstrokecolor}% \pgfsyssoftpath@invokecurrentpath% \pgfsys@stroke% }% \pgfsys@endscope% \global\let\pgf@strokecolor@global=\pgf@temp@save } \let\pgf@prepare@start@of@path\relax% % Shorten start/end of paths by a certain amount. % % #1 = amount by which paths should be shortened. % % Example: % % \pgfpathmoveto{\pgfpointorigin} % \pgfpathlineto{\pgfpoint{10pt}{0pt} % % % The following has the same effect: % \pgfsetshortenstart{1pt} % \pgfpathmoveto{\pgfpointorigin} % \pgfpathlineto{\pgfpoint{11pt}{0pt} \def\pgfsetshortenstart#1{\pgfmathsetlength\pgf@shorten@start@additional{#1}} \def\pgfsetshortenend#1{\pgfmathsetlength\pgf@shorten@end@additional{#1}} \newdimen\pgf@shorten@end@additional \newdimen\pgf@shorten@start@additional % % % Handling the end of a path % % % The "handling" consists of first testing whether we need to do % anything at all, namely because either an arrow tip should be drawn % at the end or because the path should be shortened at the end. If % so, we shorten the path if needed and, later on, add the arrow tip. % \newif\ifpgf@worry % Prepare the end of the path: Test whether anything must be done % (step 0) and, if so, split the path (step 1), extract the interesting points from % the path (step 2), prepare further computations (step 3), shorten % the path (step 4) if necessary, and add the arrow tip (step 4 in % macro \pgf@add@arrow@at@end, which is called later). \def\pgf@prepare@end@of@path{% \let\pgfprocessresultpathsuffix\relax% flag that nothing has happened... \let\pgfprocessresultsubpathsuffix\relax% \pgfsyssoftpath@getcurrentpath\pgf@arrowpath% % % Step 0 start: % % Do we need to worry about the end? % \ifx\pgf@arrowpath\pgfutil@empty\else% \pgf@worryfalse% \ifx\pgf@end@tip@sequence\pgfutil@empty% \else% \pgf@worrytrue% Yes, worry if we have to draw an arrow \fi% \pgf@precise@shorteningfalse% \pgf@arrow@compute@shortening\pgf@end@tip@sequence% \advance\pgf@xa by\pgf@shorten@end@additional% \advance\pgf@xb by\pgf@shorten@end@additional% \ifdim\pgf@xa=0pt\relax\else\pgf@worrytrue\fi% Also, worry if shortening is requested \edef\pgf@path@shortening@distance{\the\pgf@xa}% \edef\pgf@arrow@tip@total@length{\the\pgf@xb}% % % Step 0 done. % \ifpgf@worry% % Ok, need to "worry" about the end, either because we need to % shorten it or to draw an arrow head. % % Step 1: Split % \pgfprocesssplitpath{\pgf@arrowpath}% \pgfprocesssplitsubpath{\pgfprocessresultpathsuffix}% % % Step 2: extract % \expandafter\pgf@parse@end\pgfprocessresultsubpathsuffix\pgf@stop\pgf@stop\pgf@stop% % % Step 3: prep % \pgf@prep@end% % % Step 4: shorten % \ifdim\pgf@path@shortening@distance=0pt\else\pgf@do@shorten@end\fi% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\pgf@arrowpath% \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathprefix\pgfprocessresultpathsuffix}% \pgfsyssoftpath@setcurrentpath\pgf@arrowpath% \fi% \fi% } \def\pgf@parse@end#1#2#3#4#5#6{% \ifx#4\pgf@stop% Only a moveto! -> do nothing! \def\pgfpointlastonpath{\pgfqpoint{#2}{#3}}% \let\pgf@next\relax% \let\pgf@do@shorten@end\relax% \let\pgf@do@draw@end\pgf@do@draw@straightend% \let\pgf@prep@end\pgf@prep@movetoend% \else\ifx#4\pgfsyssoftpath@curvetosupportatoken% A curve -> this will get complicated... \def\pgfsubpathfourthlasttoken{#1}% \def\pgfpointfourthlastonpath{\pgfqpoint{#2}{#3}}% \def\pgfpointthirdlastonpath{\pgfqpoint{#5}{#6}}% \ifpgf@precise@shortening% \let\pgf@do@shorten@end\pgf@do@shorten@curvedend% \let\pgf@do@draw@end\pgf@do@draw@curvedend% \let\pgf@prep@end\pgf@prep@curveend% \else% \def\pgfsubpathstart{\noexpand#1{#2}{#3}\noexpand#4{#5}{#6}}% \let\pgf@do@shorten@end\pgf@do@shorten@straightend% \let\pgf@do@draw@end\pgf@do@draw@straightend% \let\pgf@prep@end\pgf@prep@straightend% \fi% \let\pgf@next\pgf@parse@end@curve@cont% \else% A straight line -> great! \def\pgfsubpathstart{\noexpand#1{#2}{#3}\noexpand#4}% \def\pgfpointsecondlastonpath{\pgfqpoint{#2}{#3}}% \def\pgfpointlastonpath{\pgfqpoint{#5}{#6}}% \let\pgfpointfourthlastonpath\relax% \let\pgfpointthirdlastonpath\relax% \let\pgf@next\pgf@parse@end@gobble@three% \let\pgf@do@shorten@end\pgf@do@shorten@straightend% \let\pgf@do@draw@end\pgf@do@draw@straightend% \let\pgf@prep@end\pgf@prep@straightend% \fi\fi% \pgf@next% Needed for reading rest of path... } \def\pgf@parse@end@gobble@three#1#2#3{}% \def\pgf@parse@end@curve@cont#1#2#3#4#5#6#7#8#9{% \def\pgfpointsecondlastonpath{\pgfqpoint{#2}{#3}}% \def\pgfpointlastonpath{\pgfqpoint{#5}{#6}}% \ifpgf@precise@shortening% \else% \expandafter\def\expandafter\pgfsubpathstart\expandafter{\pgfsubpathstart\noexpand#1{#2}{#3}\noexpand#4}% \fi% } % % Preps % \def\pgf@prep@movetoend{% \pgf@process{\pgfpointlastonpath}% \pgf@xb\pgf@x \pgf@yb\pgf@y \pgf@xc\pgf@x \pgf@yc\pgf@y } \def\pgf@prep@straightend{% \let\pgf@ref\pgfpointsecondlastonpath \ifx\pgfpointlastonpath\pgfpointsecondlastonpath% degenerate! \ifx\pgfpointthirdlastonpath\relax% cannot help it: really a zero-length path \else% \ifx\pgfpointlastonpath\pgfpointthirdlastonpath% double degenerate! \let\pgf@ref\pgfpointfourthlastonpath% Use third point for reference. \else \let\pgf@ref\pgfpointthirdlastonpath% Use third point for reference. \fi% \fi% \fi% \pgfpointlineatdistance{\pgf@path@shortening@distance}{\pgfpointlastonpath}{\pgf@ref}% \pgf@xa\pgf@x% \pgf@ya\pgf@y% } % % Line shortening for straight lines: % \def\pgf@do@shorten@straightend{% \edef\pgfprocessresultsubpathsuffix{\pgfsubpathstart{\the\pgf@xa}{\the\pgf@ya}}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\pgfprocessresultpathsuffix% \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultsubpathprefix\pgfprocessresultsubpathsuffix}% } % % Draw an end arrow by calling an appropriate subfunction, if necessary % \def\pgf@add@arrow@at@end{% \ifx\pgf@arrowpath\pgfutil@empty\else% \ifx\pgf@end@tip@sequence\pgfutil@empty\else% \pgf@do@draw@end% \fi% \fi% } % % Draw an end arrow at the end of a straight line % \def\pgf@do@draw@straightend{% {% \pgftransformreset% \pgftransformarrow{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}% \pgf@arrow@draw@arrow\pgf@end@tip@sequence\pgf@arrow@tip@total@length% }% } % % % Handling the start of a path % % % The "handling" is similar to the case for the start of the path. We % may be able to skip the splitting if that was done already for the % end. Otherwise, things are basically the same. % % Prepare the start of the path: Test whether anything must be done % (step 0) and, if so, split the path (step 1) if necessary, extract % the interesting points from the path (step 2), prepare computations % (step 3) needed for both shortening and tip adding, shorten the path % (step 4), and add the arrow tip (step 5 in macro % \pgf@add@arrow@at@start, which is called later). \def\pgf@prepare@start@of@path{% % % Step 0 start: % % Do we need to worry about the start? % \ifx\pgf@arrowpath\pgfutil@empty\else% \pgf@worryfalse% \ifx\pgf@start@tip@sequence\pgfutil@empty\else\pgf@worrytrue\fi% Yes, worry if we have to draw an arrow \pgf@precise@shorteningfalse% \pgf@arrow@compute@shortening\pgf@start@tip@sequence% \advance\pgf@xa by\pgf@shorten@start@additional% \advance\pgf@xb by\pgf@shorten@start@additional% \ifdim\pgf@xa=0pt\relax\else\pgf@worrytrue\fi% Also, worry if shortening is requested \edef\pgf@path@shortening@distance{\the\pgf@xa}% \edef\pgf@arrow@tip@total@length{\the\pgf@xb}% % % Step 0 done. % \ifpgf@worry% % Ok, need to "worry" about the start, either because we need to % shorten it or to draw an arrow head. % % Step 1: Split % \ifx\pgfprocessresultpathsuffix\relax% % Ok, still need to compute the split: \pgfprocesssplitpath{\pgf@arrowpath}% \fi% % % Step 2: extract % \expandafter\pgf@parse@start\pgfprocessresultpathsuffix\pgf@stop\pgf@stop\pgf@stop% % % Step 3: prep % \pgf@prep@start% % % Step 4: shorten % \ifdim\pgf@path@shortening@distance=0pt\else\pgf@do@shorten@start\fi% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\pgf@arrowpath% \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathprefix\pgfprocessresultpathsuffix}% \pgfsyssoftpath@setcurrentpath\pgf@arrowpath% \fi% \fi% } \def\pgf@parse@start#1#2#3#4#5#6{% \def\pgfpointfirstonpath{\pgfqpoint{#2}{#3}}% \def\pgfpointsecondonpath{\pgfqpoint{#5}{#6}}% \let\pgfpointthirdonpath\relax% \let\pgfpointfourthonpath\relax% \def\pgfsubpathfirsttoken{\noexpand#1}% \def\pgfsubpathsecondtoken{\noexpand#4}% \ifx#4\pgf@stop% Only a moveto! -> do nothing! \let\pgf@next\relax% \let\pgf@do@shorten@start\relax% \let\pgf@prep@start\pgf@prep@movetostart% \let\pgf@do@draw@start\pgf@do@draw@straightstart% \else\ifx#4\pgfsyssoftpath@curvetosupportatoken% A curve -> this will get complicated... \ifpgf@precise@shortening% \let\pgf@next\pgf@parse@start@curve@cont% \let\pgf@do@shorten@start\pgf@do@shorten@curvedstart% \let\pgf@do@draw@start\pgf@do@draw@curvedstart% \let\pgf@prep@start\pgf@prep@curvedstart% \else% can treat the end like a straight line... \let\pgf@next\pgf@parse@start@curve@cont@straight% \let\pgf@do@shorten@start\pgf@do@shorten@straightstart% \let\pgf@do@draw@start\pgf@do@draw@straightstart% \let\pgf@prep@start\pgf@prep@straightstart% \fi% \else% A straight line -> great! \let\pgf@next\pgf@parse@start@till@stop% \let\pgf@do@shorten@start\pgf@do@shorten@straightstart% \let\pgf@do@draw@start\pgf@do@draw@straightstart% \let\pgf@prep@start\pgf@prep@straightstart% \fi\fi% \pgf@next% Needed for reading rest of path... } \def\pgf@parse@start@till@stop#1\pgf@stop\pgf@stop\pgf@stop{\def\pgfsubpathend{#1}}% \def\pgf@parse@start@curve@cont#1#2#3#4#5#6#7\pgf@stop\pgf@stop\pgf@stop{% \def\pgfpointthirdonpath{\pgfqpoint{#2}{#3}}% \def\pgfpointfourthonpath{\pgfqpoint{#5}{#6}}% \def\pgfsubpathend{#7}% } \def\pgf@parse@start@curve@cont@straight#1#2#3#4#5#6#7\pgf@stop\pgf@stop\pgf@stop{% \def\pgfpointthirdonpath{\pgfqpoint{#2}{#3}}% \def\pgfpointfourthonpath{\pgfqpoint{#5}{#6}}% \def\pgfsubpathend{#1{#2}{#3}#4{#5}{#6}#7}% } % % Preps % \def\pgf@prep@movetostart{% \pgf@process{\pgfpointfirstonpath}% \pgf@xb\pgf@x \pgf@yb\pgf@y \pgf@xc\pgf@x \pgf@yc\pgf@y } \def\pgf@prep@straightstart{% \let\pgf@ref\pgfpointsecondonpath \ifx\pgfpointfirstonpath\pgfpointsecondonpath% degenerate! \ifx\pgfpointthirdonpath\relax% cannot help it: really a zero-length path \else% \ifx\pgfpointfirstonpath\pgfpointthirdonpath% double degenerate! \let\pgf@ref\pgfpointfourthonpath% Use third point for reference. \else \let\pgf@ref\pgfpointthirdonpath% Use third point for reference. \fi% \fi% \fi% \pgfpointlineatdistance{\pgf@path@shortening@distance}{\pgfpointfirstonpath}{\pgf@ref}% \pgf@xa\pgf@x% \pgf@ya\pgf@y% } % % Line shortening for straight lines: % \def\pgf@do@shorten@straightstart{% \edef\pgfprocessresultpathsuffix{\pgfsubpathfirsttoken{\the\pgf@xa}{\the\pgf@ya}\pgfsubpathsecondtoken{\the\pgf@xc}{\the\pgf@yc}}% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\pgfprocessresultpathsuffix% \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathsuffix\pgfsubpathend}% } % % Draw a start arrow by calling an appropriate subfunction, if necessary % \def\pgf@add@arrow@at@start{% \ifx\pgf@arrowpath\pgfutil@empty\else% \ifx\pgf@start@tip@sequence\pgfutil@empty\else% \pgf@do@draw@start% \fi% \fi% } % % Draw an start arrow at the start of a straight line % \def\pgf@do@draw@straightstart{% {% \pgftransformreset% \pgftransformarrow{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}% \pgf@arrow@draw@arrow\pgf@start@tip@sequence\pgf@arrow@tip@total@length% }% } \let\pgf@shorten@end=\pgfutil@empty \let\pgf@shorten@start=\pgfutil@empty \endinput%