%% xyarc.tex from $Id: xyarc.doc,v 3.3 1996/12/18 14:21:23 ross Exp $ %% %% Xy-pic ``Circles, Ellipses and Arcs'' feature. %% Copyright (c) 1995-1996 Ross Moore %% %% This file is part of the Xy-pic package for graphs and diagrams in TeX. %% See the companion README and INSTALL files for further information. %% Copyright (c) 1991-1996 Kristoffer H. Rose %% %% The XY-pic package is free software; you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by the %% Free Software Foundation; either version 2 of the License, or (at your %% option) any later version. %% %% The XY-pic package is distributed in the hope that it will be useful, but %% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY %% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License %% for more details. %% %% You should have received a copy of the GNU General Public License along %% with this package; if not, write to the Free Software Foundation, Inc., %% 675 Mass Ave, Cambridge, MA 02139, USA. %% \ifx\xyloaded\undefined \input xy \fi \xyprovide{arc}{Circle, Ellipse and Arc feature}{\stripRCS$Revision: 3.3 $}% {Ross Moore}{ross@mpce.mq.edu.au}% {Mathematics Department, Macquarie University, NSW~2109, Australia} \xyrequire{curve} \xycatcodes \xydef@\ellipse#1#{\xy@{ELLIPSE}{\hbox\bgroup\save@}% \let\endarc@=\endellipse@@ \xyFN@\preARC@ #1@} \xydef@\endellipse@@{\xy@{endELLIPSE}{\leave@\origDirection@ \edef\next@{\egroup \X@min=\the\X@min \X@max=\the\X@max \Y@min=\the\Y@min \Y@max=\the\Y@max }\next@}\let\bstartPLACE@=\relax} \xydef@\preARC@{% \ifx\next\space@ \expandafter\DN@\space{\xyFN@\preARC@}% \else\ifx\next @\DN@{\xy@{ellipseARC}\ellipticARC@ \arc@}% \else\ifx\next ~\DN@~##1{\tildeARC@{##1}}% \else\DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}% \fi\fi\fi \next@ } \xydef@\arc@#1@#2{\xy@{arcSTYLE}{\def\arcSTYLE{#2}}\arc@i \DNii@{#1}% \ifx\nextii@\empty \DN@{\fullCircle@}% \else \DN@{_}% \ifx\next@\nextii@ \xy@{_}{\def\arcOrient@@{_}}% \let\arcOrient@@=\next@ \DN@{\fullCircle@}% \else \DN@{^}% \ifx\next@\nextii@ \xy@{^}{\def\arcOrient@@{^}}% \let\arcOrient@@=\next@ \DN@{\fullCircle@}% \else \DN@{\def\afterARCextents@@{% \xy@{aftARCext}{\let\doCircleArc@=\doCircleArc@@}% \ellipseArc@ \xy@{doCircARCs}{\leave@ \doCircleArcs@}\endarc@ }% \xyFN@\getarcparams@#1@}\fi\fi\fi \next@ } \xydef@\arc@i{\xy@{ARCi}{% \save@\idfromc@{0@c}\cfromp@\idfromc@{0@p}% \enter@\cplusthec@ \enter@\relax\begingroup\vfromslide@i{}@\czeroEdge@ \leave@\idfromc@{0@m}\leave@ \zeroDivideLimit@{50}% \edef\origDirection@{\Direction=\the\Direction \relax\noexpand\imposeDirection@}% \let\startDirection@=\origDirection@ \def\startDirection@@{}% \def\endDirection@{}\def\endDirection@@{}\def\arcOrient@@{^}}% \def\arcOrient@@{^}\let\processDirections@=\checkstartDirection@ \def\arcRadius@{}\def\ellipseRatio@{}\def\arcScale@{\arcScale@@}} \message{circles,} \xydef@\fullCircle@{\xy@{fullCIRC}{\let\endDirection@=\relax \let\doCircleArc@=\doMergeEndArc@@}\circleArc@ }% \xydef@\getarcparams@{% \ifx\space@\next \expandafter\DN@\space{\xyFN@\getarcparams@}% \else\addLT@\ifx \next \xy@{<}{}% \addGT@{\addLT@\DN@##1}{\splitRadius@dim##1,,@}% \else\ifx\next (\DN@({\xyFN@\checkRadOpen@}% \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}% \else \addLQ@\ifx \next \addLQ@\DN@{\xy@`{}\ARCturn@}% \else \DN@{\getarcExtents@}% \fi\fi\fi\fi\fi \next@ } \xydef@\checkRadOpen@{% \ifx\next *\DN@{\xyFN@\getarcExtents@ (}% \else \xy@{(}{}\DN@##1){\splitRadius@##1,,@}% \fi \next@ } \xydef@\fixedRadiusArc@{% \xy@{fixRadArc}{\save@ \idfromc@{0@0}\cfromp@\idfromc@{0@c}\leave@}% \xyFN@\fixedRadiusArc@i } \xydef@\fixedRadiusArc@i{% \ifx\next\space@ \expandafter\DN@\space{\xyFN@\fixedRadiusArc@i}% \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}% \else\DN@{\let\processDirections@=\processArcDirections@ \def\afterARCextents@@{\xy@{aftARCext}{\let\doCircleArc@=\doCircleArc@@ \ellipseSector@}}\xyFN@\getarcExtents@}% \fi\fi \next@ } \xydef@\arcScale@@{\xy@{arcSCALE@@}{\save@ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setbase@\X@p\Y@p\X@c\Y@c}} \xydef@\arcScale@dim#1{\xy@{arcSCALEdim}{\save@\cfromid@{0@0}\pfromc@ \cfromid@{0@p}\setupDirection@\cfromp@ \enter@\cplusthec@ \enter@\relax\begingroup\vfromslide@i#1@\leave@ \setbase@\X@p\Y@p\X@c\Y@c \idfromc@{0@p}}} \xydef@\ellipseScale@dim#1{\xy@{ellSCALEdim}{\setupDirection@\cfromp@ \enter@\cplusthec@ \aboveDirection@\xydashl@ \vfromslide@{#1}\leave@ \setbase@@\X@c\Y@c}} \xydef@\ellipseScale@#1{\xy@{ellSCALE@}% {\vfromcartesian@@0,#1@\setbase@@\X@c\Y@c}} \xydef@\splitRadius@dim#1,#2,#3@{% \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\relax%\splinetracing \expandafter\def\expandafter\arcRadius@ \expandafter{\arcScale@dim{#1}}\fi \DN@{#2}\ifx\next@\empty\dimen@ii=\z@\def\ellipseRatio@{}% \else\dimen@ii=#2\relax \expandafter \def\expandafter\ellipseRatio@\expandafter{\ellipseScale@dim{#2}}% \fi \fixedRadiusArc@ } \xydef@\splitRadius@#1,#2,#3@{% \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\relax\fi \DN@{#2}\ifx\next@\empty\dimen@ii=\z@\else\dimen@ii=#2\p@\relax\fi \ifdim\dimen@=\z@ \ifdim\dimen@ii=\z@\else \expandafter \def\expandafter\ellipseRatio@\expandafter{\ellipseScale@{#2}}\fi \else \ifdim\dimen@ii=\z@ \def\arcScale@{\xy@{arcSCALE@}{\save@\cfromid@{0@0}% \X@origin=\X@c \Y@origin=\Y@c \X@xbase=#1\X@xbase \Y@xbase=#1\Y@xbase \X@ybase=#1\X@ybase \Y@ybase=#1\Y@ybase \advance\X@c\X@xbase \advance\Y@c\Y@xbase \czeroEdge@ \idfromc@{0@p}\idfromc@{0@c}}}% \else \def\arcScale@{\xy@{arcSCALE@}{\save@\cfromid@{0@0}% \X@origin=\X@c \Y@origin=\Y@c \X@xbase=#1\X@xbase \Y@xbase=#1\Y@xbase \X@ybase=#2\X@ybase \Y@ybase=#2\Y@ybase \advance\X@c\X@xbase \advance\Y@c\Y@xbase \czeroEdge@ \idfromc@{0@p}\idfromc@{0@c}}}% \fi \fi \fixedRadiusArc@ } \xydef@\baseOrient@{\DN@{_}\ifx\next@\arcOrient@@ \X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi } \message{ellipses,} \xydef@\fullEllipse@{\xy@{fullELLIPSE}% {\def\startDirection@{}\let\doCircleArc@=\doMergeEndArc@@}% \ellipseArc@ \xy@{doCIRCarcs}{\leave@ \doCircleArcs@}\endarc@ } \xydef@\ellipseArc@{% \arcScale@ \arcRadius@ \ellipseRatio@ \xy@{arcCONTROLS}{\baseOrient@ \arcControls@ \let\bstartPLACE@=\relax }} \xydef@\cubicARCcontrols@@{\czeroEdge@ \vfromcartesian@@0,1@\idfromc@{1@c}% \vfromcartesian@@-1,0@\idfromc@{2@c}% \vfromcartesian@@0,-1@\idfromc@{3@c}% \vfromcartesian@@1,\arcparam@ @\idfromc@{1@m}% \vfromcartesian@@\arcparam@,1@\idfromc@{2@m}% \vfromcartesian@@-\arcparam@,1@\idfromc@{3@m}% \vfromcartesian@@-1,\arcparam@ @\idfromc@{4@m}% \vfromcartesian@@-1,-\arcparam@ @\idfromc@{5@m}% \vfromcartesian@@-\arcparam@,-1@\idfromc@{6@m}% \vfromcartesian@@\arcparam@,-1@\idfromc@{7@m}% \vfromcartesian@@1,-\arcparam@ @\idfromc@{8@m}% } \xydef@\doCircleArc@@#1#2{\save@ \ifcase#2\relax \doCircleArc@@@{0@p}{1@m}{2@m}{1@c}{#1}\or \doCircleArc@@@{1@c}{3@m}{4@m}{2@c}{#1}\or \doCircleArc@@@{2@c}{5@m}{6@m}{3@c}{#1}\or \doCircleArc@@@{3@c}{7@m}{8@m}{0@p}{#1}\or \doCircleArc@@@{0@p}{1@m}{2@m}{1@c}{#1}\or \doCircleArc@@@{1@c}{3@m}{4@m}{2@c}{#1}\or \doCircleArc@@@{2@c}{5@m}{6@m}{3@c}{#1}\or \doCircleArc@@@{3@c}{7@m}{8@m}{0@p}{#1}\fi \leave@ } \xydef@\doCircleArc@@@#1#2#3#4#5{% \cfromid@{#1}\pfromc@\senter@ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}% \connect@\crvs{#5}\relax\sinit@\sleave@} \xydef@\doMergeEndArc@@#1#2{\save@\ifcase#2\relax \doMergeEnd@@@{0@p}{1@m}{2@m}{1@c}{#1}\relax\or \doMergeEnd@@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or \doMergeEnd@@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or \doMergeEnd@@@{3@c}{7@m}{8@m}{0@p}{#1}@\fi \leave@ } \xydef@\doMergeEnd@@@#1#2#3#4#5#6{% \cfromid@{#1}\pfromc@\senter@ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}% \ifx#6\relax \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi \enter@\cmergethec@\cfromid@{0@c}\leave@ \enter@\cmergethec@\cfromcontrols@{#1}{#2}{#3}{#4}\leave@ \connect@\crvs{#5}\relax \sinit@\sleave@} \xydef@\doMergeStartArc@#1#2{\save@\ifcase#2\relax \doMergeStart@@{0@p}{1@m}{2@m}{1@c}{#1}@\or \doMergeStart@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or \doMergeStart@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or \doMergeStart@@{3@c}{7@m}{8@m}{0@p}{#1}\relax\fi \leave@ } \xydef@\doMergeStart@@#1#2#3#4#5#6{% \cfromid@{#1}\ifx#6\relax \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi \enter@\cmergethec@\cfromid@{0@x}\leave@ \enter@\cmergethec@\cfromcontrols@{#4}{#3}{#2}{#1}\leave@ \pfromc@ \senter@ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}% \connect@\crvs{#5}\relax\sinit@\sleave@} \xydef@\doMergeBothArc@#1#2{\save@\ifcase#2\relax \doMergeBoth@@{0@p}{1@m}{2@m}{1@c}{#1}@\or \doMergeBoth@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or \doMergeBoth@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or \doMergeBoth@@{3@c}{7@m}{8@m}{0@p}{#1}\relax\fi \leave@ } \xydef@\doMergeBoth@@#1#2#3#4#5#6{% \cfromid@{#1}\ifx#6\relax \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi \enter@\cmergethec@\cfromid@{0@x}\leave@ \enter@\cmergethec@\cfromcontrols@{#4}{#3}{#2}{#1}\leave@ \pfromc@ \senter@ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}% \enter@\cmergethec@\cfromid@{0@c}\leave@ \enter@\cmergethec@\cfromcontrols@{#1}{#2}{#3}{#4}\leave@ \connect@\crvs{#5}\relax\sinit@\sleave@} \xydef@\doMergeEndArc@#1#2{\count@@=#2\relax \ifnum\count@@>\thr@@ \advance\count@@-4\fi\relax \doMergeEndArc@@{#1}\count@@ } \xydef@\doStraightArc@@#1{\xy@{STRAITarc}{\save@ \cfromid@{0@p}\pfromc@\cfromid@{0@c}% \senter@\connect@\crvs{#1}\sinit@\sleave@\leave@}} \xydef@\cfromcontrols@#1#2#3#4{\bgroup \cfromid@{#1}\L@p=\X@c \U@p=\Y@c \cfromid@{#4}\R@p=\X@c \D@p=\Y@c \cfromid@{#3}\A@=\X@c \B@=\Y@c \cfromid@{#2}% \ifdim\R@p>\L@p \ifdim\A@>\R@p \R@p=\A@ \ifdim\X@c>\R@p \R@p=\X@c\fi\fi \else \ifdim\A@<\R@p \R@p=\A@ \ifdim\X@c<\R@p \R@p=\X@c\fi\fi \fi \ifdim\D@p>\U@p \ifdim\B@>\D@p \D@p=\B@ \ifdim\Y@p>\D@p \D@p=\Y@p\fi\fi \else \ifdim\B@<\D@p \D@p=\B@ \ifdim\Y@p<\D@p \D@p=\Y@p\fi\fi \fi \edef\next@{\egroup \X@c=\the\R@p \Y@c=\the\D@p}\next@ } \xydef@\doCircleArcs@{\save@ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@ \startDirection@ \edef\startDirection@@{\the\Direction}% \cfromid@{1@c}\setupDirection@ \edef\quadDirection@{\the\Direction}\relax \count@=\quadDirection@ \relax\def\nextii@{^}% \let\preDirection@@=\startDirection@@ \ifx\nextii@\arcOrient@@ \ifnum\quadDirection@>\startDirection@@ \relax \else \advance\count@ by8192 \relax\edef\quadDirection@{\the\count@}\fi \ifx\endDirection@@\empty \ifx\endDirection@\relax \bgroup\cfromid@{0@c}\setupDirection@ \edef\next@{\egroup \count@@=\the\Direction}\next@ \relax \ifnum\count@@<\startDirection@@ \advance\count@@ 8192 \fi \edef\endDirection@@{\the\count@@}% \else \count@@=\startDirection@@ \advance\count@@ by8192 \edef\endDirection@@{\the\count@@}% \fi \else \count@@=\endDirection@@ \relax\ifnum\count@@<\startDirection@@ \relax \advance\count@@ by8192 \edef\endDirection@@{\the\count@@}\fi \fi \ifnum\endDirection@@>\quadDirection@ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{0}}% \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{0}}% \fi \else \ifnum\count@<\startDirection@@\relax\else\advance\count@ by-8192 \relax \edef\quadDirection@{\the\count@}\fi \ifx\endDirection@@\empty \ifx\endDirection@\relax \bgroup\cfromid@{0@c}\setupDirection@ \edef\next@{\egroup \count@@=\the\Direction}\next@ \relax \ifnum\count@@>\startDirection@@ \advance\count@@-8192 \fi \edef\endDirection@@{\the\count@@}% \else \count@@=\startDirection@@ \advance\count@@ by-8192 \edef\endDirection@@{\the\count@@}% \fi \else \count@@=\endDirection@@ \relax \ifnum\count@@>\startDirection@@ \advance\count@@ by-8192 \edef\endDirection@@{\the\count@@}\fi \fi \ifnum\endDirection@@<\quadDirection@ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{0}}% \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{0}}\fi \fi \next@ \relax \count@=\quadDirection@ \relax\def\nextii@{^}\DN@{}% \ifx\nextii@\arcOrient@@ \count@@=\startDirection@@ \advance\count@@ by4096 \relax \ifnum \count@<\endDirection@@ \relax \ifnum\endDirection@@>\count@@ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{1}}% \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{1}}\fi \fi \else \count@@=\startDirection@@ \advance\count@@ by-4096 \relax \ifnum \count@>\endDirection@@ \relax \ifnum\endDirection@@<\count@@ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{1}}% \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{1}}\fi \fi\fi \next@ \relax \ifx\next@\empty \else \relax \count@=\startDirection@@ \relax\def\nextii@{^}\DN@{}% \ifx\nextii@\arcOrient@@ \advance\count@ by4096 \relax \count@@=\quadDirection@ \advance\count@@ by4096 \relax \ifnum \count@<\endDirection@@ \ifnum\endDirection@@>\count@@ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{2}}% \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{2}}\fi \fi \else \advance\count@ by-4096 \relax \count@@=\quadDirection@ \advance\count@@ by-4096 \relax \ifnum \count@>\endDirection@@ \relax \ifnum\endDirection@@<\count@@ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{2}}% \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{2}}\fi \fi\fi \next@ \relax \fi \ifx\next@\empty \else \relax \count@=\quadDirection@ \def\nextii@{^}\DN@{}% \ifx\nextii@\arcOrient@@ \advance\count@ by4096 \relax \ifnum \count@<\endDirection@@ \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{3}}\fi \else \advance\count@ by-4096 \relax \ifnum \count@>\endDirection@@ \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{3}}\fi \fi \next@ \relax \fi \leave@ } \message{elliptical arcs,} \xydef@\arcmagic@@{0.5517847} \xylet@\arcmagic=\arcmagic@@ \xydef@\tildeARC@#1{% \if q#1\DN@{\xy@{quadARC}\quadARC@ \arc@}% \else\if c#1\DN@{\xyFN@\cubicARC@i}% \else\if e#1\DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}% \else\if i#1\DN@{\xy@{interpARC}\interpARC@ \arc@}% \else\if p#1\DN@{\xy@{cuspidalARC}\cuspidalARC@ \arc@}% \else\xywarning@{unknown arc type: #1 }% \DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}% \fi\fi\fi\fi\fi \next@ } \xydef@\cubicARC@i{% \ifx\next\space@ \expandafter\DN@\space{\xyFN@\cubicARC@i}% \else\ifx\next (\DN@(##1){\xy@{cubicARC(##1)}{\cubicARC@{##1}}\arc@}% \else \DN@{\xy@{cubicARC(1)}{\cubicARC@{1}}\arc@}% \fi\fi \next@ } \xydef@\ellipticARC@{\let\arcControls@=\cubicARCcontrols@@ \edef\arcparam@{\arcmagic@@}} \xydef@\cubicARC@#1{\let\arcControls@=\cubicARCcontrols@@ \dimen@=#1\p@ \edef\arcparam@{\expandafter\removePT@\the\dimen@}} \xydef@\quadARC@{\let\arcControls@=\cubicARCcontrols@@ \def\arcparam@{.66667}} \xydef@\cuspidalARC@{\let\arcControls@=\cubicARCcontrols@@ \def\arcparam@{2}} \xydef@\interpARC@{\let\arcControls@=\cubicARCcontrols@@ \def\arcparam@{1.33333}} \xydef@\ARCturn@{\xy@@\bgroup\afterCOORD{% \xy@@{\edef\next@{\egroup \A@=\the\X@c \B@=\the\Y@c}\next@}\ARCturn@@}} \xydef@\ARCturn@@#1@{\DN@{#1}\DNii@{^}% \ifx\next@\nextii@ \xy@{^}{\def\arcOrient@@{^}}% \else\DNii@{_}\ifx\next@\nextii@ \xy@{_}{\def\arcOrient@@{_}}% \else\xy@{}{\def\arcOrient@@{}}\fi\fi \xy@@\ARCturn@@@ \processDirections@@ } \xydef@\ARCturn@@@{% \bgroup\cfromid@{0@p}\X@p=\X@c \Y@p=\Y@c \X@c=\A@ \Y@c=\B@ \setupDirection@ \edef\next@{\egroup\count@=\the\Direction}\next@\relax \edef\startDirection@@{\the\count@ }% \bgroup\cfromid@{0@c}\X@p=\A@ \Y@p=\B@ \setupDirection@ \edef\next@{\egroup\count@=\the\Direction}\next@\relax \edef\endDirection@@{\the\count@}% \ifx\arcOrient@@\empty \bgroup\cfromid@{0@p}\X@p=\X@c \Y@p=\Y@c \cfromid@{0@c}% \setupDirection@ \edef\next@{\egroup\count@@=\the\Direction}\next@\relax \count@=-\count@@ \advance\count@\startDirection@@ \relax \count@=-\count@ \ifnum\count@>4096 \def\arcOrient@@{_}% \else\ifnum\count@<-4096 \def\arcOrient@@{^}% \else\ifnum\count@>\z@ \def\arcOrient@@{^}% \else\def\arcOrient@@{_}\fi\fi\fi \fi } \xydef@\circleArc@{% \xy@{circARC@}{\cfromid@{0@p}\pfromc@\cfromp@\startDirection@ \arcCenter@\idfromc@{0@0}% \def\startDirection@{\bgroup \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@ \edef\next@{\egroup \Direction=\the\Direction}\next@ \relax\imposeDirection@}}% \ifx\endDirection@@\empty \ifx\arcRadius@\empty \ifx\ellipseRatio@\empty\else \DN@{\arcScale@@}\ifx\arcScale@\next@\else \xy@@{\bgroup\cfromid@{0@0}\pfromc@\cfromid@{0@c}\setupDirection@ \edef\next@{\egroup \Direction=\the\Direction}\next@ \edef\endDirection@@{\the\Direction}}\fi\fi\fi\fi \ellipseArc@ \xy@@{\leave@ \doCircleArcs@}\endarc@ } \xydef@\arcbisector{% \cfromid@{0@p}\pfromc@\cfromid@{0@c}\setupDirection@ \advance\X@c\X@p\divide\X@c\tw@ \advance\Y@c\Y@p\divide\Y@c\tw@ \czeroEdge@ \pfromc@ \enter@\cplusthec@ \enter@\relax\begingroup \aboveDirection@\xydashl@ \vfromslide@i{}@\leave@ } \xydef@\arcCenter@{% \cfromid@{0@p}\pfromc@\cfromid@{0@m}\setupDirection@ \cfromp@\enter@\cplusthec@ \enter@\relax\begingroup \aboveDirection@\xydashl@ \vfromslide@i{}@\leave@\no@@ \arcCenter@i } \xydef@\arcCenter@i{% \enter@{\pfromthep@}\setupDirection@ \Creset@@ \let\PLACEedgep@@=\PLACEedgep@ \let\PLACEedgec@@=\PLACEedgec@ \enter@{\pfromthep@\basefromthebase@}\bgroup \arcbisector \edef\next@{\egroup \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p }% \next@ \Cintercept@@ \leave@\leave@ } \xydef@\getarcExtents@{% \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcExtents@}% \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}% \else\DN@{\xy@{arcEXTENTs}{\save@ \def\startDirection@{\Direction=\startDirection@@ \imposeDirection@}}% \xyFN@\getarcExtents@ii}\fi\fi \next@ } \xydef@\getarcExtents@ii{% \ifx\next!\xy@{![[}{}\DN@![[##1]]{\getxyDirection@{##1}\getarcExtents@iv}% \else\DN@{\getarcExtents@iv}\fi \next@ } \xydef@\getarcExtents@iv{\afterDIRECTIONorEMPTY {\xy@{startDIR}{\edef\startDirection@@{\the\Direction}\leave@}% \xyFN@\getarcOrientation@}% {\xy@{startDIR}{\edef\startDirection@@{\the\Direction}\leave@}% \xyFN@\getarcOrientation@}} \xydef@\getarcOrientation@{% \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcOrientation@}% \else\ifx\next @\xy@{@}{}\DN@{\getEndDirection@x}% \else\ifx\next,\xy@{,}{}\DN@,{\xyFN@\getarcOrientation@i}% \else\DN@{\getarcOrientation@i}\fi\fi\fi \next@ }% \xydef@\getarcOrientation@i{% \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcOrientation@i}% \else\ifx\next @\xy@{@}{}\DN@{\getEndDirection@x}% \else\ifx\next^{}\DN@##1{\xy@{^}{\def\arcOrient@@{^}}% \def\arcOrient@@{^}\xyFN@\getEndDirection@}% \else\ifx\next_\DN@##1{\xy@{_}{\def\arcOrient@@{_}}% \def\arcOrient@@{_}\xyFN@\getEndDirection@}% \else\DN@{\xyFN@\getEndDirection@}% \fi\fi\fi\fi \next@ } \xydef@\getEndDirection@{% \ifx\space@\next\expandafter\DN@\space{\xyFN@\getEndDirection@}% \else\ifx\next,\DN@,{\xy@{,}{}\xyFN@\getEndDirection@}% \else\addEQ@\ifx\next\addEQ@\DN@{\xy@{=}{\save@\startDirection@}% \xyFN@\getEqDirection@}% \else \ifx\next!\DN@![[##1]]{\xy@{![[}{\save@}\getxyDirection@{##1}% \xy@{endDIR}{\edef\endDirection@@{\the\Direction}}% \xyFN@\getEndDirection@i}% \else \DN@{\xy@{origDIR}{\save@\origDirection@}\getEndDirection@i}% \fi\fi\fi\fi \next@ } \xydef@\getEqDirection@{% \ifx\space@\next\expandafter\DN@\space{\xyFN@\getEqDirection@}% \else\ifx\next @\xy@{@}{}\DN@ @{% \xy@{sameDIR}{\edef\endDirection@@{\startDirection@@}\leave@}% \parEllipse@{1}{}}% \else\ifx\next (\DN@({\xyFN@\checkEqOpen@}% \else \DN@{\getEndDirection@i}\fi\fi\fi \next@ } \xydef@\checkEqOpen@{% \ifx\next *\DN@{\getEndDirection@i (}% \else \DN@##1)##2@{\xy@{()}\leave@ \parEllipse@{##1}{##2}}% \fi \next@ } \xydef@\getEndDirection@i{\afterDIRECTIONorEMPTY {\xy@{endDIR}{\edef\endDirection@@{\the\Direction}\leave@}% \getEndDirection@x }% {\xy@{endDIR}\leave@ \getEndDirection@x }} \xydef@\getEndDirection@x#1@{% \DN@{#1}\ifx\next@\empty\relax \else\xywarning@{\omittingTokens@}\fi \processDirections@ } \xydef@\omittingTokens@{omitting unused tokens: \codeof\next@ } \xydef@\processDirections@@{% \ifx\endDirection@@\empty \skewCircle@ \else \skewEllipse@ \expandafter \afterARCextents@@ \fi } \xydef@\processArcDirections@{% \xy@{ARCdirs}{\ifx\endDirection@@\empty \origDirection@ \edef\endDirection@@{\the\Direction}\fi}% \ellipseArc@ \xy@{procARCdirs}\processArcDirections@@ \let\arcScale@=\relax \def\arcRadius@{}\def\ellipseRatio@{}% \xy@{circSECTORS}{\let\doCircleArc@=\doMergeEndArc@@ \doCircleSectors@}% \endarc@ } \xydef@\processArcDirections@@{\save@ \bgroup \cfromid@{0@0}\pfromc@ \Direction=\startDirection@@ \DN@{_}\ifx\next@\arcOrient@@ \advance\Direction \ifnum\Direction<\z@-\fi 4096 \relax\fi \imposeDirection@ \d@X=\cosDirection\Y@ybase \advance\d@X-\sinDirection\X@ybase \d@Y=-\cosDirection\Y@xbase \advance\d@Y\sinDirection\X@xbase \setupDirection@i \d@X=-\cosDirection\X@ybase \advance\d@X\sinDirection\X@xbase \d@Y=-\cosDirection\Y@ybase \advance\d@Y\sinDirection\Y@xbase \enter@\cplusthec@\X@c=\d@X \Y@c=\d@Y \leave@ \czeroEdge@ \setupDirection@i \czeroEdge@ \edef\next@{\egroup \cfromthec@ \count@=\the\Direction}\next@ \edef\startDirection@@{\the\count@}\idfromc@{0@x}% \bgroup \cfromid@{0@0}\pfromc@ \Direction=\endDirection@@ \DN@{_}\ifx\next@\arcOrient@@ \advance\Direction \ifnum\Direction<\z@-\fi 4096 \relax\fi \imposeDirection@ \d@X=\cosDirection\Y@ybase \advance\d@X-\sinDirection\X@ybase \d@Y=-\cosDirection\Y@xbase \advance\d@Y\sinDirection\X@xbase \setupDirection@i \d@X=-\cosDirection\X@ybase \advance\d@X\sinDirection\X@xbase \d@Y=-\cosDirection\Y@ybase \advance\d@Y\sinDirection\Y@xbase \enter@\cplusthec@\X@c=\d@X \Y@c=\d@Y \leave@ \czeroEdge@ \setupDirection@i \edef\next@{\egroup \cfromthec@ \count@=\the\Direction}\next@ \edef\endDirection@@{\the\count@}\idfromc@{0@c}% \count@=\startDirection@@ \relax \count@@=\endDirection@@ \relax \DN@{^}\ifx\arcOrient@@\next@ \ifnum\count@@>\count@ \else\advance\count@@ 8192 \relax\fi \else \ifnum\count@@<\count@ \else\advance\count@@-8192 \relax\fi\fi \edef\startDirection@@{\the\count@}% \edef\endDirection@@{\the\count@@}}% \xydef@\doCircleSectors@{\save@ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@ \count@=\Direction \DN@{^}\ifx\arcOrient@@\next@ \ifnum\count@>\startDirection@@ \advance\count@-8192 \fi\relax \count@@=\count@ \advance\count@@ 8192 \relax \ifnum\count@@<\endDirection@@ \advance\count@@ 8192 \fi\relax \else \ifnum\count@<\startDirection@@ \advance\count@ 8192 \fi\relax \count@@=\count@ \advance\count@@-8192 \relax \ifnum\count@@>\endDirection@@ \advance\count@@-8192 \fi\relax \fi \relax \edef\preDirection@@{\the\count@}\edef\postDirection@@{\the\count@@}% \cfromid@{1@c}\setupDirection@ \count@=\Direction \def\nextii@{^}\ifx\nextii@\arcOrient@@ \DN@{\forwardSectors@\doEllipseSectors@}% \ifnum\count@<\preDirection@@ \advance\count@ 8192 \relax \else \count@@=\count@\advance\count@-8192 \relax \ifnum\count@@<\preDirection@@ \else\count@=\count@@ \fi\fi \else \DN@{\backwardSectors@\doEllipseSectors@}% \ifnum\count@>\preDirection@@ \advance\count@-8192 \relax \else \count@@=\count@\advance\count@ 8192 \relax \ifnum\count@@>\preDirection@@ \else\count@=\count@@ \fi\fi \fi \edef\quadDirection@{\the\count@}% \next@ } \xydef@\forwardSectors@{% \ifnum \startDirection@@<\quadDirection@ \def\startSector@@{0}% \else\count@=\preDirection@@ \advance\count@ 4096 \relax \ifnum \startDirection@@<\count@ \def\startSector@@{1}% \else\count@=\quadDirection@ \advance\count@ 4096 \relax \ifnum\startDirection@@<\count@ \def\startSector@@{2}% \else \def\startSector@@{3}\fi\fi\fi \ifnum\quadDirection@ <\endDirection@@ \relax \count@=\preDirection@@ \advance\count@ 4096 \relax \ifnum\count@<\endDirection@@ \relax \count@=\quadDirection@ \advance\count@ 4096 \relax \ifnum\count@<\endDirection@@ \relax \count@=\preDirection@@ \advance\count@ 8192 \relax \ifnum\count@<\endDirection@@ \relax \count@=\quadDirection@ \advance\count@ 8192 \relax \ifnum\count@<\endDirection@@ \relax \count@=\preDirection@@ \advance\count@ 12288 \relax \ifnum\count@<\endDirection@@ \relax \count@=\quadDirection@ \advance\count@ 12288 \relax \ifnum\count@<\endDirection@@ \def\endSector@@{7}% \else \def\endSector@@{6}\fi \else \def\endSector@@{5}\fi \else \def\endSector@@{4}\fi \else \def\endSector@@{3}\fi \else \def\endSector@@{2}\fi \else \def\endSector@@{1}\fi \else \def\endSector@@{0}\fi } \xydef@\backwardSectors@{% \ifnum \startDirection@@>\quadDirection@ \def\startSector@@{0}% \else\count@=\preDirection@@ \advance\count@-4096 \relax \ifnum \startDirection@@>\count@ \def\startSector@@{1}% \else\count@=\quadDirection@ \advance\count@-4096 \relax \ifnum\startDirection@@>\count@ \def\startSector@@{2}% \else \def\startSector@@{3}\fi\fi\fi \ifnum\quadDirection@>\endDirection@@ \relax \count@=\preDirection@@ \advance\count@-4096 \relax \ifnum\count@>\endDirection@@ \relax \count@=\quadDirection@ \advance\count@-4096 \relax \ifnum\count@>\endDirection@@ \relax \count@=\preDirection@@ \advance\count@-8192 \relax \ifnum\count@>\endDirection@@ \relax \count@=\quadDirection@ \advance\count@-8192 \relax \ifnum\count@>\endDirection@@ \relax \count@=\preDirection@@ \advance\count@-12288 \relax \ifnum\count@>\endDirection@@ \relax \count@=\quadDirection@ \advance\count@-12288 \relax \ifnum\count@>\endDirection@@ \def\endSector@@{7}% \else \def\endSector@@{6}\fi \else \def\endSector@@{5}\fi \else \def\endSector@@{4}\fi \else \def\endSector@@{3}\fi \else \def\endSector@@{2}\fi \else \def\endSector@@{1}\fi \else \def\endSector@@{0}\fi } \xydef@\doEllipseSectors@{% \ifx\startSector@@\endSector@@ \DN@{\expandafter\doMergeBothArc@\expandafter{\arcSTYLE}{\endSector@@}}% \else \expandafter\doMergeStartArc@\expandafter{\arcSTYLE}{\startSector@@}% \edef\countArcs@@{\startSector@@}% \loop@ \count@=\countArcs@@ \relax \advance\count@\@ne \ifnum \count@ < \endSector@@ \edef\countArcs@@{\the\count@}% \bgroup\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{\countArcs@@}% \egroup \repeat@ \DN@{\expandafter\doMergeEndArc@\expandafter{\arcSTYLE}{\endSector@@}}% \fi \next@ \leave@} \xydef@\checkstartDirection@{% \bgroup\no@@ \edef\next@{\egroup\count@@=\the\Direction}\next@\relax \ifnum\count@@=\startDirection@@ \relax \DN@{\straightArc@}% \else \advance\count@@-\startDirection@@ \relax \ifnum\count@@=\ifnum\count@@<\z@-\fi 4096 \relax \DN@{\straightArc@}% \else \DN@{\processDirections@@}\fi\fi \next@ } \xydef@\straightArc@{\xywarning@{straight arc encountered}% \xy@@{\let\bstartPLACE@=\relax \expandafter\doStraightArc@@\expandafter{\arcSTYLE}}\endarc@ }% \xydef@\skewEllipse@{\xy@@{\doskewEllipse@}% \def\afterARCextents@@{\xy@{aftARCext}{\let\doCircleArc@=\doMergeEndArc@@}% \ellipseArc@ \xy@{doCircARCs}{\doCircleArcs@}\endarc@ }% \let\arcScale@=\relax \def\arcRadius@{}\def\ellipseRatio@{}} \xydef@\skewCircle@{\xy@@{\setupDirection@}% \ifnum\Direction=\startDirection@@\relax\DN@{\halfEllipse@{1}}% \else \xy@@{\def\startDirection@{\Direction=\startDirection@@\imposeDirection@}% \cfromid@{0@p}\enter@\cplusthec@ \startDirection@ \enter@\relax\begingroup\vfromslide@i{}@\czeroEdge@\leave@\idfromc@{0@m}% \let\endDirection@=\relax \let\doCircleArc@=\doMergeEndArc@@}% \DN@{\circleArc@}% \fi \next@ } \xydef@\doskewEllipse@{% \def\startDirection@{\Direction=\startDirection@@ \relax \imposeDirection@}\startDirection@ \cfromid@{0@p}% \enter@\cplusthec@ \enter@\relax\begingroup\vfromslide@i{}@\leave@ \idfromc@{0@x}% \ifx\endDirection@@\empty \parallelDirection@ \else \def\endDirection@{\Direction=\endDirection@@ \relax \imposeDirection@ }\endDirection@ \skewEllB@ \bgroup\setupDirection@\edef\next@{\egroup\count@@=\the\Direction}\next@ \edef\endDirection@@{\the\count@@}% \fi \cfromid@{0@p}\bgroup \setupDirection@ \edef\next@{\egroup \count@@=\the\Direction}\next@ \edef\startDirection@@{\the\count@@}} \xydef@\halfEllipse@#1{\xy@@{% \cfromid@{0@p}\pfromc@\cfromid@{0@c}\no@@ \edef\endDirection@@{\the\Direction}% \advance\X@c\X@p \divide\X@c\tw@ \advance\Y@c\Y@p \divide\Y@c\tw@ \idfromc@{0@0}\pfromc@ \cfromid@{0@p}\setbase@\X@p\Y@p\X@c\Y@c \dimen@=\X@origin \advance\dimen@-\X@c \dimen@ii=\cosDirection\dimen@ \dimen@=\Y@origin \advance\dimen@-\Y@c \advance\dimen@ii \sinDirection\dimen@ \X@c=\X@origin \Y@c=\Y@origin \enter@\cplusthec@ \dimen@=#1\p@ \ifdim\dimen@<\z@ \DN@{^}\dimen@ii=-#1\dimen@ii \ifx\next@\arcOrient@@\def\arcOrient@@{_}\else\def\arcOrient@@{^}\fi \else \dimen@ii=#1\dimen@ii\fi \startDirection@ \enter@\relax\begingroup\expandafter \vfromslide@i\expandafter{\the\dimen@ii}@\leave@ \idfromc@{1@c}\setbase@@ \X@c \Y@c \adjustBaseOrient@ \count@@=\endDirection@@ \relax \DN@{^}\advance\count@@\ifx\arcOrient@@\next@\else-\fi 4096 \relax \edef\startDirection@@{\the\count@@}% \def\startDirection@{\Direction=\startDirection@@ \imposeDirection@ }% \let\doCircleArc@=\doMergeEndArc@@ }% \let\arcScale@=\relax \ellipseArc@ \xy@@{\doCircleArcs@}\endarc@ } \xydef@\parallelDirection@{\show\parallelDirection@}% \xydef@\parEllipse@#1#2{\DN@{#2}\ifx\next@\empty \else\xywarning@{\omittingTokens@ }\fi \halfEllipse@{#1}} \xydef@\skewEllB@{\cfromid@{0@c}\pfromc@\enter@\cplusthec@ \enter@\relax\begingroup\vfromslide@i{}@\leave@ \enter@{\pfromthep@\basefromthebase@}\no@@ \bgroup \cfromid@{0@p}\pfromc@\cfromid@{0@x}\edef\next@{\egroup \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p }\next@ \Cintercept@@\leave@ \idfromc@{0@x}\cfromid@{0@p}\enter@\cplusthec@ \cfromid@{0@c}\leave@ \enter@\cplusthec@ \cfromid@{0@x}% \X@c=-\X@c \Y@c=-\Y@c \leave@ \idfromc@{0@0}\pfromc@\cfromid@{0@p}% \setbase@\X@p\Y@p\X@c\Y@c \cfromid@{0@c}\setbase@@\X@c\Y@c \adjustBaseOrient@ } \xydef@\adjustBaseOrient@{% \edef\tmp@{\expandafter\removePT@\the\X@xbase}\dimen@=\Y@ybase \divide\dimen@ 64 \relax \dimen@ii=\tmp@\dimen@ \edef\tmp@{\expandafter\removePT@\the\X@ybase}\dimen@=\Y@xbase \divide\dimen@ 64 \relax \dimen@=\tmp@\dimen@ \ifdim\dimen@>\dimen@ii \X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi } \xyendinput