% Copyright 2018 by Till Tantau and Mark Wibrow % % This file may be distributed and/or modified % % 1. under the LaTeX Project Public License and/or % 2. under the GNU Public License. % % See the file doc/generic/pgf/licenses/LICENSE for more details. \ProvidesFileRCS{pgflibraryshapes.symbols.code.tex} \pgfdeclareshape{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{} }% }% \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{} }% }% % Keys for starburst shape % % /pgf/starburst point height : The maximum height of the outer points. % /pgf/starburst points : The number of points. % /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}% }% }% \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}% }% }% \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}% }% }% \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}% % % Rotate 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}% }% }% % Keys for shape cloud. % % /pgf/cloud puffs : the number of cloud puffs. % /pgf/cloud puff arc : the length of the cloud puff arc. \newif\ifpgfcloudanchorsuseellipse% \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, }% % 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} }% }% \def\pgfsetshapeaspect#1{% \def\pgfshapeaspect{#1}% % Invert \pgfutil@tempdima=#1pt% \pgfutil@tempdima=.125\pgfutil@tempdima% \c@pgf@counta=\pgfutil@tempdima\relax% 8192*determinant \pgfutil@tempdima=8192pt% \divide\pgfutil@tempdima by\c@pgf@counta% \edef\pgfshapeaspectinverse{\pgf@sys@tonumber{\pgfutil@tempdima}}% }% \pgfsetshapeaspect{1}% % 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 extremities 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-ellipse (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/) % 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-ellipse' 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 relevant 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 nearest 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 positioning the cloud shape. This is needed % if a cloud is positioned using the `puff ' 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 % % 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}% }% }% % \pgf@sh@cloudpuffparameters % % Internal macro to calculate some common arc parameters which % are required when calculating radii, drawing the background % path and calculating border anchors. % \def\pgf@sh@getcloudpuffparameters{% % % 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}% \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}} \pgf@x\pgfmathresult pt\relax% \pgf@xa.5\pgf@x% \edef\halfchordlength{\the\pgf@xa}% \pgf@x\arcradiusquotient\pgf@x% \edef\arcradius{\the\pgf@x}% \pgf@xa\outersep\relax% \advance\pgf@xa\pgf@x% \edef\outerarcradius{\the\pgf@xa}% % % Calculate the height of the resulting segment. % \pgf@y-\sinhalfcomplementarc\pgf@x% sin((180-a)/2) \advance\pgf@y\pgf@x% \edef\segmentheight{\the\pgf@y}% % % Calculate the center of the circle of which the arc is a part. % \pgfextract@process\circlecenterpoint{% \pgfextract@process\circlecenterpoint{% \pgf@x-\halfchordlength\relax% \pgf@y\segmentheight\relax% \advance\pgf@y-\arcradius }% \pgfpointadd{\arcstartpoint}{% \pgfmathrotatepointaround{\circlecenterpoint}{\pgfpointorigin}{\arcslope}% }% }% }% % Internal macros for signal shape. % \def\pgf@lib@sh@signal@nowhere{nowhere}% \def\pgf@lib@sh@signal@from{from}% \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}% \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 }% \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% }% \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% }% % Keys for signal shape: % \pgfkeys{/pgf/.cd, 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}% }% }% % Keys for shape tape % % /pgf/tape bend top : Type of bend for north side. % /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, }% \def\pgf@lib@sh@inandouttext{in and out}% \def\pgf@lib@sh@outandintext{out and in}% \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% }% }% % Keys for magnifying glass shape % % /pgf/magnifying glass handle angle : The angle of handle % /pgf/magnifying glass handle aspect : The length of the handle as a multiple % of the radius of the circle % \pgfkeys{/pgf/.cd, magnifying glass handle angle/.initial=-45, magnifying glass handle aspect/.initial=1.5, }% \pgfdeclareshape{magnifying glass} {% \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}} {\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: