summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex4820
1 files changed, 2512 insertions, 2308 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex b/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex
index b419a8cb624..efa492cc024 100644
--- a/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex
+++ b/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex
@@ -7,7 +7,7 @@
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.
-\ProvidesFileRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex,v 1.3 2009/10/27 23:03:12 tantau Exp $
+\ProvidesFileRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex,v 1.6 2013/09/11 06:15:59 vibrovski Exp $
\pgfdeclareshape{forbidden sign}
{
@@ -43,6 +43,48 @@
\fi%
\pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{-0.707107\pgfutil@tempdima}{-0.707107\pgfutil@tempdima}}}
\pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{0.707107\pgfutil@tempdima}{0.707107\pgfutil@tempdima}}}
+ \pgfsetarrowsstart{}
+ \pgfsetarrowsend{}
+ }
+}
+
+
+\pgfdeclareshape{correct forbidden sign}
+{
+ \inheritsavedanchors[from=circle] % this is nearly a circle
+ \inheritanchorborder[from=circle]
+ \inheritanchor[from=circle]{north}
+ \inheritanchor[from=circle]{north west}
+ \inheritanchor[from=circle]{north east}
+ \inheritanchor[from=circle]{center}
+ \inheritanchor[from=circle]{west}
+ \inheritanchor[from=circle]{east}
+ \inheritanchor[from=circle]{mid}
+ \inheritanchor[from=circle]{mid west}
+ \inheritanchor[from=circle]{mid east}
+ \inheritanchor[from=circle]{base}
+ \inheritanchor[from=circle]{base west}
+ \inheritanchor[from=circle]{base east}
+ \inheritanchor[from=circle]{south}
+ \inheritanchor[from=circle]{south west}
+ \inheritanchor[from=circle]{south east}
+ \inheritbackgroundpath[from=circle]
+ \foregroundpath{
+ \centerpoint%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{0.707107\pgfutil@tempdima}{-0.707107\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{-0.707107\pgfutil@tempdima}{0.707107\pgfutil@tempdima}}}
+ \pgfsetarrowsstart{}
+ \pgfsetarrowsend{}
}
}
@@ -57,468 +99,468 @@
% /pgf/random starburst : The seed for the random number generator.
%
\pgfkeys{/pgf/random starburst/%
- .code={%
- \ifx\pgfkeysnovalue#1%
- \pgfmathgeneratepseudorandomnumber%
- \else%
- \pgfmathtruncatemacro\pgfmathresult{#1}%
- \fi%
- \pgfkeyslet{/pgf/random starburst}{\pgfmathresult}%
- }%
+ .code={%
+ \ifx\pgfkeysnovalue#1%
+ \pgfmathgeneratepseudorandomnumber%
+ \else%
+ \pgfmathtruncatemacro\pgfmathresult{#1}%
+ \fi%
+ \pgfkeyslet{/pgf/random starburst}{\pgfmathresult}%
+ }%
}
\pgfkeys{/pgf/random starburst=100}
\pgfkeys{/pgf/starburst point height/.value required}
\pgfkeys{/pgf/starburst point height/.code={%
- \pgfmathparse{#1}%
- \edef\pgfmathresult{\pgfmathresult pt}%
- \pgfkeyslet{/pgf/starburst point height}{\pgfmathresult}%
- }%
+ \pgfmathparse{#1}%
+ \edef\pgfmathresult{\pgfmathresult pt}%
+ \pgfkeyslet{/pgf/starburst point height}{\pgfmathresult}%
+ }%
}%
\pgfkeys{/pgf/starburst point height=.5cm}
\pgfkeys{/pgf/starburst points/.value required}
\pgfkeys{/pgf/starburst points/.code={%
- \pgfmathtruncatemacro\pgfmathresult{#1}%
- \pgfkeyslet{/pgf/starburst points}{\pgfmathresult}%
- }%
+ \pgfmathtruncatemacro\pgfmathresult{#1}%
+ \pgfkeyslet{/pgf/starburst points}{\pgfmathresult}%
+ }%
}%
\pgfkeys{/pgf/starburst points=17}
\pgfdeclareshape{starburst}{%
- \savedmacro\anglestep{%
- \pgfmathdivide@{180}{\pgfkeysvalueof{/pgf/starburst points}}%
- \let\anglestep\pgfmathresult%
- }
- \savedmacro\calculatestarburstpoints{%
- %
- % Get the angle step.
- %
- \pgfmathdivide@{180}{\pgfkeysvalueof{/pgf/starburst points}}%
- \let\anglestep\pgfmathresult%
- %
- % Get the total number of points.
- %
- \pgfmathsetcounter{pgf@counta}{\pgfkeysvalueof{/pgf/starburst points}}%
- \multiply\c@pgf@counta2\relax%
- \edef\totalpoints{\the\c@pgf@counta}%
- \addtosavedmacro{\totalpoints}%
- %
- % Calculate the centerpoint.
- %
- \pgfextract@process\centerpoint{%
- \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
- \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}%
- \pgfmathaddtolength\pgf@y{+-.5\dp\pgfnodeparttextbox}%
- }%
- %
- % Get the larger of the outer sep.
- %
- \pgfmathsetlength\pgf@x{+\pgfkeysvalueof{/pgf/outer xsep}}%
- \pgfmathsetlength\pgf@y{+\pgfkeysvalueof{/pgf/outer ysep}}%
- \ifdim\pgf@x<\pgf@y%
- \pgf@x\pgf@y%
- \fi%
- \edef\outersep{\the\pgf@x}%
- %
- % Get the node dimensions.
- %
- \pgfmathsetlength\pgf@x{+\pgfkeysvalueof{/pgf/inner xsep}}%
- \pgfmathaddtolength\pgf@x{+.5\wd\pgfnodeparttextbox}%
- \pgfmathsetlength\pgf@y{+\pgfkeysvalueof{/pgf/inner ysep}}%
- \pgfmathaddtolength\pgf@y{+.5\ht\pgfnodeparttextbox}%
- \pgfmathaddtolength\pgf@y{+.5\dp\pgfnodeparttextbox}%
- %
- % Calculate the inner radii.
- %
- \ifpgfshapeborderusesincircle%
- \pgfkeysgetvalue{/pgf/shape border rotate}{\rotate}%
- %
- % Use the incircle...
- %
- \ifdim\pgf@y>\pgf@x%
- \pgf@x\pgf@y%
- \fi%
- \pgf@x1.41421\pgf@x%
- \pgf@y\pgf@x%
- \else%
- %
- % Get the rotation (with rounding).
- %
- \pgfkeysgetvalue{/pgf/shape border rotate}{\rotate}%
- \pgfmathmod@{\rotate}{360}%
- \afterassignment\pgfmath@gobbletilpgfmath@%
- \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
- \advance\c@pgf@counta45\relax%
- \divide\c@pgf@counta90\relax%
- \multiply\c@pgf@counta90\relax%
- \ifnum\c@pgf@counta<0\relax%
- \advance\c@pgf@counta360\relax%
- \fi%
- %
- % Calculate the width and height of the node
- % contents, according to any border rotation.
- %
- \ifnum\c@pgf@counta=90\relax%
- \pgf@xc\pgf@x%
- \pgf@x\pgf@y%
- \pgf@y\pgf@xc%
- \else%
- \ifnum\c@pgf@counta=270\relax%
- \pgf@xc\pgf@x%
- \pgf@x\pgf@y%
- \pgf@y\pgf@xc%
- \fi%
- \fi%
- \edef\rotate{\the\c@pgf@counta}%
- %
- % ...or not.
- %
- \pgf@x=1.41421\pgf@x%
- \pgf@y=1.41421\pgf@y%
- \fi%
- \addtosavedmacro{\rotate}%
- %
- % Adjust innerradius for minimum width and height.
- %
- \pgf@xa\pgf@x%
- \pgfmathsetlength\pgf@xb{+\pgfkeysvalueof{/pgf/starburst point height}}%
- \advance\pgf@xa\pgf@xb%
- \pgfmathsetlength\pgf@xc{+\pgfkeysvalueof{/pgf/minimum width}}%
- \ifdim\pgf@xa<.5\pgf@xc%
- \pgf@x.5\pgf@xc%
- \advance\pgf@x-\pgf@xb%
- \fi%
- \pgf@ya\pgf@y%
- \pgfmathsetlength\pgf@yb{+\pgfkeysvalueof{/pgf/starburst point height}}%
- \advance\pgf@ya\pgf@yb%
- \pgfmathsetlength\pgf@yc{+\pgfkeysvalueof{/pgf/minimum height}}%
- \ifdim\pgf@ya<.5\pgf@yc%
- \pgf@y.5\pgf@yc%
- \advance\pgf@y-\pgf@yb%
- \fi%
- \edef\xinnerradius{\the\pgf@x}%
- \edef\yinnerradius{\the\pgf@y}%
- \addtosavedmacro{\xinnerradius}%
- \addtosavedmacro{\yinnerradius}%
- %
- % Calculate a radius outside the starburst.
- %
- \ifdim\pgf@y>\pgf@x%
- \pgf@x\pgf@y%
- \fi%
- \pgfmathaddtolength\pgf@x{+\pgfkeysvalueof{/pgf/starburst point height}}%
- \edef\externalradius{\the\pgf@x}%
- \addtosavedmacro{\externalradius}%
- %
- % Set the seed for the random number generator.
- %
- \pgfmathsetseed{\pgfkeysvalueof{/pgf/random starburst}}%
- %
- % Now create the points on the shape and also
- % the miter length and angle for each point.
- %
- \def\angle{90}% Start at the top.
- %
- % At point a, the miter length and angle are calculated for point b = a - 1.
- %
- \c@pgf@counta1\relax%
- \c@pgf@countb0\relax%
- %
- % As 3 consecutive points are required to be defined for miter
- % calculations, it is necessary to go over the first two points
- % again.
- %
- \c@pgf@countc\totalpoints\relax%
- \advance\c@pgf@countc2\relax%
- \edef\looppoints{\the\c@pgf@countc}%
- \let\secondpoint\pgfutil@empty%
- \let\thirdpoint\pgfutil@empty%
- \pgfmathloop%
- %
- % Cycle the point definitions.
- %
- \let\firstpoint\secondpoint%
- \let\secondpoint\thirdpoint%
- \ifnum\pgfmathcounter>\looppoints%
- \else%
- \ifnum\pgfmathcounter>\totalpoints%
- \expandafter\let\expandafter\thirdpoint\csname point@\the\c@pgf@counta @\endcsname%
- \else%
- \ifodd\pgfmathcounter%
- %
- % An outer point.
- %
- \ifnum\pgfkeysvalueof{/pgf/random starburst}=0\relax%
- \pgf@xa\pgfkeysvalueof{/pgf/starburst point height}\relax%
- \else%
- \pgf@x\pgfkeysvalueof{/pgf/starburst point height}\relax%
- \pgf@xa.75\pgf@x%
- \pgf@xb.25\pgf@x%
- \pgfmathrnd%
- \pgf@xa\pgfmathresult\pgf@xa%
- \advance\pgf@xa\pgf@xb%
- \fi%
- \pgf@x\xinnerradius\relax%
- \advance\pgf@x\pgf@xa%
- \pgf@y\yinnerradius\relax%
- \advance\pgf@y\pgf@xa%
- \expandafter\pgfextract@process\csname point@\the\c@pgf@counta @\endcsname{%
- \pgfpointpolar{\angle}{\the\pgf@x and \the\pgf@y}%
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \centerpoint%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
- \else%
- %
- % An inner point.
- %
- \expandafter\pgfextract@process\csname point@\the\c@pgf@counta @\endcsname{%
- \pgfpointpolar{\angle}{\xinnerradius and \yinnerradius}%
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \centerpoint%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
- \fi%
- %
- % Add the points to the saved macro.
- %
- \expandafter\let\expandafter\thirdpoint\csname point@\the\c@pgf@counta @\endcsname%
- \expandafter\addtosavedmacro\expandafter{\csname point@\the\c@pgf@counta @\endcsname}%
- \fi%
- %
- % It is only possible to do the miter calculations if three points are defined.
- %
- \ifx\firstpoint\pgfutil@empty%
- \else%
- %
- % Calculate the miter length...
- %
- \pgfmathanglebetweenlines{\secondpoint}{\thirdpoint}{\secondpoint}{\firstpoint}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\defaultmiterangle\pgfmathresult%
- \pgfmathcosec@{\pgfmathresult}%
- \pgf@x\outersep\relax%
- \pgf@x\pgfmathresult\pgf@x%
- \edef\miterlength{\the\pgf@x}%
- %
- % ...the miter angle...
- %
- \pgfmathanglebetweenlines{\firstpoint}{\secondpoint}{\firstpoint}{\thirdpoint}%
- \pgfmathadd@{\pgfmathresult}{\defaultmiterangle}%
- \pgfmathsubtract@{180}{\pgfmathresult}%
- \let\angletemp\pgfmathresult%
- \pgfmathanglebetweenpoints{\firstpoint}{\thirdpoint}%
- \pgfmathsubtract@{180}{\pgfmathresult}%
- \pgfmathsubtract@{\angletemp}{\pgfmathresult}%
- \edef\miterangle{\pgfmathresult}%
- %
- % ...and thus the border point.
- %
- \pgfextract@process\borderpoint{%
- \secondpoint%
- \pgf@xa\pgf@x
- \pgf@ya\pgf@y%
- \pgfpointpolar{\miterangle}{\miterlength}%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
- %
- % Get the angle from the centerpoint to the *unrotated* border points.
- %
- \pgfmathanglebetweenpoints{\centerpoint}{\borderpoint}%
- \expandafter\edef\csname angletoborderpoint@\the\c@pgf@countb @\endcsname{\pgfmathresult}%
- \expandafter\addtosavedmacro\expandafter{\csname angletoborderpoint@\the\c@pgf@countb @\endcsname}%
- %
- % Rotatee the border points and save.
- %
- \expandafter\pgfextract@process\csname borderpoint@\the\c@pgf@countb @\endcsname{%
- \pgfmathrotatepointaround{\borderpoint}{\centerpoint}{\rotate}%
- }%
- \expandafter\addtosavedmacro\expandafter{\csname borderpoint@\the\c@pgf@countb @\endcsname}%
- %
- % Now create the anchors.
- %
- \c@pgf@countc\c@pgf@countb%
- \advance\c@pgf@countc1\relax%
- \divide\c@pgf@countc2\relax%
- \ifodd\c@pgf@countb\relax%
- \pgfutil@ifundefined{pgf@anchor@starburst@outer point\space\the\c@pgf@countc}{%
- \expandafter\xdef\csname pgf@anchor@starburst@outer point\space\the\c@pgf@countc\endcsname{%
- \noexpand\calculatestarburstpoints%
- \noexpand\csname borderpoint@\the\c@pgf@countb @\noexpand\endcsname%
- }%
- }{}%
- \else%
- \pgfutil@ifundefined{pgf@anchor@starburst@inner point\space\the\c@pgf@countc}{%
- \expandafter\xdef\csname pgf@anchor@starburst@inner point\space\the\c@pgf@countc\endcsname{%
- \noexpand\calculatestarburstpoints%
- \noexpand\csname borderpoint@\the\c@pgf@countb @\noexpand\endcsname%
- }%
- }{}%
- \fi%
- \fi%
- \pgfmathadd@{\angle}{\anglestep}%
- \pgfmathmod@{\pgfmathresult}{360}%
- \let\angle\pgfmathresult%
- \advance\c@pgf@counta1\relax%
- \ifnum\c@pgf@counta>\totalpoints%
- \c@pgf@counta1\relax%
- \fi%
- \advance\c@pgf@countb1\relax%
- \ifnum\c@pgf@countb>\totalpoints%
- \c@pgf@countb1\relax%
- \fi%
- \repeatpgfmathloop%
- }
- \savedanchor\centerpoint{%
- \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
- \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}%
- \pgfmathaddtolength\pgf@y{+-.5\dp\pgfnodeparttextbox}%
- }%
- \savedanchor\midpoint{%
- \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
- \pgfmathsetlength\pgf@y{+.5ex}%
- }%
- \savedanchor\basepoint{%
- \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
- \pgf@y0pt\relax%
- }%
- \anchor{center}{\centerpoint}
- \anchor{base}{\basepoint}
- \anchor{mid}{\midpoint}
- \anchor{north}{%
- \calculatestarburstpoints%
- \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
- }
- \anchor{south}{%
- \calculatestarburstpoints%
- \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
- }
- \anchor{east}{%
- \calculatestarburstpoints%
- \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
- }
- \anchor{west}{%
- \calculatestarburstpoints%
- \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
- }
- \anchor{north west}{%
- \calculatestarburstpoints%
- \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
- }
- \anchor{south west}{%
- \calculatestarburstpoints%
- \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
- }
- \anchor{north east}{%
- \calculatestarburstpoints%
- \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
- }
- \anchor{south east}{%
- \calculatestarburstpoints%
- \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
- }
- \backgroundpath{%
- \calculatestarburstpoints%
- \pgfmathloop%
- \ifnum\pgfmathcounter>\totalpoints%
- \else%
- \ifnum\pgfmathcounter=1\relax%
- \let\starburstaction\pgfpathmoveto%
- \else%
- \let\starburstaction\pgfpathlineto%
- \fi%
- \starburstaction{%
- %\pgfmathrotatepointaround{\csname point@\pgfmathcounter @\endcsname}{\centerpoint}{\rotate}}%
- \csname point@\pgfmathcounter @\endcsname}
- \repeatpgfmathloop%
- \pgfpathclose%
- }
- \anchorborder{%
- %
- % Save x and y.
- %
- \edef\externalx{\the\pgf@x}%
- \edef\externaly{\the\pgf@y}%
- %
- % Adjust the location of the external
- % point relative to \centerpoint.
- %
- \centerpoint%
- \pgf@xa\externalx\relax%
- \pgf@ya\externaly\relax%
- \advance\pgf@xa\pgf@x%
- \advance\pgf@ya\pgf@y%
- \edef\externalx{\the\pgf@xa}%
- \edef\externaly{\the\pgf@ya}%
- %
- % Get the starburst points.
- %
- \calculatestarburstpoints%
- %
- % Get the angle of the external point to the \centerpoint.
- %
- \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
- \pgfmathsubtract@{\pgfmathresult}{\rotate}%
- \ifdim\pgfmathresult pt<0pt\relax%
- \pgfmathadd@{\pgfmathresult}{360}%
- \fi%
- \let\externalangle\pgfmathresult%
- %
- % Locate the appropriate sides on the starburst border...
- %
- \ifdim\externalangle pt<90pt\relax%
- \c@pgf@counta0\relax%
- \c@pgf@countb\totalpoints\relax%
- \pgfmathloop%
- \ifnum\c@pgf@counta>0\relax%
- \else%
- \ifdim\csname angletoborderpoint@\the\c@pgf@countb @\endcsname pt>90pt\relax%
- \c@pgf@counta\c@pgf@countb%
- \else%
- \ifdim\externalangle pt>\csname angletoborderpoint@\the\c@pgf@countb @\endcsname pt\relax%
- \c@pgf@counta\c@pgf@countb%
- \fi%
- \fi%
- \advance\c@pgf@countb-1\relax%
- \repeatpgfmathloop%
- \edef\first{\the\c@pgf@counta}%
- \advance\c@pgf@counta1\relax%
- \ifnum\c@pgf@counta>\totalpoints\relax%
- \c@pgf@counta1\relax%
- \fi%
- \edef\second{\the\c@pgf@counta}%
- \else%
- \c@pgf@counta0\relax%
- \pgfmathloop%
- \ifnum\c@pgf@counta>0\relax%
- \else%
- \ifdim\csname angletoborderpoint@\pgfmathcounter @\endcsname pt<90pt\relax%
- \c@pgf@counta\pgfmathcounter%
- \else%
- \ifdim\externalangle pt<\csname angletoborderpoint@\pgfmathcounter @\endcsname pt\relax%
- \c@pgf@counta\pgfmathcounter%
- \fi%
- \fi%
- \repeatpgfmathloop%
- \edef\first{\the\c@pgf@counta}%
- \advance\c@pgf@counta-1\relax%
- \ifnum\c@pgf@counta=0\relax%
- \c@pgf@counta\totalpoints\relax%
- \fi%
- \edef\second{\the\c@pgf@counta}%
- \fi%
- %
- % ...and thus, the point on the star border.
- %
- \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
- {\csname borderpoint@\first @\endcsname}{\csname borderpoint@\second @\endcsname}%
- }%
+ \savedmacro\anglestep{%
+ \pgfmathdivide@{180}{\pgfkeysvalueof{/pgf/starburst points}}%
+ \let\anglestep\pgfmathresult%
+ }
+ \savedmacro\calculatestarburstpoints{%
+ %
+ % Get the angle step.
+ %
+ \pgfmathdivide@{180}{\pgfkeysvalueof{/pgf/starburst points}}%
+ \let\anglestep\pgfmathresult%
+ %
+ % Get the total number of points.
+ %
+ \pgfmathsetcounter{pgf@counta}{\pgfkeysvalueof{/pgf/starburst points}}%
+ \multiply\c@pgf@counta2\relax%
+ \edef\totalpoints{\the\c@pgf@counta}%
+ \addtosavedmacro{\totalpoints}%
+ %
+ % Calculate the centerpoint.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}%
+ \pgfmathaddtolength\pgf@y{+-.5\dp\pgfnodeparttextbox}%
+ }%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{+\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{+\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@x{+\pgfkeysvalueof{/pgf/inner xsep}}%
+ \pgfmathaddtolength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+\pgfkeysvalueof{/pgf/inner ysep}}%
+ \pgfmathaddtolength\pgf@y{+.5\ht\pgfnodeparttextbox}%
+ \pgfmathaddtolength\pgf@y{+.5\dp\pgfnodeparttextbox}%
+ %
+ % Calculate the inner radii.
+ %
+ \ifpgfshapeborderusesincircle%
+ \pgfkeysgetvalue{/pgf/shape border rotate}{\rotate}%
+ %
+ % Use the incircle...
+ %
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgf@x1.41421\pgf@x%
+ \pgf@y\pgf@x%
+ \else%
+ %
+ % Get the rotation (with rounding).
+ %
+ \pgfkeysgetvalue{/pgf/shape border rotate}{\rotate}%
+ \pgfmathmod@{\rotate}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ %
+ % Calculate the width and height of the node
+ % contents, according to any border rotation.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \fi%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % ...or not.
+ %
+ \pgf@x=1.41421\pgf@x%
+ \pgf@y=1.41421\pgf@y%
+ \fi%
+ \addtosavedmacro{\rotate}%
+ %
+ % Adjust innerradius for minimum width and height.
+ %
+ \pgf@xa\pgf@x%
+ \pgfmathsetlength\pgf@xb{+\pgfkeysvalueof{/pgf/starburst point height}}%
+ \advance\pgf@xa\pgf@xb%
+ \pgfmathsetlength\pgf@xc{+\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@xa<.5\pgf@xc%
+ \pgf@x.5\pgf@xc%
+ \advance\pgf@x-\pgf@xb%
+ \fi%
+ \pgf@ya\pgf@y%
+ \pgfmathsetlength\pgf@yb{+\pgfkeysvalueof{/pgf/starburst point height}}%
+ \advance\pgf@ya\pgf@yb%
+ \pgfmathsetlength\pgf@yc{+\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@ya<.5\pgf@yc%
+ \pgf@y.5\pgf@yc%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ \edef\xinnerradius{\the\pgf@x}%
+ \edef\yinnerradius{\the\pgf@y}%
+ \addtosavedmacro{\xinnerradius}%
+ \addtosavedmacro{\yinnerradius}%
+ %
+ % Calculate a radius outside the starburst.
+ %
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgfmathaddtolength\pgf@x{+\pgfkeysvalueof{/pgf/starburst point height}}%
+ \edef\externalradius{\the\pgf@x}%
+ \addtosavedmacro{\externalradius}%
+ %
+ % Set the seed for the random number generator.
+ %
+ \pgfmathsetseed{\pgfkeysvalueof{/pgf/random starburst}}%
+ %
+ % Now create the points on the shape and also
+ % the miter length and angle for each point.
+ %
+ \def\angle{90}% Start at the top.
+ %
+ % At point a, the miter length and angle are calculated for point b = a - 1.
+ %
+ \c@pgf@counta1\relax%
+ \c@pgf@countb0\relax%
+ %
+ % As 3 consecutive points are required to be defined for miter
+ % calculations, it is necessary to go over the first two points
+ % again.
+ %
+ \c@pgf@countc\totalpoints\relax%
+ \advance\c@pgf@countc2\relax%
+ \edef\looppoints{\the\c@pgf@countc}%
+ \let\secondpoint\pgfutil@empty%
+ \let\thirdpoint\pgfutil@empty%
+ \pgfmathloop%
+ %
+ % Cycle the point definitions.
+ %
+ \let\firstpoint\secondpoint%
+ \let\secondpoint\thirdpoint%
+ \ifnum\pgfmathcounter>\looppoints%
+ \else%
+ \ifnum\pgfmathcounter>\totalpoints%
+ \expandafter\let\expandafter\thirdpoint\csname point@\the\c@pgf@counta @\endcsname%
+ \else%
+ \ifodd\pgfmathcounter%
+ %
+ % An outer point.
+ %
+ \ifnum\pgfkeysvalueof{/pgf/random starburst}=0\relax%
+ \pgf@xa\pgfkeysvalueof{/pgf/starburst point height}\relax%
+ \else%
+ \pgf@x\pgfkeysvalueof{/pgf/starburst point height}\relax%
+ \pgf@xa.75\pgf@x%
+ \pgf@xb.25\pgf@x%
+ \pgfmathrnd%
+ \pgf@xa\pgfmathresult\pgf@xa%
+ \advance\pgf@xa\pgf@xb%
+ \fi%
+ \pgf@x\xinnerradius\relax%
+ \advance\pgf@x\pgf@xa%
+ \pgf@y\yinnerradius\relax%
+ \advance\pgf@y\pgf@xa%
+ \expandafter\pgfextract@process\csname point@\the\c@pgf@counta @\endcsname{%
+ \pgfpointpolar{\angle}{\the\pgf@x and \the\pgf@y}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \else%
+ %
+ % An inner point.
+ %
+ \expandafter\pgfextract@process\csname point@\the\c@pgf@counta @\endcsname{%
+ \pgfpointpolar{\angle}{\xinnerradius and \yinnerradius}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \fi%
+ %
+ % Add the points to the saved macro.
+ %
+ \expandafter\let\expandafter\thirdpoint\csname point@\the\c@pgf@counta @\endcsname%
+ \expandafter\addtosavedmacro\expandafter{\csname point@\the\c@pgf@counta @\endcsname}%
+ \fi%
+ %
+ % It is only possible to do the miter calculations if three points are defined.
+ %
+ \ifx\firstpoint\pgfutil@empty%
+ \else%
+ %
+ % Calculate the miter length...
+ %
+ \pgfmathanglebetweenlines{\secondpoint}{\thirdpoint}{\secondpoint}{\firstpoint}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\defaultmiterangle\pgfmathresult%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@x\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \edef\miterlength{\the\pgf@x}%
+ %
+ % ...the miter angle...
+ %
+ \pgfmathanglebetweenlines{\firstpoint}{\secondpoint}{\firstpoint}{\thirdpoint}%
+ \pgfmathadd@{\pgfmathresult}{\defaultmiterangle}%
+ \pgfmathsubtract@{180}{\pgfmathresult}%
+ \let\angletemp\pgfmathresult%
+ \pgfmathanglebetweenpoints{\firstpoint}{\thirdpoint}%
+ \pgfmathsubtract@{180}{\pgfmathresult}%
+ \pgfmathsubtract@{\angletemp}{\pgfmathresult}%
+ \edef\miterangle{\pgfmathresult}%
+ %
+ % ...and thus the border point.
+ %
+ \pgfextract@process\borderpoint{%
+ \secondpoint%
+ \pgf@xa\pgf@x
+ \pgf@ya\pgf@y%
+ \pgfpointpolar{\miterangle}{\miterlength}%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Get the angle from the centerpoint to the *unrotated* border points.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\borderpoint}%
+ \expandafter\edef\csname angletoborderpoint@\the\c@pgf@countb @\endcsname{\pgfmathresult}%
+ \expandafter\addtosavedmacro\expandafter{\csname angletoborderpoint@\the\c@pgf@countb @\endcsname}%
+ %
+ % Rotatee the border points and save.
+ %
+ \expandafter\pgfextract@process\csname borderpoint@\the\c@pgf@countb @\endcsname{%
+ \pgfmathrotatepointaround{\borderpoint}{\centerpoint}{\rotate}%
+ }%
+ \expandafter\addtosavedmacro\expandafter{\csname borderpoint@\the\c@pgf@countb @\endcsname}%
+ %
+ % Now create the anchors.
+ %
+ \c@pgf@countc\c@pgf@countb%
+ \advance\c@pgf@countc1\relax%
+ \divide\c@pgf@countc2\relax%
+ \ifodd\c@pgf@countb\relax%
+ \pgfutil@ifundefined{pgf@anchor@starburst@outer point\space\the\c@pgf@countc}{%
+ \expandafter\xdef\csname pgf@anchor@starburst@outer point\space\the\c@pgf@countc\endcsname{%
+ \noexpand\calculatestarburstpoints%
+ \noexpand\csname borderpoint@\the\c@pgf@countb @\noexpand\endcsname%
+ }%
+ }{}%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@starburst@inner point\space\the\c@pgf@countc}{%
+ \expandafter\xdef\csname pgf@anchor@starburst@inner point\space\the\c@pgf@countc\endcsname{%
+ \noexpand\calculatestarburstpoints%
+ \noexpand\csname borderpoint@\the\c@pgf@countb @\noexpand\endcsname%
+ }%
+ }{}%
+ \fi%
+ \fi%
+ \pgfmathadd@{\angle}{\anglestep}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \let\angle\pgfmathresult%
+ \advance\c@pgf@counta1\relax%
+ \ifnum\c@pgf@counta>\totalpoints%
+ \c@pgf@counta1\relax%
+ \fi%
+ \advance\c@pgf@countb1\relax%
+ \ifnum\c@pgf@countb>\totalpoints%
+ \c@pgf@countb1\relax%
+ \fi%
+ \repeatpgfmathloop%
+ }
+ \savedanchor\centerpoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}%
+ \pgfmathaddtolength\pgf@y{+-.5\dp\pgfnodeparttextbox}%
+ }%
+ \savedanchor\midpoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgf@y0pt\relax%
+ }%
+ \anchor{center}{\centerpoint}
+ \anchor{base}{\basepoint}
+ \anchor{mid}{\midpoint}
+ \anchor{north}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
+ }
+ \anchor{south}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
+ }
+ \anchor{east}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }
+ \anchor{west}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }
+ \anchor{north west}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
+ }
+ \anchor{south west}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
+ }
+ \anchor{north east}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
+ }
+ \anchor{south east}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
+ }
+ \backgroundpath{%
+ \calculatestarburstpoints%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\totalpoints%
+ \else%
+ \ifnum\pgfmathcounter=1\relax%
+ \let\starburstaction\pgfpathmoveto%
+ \else%
+ \let\starburstaction\pgfpathlineto%
+ \fi%
+ \starburstaction{%
+ %\pgfmathrotatepointaround{\csname point@\pgfmathcounter @\endcsname}{\centerpoint}{\rotate}}%
+ \csname point@\pgfmathcounter @\endcsname}
+ \repeatpgfmathloop%
+ \pgfpathclose%
+ }
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Adjust the location of the external
+ % point relative to \centerpoint.
+ %
+ \centerpoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Get the starburst points.
+ %
+ \calculatestarburstpoints%
+ %
+ % Get the angle of the external point to the \centerpoint.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\externalangle\pgfmathresult%
+ %
+ % Locate the appropriate sides on the starburst border...
+ %
+ \ifdim\externalangle pt<90pt\relax%
+ \c@pgf@counta0\relax%
+ \c@pgf@countb\totalpoints\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \else%
+ \ifdim\csname angletoborderpoint@\the\c@pgf@countb @\endcsname pt>90pt\relax%
+ \c@pgf@counta\c@pgf@countb%
+ \else%
+ \ifdim\externalangle pt>\csname angletoborderpoint@\the\c@pgf@countb @\endcsname pt\relax%
+ \c@pgf@counta\c@pgf@countb%
+ \fi%
+ \fi%
+ \advance\c@pgf@countb-1\relax%
+ \repeatpgfmathloop%
+ \edef\first{\the\c@pgf@counta}%
+ \advance\c@pgf@counta1\relax%
+ \ifnum\c@pgf@counta>\totalpoints\relax%
+ \c@pgf@counta1\relax%
+ \fi%
+ \edef\second{\the\c@pgf@counta}%
+ \else%
+ \c@pgf@counta0\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \else%
+ \ifdim\csname angletoborderpoint@\pgfmathcounter @\endcsname pt<90pt\relax%
+ \c@pgf@counta\pgfmathcounter%
+ \else%
+ \ifdim\externalangle pt<\csname angletoborderpoint@\pgfmathcounter @\endcsname pt\relax%
+ \c@pgf@counta\pgfmathcounter%
+ \fi%
+ \fi%
+ \repeatpgfmathloop%
+ \edef\first{\the\c@pgf@counta}%
+ \advance\c@pgf@counta-1\relax%
+ \ifnum\c@pgf@counta=0\relax%
+ \c@pgf@counta\totalpoints\relax%
+ \fi%
+ \edef\second{\the\c@pgf@counta}%
+ \fi%
+ %
+ % ...and thus, the point on the star border.
+ %
+ \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\csname borderpoint@\first @\endcsname}{\csname borderpoint@\second @\endcsname}%
+ }%
}
@@ -533,22 +575,22 @@
\newif\ifpgfcloudignoresaspect%
\pgfcloudignoresaspectfalse%
\pgfkeys{/pgf/.cd,
- cloud puffs/.initial=10,
- cloud puff arc/.initial=150,
- cloud ignores aspect/.is if=pgfcloudignoresaspect,
- cloud anchors use ellipse/.is if=pgfcloudanchorsuseellipse
+ cloud puffs/.initial=10,
+ cloud puff arc/.initial=150,
+ cloud ignores aspect/.is if=pgfcloudignoresaspect,
+ cloud anchors use ellipse/.is if=pgfcloudanchorsuseellipse
}%
% If symbol library is loaded separately these need to be defined.
%
\pgfkeys{/pgf/.cd,
- aspect/.code={\pgfsetshapeaspect{#1}},% this for tikz...
- shape aspect/.initial=1,% but this is consistent with other pgfset stuff.
- shape aspect/.code={%
- \pgfkeys{/pgf/aspect=#1}%
- \pgfkeyssetvalue{/pgf/shape aspect}{#1}
- }%
+ aspect/.code={\pgfsetshapeaspect{#1}},% this for tikz...
+ shape aspect/.initial=1,% but this is consistent with other pgfset stuff.
+ shape aspect/.code={%
+ \pgfkeys{/pgf/aspect=#1}%
+ \pgfkeyssetvalue{/pgf/shape aspect}{#1}
+ }%
}
\def\pgfsetshapeaspect#1{%
@@ -568,717 +610,717 @@
% Shape cloud.
%
\pgfdeclareshape{cloud}{%
- \savedmacro\getradii{%
- \pgfmathtruncatemacro\puffs{\pgfkeysvalueof{/pgf/cloud puffs}}%
- \addtosavedmacro\puffs%
- \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/cloud puffs}}%
- \let\anglestep\pgfmathresult%
- \addtosavedmacro\anglestep%
- \pgfmathsetmacro\arc{\pgfkeysvalueof{/pgf/cloud puff arc}}%
- \addtosavedmacro\arc%
- %
- % x radius.
- %
- \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
- \advance\pgf@x.5\wd\pgfnodeparttextbox%
- \pgf@x1.4142135\pgf@x%
- %
- % y radius.
- %
- \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
- \advance\pgf@y.5\ht\pgfnodeparttextbox%
- \advance\pgf@y.5\dp\pgfnodeparttextbox%
- \pgf@y1.4142135\pgf@y%
- %
- % Adjust for shape aspect.
- %
- \ifpgfcloudignoresaspect%
- \pgf@xc\pgf@x%
- \pgf@yc\pgf@y%
- \else%
- \pgf@xc\pgfshapeaspect\pgf@y%
- \ifdim\pgf@xc<\pgf@x%
- \pgf@xc\pgf@x%
- \fi%
- \pgf@yc\pgfshapeaspectinverse\pgf@xc%
- \ifdim\pgf@yc<\pgf@y%
- \pgf@yc\pgf@y%
- \pgf@xc\pgfshapeaspect\pgf@y%
- \fi%
- \fi%
- %
- \edef\xinnerradius{\the\pgf@xc}%
- \edef\yinnerradius{\the\pgf@yc}%
- %
- % Get the larger of the outer sep.
- %
- \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
- \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
- \ifdim\pgf@x<\pgf@y%
- \pgf@x\pgf@y%
- \fi%
- \edef\outersep{\the\pgf@x}%
- \addtosavedmacro\outersep%
- %
- % For a given cloud, with puff arc length a, the quotient of the
- % distance between the start and end point of a puffs circular arc
- % and the radius of that arc, is constant:
- %
- % g = .5 * sec((180-a)/2)
- %
- \pgfmathsubtract{180}{\arc}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\tempangle\pgfmathresult%
- \pgfmathsec@{\pgfmathresult}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\arcradiusquotient\pgfmathresult%
- \addtosavedmacro\arcradiusquotient%
- %
- % In addition, the quotient of the distance between the start and
- % end point of a puffs circular arc and the height of that arc
- % (ignoring rotation), is also constant:
- %
- % h = .5 * (1-sin((180-a)/2))/cos((180-a)/2)
- % = g * (1 - sin((180-a)/2))
- \pgfmathsin@{\tempangle}%
- \pgfmathsubtract@{1}{\pgfmathresult}%
- \pgfmathmultiply@{\pgfmathresult}{\arcradiusquotient}%
- \let\archeightquotient\pgfmathresult%
- \addtosavedmacro\archeightquotient%
- %
- % Minimum size is applied to the circum-ellipse (i.e. the ellipse
- % that passes through the extremeties of each puff). Thus, the
- % relationship between the radii of the elliptical incircle ("inellipse"?)
- % of the cloud (x and y) and the radii of the circum-ellispe (X and Y),
- % is given by
- %
- % X = 2(x*cos(p/2) + ky)
- % Y = 2(y*cos(p/2) + kx)
- %
- % where:
- % k = sin(p/2)*((1-cos(a/2))/sin(a/2))
- % p = the angle between each puff (i.e. 360/<puffs>)
- % a = the length of arc of the puff.
- %
- \pgfmathdivide{\arc}{2}%
- \let\halfarcangle\pgfmathresult%
- \pgfmathcos@{\pgfmathresult}%
- \pgfmathsubtract@{1}{\pgfmathresult}%
- \let\pgf@temp\pgfmathresult%
- \pgfmathsin@{\halfarcangle}%
- \pgfmathdivide@{\pgf@temp}{\pgfmathresult}%
- \let\pgf@temp\pgfmathresult%
- \pgfmathdivide@{\anglestep}{2}%
- \pgfmathsin@{\pgfmathresult}%
- \pgfmathmultiply@{\pgfmathresult}{\pgf@temp}%
- \let\k\pgfmathresult%
- %
- \pgfmathdivide@{\anglestep}{2}%
- \pgfmathcos@{\pgfmathresult}%
- \let\coshalfanglestep\pgfmathresult%
- %
- % Calculate the actual radii of the circum-ellipse.
- %
- \pgf@x\xinnerradius\relax%
- \pgf@y\yinnerradius\relax%
- \pgf@xa\coshalfanglestep\pgf@x%
- \advance\pgf@xa\k\pgf@y%
- \pgf@ya\coshalfanglestep\pgf@y%
- \advance\pgf@ya\k\pgf@x%
- %
- % Adjust for minimum height (Y').
- %
- \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
- \ifdim\pgf@ya<.5\pgf@yb%
- \pgf@ya.5\pgf@yb%
- \fi%
- %
- % Adjust for minimum width (X').
- %
- \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
- \ifdim\pgf@xa<.5\pgf@xb%
- \pgf@xa.5\pgf@xb%
- \fi%
- %
- \edef\xouterradius{\the\pgf@xa}%
- \addtosavedmacro\xouterradius%
- \edef\youterradius{\the\pgf@ya}%
- \addtosavedmacro\youterradius%
- %
- % Now recalculate `in-ellispe' radii:
- %
- % x = (X'cos(p/2)-kY')/cos^2(p/2)-k^2,
- % y = (Y'cos(p/2)-kX')/cos^2(p/2)-k^2,
- %
- \pgf@xc\k pt\relax%
- \pgf@xc-\k\pgf@xc%
- \pgf@yc\coshalfanglestep pt\relax%
- \pgf@yc\coshalfanglestep\pgf@yc%
- \advance\pgf@xc\pgf@yc\relax%
- \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xc}}% cos^2(p/2)-k^2
- %
- \pgf@x\coshalfanglestep\pgf@xa%
- \advance\pgf@x-\k\pgf@ya%
- \pgf@x\pgfmathresult\pgf@x%
- \pgf@y\coshalfanglestep\pgf@ya%
- \advance\pgf@y-\k\pgf@xa%
- \pgf@y\pgfmathresult\pgf@y%
- %
- \edef\xinnerradius{\the\pgf@x}%
- \edef\yinnerradius{\the\pgf@y}%
- \addtosavedmacro\xinnerradius%
- \addtosavedmacro\yinnerradius%
- %
- % Get some useful trig. constants.
- %
- \pgfmathdivide@{\arc}{4}%
- \let\quarterarc\pgfmathresult%
- \pgfmathsubtract@{180}{\arc}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\halfcomplementarc\pgfmathresult%
- %
- \addtosavedmacro\arc%
- \addtosavedmacro\quarterarc%
- \addtosavedmacro\halfcomplementarc%
- %
- \pgfmathsec@{\halfcomplementarc}% 1/cos((180-a)/2)
- \let\sechalfcomplementarc\pgfmathresult%
- \pgfmathsin@{\halfcomplementarc}% sin((180-a)/2)
- \let\sinhalfcomplementarc\pgfmathresult%
- %
- \addtosavedmacro\sechalfcomplementarc%
- \addtosavedmacro\sinhalfcomplementarc%
- %
- \pgfmathsin@{\quarterarc}% sin(a/4)
- \let\sinquarterarc\pgfmathresult%
- \pgfmathcos@{\quarterarc}% cos(a/4)
- \let\cosquarterarc\pgfmathresult%
- \pgfmathreciprocal@{\cosquarterarc}%
- \pgfmathmultiply@{\pgfmathresult}{\sinquarterarc}% tan(a/4)
- \let\tanquarterarc\pgfmathresult%
- %
- \addtosavedmacro\sinquarterarc%
- \addtosavedmacro\cosquarterarc%
- \addtosavedmacro\tanquarterarc%
- %
- }
- \savedanchor\centerpoint{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgf@y.5\ht\pgfnodeparttextbox%
- \advance\pgf@y-.5\dp\pgfnodeparttextbox%
- }
- \savedanchor\midpoint{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgfmathsetlength\pgf@y{+.5ex}%
- }
- \savedanchor\basepoint{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgf@y0pt%
- }
- \anchor{center}{\centerpoint}
- \anchor{mid}{\midpoint}
- \anchor{base}{\basepoint}
- \anchor{north}{%
- \getradii%
- \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{0pt}{\youterradius}}%
- }%
- \anchor{south}{%
- \getradii%
- \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{0pt}{-\youterradius}}%
- }%
- \anchor{east}{%
- \getradii%
- \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{\xouterradius}{0pt}}%
- }%
- \anchor{west}{%
- \getradii%
- \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{-\xouterradius}{0pt}}%
- }%
- \anchor{north west}{%
- \getradii%
- \pgfextract@process\pgf@sh{%
- \pgf@x\xouterradius\relax%
- \pgf@x-0.707106\pgf@x%
- \pgf@y\youterradius\relax%
- \pgf@y0.707106\pgf@y%
- }%
- \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
- }%
- \anchor{north east}{%
- \getradii%
- \pgfextract@process\pgf@sh{%
- \pgf@x\xouterradius\relax%
- \pgf@x0.707106\pgf@x%
- \pgf@y\youterradius\relax%
- \pgf@y0.707106\pgf@y%
- }%
- \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
- }%
- \anchor{south west}{%
- \getradii%
- \pgfextract@process\pgf@sh{%
- \pgf@x\xouterradius\relax%
- \pgf@x-0.707106\pgf@x%
- \pgf@y\youterradius\relax%
- \pgf@y-0.707106\pgf@y%
- }%
- \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
- }%
- \anchor{south east}{%
- \getradii%
- \pgfextract@process\pgf@sh{%
- \pgf@x\xouterradius\relax%
- \pgf@x0.707106\pgf@x%
- \pgf@y\youterradius\relax%
- \pgf@y-0.707106\pgf@y%
- }%
- \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
- }%
- %
- % Each `puff' is a circular arc of length a, drawn using two a/2
- % arcs (a < 180), approximated by Bezier curves.
- % Due to TeX rounding errors, it is sometimes necessary to `force'
- % the arc to end at a specific point. So...
- %
- % @article{riskus2006,
- % author = {Aleskus Ri\v{s}kus},
- % title = {Approximation of a cubic Bezier curve by circular arcs and vice versa},
- % journal = {Information Technology and Control},
- % year = {2006},
- % volume = {35},
- % number = {4}
- % }
- %
- \backgroundpath{%
- {%
- \getradii%
- %
- % Get the start angle.
- %
- \pgfmathdivide@{\anglestep}{2}%
- \pgfmathsubtract@{90}{\pgfmathresult}%
- \let\angle\pgfmathresult%
- %
- % Calculate the first arc point.
- %
- \pgfextract@process\arcfirstpoint{%
- \pgfpointadd{\centerpoint}{%
- \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
- }%
- }%
- \pgfpathmoveto{\arcfirstpoint}%
- \let\arcendpoint\arcfirstpoint%
- %
- \pgfmathloop%
- \ifnum\pgfmathcounter>\puffs\relax%
- \else
- \let\arcstartpoint\arcendpoint%
- %
- % Make sure beginning and end of path are exactly the same.
- %
- \ifnum\pgfmathcounter=\puffs\relax%
- \let\arcendpoint\arcfirstpoint%
- \else%
- \pgfmathadd@{\angle}{\anglestep}%
- \let\angle\pgfmathresult%
- \pgfextract@process\arcendpoint{%
- \pgfpointadd{\centerpoint}{%
- \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
- }%
- }%
- \fi%
- %
- % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
- %
- \pgf@sh@getcloudpuffparameters%
- %
- % Get the rotation for the Bezier curve.
- %
- \pgfmathsubtract@{90}{\quarterarc}%
- \pgfmathadd@{\pgfmathresult}{\arcslope}%
- \let\arcrotate\pgfmathresult%
- \pgfmathsin@{\arcrotate}%
- \let\sinarcrotate\pgfmathresult%
- \pgfmathcos@{\arcrotate}%
- \let\cosarcrotate\pgfmathresult%
- %
- % Calculate the amount by which to scale the control
- % points, in order to approximate an a/2 arc with radius x.
- %
- \pgf@x\arcradius\relax%
- \pgf@x\tanquarterarc\pgf@x% tan(a/4)
- \edef\controlscale{\pgfmath@tonumber{\pgf@x}}%
- %
- % Get the first control point for the first arc (length a/2)...
- %
- \pgfextract@process\controlone{%
- %
- % k = 0.552284745 (a `magic' number)...
- %
- \pgf@x0.55228475pt\relax%
- \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
- \pgf@y0.55228475pt\relax%
- \pgf@y\cosquarterarc\pgf@y% k * cos(a/2)
- %
- % ...scale the control points up...
- %
- \pgf@x\controlscale\pgf@x%
- \pgf@y\controlscale\pgf@y%
- %
- % ...rotate...
- %
- \pgf@xa\cosarcrotate\pgf@x%
- \advance\pgf@xa-\sinarcrotate\pgf@y%
- \pgf@ya\cosarcrotate\pgf@y%
- \advance\pgf@ya\sinarcrotate\pgf@x%
- %
- % ...and shift.
- %
- \arcstartpoint%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
- %
- % Get the midpoint of the 150° arc.
- %
- \pgfextract@process\arcmidpoint{%
- \pgfextract@process\arcmidpoint{%
- \pgf@x-\halfchordlength\relax%
- \pgf@y\segmentheight\relax%
- }%
- \pgfpointadd{\arcstartpoint}{%
- \pgfmathrotatepointaround{\arcmidpoint}{\pgfpointorigin}{\arcslope}%
- }%
- }%
- %
- % Get the second control point for the first arc (length a/2)...
- %
- \pgfextract@process\controltwo{%
- \pgf@x0.55228475pt\relax%
- \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
- \pgf@y-0.55228475pt\relax%
- \pgf@y\cosquarterarc\pgf@y% -k * cos(a/2)
- %
- % ...scale, rotate and shift.
- %
- \pgf@x\controlscale\pgf@x%
- \pgf@y\controlscale\pgf@y%
- %
- \pgf@xa\cosarcrotate\pgf@x%
- \advance\pgf@xa-\sinarcrotate\pgf@y%
- \pgf@ya\cosarcrotate\pgf@y%
- \advance\pgf@ya\sinarcrotate\pgf@x%
- %
- \arcmidpoint%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
- {%
- \pgfsetcornersarced{\pgfpointorigin}%
- \pgfpathcurveto{\controlone}{\controltwo}{\arcmidpoint}%
- }%
- %
- % Do the same for the second arc...
- %
- \pgfmathadd@{\quarterarc}{90}%
- \pgfmathadd@{\pgfmathresult}{\arcslope}%
- \let\arcrotate\pgfmathresult%
- \pgfmathsin@{\arcrotate}%
- \let\sinarcrotate\pgfmathresult%
- \pgfmathcos@{\arcrotate}%
- \let\cosarcrotate\pgfmathresult%
- %
- % First control point for the second arc...
- %
- \pgfextract@process\controlone{%
- \pgf@x0.55228475pt\relax%
- \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
- \pgf@y0.55228475pt\relax%
- \pgf@y\cosquarterarc\pgf@y% k * cos(a/2)
- %
- % ...scale, rotate and shift.
- %
- \pgf@x\controlscale\pgf@x%
- \pgf@y\controlscale\pgf@y%
- %
- \pgf@xa\cosarcrotate\pgf@x%
- \advance\pgf@xa-\sinarcrotate\pgf@y%
- \pgf@ya\cosarcrotate\pgf@y%
- \advance\pgf@ya\sinarcrotate\pgf@x%
- %
- \arcmidpoint%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
- %
- % Second control point for the second arc.
- %
- \pgfextract@process\controltwo{%
- \pgf@x0.55228475pt\relax%
- \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
- \pgf@y-0.55228475pt\relax%
- \pgf@y\cosquarterarc\pgf@y% -k * cos(a/2)
- %
- % ...scale, rotate and shift.
- %
- \pgf@x\controlscale\pgf@x%
- \pgf@y\controlscale\pgf@y%
- %
- \pgf@xa\cosarcrotate\pgf@x%
- \advance\pgf@xa-\sinarcrotate\pgf@y%
- \pgf@ya\cosarcrotate\pgf@y%
- \advance\pgf@ya\sinarcrotate\pgf@x%
- %
- \arcendpoint%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
- \pgfpathcurveto{\controlone}{\controltwo}{\arcendpoint}%
- \repeatpgfmathloop%
- \pgfpathclose% Phew!
- }%
- }%
- %
- % Calculate a point on the border of the cloud. This is a two-stage process:
- %
- % 1. Locate the correct puff.
- % 2. Locate the angle on the circular arc which forms the puff.
- %
- \anchorborder{%
- %
- % Save x and y.
- %
- \edef\externalx{\the\pgf@x}%
- \edef\externaly{\the\pgf@y}%
- %
- % Get the inner radii and trig. constants.
- %
- \getradii%
- %
- %
- %
- \ifpgfcloudanchorsuseellipse%
- \pgfpointadd{\centerpoint}{%
- \pgfpointborderellipse{%
- \pgfpoint{\externalx}{\externaly}
- }{%
- \pgfpoint{\xouterradius}{\youterradius}
- }%
- }%
- \else%
- \pgfextract@process\externalpoint{%
- \centerpoint%
- \advance\pgf@x\externalx\relax%
- \advance\pgf@y\externaly\relax%
- }%
- \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
- \let\externalangle\pgfmathresult%
- %
- % 1. Locate the correct puff:
- %
- % Get end angle of the relavent puff arc.
- %
- \pgfmathdivide@{\anglestep}{2}%
- \let\halfanglestep\pgfmathresult%
- \pgfmathsubtract@{90}{\halfanglestep}%
- \let\endangle\pgfmathresult%
- \pgfmathloop%
- \pgfmathsubtract@{\endangle}{\anglestep}%
- \ifdim\pgfmathresult pt<-\anglestep pt\relax%
- \else%
- \let\endangle\pgfmathresult%
- \repeatpgfmathloop%
- \def\angle{0}%
- \let\lastangle\angle%
- \pgfmathloop%
- \pgfmathadd@{\endangle}{\anglestep}%
- \let\endangle\pgfmathresult%
- %
- % Calculate the `miter point'. This is the point between
- % each puff, and takes into account the outer sep.
- %
- \pgfextract@process\miterpoint{%
- %
- \pgfextract@process\secondpoint{%
- \pgfpointpolar{+\endangle}{+\xinnerradius and +\yinnerradius}%
- }%
- %
- \pgfmathadd@{\endangle}{\anglestep}%
- \let\angletemp\pgfmathresult%
- \pgfextract@process\thirdpoint{%
- \pgfpointpolar{+\angletemp}{+\xinnerradius and +\yinnerradius}%
- }%
- %
- \pgfmathsubtract@{\endangle}{\anglestep}%
- \let\angletemp\pgfmathresult%
- \pgfextract@process\firstpoint{%
- \pgfpointpolar{+\angletemp}{+\xinnerradius and +\yinnerradius}%
- }%
- %
- \pgfmathanglebetweenpoints{\firstpoint}{\secondpoint}%
- \let\anglealpha\pgfmathresult%
- \pgfmathanglebetweenpoints{\secondpoint}{\thirdpoint}%
- \let\anglebeta\pgfmathresult%
- %
- \pgfmathsubtract@{\anglebeta}{\anglealpha}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \pgfmathadd@{\pgfmathresult}{\halfcomplementarc}%
- \pgfmathcosec@{\pgfmathresult}%
- \pgf@x\outersep\relax%
- \pgf@x\pgfmathresult\pgf@x%
- \edef\miterradius{\the\pgf@x}%
- %
- \pgfmathadd@{\anglealpha}{\anglebeta}%
- \pgfmathsubtract@{\pgfmathresult}{180}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\miterangle\pgfmathresult%
- \pgfpointadd{\secondpoint}{%
- \pgfqpointpolar{\miterangle}{\miterradius}%
- }%
- }%
- %
- % Get the angle of the miter point...
- %
- \pgfmathanglebetweenpoints{\pgfpointorigin}{\miterpoint}%
- \let\angle\pgfmathresult%
- \ifdim\angle pt<\lastangle pt\relax% Guard against 360° = 0°
- \pgfmathadd@{\angle}{360}%
- \let\angle\pgfmathresult%
- \fi%
- \let\lastangle\angle%
- %
- % ...and see if it is greater than the external point.
- %
- \ifdim\externalangle pt>\angle pt\relax%
- \repeatpgfmathloop%
- %
- % Get the start angle of the relevant arc and ensure angles are in the range.
- %
- \pgfmathmod@{\endangle}{360}%
- \let\endangle\pgfmathresult%
- \pgfmathsubtract@{\endangle}{\anglestep}%
- \ifdim\pgfmathresult pt<0pt\relax%
- \pgfmathadd@{\pgfmathresult}{360}%
- \fi%
- \let\startangle\pgfmathresult%
- %
- % Now, get the start and end points of the arc.
- %
- \pgfextract@process\arcstartpoint{%
- \pgfpointadd{\centerpoint}{%
- \pgfpointpolar{+\startangle}{+\xinnerradius and +\yinnerradius}%
- }%
- }%
- \pgfextract@process\arcendpoint{%
- \pgfpointadd{\centerpoint}{%
- \pgfpointpolar{+\endangle}{+\xinnerradius and +\yinnerradius}%
- }%
- }%
- %
- % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
- %
- \pgf@sh@getcloudpuffparameters%
- %
- % Hackery, for when an arc straddles 0°.
- %
- \ifdim\endangle pt<\startangle pt\relax%
- \pgfmathadd@{\externalangle}{180}%
- \pgfmathmod@{\pgfmathresult}{360}%
- \let\x\pgfmathresult%
- \else%
- \let\x\externalangle%
- \fi%
- %
- % 2. Locate the angle on the circular arc which forms the puff.
- %
- % Essentially a binary search to find the angle on the circular
- % arc, which provides the nearset estimate to the border point.
- %
- \let\s\halfcomplementarc% The start of the arc.
- \pgfmathadd@{\s}{\arc}%
- \let\e\pgfmathresult% The end of the arc.
- \pgfmathadd@{\e}{\s}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\n\pgfmathresult% The nearest estimate (default to middle of arc).
- \def\m{360}% Measure of `nearness'.
- \pgfmathloop%
- \pgfmathadd@{\e}{\s}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\p\pgfmathresult% The point halfway between \s and \e.
- \ifdim\p pt=\s pt\relax%
- \else%
- %
- % Get the point on the circular arc.
- %
- \pgfmathadd@{\p}{\arcslope}%
- \let\a\pgfmathresult%
- \pgfextract@process\arcpoint{%
- \pgfpointadd{\circlecenterpoint}{%
- \pgfqpointpolar{\a}{\outerarcradius}%
- }%
- }%
- %
- % Find the angle between the node centre and the point on the arc.
- %
- \pgfmathanglebetweenpoints{\centerpoint}{\arcpoint}%
- %
- % Hackery, for when an arc straddles 0°.
- %
- \ifdim\endangle pt<\startangle pt\relax%
- \pgfmathadd@{\pgfmathresult}{180}%
- \pgfmathmod@{\pgfmathresult}{360}%
- \fi%
- \let\q\pgfmathresult%
- \ifdim\x pt=\q pt% Found it!
- \pgfmathbreakloop% Breaks after current iteration is complete.
- \else
- \ifdim\x pt<\q pt\relax%
- \let\e\p%
- \else%
- \let\s\p%
- \fi%
- \fi%
- \pgfmathsubtract@{\x}{\q}%
- \pgfmathabs@{\pgfmathresult}%
- %
- % Save the estimate if it is better than any previous estimate.
- %
- \ifdim\pgfmathresult pt<\m pt\relax%
- \let\m\pgfmathresult%
- \let\n\p%
- \fi%
- \repeatpgfmathloop%
- %
- % Use the nearest estimate as the anchor angle.
- %
- \pgfmathadd@{\n}{\arcslope}%
- \let\anchorangle\pgfmathresult%
- %
- % Finally, the required point.
- %
- \pgfpointadd{\circlecenterpoint}{%
- \pgfqpointpolar{\anchorangle}{\outerarcradius}%
- }%
- \fi%
- }% Again, Phew!
- %
- % Now, a sneaky hack. This means an arbitrary `puff' anchors
- % can be used for positiong the cloud shape. This is needed
- % if a cloud is positioned using the `puff <n+1>' anchor, where
- % n is the number of puffs of any previously drawn cloud.
- %
- \pgfutil@g@addto@macro\pgf@sh@s@cloud{%
- \c@pgf@counta\puffs\relax%
- \pgfmathloop%
- \ifnum\c@pgf@counta>0\relax%
- \pgfutil@ifundefined{pgf@anchor@cloud@puff\space\the\c@pgf@counta}{%
- \expandafter\xdef\csname pgf@anchor@cloud@puff\space\the\c@pgf@counta\endcsname{%
- \noexpand\pgf@sh@@cloudpuffanchor{\the\c@pgf@counta}%
- }%
- }{\c@pgf@counta0\relax}%
- \advance\c@pgf@counta-1\relax%
- \repeatpgfmathloop%
- }%
+ \savedmacro\getradii{%
+ \pgfmathtruncatemacro\puffs{\pgfkeysvalueof{/pgf/cloud puffs}}%
+ \addtosavedmacro\puffs%
+ \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/cloud puffs}}%
+ \let\anglestep\pgfmathresult%
+ \addtosavedmacro\anglestep%
+ \pgfmathsetmacro\arc{\pgfkeysvalueof{/pgf/cloud puff arc}}%
+ \addtosavedmacro\arc%
+ %
+ % x radius.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@x1.4142135\pgf@x%
+ %
+ % y radius.
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \pgf@y1.4142135\pgf@y%
+ %
+ % Adjust for shape aspect.
+ %
+ \ifpgfcloudignoresaspect%
+ \pgf@xc\pgf@x%
+ \pgf@yc\pgf@y%
+ \else%
+ \pgf@xc\pgfshapeaspect\pgf@y%
+ \ifdim\pgf@xc<\pgf@x%
+ \pgf@xc\pgf@x%
+ \fi%
+ \pgf@yc\pgfshapeaspectinverse\pgf@xc%
+ \ifdim\pgf@yc<\pgf@y%
+ \pgf@yc\pgf@y%
+ \pgf@xc\pgfshapeaspect\pgf@y%
+ \fi%
+ \fi%
+ %
+ \edef\xinnerradius{\the\pgf@xc}%
+ \edef\yinnerradius{\the\pgf@yc}%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ \addtosavedmacro\outersep%
+ %
+ % For a given cloud, with puff arc length a, the quotient of the
+ % distance between the start and end point of a puffs circular arc
+ % and the radius of that arc, is constant:
+ %
+ % g = .5 * sec((180-a)/2)
+ %
+ \pgfmathsubtract{180}{\arc}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\tempangle\pgfmathresult%
+ \pgfmathsec@{\pgfmathresult}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\arcradiusquotient\pgfmathresult%
+ \addtosavedmacro\arcradiusquotient%
+ %
+ % In addition, the quotient of the distance between the start and
+ % end point of a puffs circular arc and the height of that arc
+ % (ignoring rotation), is also constant:
+ %
+ % h = .5 * (1-sin((180-a)/2))/cos((180-a)/2)
+ % = g * (1 - sin((180-a)/2))
+ \pgfmathsin@{\tempangle}%
+ \pgfmathsubtract@{1}{\pgfmathresult}%
+ \pgfmathmultiply@{\pgfmathresult}{\arcradiusquotient}%
+ \let\archeightquotient\pgfmathresult%
+ \addtosavedmacro\archeightquotient%
+ %
+ % Minimum size is applied to the circum-ellipse (i.e. the ellipse
+ % that passes through the extremeties of each puff). Thus, the
+ % relationship between the radii of the elliptical incircle ("inellipse"?)
+ % of the cloud (x and y) and the radii of the circum-ellispe (X and Y),
+ % is given by
+ %
+ % X = 2(x*cos(p/2) + ky)
+ % Y = 2(y*cos(p/2) + kx)
+ %
+ % where:
+ % k = sin(p/2)*((1-cos(a/2))/sin(a/2))
+ % p = the angle between each puff (i.e. 360/<puffs>)
+ % a = the length of arc of the puff.
+ %
+ \pgfmathdivide{\arc}{2}%
+ \let\halfarcangle\pgfmathresult%
+ \pgfmathcos@{\pgfmathresult}%
+ \pgfmathsubtract@{1}{\pgfmathresult}%
+ \let\pgf@temp\pgfmathresult%
+ \pgfmathsin@{\halfarcangle}%
+ \pgfmathdivide@{\pgf@temp}{\pgfmathresult}%
+ \let\pgf@temp\pgfmathresult%
+ \pgfmathdivide@{\anglestep}{2}%
+ \pgfmathsin@{\pgfmathresult}%
+ \pgfmathmultiply@{\pgfmathresult}{\pgf@temp}%
+ \let\k\pgfmathresult%
+ %
+ \pgfmathdivide@{\anglestep}{2}%
+ \pgfmathcos@{\pgfmathresult}%
+ \let\coshalfanglestep\pgfmathresult%
+ %
+ % Calculate the actual radii of the circum-ellipse.
+ %
+ \pgf@x\xinnerradius\relax%
+ \pgf@y\yinnerradius\relax%
+ \pgf@xa\coshalfanglestep\pgf@x%
+ \advance\pgf@xa\k\pgf@y%
+ \pgf@ya\coshalfanglestep\pgf@y%
+ \advance\pgf@ya\k\pgf@x%
+ %
+ % Adjust for minimum height (Y').
+ %
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@ya<.5\pgf@yb%
+ \pgf@ya.5\pgf@yb%
+ \fi%
+ %
+ % Adjust for minimum width (X').
+ %
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@xa<.5\pgf@xb%
+ \pgf@xa.5\pgf@xb%
+ \fi%
+ %
+ \edef\xouterradius{\the\pgf@xa}%
+ \addtosavedmacro\xouterradius%
+ \edef\youterradius{\the\pgf@ya}%
+ \addtosavedmacro\youterradius%
+ %
+ % Now recalculate `in-ellispe' radii:
+ %
+ % x = (X'cos(p/2)-kY')/cos^2(p/2)-k^2,
+ % y = (Y'cos(p/2)-kX')/cos^2(p/2)-k^2,
+ %
+ \pgf@xc\k pt\relax%
+ \pgf@xc-\k\pgf@xc%
+ \pgf@yc\coshalfanglestep pt\relax%
+ \pgf@yc\coshalfanglestep\pgf@yc%
+ \advance\pgf@xc\pgf@yc\relax%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xc}}% cos^2(p/2)-k^2
+ %
+ \pgf@x\coshalfanglestep\pgf@xa%
+ \advance\pgf@x-\k\pgf@ya%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y\coshalfanglestep\pgf@ya%
+ \advance\pgf@y-\k\pgf@xa%
+ \pgf@y\pgfmathresult\pgf@y%
+ %
+ \edef\xinnerradius{\the\pgf@x}%
+ \edef\yinnerradius{\the\pgf@y}%
+ \addtosavedmacro\xinnerradius%
+ \addtosavedmacro\yinnerradius%
+ %
+ % Get some useful trig. constants.
+ %
+ \pgfmathdivide@{\arc}{4}%
+ \let\quarterarc\pgfmathresult%
+ \pgfmathsubtract@{180}{\arc}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\halfcomplementarc\pgfmathresult%
+ %
+ \addtosavedmacro\arc%
+ \addtosavedmacro\quarterarc%
+ \addtosavedmacro\halfcomplementarc%
+ %
+ \pgfmathsec@{\halfcomplementarc}% 1/cos((180-a)/2)
+ \let\sechalfcomplementarc\pgfmathresult%
+ \pgfmathsin@{\halfcomplementarc}% sin((180-a)/2)
+ \let\sinhalfcomplementarc\pgfmathresult%
+ %
+ \addtosavedmacro\sechalfcomplementarc%
+ \addtosavedmacro\sinhalfcomplementarc%
+ %
+ \pgfmathsin@{\quarterarc}% sin(a/4)
+ \let\sinquarterarc\pgfmathresult%
+ \pgfmathcos@{\quarterarc}% cos(a/4)
+ \let\cosquarterarc\pgfmathresult%
+ \pgfmathreciprocal@{\cosquarterarc}%
+ \pgfmathmultiply@{\pgfmathresult}{\sinquarterarc}% tan(a/4)
+ \let\tanquarterarc\pgfmathresult%
+ %
+ \addtosavedmacro\sinquarterarc%
+ \addtosavedmacro\cosquarterarc%
+ \addtosavedmacro\tanquarterarc%
+ %
+ }
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }
+ \anchor{center}{\centerpoint}
+ \anchor{mid}{\midpoint}
+ \anchor{base}{\basepoint}
+ \anchor{north}{%
+ \getradii%
+ \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{0pt}{\youterradius}}%
+ }%
+ \anchor{south}{%
+ \getradii%
+ \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{0pt}{-\youterradius}}%
+ }%
+ \anchor{east}{%
+ \getradii%
+ \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{\xouterradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \getradii%
+ \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{-\xouterradius}{0pt}}%
+ }%
+ \anchor{north west}{%
+ \getradii%
+ \pgfextract@process\pgf@sh{%
+ \pgf@x\xouterradius\relax%
+ \pgf@x-0.707106\pgf@x%
+ \pgf@y\youterradius\relax%
+ \pgf@y0.707106\pgf@y%
+ }%
+ \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
+ }%
+ \anchor{north east}{%
+ \getradii%
+ \pgfextract@process\pgf@sh{%
+ \pgf@x\xouterradius\relax%
+ \pgf@x0.707106\pgf@x%
+ \pgf@y\youterradius\relax%
+ \pgf@y0.707106\pgf@y%
+ }%
+ \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
+ }%
+ \anchor{south west}{%
+ \getradii%
+ \pgfextract@process\pgf@sh{%
+ \pgf@x\xouterradius\relax%
+ \pgf@x-0.707106\pgf@x%
+ \pgf@y\youterradius\relax%
+ \pgf@y-0.707106\pgf@y%
+ }%
+ \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
+ }%
+ \anchor{south east}{%
+ \getradii%
+ \pgfextract@process\pgf@sh{%
+ \pgf@x\xouterradius\relax%
+ \pgf@x0.707106\pgf@x%
+ \pgf@y\youterradius\relax%
+ \pgf@y-0.707106\pgf@y%
+ }%
+ \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
+ }%
+ %
+ % Each `puff' is a circular arc of length a, drawn using two a/2
+ % arcs (a < 180), approximated by Bezier curves.
+ % Due to TeX rounding errors, it is sometimes necessary to `force'
+ % the arc to end at a specific point. So...
+ %
+ % @article{riskus2006,
+ % author = {Aleskus Ri\v{s}kus},
+ % title = {Approximation of a cubic Bezier curve by circular arcs and vice versa},
+ % journal = {Information Technology and Control},
+ % year = {2006},
+ % volume = {35},
+ % number = {4}
+ % }
+ %
+ \backgroundpath{%
+ {%
+ \getradii%
+ %
+ % Get the start angle.
+ %
+ \pgfmathdivide@{\anglestep}{2}%
+ \pgfmathsubtract@{90}{\pgfmathresult}%
+ \let\angle\pgfmathresult%
+ %
+ % Calculate the first arc point.
+ %
+ \pgfextract@process\arcfirstpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ \pgfpathmoveto{\arcfirstpoint}%
+ \let\arcendpoint\arcfirstpoint%
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\puffs\relax%
+ \else
+ \let\arcstartpoint\arcendpoint%
+ %
+ % Make sure beginning and end of path are exactly the same.
+ %
+ \ifnum\pgfmathcounter=\puffs\relax%
+ \let\arcendpoint\arcfirstpoint%
+ \else%
+ \pgfmathadd@{\angle}{\anglestep}%
+ \let\angle\pgfmathresult%
+ \pgfextract@process\arcendpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ \fi%
+ %
+ % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
+ %
+ \pgf@sh@getcloudpuffparameters%
+ %
+ % Get the rotation for the Bezier curve.
+ %
+ \pgfmathsubtract@{90}{\quarterarc}%
+ \pgfmathadd@{\pgfmathresult}{\arcslope}%
+ \let\arcrotate\pgfmathresult%
+ \pgfmathsin@{\arcrotate}%
+ \let\sinarcrotate\pgfmathresult%
+ \pgfmathcos@{\arcrotate}%
+ \let\cosarcrotate\pgfmathresult%
+ %
+ % Calculate the amount by which to scale the control
+ % points, in order to approximate an a/2 arc with radius x.
+ %
+ \pgf@x\arcradius\relax%
+ \pgf@x\tanquarterarc\pgf@x% tan(a/4)
+ \edef\controlscale{\pgfmath@tonumber{\pgf@x}}%
+ %
+ % Get the first control point for the first arc (length a/2)...
+ %
+ \pgfextract@process\controlone{%
+ %
+ % k = 0.552284745 (a `magic' number)...
+ %
+ \pgf@x0.55228475pt\relax%
+ \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
+ \pgf@y0.55228475pt\relax%
+ \pgf@y\cosquarterarc\pgf@y% k * cos(a/2)
+ %
+ % ...scale the control points up...
+ %
+ \pgf@x\controlscale\pgf@x%
+ \pgf@y\controlscale\pgf@y%
+ %
+ % ...rotate...
+ %
+ \pgf@xa\cosarcrotate\pgf@x%
+ \advance\pgf@xa-\sinarcrotate\pgf@y%
+ \pgf@ya\cosarcrotate\pgf@y%
+ \advance\pgf@ya\sinarcrotate\pgf@x%
+ %
+ % ...and shift.
+ %
+ \arcstartpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Get the midpoint of the 150� arc.
+ %
+ \pgfextract@process\arcmidpoint{%
+ \pgfextract@process\arcmidpoint{%
+ \pgf@x-\halfchordlength\relax%
+ \pgf@y\segmentheight\relax%
+ }%
+ \pgfpointadd{\arcstartpoint}{%
+ \pgfmathrotatepointaround{\arcmidpoint}{\pgfpointorigin}{\arcslope}%
+ }%
+ }%
+ %
+ % Get the second control point for the first arc (length a/2)...
+ %
+ \pgfextract@process\controltwo{%
+ \pgf@x0.55228475pt\relax%
+ \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
+ \pgf@y-0.55228475pt\relax%
+ \pgf@y\cosquarterarc\pgf@y% -k * cos(a/2)
+ %
+ % ...scale, rotate and shift.
+ %
+ \pgf@x\controlscale\pgf@x%
+ \pgf@y\controlscale\pgf@y%
+ %
+ \pgf@xa\cosarcrotate\pgf@x%
+ \advance\pgf@xa-\sinarcrotate\pgf@y%
+ \pgf@ya\cosarcrotate\pgf@y%
+ \advance\pgf@ya\sinarcrotate\pgf@x%
+ %
+ \arcmidpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ {%
+ \pgfsetcornersarced{\pgfpointorigin}%
+ \pgfpathcurveto{\controlone}{\controltwo}{\arcmidpoint}%
+ }%
+ %
+ % Do the same for the second arc...
+ %
+ \pgfmathadd@{\quarterarc}{90}%
+ \pgfmathadd@{\pgfmathresult}{\arcslope}%
+ \let\arcrotate\pgfmathresult%
+ \pgfmathsin@{\arcrotate}%
+ \let\sinarcrotate\pgfmathresult%
+ \pgfmathcos@{\arcrotate}%
+ \let\cosarcrotate\pgfmathresult%
+ %
+ % First control point for the second arc...
+ %
+ \pgfextract@process\controlone{%
+ \pgf@x0.55228475pt\relax%
+ \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
+ \pgf@y0.55228475pt\relax%
+ \pgf@y\cosquarterarc\pgf@y% k * cos(a/2)
+ %
+ % ...scale, rotate and shift.
+ %
+ \pgf@x\controlscale\pgf@x%
+ \pgf@y\controlscale\pgf@y%
+ %
+ \pgf@xa\cosarcrotate\pgf@x%
+ \advance\pgf@xa-\sinarcrotate\pgf@y%
+ \pgf@ya\cosarcrotate\pgf@y%
+ \advance\pgf@ya\sinarcrotate\pgf@x%
+ %
+ \arcmidpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Second control point for the second arc.
+ %
+ \pgfextract@process\controltwo{%
+ \pgf@x0.55228475pt\relax%
+ \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
+ \pgf@y-0.55228475pt\relax%
+ \pgf@y\cosquarterarc\pgf@y% -k * cos(a/2)
+ %
+ % ...scale, rotate and shift.
+ %
+ \pgf@x\controlscale\pgf@x%
+ \pgf@y\controlscale\pgf@y%
+ %
+ \pgf@xa\cosarcrotate\pgf@x%
+ \advance\pgf@xa-\sinarcrotate\pgf@y%
+ \pgf@ya\cosarcrotate\pgf@y%
+ \advance\pgf@ya\sinarcrotate\pgf@x%
+ %
+ \arcendpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfpathcurveto{\controlone}{\controltwo}{\arcendpoint}%
+ \repeatpgfmathloop%
+ \pgfpathclose% Phew!
+ }%
+ }%
+ %
+ % Calculate a point on the border of the cloud. This is a two-stage process:
+ %
+ % 1. Locate the correct puff.
+ % 2. Locate the angle on the circular arc which forms the puff.
+ %
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Get the inner radii and trig. constants.
+ %
+ \getradii%
+ %
+ %
+ %
+ \ifpgfcloudanchorsuseellipse%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointborderellipse{%
+ \pgfpoint{\externalx}{\externaly}
+ }{%
+ \pgfpoint{\xouterradius}{\youterradius}
+ }%
+ }%
+ \else%
+ \pgfextract@process\externalpoint{%
+ \centerpoint%
+ \advance\pgf@x\externalx\relax%
+ \advance\pgf@y\externaly\relax%
+ }%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ %
+ % 1. Locate the correct puff:
+ %
+ % Get end angle of the relavent puff arc.
+ %
+ \pgfmathdivide@{\anglestep}{2}%
+ \let\halfanglestep\pgfmathresult%
+ \pgfmathsubtract@{90}{\halfanglestep}%
+ \let\endangle\pgfmathresult%
+ \pgfmathloop%
+ \pgfmathsubtract@{\endangle}{\anglestep}%
+ \ifdim\pgfmathresult pt<-\anglestep pt\relax%
+ \else%
+ \let\endangle\pgfmathresult%
+ \repeatpgfmathloop%
+ \def\angle{0}%
+ \let\lastangle\angle%
+ \pgfmathloop%
+ \pgfmathadd@{\endangle}{\anglestep}%
+ \let\endangle\pgfmathresult%
+ %
+ % Calculate the `miter point'. This is the point between
+ % each puff, and takes into account the outer sep.
+ %
+ \pgfextract@process\miterpoint{%
+ %
+ \pgfextract@process\secondpoint{%
+ \pgfpointpolar{+\endangle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ %
+ \pgfmathadd@{\endangle}{\anglestep}%
+ \let\angletemp\pgfmathresult%
+ \pgfextract@process\thirdpoint{%
+ \pgfpointpolar{+\angletemp}{+\xinnerradius and +\yinnerradius}%
+ }%
+ %
+ \pgfmathsubtract@{\endangle}{\anglestep}%
+ \let\angletemp\pgfmathresult%
+ \pgfextract@process\firstpoint{%
+ \pgfpointpolar{+\angletemp}{+\xinnerradius and +\yinnerradius}%
+ }%
+ %
+ \pgfmathanglebetweenpoints{\firstpoint}{\secondpoint}%
+ \let\anglealpha\pgfmathresult%
+ \pgfmathanglebetweenpoints{\secondpoint}{\thirdpoint}%
+ \let\anglebeta\pgfmathresult%
+ %
+ \pgfmathsubtract@{\anglebeta}{\anglealpha}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \pgfmathadd@{\pgfmathresult}{\halfcomplementarc}%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@x\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \edef\miterradius{\the\pgf@x}%
+ %
+ \pgfmathadd@{\anglealpha}{\anglebeta}%
+ \pgfmathsubtract@{\pgfmathresult}{180}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\miterangle\pgfmathresult%
+ \pgfpointadd{\secondpoint}{%
+ \pgfqpointpolar{\miterangle}{\miterradius}%
+ }%
+ }%
+ %
+ % Get the angle of the miter point...
+ %
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\miterpoint}%
+ \let\angle\pgfmathresult%
+ \ifdim\angle pt<\lastangle pt\relax% Guard against 360� = 0�
+ \pgfmathadd@{\angle}{360}%
+ \let\angle\pgfmathresult%
+ \fi%
+ \let\lastangle\angle%
+ %
+ % ...and see if it is greater than the external point.
+ %
+ \ifdim\externalangle pt>\angle pt\relax%
+ \repeatpgfmathloop%
+ %
+ % Get the start angle of the relevant arc and ensure angles are in the range.
+ %
+ \pgfmathmod@{\endangle}{360}%
+ \let\endangle\pgfmathresult%
+ \pgfmathsubtract@{\endangle}{\anglestep}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\startangle\pgfmathresult%
+ %
+ % Now, get the start and end points of the arc.
+ %
+ \pgfextract@process\arcstartpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\startangle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ \pgfextract@process\arcendpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\endangle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ %
+ % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
+ %
+ \pgf@sh@getcloudpuffparameters%
+ %
+ % Hackery, for when an arc straddles 0�.
+ %
+ \ifdim\endangle pt<\startangle pt\relax%
+ \pgfmathadd@{\externalangle}{180}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \let\x\pgfmathresult%
+ \else%
+ \let\x\externalangle%
+ \fi%
+ %
+ % 2. Locate the angle on the circular arc which forms the puff.
+ %
+ % Essentially a binary search to find the angle on the circular
+ % arc, which provides the nearset estimate to the border point.
+ %
+ \let\s\halfcomplementarc% The start of the arc.
+ \pgfmathadd@{\s}{\arc}%
+ \let\e\pgfmathresult% The end of the arc.
+ \pgfmathadd@{\e}{\s}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\n\pgfmathresult% The nearest estimate (default to middle of arc).
+ \def\m{360}% Measure of `nearness'.
+ \pgfmathloop%
+ \pgfmathadd@{\e}{\s}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\p\pgfmathresult% The point halfway between \s and \e.
+ \ifdim\p pt=\s pt\relax%
+ \else%
+ %
+ % Get the point on the circular arc.
+ %
+ \pgfmathadd@{\p}{\arcslope}%
+ \let\a\pgfmathresult%
+ \pgfextract@process\arcpoint{%
+ \pgfpointadd{\circlecenterpoint}{%
+ \pgfqpointpolar{\a}{\outerarcradius}%
+ }%
+ }%
+ %
+ % Find the angle between the node centre and the point on the arc.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcpoint}%
+ %
+ % Hackery, for when an arc straddles 0�.
+ %
+ \ifdim\endangle pt<\startangle pt\relax%
+ \pgfmathadd@{\pgfmathresult}{180}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \fi%
+ \let\q\pgfmathresult%
+ \ifdim\x pt=\q pt% Found it!
+ \pgfmathbreakloop% Breaks after current iteration is complete.
+ \else
+ \ifdim\x pt<\q pt\relax%
+ \let\e\p%
+ \else%
+ \let\s\p%
+ \fi%
+ \fi%
+ \pgfmathsubtract@{\x}{\q}%
+ \pgfmathabs@{\pgfmathresult}%
+ %
+ % Save the estimate if it is better than any previous estimate.
+ %
+ \ifdim\pgfmathresult pt<\m pt\relax%
+ \let\m\pgfmathresult%
+ \let\n\p%
+ \fi%
+ \repeatpgfmathloop%
+ %
+ % Use the nearest estimate as the anchor angle.
+ %
+ \pgfmathadd@{\n}{\arcslope}%
+ \let\anchorangle\pgfmathresult%
+ %
+ % Finally, the required point.
+ %
+ \pgfpointadd{\circlecenterpoint}{%
+ \pgfqpointpolar{\anchorangle}{\outerarcradius}%
+ }%
+ \fi%
+ }% Again, Phew!
+ %
+ % Now, a sneaky hack. This means an arbitrary `puff' anchors
+ % can be used for positiong the cloud shape. This is needed
+ % if a cloud is positioned using the `puff <n+1>' anchor, where
+ % n is the number of puffs of any previously drawn cloud.
+ %
+ \pgfutil@g@addto@macro\pgf@sh@s@cloud{%
+ \c@pgf@counta\puffs\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \pgfutil@ifundefined{pgf@anchor@cloud@puff\space\the\c@pgf@counta}{%
+ \expandafter\xdef\csname pgf@anchor@cloud@puff\space\the\c@pgf@counta\endcsname{%
+ \noexpand\pgf@sh@@cloudpuffanchor{\the\c@pgf@counta}%
+ }%
+ }{\c@pgf@counta0\relax}%
+ \advance\c@pgf@counta-1\relax%
+ \repeatpgfmathloop%
+ }%
}
% \pgf@sh@@cloudpuffanchor
@@ -1286,43 +1328,43 @@
% Internal macro for calculating the anchors puff 1, puff 2, ... etc.
%
\def\pgf@sh@@cloudpuffanchor#1{%
- \getradii%
- \pgfmathdivide@{\anglestep}{2}%
- \let\halfanglestep\pgfmathresult%
- \c@pgf@counta#1\relax%
- \advance\c@pgf@counta-1\relax%
- \pgfmathmultiply@{\anglestep}{\the\c@pgf@counta}%
- \pgfmathadd@{\pgfmathresult}{90}%
- \pgfmathsubtract@{\pgfmathresult}{\halfanglestep}%
- \let\angle\pgfmathresult%
- %
- % Calculate the first arc point.
- %
- \pgfextract@process\arcstartpoint{%
- \pgfpointadd{\centerpoint}{%
- \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
- }%
- }%
- %
- \pgfmathadd@{\angle}{\anglestep}%
- \let\angle\pgfmathresult%
- \pgfextract@process\arcendpoint{%
- \pgfpointadd{\centerpoint}{%
- \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
- }%
- }%
- %
- % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
- %
- \pgf@sh@getcloudpuffparameters%
- %
- % Calculate the point.
- %
- \pgfmathadd@{\arcslope}{90}%
- \let\anchorangle\pgfmathresult%
- \pgfpointadd{\circlecenterpoint}{%
- \pgfqpointpolar{\anchorangle}{\outerarcradius}%
- }%
+ \getradii%
+ \pgfmathdivide@{\anglestep}{2}%
+ \let\halfanglestep\pgfmathresult%
+ \c@pgf@counta#1\relax%
+ \advance\c@pgf@counta-1\relax%
+ \pgfmathmultiply@{\anglestep}{\the\c@pgf@counta}%
+ \pgfmathadd@{\pgfmathresult}{90}%
+ \pgfmathsubtract@{\pgfmathresult}{\halfanglestep}%
+ \let\angle\pgfmathresult%
+ %
+ % Calculate the first arc point.
+ %
+ \pgfextract@process\arcstartpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ %
+ \pgfmathadd@{\angle}{\anglestep}%
+ \let\angle\pgfmathresult%
+ \pgfextract@process\arcendpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ %
+ % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
+ %
+ \pgf@sh@getcloudpuffparameters%
+ %
+ % Calculate the point.
+ %
+ \pgfmathadd@{\arcslope}{90}%
+ \let\anchorangle\pgfmathresult%
+ \pgfpointadd{\circlecenterpoint}{%
+ \pgfqpointpolar{\anchorangle}{\outerarcradius}%
+ }%
}
% \pgf@sh@cloudpuffparameters
@@ -1333,11 +1375,11 @@
%
\def\pgf@sh@getcloudpuffparameters{%
%
- % Calculate the angle to which the entire arc is sloped.
- %
- \pgfmathanglebetweenpoints{\arcendpoint}{\arcstartpoint}%
- \let\arcslope\pgfmathresult%
- %
+ % Calculate the angle to which the entire arc is sloped.
+ %
+ \pgfmathanglebetweenpoints{\arcendpoint}{\arcstartpoint}%
+ \let\arcslope\pgfmathresult%
+ %
% Calculate the chord length and arc radius.
%
\pgfpointdiff{\arcendpoint}{\arcstartpoint}%
@@ -1345,7 +1387,7 @@
\pgf@x\pgfmathresult pt\relax%
\pgf@xa.5\pgf@x%
\edef\halfchordlength{\the\pgf@xa}%
- \pgf@x\arcradiusquotient\pgf@x%
+ \pgf@x\arcradiusquotient\pgf@x%
\edef\arcradius{\the\pgf@x}%
\pgf@xa\outersep\relax%
\advance\pgf@xa\pgf@x%
@@ -1382,671 +1424,671 @@
\def\pgf@lib@sh@signal@to{to}%
\def\pgf@lib@sh@signal@parsedirection#1#2{%
- %
- \let\pgf@lib@sh@signal@direction=#2%
- \edef\pgf@lib@sh@temp{#1}%
- \expandafter\pgf@lib@sh@signal@@parsedirection\pgf@lib@sh@temp\pgf@stop}
+ %
+ \let\pgf@lib@sh@signal@direction=#2%
+ \edef\pgf@lib@sh@temp{#1}%
+ \expandafter\pgf@lib@sh@signal@@parsedirection\pgf@lib@sh@temp\pgf@stop}
\def\pgf@lib@sh@signal@@parsedirection#1\pgf@stop{%
- \pgfutil@in@{and}{#1}%
- \ifpgfutil@in@%
- \pgf@lib@sh@signal@@@parsedirection#1\pgf@lib%
- \else%
- \pgf@lib@sh@signal@@@parsedirection#1 and #1\pgf@lib%
- \fi
+ \pgfutil@in@{and}{#1}%
+ \ifpgfutil@in@%
+ \pgf@lib@sh@signal@@@parsedirection#1\pgf@lib%
+ \else%
+ \pgf@lib@sh@signal@@@parsedirection#1 and #1\pgf@lib%
+ \fi
}
\def\pgf@lib@sh@signal@@@parsedirection#1 and #2\pgf@lib{%
- \pgfutil@in@{nowhere}{#1}%
- \ifpgfutil@in@
- \else%
- \pgf@lib@sh@signal@@@@parsedirection{#1}%
- \pgf@lib@sh@signal@@@@parsedirection{#2}%
- \fi%
+ \pgfutil@in@{nowhere}{#1}%
+ \ifpgfutil@in@
+ \else%
+ \pgf@lib@sh@signal@@@@parsedirection{#1}%
+ \pgf@lib@sh@signal@@@@parsedirection{#2}%
+ \fi%
}
\def\pgf@lib@sh@signal@@@@parsedirection#1{%
- \pgfutil@in@{ #1 }{ east right }%
- \ifpgfutil@in@%
- \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@direction%
- \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
- \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
- \fi%
- \pgfutil@in@{ #1 }{ left west }%
- \ifpgfutil@in@%
- \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@direction%
- \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
- \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
- \fi%
- \pgfutil@in@{ #1 }{ above up north }%
- \ifpgfutil@in@%
- \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@direction%
- \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
- \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
- \fi%
- \pgfutil@in@{ #1 }{ below down south }%
- \ifpgfutil@in@%
- \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@direction%
- \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
- \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
- \fi%
+ \pgfutil@in@{ #1 }{ east right }%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@direction%
+ \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
+ \fi%
+ \pgfutil@in@{ #1 }{ left west }%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@direction%
+ \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
+ \fi%
+ \pgfutil@in@{ #1 }{ above up north }%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@direction%
+ \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
+ \fi%
+ \pgfutil@in@{ #1 }{ below down south }%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@direction%
+ \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
+ \fi%
}
% Keys for signal shape:
%
\pgfkeys{/pgf/.cd,
- signal pointer angle/.initial=90,
- signal to/.initial=east,
- signal from/.initial=nowhere
+ signal pointer angle/.initial=90,
+ signal to/.initial=east,
+ signal from/.initial=nowhere
}
\pgfdeclareshape{signal}{%
- \savedmacro\installsignalparameters{%
- %
- \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
- \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
- \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
- \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
- %
- \pgf@lib@sh@signal@parsedirection{\pgfkeysvalueof{/pgf/signal from}}{\pgf@lib@sh@signal@from}%
- \pgf@lib@sh@signal@parsedirection{\pgfkeysvalueof{/pgf/signal to}}{\pgf@lib@sh@signal@to}%
- %
- % Define a centerpoint.
- %
- \pgfextract@process\centerpoint{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgf@y.5\ht\pgfnodeparttextbox%
- \advance\pgf@y-.5\dp\pgfnodeparttextbox%
- }%
- %
- % Get some useful trig. stuff
- %
- \pgfmathsetmacro\pointerangle{\pgfkeysvalueof{/pgf/signal pointer angle}}%
- %
- \pgfmathdivide@{\pointerangle}{2}%
- \let\halfpointerangle=\pgfmathresult%
- %
- \pgfmathcosec@{\halfpointerangle}%
- \let\cosechalfpointerangle=\pgfmathresult%
- %
- \pgfmathdivide@{\halfpointerangle}{2}%
- \let\quarterpointerangle=\pgfmathresult%
- %
- \pgfmathcosec@{\quarterpointerangle}%
- \let\cosecquarterpointerangle=\pgfmathresult%
- %
- \pgfmathsec@{\quarterpointerangle}%
- \let\secquarterpointerangle=\pgfmathresult%
- %
- \pgfmathsubtract@{90}{\quarterpointerangle}%
- \let\complementquarterpointerangle\pgfmathresult%
- %
- % Get the larger of the outer sep.
- %
- \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
- \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
- \ifdim\pgf@x>\pgf@y%
- \pgf@y\pgf@x%
- \fi%
- \pgf@yc=\pgf@y%
- %
- % Calculate the miter due to the line width, at the pointer apex...
- %
- \pgf@x=\cosechalfpointerangle\pgf@y%
- \edef\pointerapexmiter{\the\pgf@x}%
- %
- % ...at a corner by a `to' pointer (i.e. sticks out)...
- %
- \pgf@x=\secquarterpointerangle\pgf@y%
- \edef\tocornermiter{\the\pgf@x}%
- %
- % ...at a corner by a `from' pointer (i.e. sticks in).
- %
- \pgf@x=\cosecquarterpointerangle\pgf@y
- \edef\fromcornermiter{\the\pgf@x}%
- %
- % Get the (half) dimensions of the node.
- %
- \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
- \advance\pgf@xa.5\wd\pgfnodeparttextbox%
- \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
- \advance\pgf@ya.5\ht\pgfnodeparttextbox%
- \advance\pgf@ya.5\dp\pgfnodeparttextbox%
- %
- % Get the distance a pointer sticks out to the side...
- %
- \pgfmathsubtract@{90}{\halfpointerangle}%
- \pgfmathtan@{\pgfmathresult}%
- \pgf@xb=\pgfmathresult\pgf@ya%
- %
- % ...and up.
- %
- \pgf@yb=\pgfmathresult\pgf@xa%
- %
- % Adjust for minimum height.
- %
- \pgfutil@tempdima=2.0\pgf@ya%
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
- \else%
- \advance\pgfutil@tempdima by\pgf@yb%
- \fi%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
- \else%
- \advance\pgfutil@tempdima by\pgf@yb%
- \fi%
- \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}%
- \ifdim\pgfutil@tempdima<\pgf@y%
- \pgfutil@tempdima=\pgf@y%
- %
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
- \else%
- \advance\pgfutil@tempdima by-\pgf@yb%
- \fi%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
- \else%
- \advance\pgfutil@tempdima by-\pgf@yb%
- \fi%
- \pgf@ya=0.5\pgfutil@tempdima%
- \pgfmathsubtract@{90}{\halfpointerangle}%
- \pgfmathtan@{\pgfmathresult}%
- \pgf@xb=\pgfmathresult\pgf@ya%
- \fi%
- %
- % Adjust for minimum width.
- %
- \pgfutil@tempdima=2.0\pgf@xa%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
- \else%
- \advance\pgfutil@tempdima by\pgf@xb%
- \fi%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
- \else%
- \advance\pgfutil@tempdima by\pgf@xb%
- \fi%
- \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/minimum width}}%
- \ifdim\pgfutil@tempdima<\pgf@x%
- \pgfutil@tempdima=\pgf@x%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
- \else%
- \advance\pgfutil@tempdima by-\pgf@xb%
- \fi%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
- \else%
- \advance\pgfutil@tempdima by-\pgf@xb%
- \fi%
- \pgf@xa=0.5\pgfutil@tempdima%
- \pgfmathsubtract@{90}{\halfpointerangle}%
- \pgfmathtan@{\pgfmathresult}%
- \pgf@yb=\pgfmathresult\pgf@xa%
- \fi%
- %
- % So, define the points for the background path.
- %
- \pgfextract@process\north{%
- \centerpoint%
- \advance\pgf@y\pgf@ya%
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@to%
- \advance\pgf@y\pgf@yb%
- \fi%
- }%
- \pgfextract@process\south{%
- \centerpoint%
- \advance\pgf@y-\pgf@ya%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
- \advance\pgf@y-\pgf@yb%
- \fi%
- }%
- \pgfextract@process\east{%
- \centerpoint%
- \advance\pgf@x\pgf@xa%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
- \advance\pgf@x\pgf@xb%
- \fi%
- }%
- \pgfextract@process\west{%
- \centerpoint%
- \advance\pgf@x-\pgf@xa%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
- \advance\pgf@x-\pgf@xb%
- \fi%
- }%
- \pgfextract@process\northeast{%
- \centerpoint%
- \advance\pgf@y\pgf@ya%
- \advance\pgf@x\pgf@xa%
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
- \advance\pgf@y\pgf@yb%
- \fi%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
- \advance\pgf@x\pgf@xb%
- \fi%
- }%
- \pgfextract@process\southeast{%
- \centerpoint%
- \advance\pgf@y-\pgf@ya%
- \advance\pgf@x\pgf@xa%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
- \advance\pgf@y-\pgf@yb%
- \fi%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
- \advance\pgf@x\pgf@xb%
- \fi%
- }%
- \pgfextract@process\southwest{%
- \centerpoint%
- \advance\pgf@y-\pgf@ya%
- \advance\pgf@x-\pgf@xa%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
- \advance\pgf@y-\pgf@yb%
- \fi%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
- \advance\pgf@x-\pgf@xb%
- \fi%
- }%
- \pgfextract@process\northwest{%
- \centerpoint%
- \advance\pgf@y\pgf@ya%
- \advance\pgf@x-\pgf@xa%
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
- \advance\pgf@y\pgf@yb%
- \fi%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
- \advance\pgf@x-\pgf@xb%
- \fi%
- }%
- \addtosavedmacro{\north}%
- \addtosavedmacro{\south}%
- \addtosavedmacro{\east}%
- \addtosavedmacro{\west}%
- \addtosavedmacro{\northeast}%
- \addtosavedmacro{\southwest}%
- \addtosavedmacro{\southeast}%
- \addtosavedmacro{\northwest}%
- %
- % Calculate the `miter vectors' (i.e. +outer sep).
- %
- \pgfextract@process\northmiter{%
- \pgf@x0pt%
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
- \pgf@y\pgf@yc%
- \else%
- \pgf@y\pointerapexmiter\relax%
- \fi%
- }%
- \pgfextract@process\southmiter{%
- \pgf@x0pt%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
- \pgf@y-\pgf@yc%
- \else%
- \pgf@y-\pointerapexmiter\relax%
- \fi%
- }%
- \pgfextract@process\eastmiter{%
- \pgf@y0pt%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
- \pgf@x\pgf@yc%
- \else%
- \pgf@x\pointerapexmiter\relax%
- \fi%
- }%
- \pgfextract@process\westmiter{%
- \pgf@y0pt%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
- \pgf@x-\pgf@yc%
- \else%
- \pgf@x-\pointerapexmiter\relax%
- \fi%
- }%
- \pgfextract@process\northeastmiter{%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
- \pgf@x\pgf@yc
- \pgf@y\pgf@yc%
- \else
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
- \pgfqpointpolar{\quarterpointerangle}{\fromcornermiter}
- \else%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
- \pgfqpointpolar{\complementquarterpointerangle}{\tocornermiter}%
- \fi%
- \fi%
- \fi%
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
- \pgfqpointpolar{\complementquarterpointerangle}{\fromcornermiter}%
- \else%
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@to%
- \pgfqpointpolar{\quarterpointerangle}{\tocornermiter}%
- \fi%
- \fi%
- }%
- \pgfextract@process\southeastmiter{%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
- \pgf@x\pgf@yc%
- \pgf@y\pgf@yc%
- \else
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
- \pgfqpointpolar{-\quarterpointerangle}{\fromcornermiter}
- \else%
- \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
- \pgfqpointpolar{-\complementquarterpointerangle}{\tocornermiter}%
- \fi%
- \fi%
- \fi%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
- \pgfqpointpolar{-\complementquarterpointerangle}{\fromcornermiter}
- \else%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
- \pgfqpointpolar{-\quarterpointerangle}{\tocornermiter}%
- \fi%
- \fi%
- }%
- \pgfextract@process\southwestmiter{%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
- \pgf@x-\pgf@yc
- \pgf@y-\pgf@yc%
- \else
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
- \pgfmathadd@{\quarterpointerangle}{180}%
- \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}
- \else%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
- \pgfmathadd@{\complementquarterpointerangle}{180}%
- \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
- \fi%
- \fi%
- \fi%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
- \pgfmathadd@{\complementquarterpointerangle}{180}%
- \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}%
- \else%
- \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
- \pgfmathadd@{\quarterpointerangle}{180}%
- \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
- \fi%
- \fi%
- }%
- \pgfextract@process\northwestmiter{%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
- \pgf@x-\pgf@yc%
- \pgf@y\pgf@yc%
- \else
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
- \pgfmathsubtract@{180}{\quarterpointerangle}%
- \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}
- \else%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
- \pgfmathsubtract@{180}{\complementquarterpointerangle}%
- \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
- \fi%
- \fi%
- \fi%
- \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
- \pgfmathsubtract@{180}{\complementquarterpointerangle}%
- \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}%
- \else%
- \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
- \pgfmathsubtract@{180}{\quarterpointerangle}%
- \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
- \fi%
- \fi%
- }%
- \addtosavedmacro{\northmiter}%
- \addtosavedmacro{\southmiter}%
- \addtosavedmacro{\eastmiter}%
- \addtosavedmacro{\westmiter}%
- \addtosavedmacro{\northeastmiter}%
- \addtosavedmacro{\southeastmiter}%
- \addtosavedmacro{\southwestmiter}%
- \addtosavedmacro{\northwestmiter}%
- %
- % Now calculate the anchor points
- %
- \pgfextract@process\anchornorth{%
- \pgfpointadd{\north}{\northmiter}%
- }%
- \pgfextract@process\anchorsouth{%
- \pgfpointadd{\south}{\southmiter}%
- }%
- \pgfextract@process\anchoreast{%
- \pgfpointadd{\east}{\eastmiter}%
- }%
- \pgfextract@process\anchorwest{%
- \pgfpointadd{\west}{\westmiter}%
- }%
- \pgfextract@process\anchornortheast{%
- \pgfpointadd{\northeast}{\northeastmiter}%
- }%
- \pgfextract@process\anchorsoutheast{%
- \pgfpointadd{\southeast}{\southeastmiter}%
- }%
- \pgfextract@process\anchorsouthwest{%
- \pgfpointadd{\southwest}{\southwestmiter}%
- }%
- \pgfextract@process\anchornorthwest{%
- \pgfpointadd{\northwest}{\northwestmiter}%
- }%
- \addtosavedmacro{\anchornorth}%
- \addtosavedmacro{\anchorsouth}%
- \addtosavedmacro{\anchoreast}%
- \addtosavedmacro{\anchorwest}%
- \addtosavedmacro{\anchornortheast}%
- \addtosavedmacro{\anchorsouthwest}%
- \addtosavedmacro{\anchorsoutheast}%
- \addtosavedmacro{\anchornorthwest}%
- }%
- \savedanchor\centerpoint{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgf@y.5\ht\pgfnodeparttextbox%
- \advance\pgf@y-.5\dp\pgfnodeparttextbox%
- }%
- \savedanchor\basepoint{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgf@y0pt%
- }%
- \savedanchor\midpoint{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgfmathsetlength\pgf@y{+.5ex}%
- }%
- \anchor{center}{\centerpoint}%
- \anchor{base}{\basepoint}%
- \anchor{base east}{%
- \installsignalparameters%
- \anchoreast%
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \anchorsoutheast%
- \ifdim\pgf@xa>\pgf@x%
- \pgfutil@tempdima\pgf@xa%
- \else%
- \pgfutil@tempdima\pgf@x%
- \fi%
- \pgfextract@process\externalpoint{%
- \basepoint%
- \pgf@x\pgfutil@tempdima%
- }
- \basepoint%
- \let\firstpoint\anchoreast%
- \ifdim\pgf@y<\pgf@ya%
- \let\secondpoint\anchorsoutheast%
- \else%
- \let\secondpoint\anchornortheast%
- \fi%
- \pgfpointintersectionoflines{\basepoint}{\externalpoint}%
- {\firstpoint}{\secondpoint}%
- }%
- \anchor{base west}{%
- \installsignalparameters%
- \anchorwest%
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \anchorsouthwest%
- \ifdim\pgf@xa<\pgf@x%
- \pgfutil@tempdima\pgf@xa%
- \else%
- \pgfutil@tempdima\pgf@x%
- \fi%
- \pgfextract@process\externalpoint{%
- \basepoint%
- \pgf@x\pgfutil@tempdima%
- }
- \basepoint%
- \let\firstpoint\anchorwest%
- \ifdim\pgf@y<\pgf@ya%
- \let\secondpoint\anchorsouthwest%
- \else%
- \let\secondpoint\anchornorthwest%
- \fi%
- \pgfpointintersectionoflines{\basepoint}{\externalpoint}%
- {\firstpoint}{\secondpoint}%
- }%
- \anchor{mid}{\midpoint}%
- \anchor{mid east}{%
- \installsignalparameters%
- \anchoreast%
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \anchorsoutheast%
- \ifdim\pgf@xa>\pgf@x%
- \pgfutil@tempdima\pgf@xa%
- \else%
- \pgfutil@tempdima\pgf@x%
- \fi%
- \pgfextract@process\externalpoint{%
- \midpoint%
- \pgf@x\pgfutil@tempdima%
- }
- \midpoint%
- \let\firstpoint\anchoreast%
- \ifdim\pgf@y<\pgf@ya%
- \let\secondpoint\anchorsoutheast%
- \else%
- \let\secondpoint\anchornortheast%
- \fi%
- \pgfpointintersectionoflines{\midpoint}{\externalpoint}%
- {\firstpoint}{\secondpoint}%
- }%
- \anchor{mid west}{%
- \installsignalparameters%
- \anchorwest%
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \anchorsouthwest%
- \ifdim\pgf@xa<\pgf@x%
- \pgfutil@tempdima\pgf@xa%
- \else%
- \pgfutil@tempdima\pgf@x%
- \fi%
- \pgfextract@process\externalpoint{%
- \midpoint%
- \pgf@x\pgfutil@tempdima%
- }
- \midpoint%
- \let\firstpoint\anchorwest%
- \ifdim\pgf@y<\pgf@ya%
- \let\secondpoint\anchorsouthwest%
- \else%
- \let\secondpoint\anchornorthwest%
- \fi%
- \pgfpointintersectionoflines{\midpoint}{\externalpoint}%
- {\firstpoint}{\secondpoint}%
- }%
- \anchor{north}{\installsignalparameters\anchornorth}%
- \anchor{south}{\installsignalparameters\anchorsouth}%
- \anchor{east}{\installsignalparameters\anchoreast}%
- \anchor{west}{\installsignalparameters\anchorwest}%
- \anchor{north east}{\installsignalparameters\anchornortheast}%
- \anchor{south east}{\installsignalparameters\anchorsoutheast}%
- \anchor{south west}{\installsignalparameters\anchorsouthwest}%
- \anchor{north west}{\installsignalparameters\anchornorthwest}%
- \backgroundpath{%
- \installsignalparameters%
- \pgfpathmoveto{\north}%
- \pgfpathlineto{\northeast}%
- \pgfpathlineto{\east}%
- \pgfpathlineto{\southeast}%
- \pgfpathlineto{\south}%
- \pgfpathlineto{\southwest}%
- \pgfpathlineto{\west}%
- \pgfpathlineto{\northwest}%
- \pgfpathclose%
- }
- \anchorborder{%
- %
- % Save x and y.
- %
- \edef\externalx{\the\pgf@x}%
- \edef\externaly{\the\pgf@y}%
- %
- % Adjust the location of the external
- % point relative to \centerpoint.
- %
- \centerpoint%
- \pgf@xa\externalx\relax%
- \pgf@ya\externaly\relax%
- \advance\pgf@xa\pgf@x%
- \advance\pgf@ya\pgf@y%
- \edef\externalx{\the\pgf@xa}%
- \edef\externaly{\the\pgf@ya}%
- %
- % Get the shape parameters.
- %
- \installsignalparameters%
- %
- % Get the angle of the external point to the \centerpoint.
- %
- \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
- \let\externalangle\pgfmathresult%
- %
- %
- %
- \pgfmathanglebetweenpoints{\centerpoint}{\anchorwest}%
- \ifdim\externalangle pt<\pgfmathresult pt\relax%
- \pgfmathanglebetweenpoints{\centerpoint}{\anchornorth}%
- \ifdim\externalangle pt<\pgfmathresult pt\relax%
- \pgfmathanglebetweenpoints{\centerpoint}{\anchornortheast}%
- \ifdim\externalangle pt<\pgfmathresult pt\relax%
- \let\firstpoint\anchoreast%
- \let\secondpoint\anchornortheast%
- \else%
- \let\secondpoint\anchornortheast%
- \let\firstpoint\anchornorth%
- \fi%
- \else%
- \pgfmathanglebetweenpoints{\centerpoint}{\anchornorthwest}%
- \ifdim\externalangle pt<\pgfmathresult pt\relax%
- \let\firstpoint\anchornorth%
- \let\secondpoint\anchornorthwest%
- \else%
- \let\secondpoint\anchornorthwest%
- \let\firstpoint\anchorwest%
- \fi%
- \fi%
- \else%
- \pgfmathanglebetweenpoints{\centerpoint}{\anchorsouth}%
- \ifdim\externalangle pt<\pgfmathresult pt\relax%
- \pgfmathanglebetweenpoints{\centerpoint}{\anchorsouthwest}%
- \ifdim\externalangle pt<\pgfmathresult pt\relax%
- \let\firstpoint\anchorwest%
- \let\secondpoint\anchorsouthwest%
- \else%
- \let\secondpoint\anchorsouthwest%
- \let\firstpoint\anchorsouth%
- \fi%
- \else%
- \pgfmathanglebetweenpoints{\centerpoint}{\anchorsoutheast}%
- \ifdim\externalangle pt<\pgfmathresult pt\relax%
- \let\firstpoint\anchorsouth%
- \let\secondpoint\anchorsoutheast%
- \else%
- \let\secondpoint\anchorsoutheast%
- \let\firstpoint\anchoreast%
- \fi%
- \fi%
- \fi%
- %
- % Now locate the point.
- %
- \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
- {\firstpoint}{\secondpoint}%
- }%
+ \savedmacro\installsignalparameters{%
+ %
+ \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
+ %
+ \pgf@lib@sh@signal@parsedirection{\pgfkeysvalueof{/pgf/signal from}}{\pgf@lib@sh@signal@from}%
+ \pgf@lib@sh@signal@parsedirection{\pgfkeysvalueof{/pgf/signal to}}{\pgf@lib@sh@signal@to}%
+ %
+ % Define a centerpoint.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ %
+ % Get some useful trig. stuff
+ %
+ \pgfmathsetmacro\pointerangle{\pgfkeysvalueof{/pgf/signal pointer angle}}%
+ %
+ \pgfmathdivide@{\pointerangle}{2}%
+ \let\halfpointerangle=\pgfmathresult%
+ %
+ \pgfmathcosec@{\halfpointerangle}%
+ \let\cosechalfpointerangle=\pgfmathresult%
+ %
+ \pgfmathdivide@{\halfpointerangle}{2}%
+ \let\quarterpointerangle=\pgfmathresult%
+ %
+ \pgfmathcosec@{\quarterpointerangle}%
+ \let\cosecquarterpointerangle=\pgfmathresult%
+ %
+ \pgfmathsec@{\quarterpointerangle}%
+ \let\secquarterpointerangle=\pgfmathresult%
+ %
+ \pgfmathsubtract@{90}{\quarterpointerangle}%
+ \let\complementquarterpointerangle\pgfmathresult%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x>\pgf@y%
+ \pgf@y\pgf@x%
+ \fi%
+ \pgf@yc=\pgf@y%
+ %
+ % Calculate the miter due to the line width, at the pointer apex...
+ %
+ \pgf@x=\cosechalfpointerangle\pgf@y%
+ \edef\pointerapexmiter{\the\pgf@x}%
+ %
+ % ...at a corner by a `to' pointer (i.e. sticks out)...
+ %
+ \pgf@x=\secquarterpointerangle\pgf@y%
+ \edef\tocornermiter{\the\pgf@x}%
+ %
+ % ...at a corner by a `from' pointer (i.e. sticks in).
+ %
+ \pgf@x=\cosecquarterpointerangle\pgf@y
+ \edef\fromcornermiter{\the\pgf@x}%
+ %
+ % Get the (half) dimensions of the node.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@xa.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@ya.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya.5\dp\pgfnodeparttextbox%
+ %
+ % Get the distance a pointer sticks out to the side...
+ %
+ \pgfmathsubtract@{90}{\halfpointerangle}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgf@xb=\pgfmathresult\pgf@ya%
+ %
+ % ...and up.
+ %
+ \pgf@yb=\pgfmathresult\pgf@xa%
+ %
+ % Adjust for minimum height.
+ %
+ \pgfutil@tempdima=2.0\pgf@ya%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by\pgf@yb%
+ \fi%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgfutil@tempdima<\pgf@y%
+ \pgfutil@tempdima=\pgf@y%
+ %
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \fi%
+ \pgf@ya=0.5\pgfutil@tempdima%
+ \pgfmathsubtract@{90}{\halfpointerangle}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgf@xb=\pgfmathresult\pgf@ya%
+ \fi%
+ %
+ % Adjust for minimum width.
+ %
+ \pgfutil@tempdima=2.0\pgf@xa%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by\pgf@xb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by\pgf@xb%
+ \fi%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgfutil@tempdima<\pgf@x%
+ \pgfutil@tempdima=\pgf@x%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \pgf@xa=0.5\pgfutil@tempdima%
+ \pgfmathsubtract@{90}{\halfpointerangle}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgf@yb=\pgfmathresult\pgf@xa%
+ \fi%
+ %
+ % So, define the points for the background path.
+ %
+ \pgfextract@process\north{%
+ \centerpoint%
+ \advance\pgf@y\pgf@ya%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@to%
+ \advance\pgf@y\pgf@yb%
+ \fi%
+ }%
+ \pgfextract@process\south{%
+ \centerpoint%
+ \advance\pgf@y-\pgf@ya%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ }%
+ \pgfextract@process\east{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
+ \advance\pgf@x\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\west{%
+ \centerpoint%
+ \advance\pgf@x-\pgf@xa%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
+ \advance\pgf@x-\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\northeast{%
+ \centerpoint%
+ \advance\pgf@y\pgf@ya%
+ \advance\pgf@x\pgf@xa%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
+ \advance\pgf@y\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
+ \advance\pgf@x\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\southeast{%
+ \centerpoint%
+ \advance\pgf@y-\pgf@ya%
+ \advance\pgf@x\pgf@xa%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
+ \advance\pgf@x\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\southwest{%
+ \centerpoint%
+ \advance\pgf@y-\pgf@ya%
+ \advance\pgf@x-\pgf@xa%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
+ \advance\pgf@x-\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\northwest{%
+ \centerpoint%
+ \advance\pgf@y\pgf@ya%
+ \advance\pgf@x-\pgf@xa%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
+ \advance\pgf@y\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
+ \advance\pgf@x-\pgf@xb%
+ \fi%
+ }%
+ \addtosavedmacro{\north}%
+ \addtosavedmacro{\south}%
+ \addtosavedmacro{\east}%
+ \addtosavedmacro{\west}%
+ \addtosavedmacro{\northeast}%
+ \addtosavedmacro{\southwest}%
+ \addtosavedmacro{\southeast}%
+ \addtosavedmacro{\northwest}%
+ %
+ % Calculate the `miter vectors' (i.e. +outer sep).
+ %
+ \pgfextract@process\northmiter{%
+ \pgf@x0pt%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
+ \pgf@y\pgf@yc%
+ \else%
+ \pgf@y\pointerapexmiter\relax%
+ \fi%
+ }%
+ \pgfextract@process\southmiter{%
+ \pgf@x0pt%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
+ \pgf@y-\pgf@yc%
+ \else%
+ \pgf@y-\pointerapexmiter\relax%
+ \fi%
+ }%
+ \pgfextract@process\eastmiter{%
+ \pgf@y0pt%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \pgf@x\pgf@yc%
+ \else%
+ \pgf@x\pointerapexmiter\relax%
+ \fi%
+ }%
+ \pgfextract@process\westmiter{%
+ \pgf@y0pt%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \pgf@x-\pgf@yc%
+ \else%
+ \pgf@x-\pointerapexmiter\relax%
+ \fi%
+ }%
+ \pgfextract@process\northeastmiter{%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \pgf@x\pgf@yc
+ \pgf@y\pgf@yc%
+ \else
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
+ \pgfqpointpolar{\quarterpointerangle}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
+ \pgfqpointpolar{\complementquarterpointerangle}{\tocornermiter}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
+ \pgfqpointpolar{\complementquarterpointerangle}{\fromcornermiter}%
+ \else%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@to%
+ \pgfqpointpolar{\quarterpointerangle}{\tocornermiter}%
+ \fi%
+ \fi%
+ }%
+ \pgfextract@process\southeastmiter{%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \pgf@x\pgf@yc%
+ \pgf@y\pgf@yc%
+ \else
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
+ \pgfqpointpolar{-\quarterpointerangle}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
+ \pgfqpointpolar{-\complementquarterpointerangle}{\tocornermiter}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
+ \pgfqpointpolar{-\complementquarterpointerangle}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
+ \pgfqpointpolar{-\quarterpointerangle}{\tocornermiter}%
+ \fi%
+ \fi%
+ }%
+ \pgfextract@process\southwestmiter{%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \pgf@x-\pgf@yc
+ \pgf@y-\pgf@yc%
+ \else
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
+ \pgfmathadd@{\quarterpointerangle}{180}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
+ \pgfmathadd@{\complementquarterpointerangle}{180}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
+ \pgfmathadd@{\complementquarterpointerangle}{180}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}%
+ \else%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
+ \pgfmathadd@{\quarterpointerangle}{180}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
+ \fi%
+ \fi%
+ }%
+ \pgfextract@process\northwestmiter{%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \pgf@x-\pgf@yc%
+ \pgf@y\pgf@yc%
+ \else
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
+ \pgfmathsubtract@{180}{\quarterpointerangle}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
+ \pgfmathsubtract@{180}{\complementquarterpointerangle}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
+ \pgfmathsubtract@{180}{\complementquarterpointerangle}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}%
+ \else%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
+ \pgfmathsubtract@{180}{\quarterpointerangle}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
+ \fi%
+ \fi%
+ }%
+ \addtosavedmacro{\northmiter}%
+ \addtosavedmacro{\southmiter}%
+ \addtosavedmacro{\eastmiter}%
+ \addtosavedmacro{\westmiter}%
+ \addtosavedmacro{\northeastmiter}%
+ \addtosavedmacro{\southeastmiter}%
+ \addtosavedmacro{\southwestmiter}%
+ \addtosavedmacro{\northwestmiter}%
+ %
+ % Now calculate the anchor points
+ %
+ \pgfextract@process\anchornorth{%
+ \pgfpointadd{\north}{\northmiter}%
+ }%
+ \pgfextract@process\anchorsouth{%
+ \pgfpointadd{\south}{\southmiter}%
+ }%
+ \pgfextract@process\anchoreast{%
+ \pgfpointadd{\east}{\eastmiter}%
+ }%
+ \pgfextract@process\anchorwest{%
+ \pgfpointadd{\west}{\westmiter}%
+ }%
+ \pgfextract@process\anchornortheast{%
+ \pgfpointadd{\northeast}{\northeastmiter}%
+ }%
+ \pgfextract@process\anchorsoutheast{%
+ \pgfpointadd{\southeast}{\southeastmiter}%
+ }%
+ \pgfextract@process\anchorsouthwest{%
+ \pgfpointadd{\southwest}{\southwestmiter}%
+ }%
+ \pgfextract@process\anchornorthwest{%
+ \pgfpointadd{\northwest}{\northwestmiter}%
+ }%
+ \addtosavedmacro{\anchornorth}%
+ \addtosavedmacro{\anchorsouth}%
+ \addtosavedmacro{\anchoreast}%
+ \addtosavedmacro{\anchorwest}%
+ \addtosavedmacro{\anchornortheast}%
+ \addtosavedmacro{\anchorsouthwest}%
+ \addtosavedmacro{\anchorsoutheast}%
+ \addtosavedmacro{\anchornorthwest}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \installsignalparameters%
+ \anchoreast%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \anchorsoutheast%
+ \ifdim\pgf@xa>\pgf@x%
+ \pgfutil@tempdima\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\externalpoint{%
+ \basepoint%
+ \pgf@x\pgfutil@tempdima%
+ }
+ \basepoint%
+ \let\firstpoint\anchoreast%
+ \ifdim\pgf@y<\pgf@ya%
+ \let\secondpoint\anchorsoutheast%
+ \else%
+ \let\secondpoint\anchornortheast%
+ \fi%
+ \pgfpointintersectionoflines{\basepoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+ \anchor{base west}{%
+ \installsignalparameters%
+ \anchorwest%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \anchorsouthwest%
+ \ifdim\pgf@xa<\pgf@x%
+ \pgfutil@tempdima\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\externalpoint{%
+ \basepoint%
+ \pgf@x\pgfutil@tempdima%
+ }
+ \basepoint%
+ \let\firstpoint\anchorwest%
+ \ifdim\pgf@y<\pgf@ya%
+ \let\secondpoint\anchorsouthwest%
+ \else%
+ \let\secondpoint\anchornorthwest%
+ \fi%
+ \pgfpointintersectionoflines{\basepoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \installsignalparameters%
+ \anchoreast%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \anchorsoutheast%
+ \ifdim\pgf@xa>\pgf@x%
+ \pgfutil@tempdima\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\externalpoint{%
+ \midpoint%
+ \pgf@x\pgfutil@tempdima%
+ }
+ \midpoint%
+ \let\firstpoint\anchoreast%
+ \ifdim\pgf@y<\pgf@ya%
+ \let\secondpoint\anchorsoutheast%
+ \else%
+ \let\secondpoint\anchornortheast%
+ \fi%
+ \pgfpointintersectionoflines{\midpoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+ \anchor{mid west}{%
+ \installsignalparameters%
+ \anchorwest%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \anchorsouthwest%
+ \ifdim\pgf@xa<\pgf@x%
+ \pgfutil@tempdima\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\externalpoint{%
+ \midpoint%
+ \pgf@x\pgfutil@tempdima%
+ }
+ \midpoint%
+ \let\firstpoint\anchorwest%
+ \ifdim\pgf@y<\pgf@ya%
+ \let\secondpoint\anchorsouthwest%
+ \else%
+ \let\secondpoint\anchornorthwest%
+ \fi%
+ \pgfpointintersectionoflines{\midpoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+ \anchor{north}{\installsignalparameters\anchornorth}%
+ \anchor{south}{\installsignalparameters\anchorsouth}%
+ \anchor{east}{\installsignalparameters\anchoreast}%
+ \anchor{west}{\installsignalparameters\anchorwest}%
+ \anchor{north east}{\installsignalparameters\anchornortheast}%
+ \anchor{south east}{\installsignalparameters\anchorsoutheast}%
+ \anchor{south west}{\installsignalparameters\anchorsouthwest}%
+ \anchor{north west}{\installsignalparameters\anchornorthwest}%
+ \backgroundpath{%
+ \installsignalparameters%
+ \pgfpathmoveto{\north}%
+ \pgfpathlineto{\northeast}%
+ \pgfpathlineto{\east}%
+ \pgfpathlineto{\southeast}%
+ \pgfpathlineto{\south}%
+ \pgfpathlineto{\southwest}%
+ \pgfpathlineto{\west}%
+ \pgfpathlineto{\northwest}%
+ \pgfpathclose%
+ }
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Adjust the location of the external
+ % point relative to \centerpoint.
+ %
+ \centerpoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Get the shape parameters.
+ %
+ \installsignalparameters%
+ %
+ % Get the angle of the external point to the \centerpoint.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ \let\externalangle\pgfmathresult%
+ %
+ %
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchorwest}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchornorth}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchornortheast}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \let\firstpoint\anchoreast%
+ \let\secondpoint\anchornortheast%
+ \else%
+ \let\secondpoint\anchornortheast%
+ \let\firstpoint\anchornorth%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchornorthwest}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \let\firstpoint\anchornorth%
+ \let\secondpoint\anchornorthwest%
+ \else%
+ \let\secondpoint\anchornorthwest%
+ \let\firstpoint\anchorwest%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchorsouth}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchorsouthwest}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \let\firstpoint\anchorwest%
+ \let\secondpoint\anchorsouthwest%
+ \else%
+ \let\secondpoint\anchorsouthwest%
+ \let\firstpoint\anchorsouth%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchorsoutheast}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \let\firstpoint\anchorsouth%
+ \let\secondpoint\anchorsoutheast%
+ \else%
+ \let\secondpoint\anchorsoutheast%
+ \let\firstpoint\anchoreast%
+ \fi%
+ \fi%
+ \fi%
+ %
+ % Now locate the point.
+ %
+ \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\firstpoint}{\secondpoint}%
+ }%
}%
@@ -2060,10 +2102,10 @@
% /pgf/tape bend bottom : Type of bend for south side.
% /pgf/tape bend height : The height of the bends.
\pgfkeys{/pgf/.cd,
- tape bend top/.initial=in and out,
- tape bend bottom/.initial=in and out,
- tape bend/.style={/pgf/tape bend top=#1, /pgf/tape bend bottom=#1},
- tape bend height/.initial=5pt
+ tape bend top/.initial=in and out,
+ tape bend bottom/.initial=in and out,
+ tape bend/.style={/pgf/tape bend top=#1, /pgf/tape bend bottom=#1},
+ tape bend height/.initial=5pt
}
\def\pgf@lib@sh@inandouttext{in and out}
@@ -2071,447 +2113,447 @@
\def\pgf@lib@sh@nonetext{none}
\pgfdeclareshape{tape}{
- \savedmacro\tapedimensions{%
- \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
- \advance\pgf@x.5\wd\pgfnodeparttextbox%
- \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
- \advance\pgf@y.5\ht\pgfnodeparttextbox%
- \advance\pgf@y.5\dp\pgfnodeparttextbox%
- %
- \pgfmathsetlengthmacro\outerxsep{\pgfkeysvalueof{/pgf/outer xsep}}%
- \pgfmathsetlengthmacro\outerysep{\pgfkeysvalueof{/pgf/outer ysep}}%
- \addtosavedmacro\outerxsep%
- \addtosavedmacro\outerysep%
- %
- \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/tape bend height}}%
- \pgfutil@tempdima.5\pgfutil@tempdima%
- \edef\halfbendheight{\the\pgfutil@tempdima}%
- \addtosavedmacro\halfbendheight%
- %
- \pgfkeysgetvalue{/pgf/tape bend top}{\topbendstyle}%
- \pgfkeysgetvalue{/pgf/tape bend bottom}{\bottombendstyle}%
- \addtosavedmacro\topbendstyle%
- \addtosavedmacro\bottombendstyle%
- %
- \ifx\topbendstyle\pgf@lib@sh@nonetext%
- \else%
- \advance\pgf@y\pgfutil@tempdima%
- \fi%
- \ifx\bottombendstyle\pgf@lib@sh@none%
- \else%
- \advance\pgf@y\pgfutil@tempdima%
- \fi%
- %
- \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
- \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
- \ifdim\pgf@x<.5\pgf@xa%
- \pgf@x.5\pgf@xa%
- \fi%
- \ifdim\pgf@y<.5\pgf@ya%
- \pgf@y.5\pgf@ya%
- \fi%
- \ifx\topbendstyle\pgf@lib@sh@nonetext%
- \else%
- \advance\pgf@y-\pgfutil@tempdima%
- \fi%
- \ifx\bottombendstyle\pgf@lib@sh@nonetext%
- \else%
- \advance\pgf@y-\pgfutil@tempdima%
- \fi%
- %
- \pgfutil@tempdima3.414213\pgfutil@tempdima% 1 / (1-sin(45))
- \edef\bendyradius{\the\pgfutil@tempdima}%
- \addtosavedmacro\bendyradius%
- \advance\pgfutil@tempdima\outerysep%
- \edef\outerbendyradius{\the\pgfutil@tempdima}%
- \addtosavedmacro\outerbendyradius%
- \advance\pgfutil@tempdima-\outerysep%
- \advance\pgfutil@tempdima-\outerysep%
- \edef\innerbendyradius{\the\pgfutil@tempdima}%
- \addtosavedmacro\innerbendyradius%
- %
- \pgfutil@tempdima0.707106\pgf@x% cos(45)
- \edef\bendxradius{\the\pgfutil@tempdima}%
- \addtosavedmacro\bendxradius%
- \advance\pgfutil@tempdima\outerxsep%
- \edef\outerbendxradius{\the\pgfutil@tempdima}%
- \addtosavedmacro\outerbendxradius%
- \advance\pgfutil@tempdima-\outerxsep%
- \advance\pgfutil@tempdima-\outerxsep%
- \edef\innerbendxradius{\the\pgfutil@tempdima}%
- \addtosavedmacro\innerbendxradius%
- %
- \edef\halfwidth{\the\pgf@x}%
- \edef\halfheight{\the\pgf@y}%
- \addtosavedmacro\halfwidth%
- \addtosavedmacro\halfheight%
- %
- \advance\pgf@x\outerxsep%
- \edef\outerhalfwidth{\the\pgf@x}%
- \addtosavedmacro\outerhalfwidth%
- %
- \pgf@xc\bendxradius%
- \pgf@yc\bendyradius%
- \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@xc}}%
- \pgfmathatan{\pgfmathresult}%
- \pgf@xc\pgfmathresult pt\relax%
- \pgf@xc.5\pgf@xc%
- \edef\halfangle{\pgfmath@tonumber{\pgf@xc}}%
- \addtosavedmacro\halfangle%
- %
- \pgf@xc45pt\relax%
- \advance\pgf@xc-\halfangle pt%
- \pgfmathcot@{\pgfmath@tonumber{\pgf@xc}}%
- \let\cothalfanglein\pgfmathresult%
- \addtosavedmacro\cothalfanglein%
- %
- \pgf@xc90pt\relax%
- \advance\pgf@xc-\halfangle pt%
- \pgfmathcot@{\pgfmath@tonumber{\pgf@xc}}%
- \let\cothalfangleout\pgfmathresult%
- \addtosavedmacro\cothalfangleout%
- %
- }
- \savedanchor{\centerpoint}{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgf@y.5\ht\pgfnodeparttextbox%
- \advance\pgf@y-.5\dp\pgfnodeparttextbox%
- }
- \savedanchor{\midpoint}{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgfmathsetlength\pgf@y{+0.5ex}%
- }
- \savedanchor{\basepoint}{%
- \pgf@x.5\wd\pgfnodeparttextbox%
- \pgf@y0pt%
- }
- \anchor{center}{\centerpoint}%
- \anchor{mid}{\midpoint}%
- \anchor{mid east}{\tapedimensions\midpoint\advance\pgf@x\outerhalfwidth}%
- \anchor{mid west}{\tapedimensions\midpoint\advance\pgf@x-\outerhalfwidth}%
- \anchor{base}{\basepoint}%
- \anchor{base east}{\tapedimensions\basepoint\advance\pgf@x\outerhalfwidth}%
- \anchor{base west}{\tapedimensions\basepoint\advance\pgf@x-\outerhalfwidth}%
- \anchor{north}{%
- \csname pgf@anchor@tape@north east\endcsname%
- \pgf@ya\pgf@y%
- \csname pgf@anchor@tape@north west\endcsname%
- \advance\pgf@ya\pgf@y%
- \centerpoint%
- \pgf@y.5\pgf@ya%
- }
- \anchor{south}{%
- \csname pgf@anchor@tape@south east\endcsname%
- \pgf@ya\pgf@y%
- \csname pgf@anchor@tape@south west\endcsname%
- \advance\pgf@ya\pgf@y%
- \centerpoint%
- \pgf@y.5\pgf@ya%
- }
- \anchor{east}{%
- \tapedimensions%
- \centerpoint%
- \advance\pgf@x\outerhalfwidth%
- }
- \anchor{west}{%
- \tapedimensions%
- \centerpoint%
- \advance\pgf@x-\outerhalfwidth%
- }
- \anchor{north east}{%
- \tapedimensions%
- \centerpoint%
- \advance\pgf@x\outerhalfwidth%
- \advance\pgf@y\halfheight%
- \pgf@yc\outerysep%
- \ifx\topbendstyle\pgf@lib@sh@inandouttext%
- \advance\pgf@y\halfbendheight%
- \advance\pgf@y\cothalfangleout\pgf@yc%
- \else%
- \ifx\topbendstyle\pgf@lib@sh@outandintext%
- \advance\pgf@y\halfbendheight%
- \advance\pgf@y\cothalfanglein\pgf@yc%
- \else%
- \advance\pgf@y\pgf@yc%
- \fi%
- \fi%
- }%
- \anchor{north west}{%
- \tapedimensions%
- \centerpoint%
- \advance\pgf@x-\outerhalfwidth%
- \advance\pgf@y\halfheight%
- \pgf@yc\outerysep%
- \ifx\topbendstyle\pgf@lib@sh@inandouttext%
- \advance\pgf@y\halfbendheight%
- \advance\pgf@y\cothalfanglein\pgf@yc%
- \else%
- \ifx\topbendstyle\pgf@lib@sh@outandintext%
- \advance\pgf@y\halfbendheight%
- \advance\pgf@y\cothalfangleout\pgf@yc%
- \else%
- \advance\pgf@y\pgf@yc%
- \fi%
- \fi%
- }%
- \anchor{south east}{%
- \tapedimensions%
- \centerpoint%
- \advance\pgf@x\outerhalfwidth%
- \advance\pgf@y-\halfheight%
- \pgf@yc\outerysep%
- \ifx\topbendstyle\pgf@lib@sh@outandintext%
- \advance\pgf@y-\halfbendheight%
- \advance\pgf@y-\cothalfangleout\pgf@yc%
- \else%
- \ifx\topbendstyle\pgf@lib@sh@inandouttext%
- \advance\pgf@y-\halfbendheight%
- \advance\pgf@y-\cothalfanglein\pgf@yc%
- \else%
- \advance\pgf@y-\pgf@yc%
- \fi%
- \fi%
- }%
- \anchor{south west}{%
- \tapedimensions%
- \centerpoint%
- \advance\pgf@x-\outerhalfwidth%
- \advance\pgf@y-\halfheight%
- \pgf@yc\outerysep%
- \ifx\topbendstyle\pgf@lib@sh@outandintext%
- \advance\pgf@y-\halfbendheight%
- \advance\pgf@y-\cothalfanglein\pgf@yc%
- \else%
- \ifx\topbendstyle\pgf@lib@sh@inandouttext%
- \advance\pgf@y-\halfbendheight%
- \advance\pgf@y-\cothalfangleout\pgf@yc%
- \else%
- \advance\pgf@y-\pgf@yc%
- \fi%
- \fi%
- }%
- \backgroundpath{%
- \tapedimensions%
- %
- \pgf@xc\halfwidth%
- \pgf@yc\halfheight%
- %
- \pgf@xc\bendxradius%
- \pgf@yc\bendyradius%
- {%
- \pgftransformshift{\centerpoint}%
- \pgfpathmoveto{\pgfqpoint{-\halfwidth}{0pt}}%
- \pgfpathlineto{\pgfqpoint{-\halfwidth}{\halfheight}}%
- \ifx\topbendstyle\pgf@lib@sh@inandouttext%
- \pgfpathlineto{\pgf@x-\halfwidth\pgf@y\halfheight\advance\pgf@y\halfbendheight}%
- \pgfpatharc{225}{315}{\bendxradius and \bendyradius}%
- \pgfpatharc{135}{45}{\bendxradius and \bendyradius}%
- \else%
- \ifx\topbendstyle\pgf@lib@sh@outandintext%
- \pgfpathlineto{\pgf@x-\halfwidth\pgf@y\halfheight\advance\pgf@y\halfbendheight}%
- \pgfpatharc{135}{45}{\bendxradius and \bendyradius}%
- \pgfpatharc{225}{315}{\bendxradius and \bendyradius}%
- \else%
- \pgfpathlineto{\pgfqpoint{\halfwidth}{\halfheight}}%
- \fi%
- \fi%
- \pgfpathlineto{\pgfqpoint{\halfwidth}{-\halfheight}}%
- \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
- \pgfpathlineto{\pgf@x\halfwidth\pgf@y-\halfheight\advance\pgf@y-\halfbendheight}%
- \pgfpatharc{45}{135}{\bendxradius and \bendyradius}%
- \pgfpatharc{315}{225}{\bendxradius and \bendyradius}%
- \else%
- \ifx\bottombendstyle\pgf@lib@sh@outandintext%
- \pgfpathlineto{\pgf@x\halfwidth\pgf@y-\halfheight\advance\pgf@y-\halfbendheight}%
- \pgfpatharc{315}{225}{\bendxradius and \bendyradius}%
- \pgfpatharc{45}{135}{\bendxradius and \bendyradius}%
- \else%
- \pgfpathlineto{\pgfqpoint{-\halfwidth}{-\halfheight}}%
- \fi%
- \fi%
- \pgfpathclose%
- }%
- }
- \anchorborder{%
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \pgfextract@process\externalpoint{%
- \centerpoint%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
- \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
- \let\externalangle\pgfmathresult%
- \tapedimensions%
- %
- \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@north west\endcsname}%
- \ifdim\externalangle pt<\pgfmathresult pt%
- \ifdim\externalangle pt<90pt%
- \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@north east\endcsname}%
- \ifdim\externalangle pt<\pgfmathresult pt%
- \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
- {\csname pgf@anchor@tape@north east\endcsname}%
- {\csname pgf@anchor@tape@south east\endcsname}%
- \else%
- % Between north and north east.
- \ifx\topbendstyle\pgf@lib@sh@inandouttext%
- % in and out.
- \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
- {%
- \centerpoint%
- \pgf@xc\halfwidth%
- \advance\pgf@x.5\pgf@xc%
- \advance\pgf@y\halfheight%
- \advance\pgf@y\halfbendheight%
- \pgf@yc\bendyradius%
- \advance\pgf@y-.707106\pgf@yc%
- }%
- {5}{175}{\outerbendxradius and \outerbendyradius}%
- \else%
- \ifx\topbendstyle\pgf@lib@sh@outandintext%
- % out and in.
- \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
- {%
- \centerpoint%
- \pgf@xc\halfwidth%
- \advance\pgf@x.5\pgf@xc%
- \advance\pgf@y\halfheight%
- \advance\pgf@y\halfbendheight%
- \pgf@yc\bendyradius%
- \advance\pgf@y.707106\pgf@yc%
- }%
- {185}{355}{\innerbendxradius and \innerbendyradius}%
- \else%
- \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
- {\csname pgf@anchor@tape@north east\endcsname}%
- {\csname pgf@anchor@tape@north west\endcsname}%
- \fi%
- \fi%
- \fi%
- \else%
- % Between north and north west.
- \ifx\topbendstyle\pgf@lib@sh@inandouttext%
- % in and out.
- \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
- {%
- \centerpoint%
- \pgf@xc\halfwidth%
- \advance\pgf@x-.5\pgf@xc%
- \advance\pgf@y\halfheight%
- \advance\pgf@y\halfbendheight%
- \pgf@yc\bendyradius%
- \advance\pgf@y.707106\pgf@yc%
- }%
- {185}{355}{\innerbendxradius and \innerbendyradius}%
- \else%
- \ifx\topbendstyle\pgf@lib@sh@outandintext%
- % out and in.
- \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
- {%
- \centerpoint%
- \pgf@xc\halfwidth%
- \advance\pgf@x-.5\pgf@xc%
- \advance\pgf@y\halfheight%
- \advance\pgf@y\halfbendheight%
- \pgf@yc\bendyradius%
- \advance\pgf@y-.707106\pgf@yc%
- }%
- {5}{175}{\outerbendxradius and \outerbendyradius}%
- \else%
- \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
- {\csname pgf@anchor@tape@north east\endcsname}%
- {\csname pgf@anchor@tape@north west\endcsname}%
- \fi%
- \fi%
- \fi%
- \else%
- \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@south west\endcsname}%
- \ifdim\externalangle pt>\pgfmathresult pt%
- \ifdim\externalangle pt>270pt%
- \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@south east\endcsname}%
- \ifdim\externalangle pt>\pgfmathresult pt%
- \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
- {\csname pgf@anchor@tape@north east\endcsname}%
- {\csname pgf@anchor@tape@south east\endcsname}%
- \else%
- % Between south and south east.
- \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
- % in and out.
- \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
- {%
- \centerpoint%
- \pgf@xc\halfwidth%
- \advance\pgf@x.5\pgf@xc%
- \advance\pgf@y-\halfheight%
- \advance\pgf@y-\halfbendheight%
- \pgf@yc\bendyradius%
- \advance\pgf@y-.707106\pgf@yc%
- }%
- {5}{175}{\innerbendxradius and \innerbendyradius}%
- \else%
- \ifx\bottombendstyle\pgf@lib@sh@outandintext%
- % out and in.
- \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
- {%
- \centerpoint%
- \pgf@xc\halfwidth%
- \advance\pgf@x.5\pgf@xc%
- \advance\pgf@y-\halfheight%
- \advance\pgf@y-\halfbendheight%
- \pgf@yc\bendyradius%
- \advance\pgf@y.707106\pgf@yc%
- }%
- {185}{355}{\outerbendxradius and \outerbendyradius}%
- \else%
- \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
- {\csname pgf@anchor@tape@south east\endcsname}%
- {\csname pgf@anchor@tape@south west\endcsname}%
- \fi%
- \fi%
- \fi%
- \else%
- % Between south and south west.
- \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
- % in and out.
- \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
- {%
- \centerpoint%
- \pgf@xc\halfwidth%
- \advance\pgf@x-.5\pgf@xc%
- \advance\pgf@y-\halfheight%
- \advance\pgf@y-\halfbendheight%
- \pgf@yc\bendyradius%
- \advance\pgf@y.707106\pgf@yc%
- }%
- {185}{355}{\outerbendxradius and \outerbendyradius}%
- \else%
- \ifx\bottombendstyle\pgf@lib@sh@outandintext%
- % out and in.
- \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
- {%
- \centerpoint%
- \pgf@xc\halfwidth%
- \advance\pgf@x-.5\pgf@xc%
- \advance\pgf@y-\halfheight%
- \advance\pgf@y-\halfbendheight%
- \pgf@yc\bendyradius%
- \advance\pgf@y-.707106\pgf@yc%
- }%
- {5}{175}{\innerbendxradius and \innerbendyradius}%
- \else%
- \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
- {\csname pgf@anchor@tape@south east\endcsname}%
- {\csname pgf@anchor@tape@south west\endcsname}%
- \fi%
- \fi%
- \fi%
- \else%
- \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
- {\csname pgf@anchor@tape@north west\endcsname}%
- {\csname pgf@anchor@tape@south west\endcsname}%
- \fi%
- \fi%
- }%
+ \savedmacro\tapedimensions{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ %
+ \pgfmathsetlengthmacro\outerxsep{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlengthmacro\outerysep{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \addtosavedmacro\outerxsep%
+ \addtosavedmacro\outerysep%
+ %
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/tape bend height}}%
+ \pgfutil@tempdima.5\pgfutil@tempdima%
+ \edef\halfbendheight{\the\pgfutil@tempdima}%
+ \addtosavedmacro\halfbendheight%
+ %
+ \pgfkeysgetvalue{/pgf/tape bend top}{\topbendstyle}%
+ \pgfkeysgetvalue{/pgf/tape bend bottom}{\bottombendstyle}%
+ \addtosavedmacro\topbendstyle%
+ \addtosavedmacro\bottombendstyle%
+ %
+ \ifx\topbendstyle\pgf@lib@sh@nonetext%
+ \else%
+ \advance\pgf@y\pgfutil@tempdima%
+ \fi%
+ \ifx\bottombendstyle\pgf@lib@sh@none%
+ \else%
+ \advance\pgf@y\pgfutil@tempdima%
+ \fi%
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ \ifx\topbendstyle\pgf@lib@sh@nonetext%
+ \else%
+ \advance\pgf@y-\pgfutil@tempdima%
+ \fi%
+ \ifx\bottombendstyle\pgf@lib@sh@nonetext%
+ \else%
+ \advance\pgf@y-\pgfutil@tempdima%
+ \fi%
+ %
+ \pgfutil@tempdima3.414213\pgfutil@tempdima% 1 / (1-sin(45))
+ \edef\bendyradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\bendyradius%
+ \advance\pgfutil@tempdima\outerysep%
+ \edef\outerbendyradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\outerbendyradius%
+ \advance\pgfutil@tempdima-\outerysep%
+ \advance\pgfutil@tempdima-\outerysep%
+ \edef\innerbendyradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\innerbendyradius%
+ %
+ \pgfutil@tempdima0.707106\pgf@x% cos(45)
+ \edef\bendxradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\bendxradius%
+ \advance\pgfutil@tempdima\outerxsep%
+ \edef\outerbendxradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\outerbendxradius%
+ \advance\pgfutil@tempdima-\outerxsep%
+ \advance\pgfutil@tempdima-\outerxsep%
+ \edef\innerbendxradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\innerbendxradius%
+ %
+ \edef\halfwidth{\the\pgf@x}%
+ \edef\halfheight{\the\pgf@y}%
+ \addtosavedmacro\halfwidth%
+ \addtosavedmacro\halfheight%
+ %
+ \advance\pgf@x\outerxsep%
+ \edef\outerhalfwidth{\the\pgf@x}%
+ \addtosavedmacro\outerhalfwidth%
+ %
+ \pgf@xc\bendxradius%
+ \pgf@yc\bendyradius%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@xc}}%
+ \pgfmathatan{\pgfmathresult}%
+ \pgf@xc\pgfmathresult pt\relax%
+ \pgf@xc.5\pgf@xc%
+ \edef\halfangle{\pgfmath@tonumber{\pgf@xc}}%
+ \addtosavedmacro\halfangle%
+ %
+ \pgf@xc45pt\relax%
+ \advance\pgf@xc-\halfangle pt%
+ \pgfmathcot@{\pgfmath@tonumber{\pgf@xc}}%
+ \let\cothalfanglein\pgfmathresult%
+ \addtosavedmacro\cothalfanglein%
+ %
+ \pgf@xc90pt\relax%
+ \advance\pgf@xc-\halfangle pt%
+ \pgfmathcot@{\pgfmath@tonumber{\pgf@xc}}%
+ \let\cothalfangleout\pgfmathresult%
+ \addtosavedmacro\cothalfangleout%
+ %
+ }
+ \savedanchor{\centerpoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }
+ \savedanchor{\midpoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }
+ \savedanchor{\basepoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{\tapedimensions\midpoint\advance\pgf@x\outerhalfwidth}%
+ \anchor{mid west}{\tapedimensions\midpoint\advance\pgf@x-\outerhalfwidth}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{\tapedimensions\basepoint\advance\pgf@x\outerhalfwidth}%
+ \anchor{base west}{\tapedimensions\basepoint\advance\pgf@x-\outerhalfwidth}%
+ \anchor{north}{%
+ \csname pgf@anchor@tape@north east\endcsname%
+ \pgf@ya\pgf@y%
+ \csname pgf@anchor@tape@north west\endcsname%
+ \advance\pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y.5\pgf@ya%
+ }
+ \anchor{south}{%
+ \csname pgf@anchor@tape@south east\endcsname%
+ \pgf@ya\pgf@y%
+ \csname pgf@anchor@tape@south west\endcsname%
+ \advance\pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y.5\pgf@ya%
+ }
+ \anchor{east}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x\outerhalfwidth%
+ }
+ \anchor{west}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x-\outerhalfwidth%
+ }
+ \anchor{north east}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x\outerhalfwidth%
+ \advance\pgf@y\halfheight%
+ \pgf@yc\outerysep%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \advance\pgf@y\halfbendheight%
+ \advance\pgf@y\cothalfangleout\pgf@yc%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \advance\pgf@y\halfbendheight%
+ \advance\pgf@y\cothalfanglein\pgf@yc%
+ \else%
+ \advance\pgf@y\pgf@yc%
+ \fi%
+ \fi%
+ }%
+ \anchor{north west}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x-\outerhalfwidth%
+ \advance\pgf@y\halfheight%
+ \pgf@yc\outerysep%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \advance\pgf@y\halfbendheight%
+ \advance\pgf@y\cothalfanglein\pgf@yc%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \advance\pgf@y\halfbendheight%
+ \advance\pgf@y\cothalfangleout\pgf@yc%
+ \else%
+ \advance\pgf@y\pgf@yc%
+ \fi%
+ \fi%
+ }%
+ \anchor{south east}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x\outerhalfwidth%
+ \advance\pgf@y-\halfheight%
+ \pgf@yc\outerysep%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \advance\pgf@y-\halfbendheight%
+ \advance\pgf@y-\cothalfangleout\pgf@yc%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \advance\pgf@y-\halfbendheight%
+ \advance\pgf@y-\cothalfanglein\pgf@yc%
+ \else%
+ \advance\pgf@y-\pgf@yc%
+ \fi%
+ \fi%
+ }%
+ \anchor{south west}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x-\outerhalfwidth%
+ \advance\pgf@y-\halfheight%
+ \pgf@yc\outerysep%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \advance\pgf@y-\halfbendheight%
+ \advance\pgf@y-\cothalfanglein\pgf@yc%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \advance\pgf@y-\halfbendheight%
+ \advance\pgf@y-\cothalfangleout\pgf@yc%
+ \else%
+ \advance\pgf@y-\pgf@yc%
+ \fi%
+ \fi%
+ }%
+ \backgroundpath{%
+ \tapedimensions%
+ %
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ %
+ \pgf@xc\bendxradius%
+ \pgf@yc\bendyradius%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{-\halfwidth}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{-\halfwidth}{\halfheight}}%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \pgfpathlineto{\pgf@x-\halfwidth\pgf@y\halfheight\advance\pgf@y\halfbendheight}%
+ \pgfpatharc{225}{315}{\bendxradius and \bendyradius}%
+ \pgfpatharc{135}{45}{\bendxradius and \bendyradius}%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \pgfpathlineto{\pgf@x-\halfwidth\pgf@y\halfheight\advance\pgf@y\halfbendheight}%
+ \pgfpatharc{135}{45}{\bendxradius and \bendyradius}%
+ \pgfpatharc{225}{315}{\bendxradius and \bendyradius}%
+ \else%
+ \pgfpathlineto{\pgfqpoint{\halfwidth}{\halfheight}}%
+ \fi%
+ \fi%
+ \pgfpathlineto{\pgfqpoint{\halfwidth}{-\halfheight}}%
+ \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
+ \pgfpathlineto{\pgf@x\halfwidth\pgf@y-\halfheight\advance\pgf@y-\halfbendheight}%
+ \pgfpatharc{45}{135}{\bendxradius and \bendyradius}%
+ \pgfpatharc{315}{225}{\bendxradius and \bendyradius}%
+ \else%
+ \ifx\bottombendstyle\pgf@lib@sh@outandintext%
+ \pgfpathlineto{\pgf@x\halfwidth\pgf@y-\halfheight\advance\pgf@y-\halfbendheight}%
+ \pgfpatharc{315}{225}{\bendxradius and \bendyradius}%
+ \pgfpatharc{45}{135}{\bendxradius and \bendyradius}%
+ \else%
+ \pgfpathlineto{\pgfqpoint{-\halfwidth}{-\halfheight}}%
+ \fi%
+ \fi%
+ \pgfpathclose%
+ }%
+ }
+ \anchorborder{%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfextract@process\externalpoint{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ \tapedimensions%
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@north west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt%
+ \ifdim\externalangle pt<90pt%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@north east\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north east\endcsname}%
+ {\csname pgf@anchor@tape@south east\endcsname}%
+ \else%
+ % Between north and north east.
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ % in and out.
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x.5\pgf@xc%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y-.707106\pgf@yc%
+ }%
+ {5}{175}{\outerbendxradius and \outerbendyradius}%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ % out and in.
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x.5\pgf@xc%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y.707106\pgf@yc%
+ }%
+ {185}{355}{\innerbendxradius and \innerbendyradius}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north east\endcsname}%
+ {\csname pgf@anchor@tape@north west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ % Between north and north west.
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ % in and out.
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x-.5\pgf@xc%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y.707106\pgf@yc%
+ }%
+ {185}{355}{\innerbendxradius and \innerbendyradius}%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ % out and in.
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x-.5\pgf@xc%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y-.707106\pgf@yc%
+ }%
+ {5}{175}{\outerbendxradius and \outerbendyradius}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north east\endcsname}%
+ {\csname pgf@anchor@tape@north west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@south west\endcsname}%
+ \ifdim\externalangle pt>\pgfmathresult pt%
+ \ifdim\externalangle pt>270pt%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@south east\endcsname}%
+ \ifdim\externalangle pt>\pgfmathresult pt%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north east\endcsname}%
+ {\csname pgf@anchor@tape@south east\endcsname}%
+ \else%
+ % Between south and south east.
+ \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
+ % in and out.
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x.5\pgf@xc%
+ \advance\pgf@y-\halfheight%
+ \advance\pgf@y-\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y-.707106\pgf@yc%
+ }%
+ {5}{175}{\innerbendxradius and \innerbendyradius}%
+ \else%
+ \ifx\bottombendstyle\pgf@lib@sh@outandintext%
+ % out and in.
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x.5\pgf@xc%
+ \advance\pgf@y-\halfheight%
+ \advance\pgf@y-\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y.707106\pgf@yc%
+ }%
+ {185}{355}{\outerbendxradius and \outerbendyradius}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@south east\endcsname}%
+ {\csname pgf@anchor@tape@south west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ % Between south and south west.
+ \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
+ % in and out.
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x-.5\pgf@xc%
+ \advance\pgf@y-\halfheight%
+ \advance\pgf@y-\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y.707106\pgf@yc%
+ }%
+ {185}{355}{\outerbendxradius and \outerbendyradius}%
+ \else%
+ \ifx\bottombendstyle\pgf@lib@sh@outandintext%
+ % out and in.
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x-.5\pgf@xc%
+ \advance\pgf@y-\halfheight%
+ \advance\pgf@y-\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y-.707106\pgf@yc%
+ }%
+ {5}{175}{\innerbendxradius and \innerbendyradius}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@south east\endcsname}%
+ {\csname pgf@anchor@tape@south west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north west\endcsname}%
+ {\csname pgf@anchor@tape@south west\endcsname}%
+ \fi%
+ \fi%
+ }%
}
@@ -2565,7 +2607,169 @@
{\pgfpointpolar{\pgfkeysvalueof{/pgf/magnifying glass handle angle}}{\pgfutil@tempdima}}}
\pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}
{\pgfpointpolar{\pgfkeysvalueof{/pgf/magnifying glass handle angle}}{\pgfutil@tempdima+\pgfutil@tempdima*(\pgfkeysvalueof{/pgf/magnifying glass handle aspect})}}}
+ \pgfsetarrowsstart{}
+ \pgfsetarrowsend{}
}
}
+\pgfkeys{%
+ /pgf/magnetic tape tail/.initial=0.15,
+ /pgf/magnetic tape tail extend/.initial=0cm,
+}
+\pgfdeclareshape{magnetic tape}{
+ \nodeparts{text}
+ \savedmacro\installparameters{%
+ %
+ \pgf@x=0.5\wd\pgfnodeparttextbox%
+ \pgf@y=0.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by-0.5\dp\pgfnodeparttextbox%
+ \edef\centerpoint{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ %
+ \pgf@x=\wd\pgfnodeparttextbox%
+ \pgf@y=\ht\pgfnodeparttextbox%
+ \advance\pgf@y by\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@x by2.0\pgf@xa%
+ \advance\pgf@y by2.0\pgf@ya%
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x=\pgf@y%
+ \fi%
+ \pgf@x=1.414213\pgf@x%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<\pgf@xa%
+ \pgf@x=\pgf@xa%
+ \fi%
+ \ifdim\pgf@x<\pgf@ya%
+ \pgf@x=\pgf@ya%
+ \fi%
+ \pgf@x=0.5\pgf@x%
+ \edef\radius{\the\pgf@x}%
+ %
+ \pgfmathparse{max(\pgfkeysvalueof{/pgf/magnetic tape tail extend},0)}%
+ \edef\tailextend{\pgfmathresult pt}%
+ %
+ \pgfmathparse{min(max(\pgfkeysvalueof{/pgf/magnetic tape tail},0),1)}%
+ \pgf@xa=\pgfmathresult\pgf@x%
+ \edef\tailheight{\the\pgf@xa}%
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xa<\pgf@ya%
+ \pgf@xa=\pgf@ya%
+ \fi%
+ \edef\outersep{\the\pgf@xa}%
+ %
+ \pgfmathparse{\outersep+\radius}%
+ \edef\outerradius{\pgfmathresult pt}%
+ %
+ \pgfmathparse{(\radius-\tailheight)/\radius}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathadd@{-\pgfmathresult}{360}%
+ \let\tailangle=\pgfmathresult%
+ %
+ \pgfmathparse{\outerradius/(\outerradius+\tailextend)}%
+ \pgfmathatan@{\pgfmathresult}%
+ \pgfmathadd@{-\pgfmathresult}{360}%
+ \let\tailbottomangle=\pgfmathresult%
+ %
+ \pgfmathparse{(\outerradius-\outersep-\tailheight-\outersep)/(\outerradius+\tailextend)}%
+ \pgfmathatan@{\pgfmathresult}%
+ \pgfmathadd@{-\pgfmathresult}{360}%
+ \let\tailtopangle=\pgfmathresult%
+ %
+ \addtosavedmacro\radius%
+ \addtosavedmacro\outerradius%
+ \addtosavedmacro\outersep%
+ \addtosavedmacro\tailheight%
+ \addtosavedmacro\tailextend
+ \addtosavedmacro\tailangle%
+ \addtosavedmacro\tailtopangle%
+ \addtosavedmacro\tailbottomangle%
+ \addtosavedmacro\centerpoint%
+ }
+ \savedanchor{\base}{\pgfqpoint{0.5\wd\pgfnodeparttextbox}{0pt}}
+ \savedanchor{\mid}{\pgfqpoint{0.5\wd\pgfnodeparttextbox}{0pt}\pgfmathsetlength\pgf@y{.5ex}}
+ \anchor{center}{\installparameters\centerpoint}% \addtosavedmacro\outerradius%
+ \anchor{base}{\base}
+ \anchor{mid}{\mid}
+ \anchor{base west}{\installparameters\pgfpointadd{\base}{\pgfqpoint{-\outerradius}{0pt}}}
+ \anchor{base east}{\installparameters\pgfpointadd{\base}{\pgfqpoint{\outerradius}{0pt}}}
+ \anchor{mid west}{\installparameters\pgfpointadd{\mid}{\pgfqpoint{-\outerradius}{0pt}}}
+ \anchor{mid east}{\installparameters\pgfpointadd{\mid}{\pgfqpoint{\outerradius}{0pt}}}
+ \anchor{north}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{0pt}{\outerradius}}}
+ \anchor{north east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpointpolar{45}{\outerradius}}}
+ \anchor{south}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{0pt}{-\outerradius}}}
+ \anchor{south east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{\outerradius}{-\outerradius}}}
+ \anchor{east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{\outerradius}{0pt}}}
+ \anchor{south west}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpointpolar{225}{\outerradius}}}
+ \anchor{west}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{-\outerradius}{0pt}}}
+ \anchor{north west}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpointpolar{135}{\outerradius}}}
+ \anchor{tail east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\radius+\tailextend+\outersep}{-\outerradius+\outersep+\tailheight/2}}}
+ \anchor{tail south east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\radius+\tailextend+\outersep}{-\outerradius}}}
+ \anchor{tail north east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\radius+\tailextend+\outersep}{-\outerradius+\outersep+\tailheight+\outersep}}}
+ \backgroundpath{
+ %
+ \installparameters%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfpointpolar{\tailangle}{\radius}}%
+ \pgfpatharc{\tailangle}{360}{\radius}%
+ \pgfpatharc{0}{270}{\radius}%
+ \pgfpathlineto{\pgfpoint{\radius+\tailextend}{-\radius}}%
+ \pgfpathlineto{\pgfpoint{\radius+\tailextend}{-\radius+\tailheight}}%
+ \pgfpathclose%
+ }%
+ }
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \installparameters%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\externalpoint}
+ \ifdim\pgfmathresult pt<270pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointborderellipse%
+ {\externalpoint}%
+ {\pgfqpoint{\outerradius}{\outerradius}}%
+ }%
+ \else%
+ \ifdim\pgfmathresult pt<\tailbottomangle pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointintersectionoflines%
+ {\externalpoint}{\pgfpointorigin}%
+ {\pgfqpoint{0pt}{-\outerradius}}{\pgfqpoint{\outerradius}{-\outerradius}}%
+ }%
+ \else%
+ \ifdim\pgfmathresult pt<\tailtopangle pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointintersectionoflines%
+ {\externalpoint}{\pgfpointorigin}%
+ {\pgfqpoint{\outerradius}{\outerradius}}{\pgfqpoint{\outerradius}{-\outerradius}}%
+ }%
+ \else%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointborderellipse%
+ {\externalpoint}%
+ {\pgfqpoint{\outerradius}{\outerradius}}%
+ }%
+ \fi%
+ \fi%
+ \fi%
+ }
+}
+
+% Local Variables:
+% tab-width: 2
+% End: \ No newline at end of file