diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/xypic/xyarc.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/xypic/xyarc.tex | 684 |
1 files changed, 684 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/xypic/xyarc.tex b/Master/texmf-dist/tex/generic/xypic/xyarc.tex new file mode 100644 index 00000000000..689c28b48bb --- /dev/null +++ b/Master/texmf-dist/tex/generic/xypic/xyarc.tex @@ -0,0 +1,684 @@ +%% xyarc.tex from $Id: xyarc.doc,v 3.4 1997/05/18 01:13:24 ross Exp $ +%% +%% Xy-pic ``Circles, Ellipses and Arcs'' feature. +%% Copyright (c) 1995-1997 Ross Moore <ross@mpce.mq.edu.au> +%% +%% 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-1997 Kristoffer H. Rose <krisrose@brics.dk> +%% +%% 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, Arc feature}{\stripRCS$Revision: 3.4 $}% + {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{\DN@{#2}% + \ifx\next@\empty \xy@{arcSTYLE}{\def\arcSTYLE{-}}% + \else \xy@{arcSTYLE}{\def\arcSTYLE{#2}}\fi \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}{\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@ \begingroup\vfromslide@i#1@% + \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@\ellsave@ \let\arcRadius@\ellsave@ \def\ellipseRatio@{}% + \xy@{circSECTORS}{\doCircleSectors@}\endarc@ } +\xydef@\ellsave@{\xy@@{\save@}} +\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@{% + \let\doCircleArc@=\doMergeEndArc@@ \leave@ \leave@ + \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@ } +\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 |