%% xyarrow.tex from $Id: xyarrow.doc,v 2.12 1994/10/25 11:34:25 kris Exp $ %% %% XY-pic ``Arrows and Paths'' feature. %% Copyright (c) 1991-1994 Kristoffer H. Rose %% %% 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-1994 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{arrow}{Arrow and Path feature}{\stripRCS$Revision: 2.12 $}% {Kristoffer H.~Rose}{kris@diku.dk}% {Computer Science, University of Copenhagen, Universitetsparken~1, DK--2100 K{\o}benhavn~{\O}} \message{path,} \xydef@\PATH{\afterPATH{}} \xylet@\afterPATH@=\empty \xydef@\afterPATH#1{\xy@@\save@ \DN@##1{\def\afterPATH@{\restore \def\afterPATH@{##1}#1}}% \expandafter\next@\expandafter{\afterPATH@}% \let\PATHfail@@=\empty \let\PATHnext@@=\empty \let\PATHevery@@=\empty \let\PATHlast@@=\empty \let\PATHeverysub@@=\empty \let\PATHbeforelabels@@=\empty \let\PATHafter@@=\empty \xy@{\afterPATH{#1}}{\def\PATHslide@@{\z@}}% \def\PATHcontinue@@{\xyFN@\PATH@}% \xyFN@\PATH@} \xynew@{if}\ifPATHsingle@ \xydef@\PATH@{% \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATH@}% \else\ifPATHsingle@ \let\next@=\PATH@single \else \let\next@=\PATH@normal \fi\fi \next@} \xydef@\PATH@normal{% \ifx ~\next \DN@ ~{\xyFN@\PATHsetting@}% \else \addRQ@\ifx \next \addRQ@\DN@{\xy@'{}\xyFN@\PATHstraight@}% \else \addLQ@\ifx \next \addLQ@\DN@{\xy@`{}\xyFN@\PATHturn@}% \else\ifx \PATHfail@@\PATH@x \DN@{\xyFN@\PATHlast@}% \else \DNii@{\let\PATHfail@@=\PATH@x \xyFN@\PATH@}% \DN@{\expandafter\nextii@\PATHfail@@}% \fi\fi\fi\fi \next@} \xylet@\PATHnext@@=\empty \xylet@\PATHevery@@=\empty \xylet@\PATHlast@@=\empty \xylet@\PATHeverysub@@=\empty \xylet@\PATHbeforelabels@@=\empty \xylet@\PATHafter@@=\empty \xylet@\PATHfail@@=\empty \xydef@\PATHsetting@{% \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHsetting@}% \else\ifx \bgroup\next \DN@##1{\xy@{~{##1}}{}\def\PATHfail@@{##1}\xyFN@\PATH@}% \else \addEQ@\ifx \next \addEQ@\DN@##1{\xy@{~={##1}}{}\def\PATHevery@@{##1}\xyFN@\PATH@}% \else \addLT@\ifx \next \addLT@\DN@##1{\xy@{~<{##1}}{}\def\PATHnext@@{##1}\xyFN@\PATH@}% \else \addGT@\ifx \next \addGT@\DN@##1{\xy@{~>{##1}}{}\def\PATHlast@@{##1}\xyFN@\PATH@}% \else \addDASH@\ifx \next \addDASH@\DN@##1{\xy@{~-{##1}}{}\def\PATHeverysub@@{##1}\xyFN@\PATH@}% \else \addPLUS@\ifx \next \addPLUS@\DN@##1{\xy@{~+{##1}}{}\def\PATHbeforelabels@@{##1}\xyFN@\PATH@}% \else \ifx /\next \DN@/##1{\xy@{~/{##1}}{}\def\PATHafter@@{##1}\xyFN@\PATH@}% \else \xyerror@{Unknown \string~ setting: \meaning\next}% {See the XY-pic arrow feature documentation for help.}% \fi\fi\fi\fi\fi\fi\fi\fi \next@} \xylet@\PATHinit@@=\empty \xylet@\PATHextra@@=\empty \xylet@\PATHpost@@=\empty \xylet@\PATHcontinue@@=\empty \xydef@\PATHstraight@{% \def\PATHinit@@{\PATHinitstraight@}\def\PATHextra@@{}\def\PATHpost@@{}% \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}} \xydef@\PATHlast@{% \def\PATHinit@@{\PATHinitstraight@}% \def\PATHextra@@{\let\PATHcontinue@@=\afterPATH@ \addGT@\PATHaction@\PATHlast@@ \let\PATHlast@@=\empty}% \def\PATHpost@@{}% \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}} \xydef@\PATHinitstraight@{\xy@@{\setupDirection@ \dimen@=\PATHslide@@ \dimen@ii=-\sinDirection\dimen@ \ifPATHomitslide@@\else\advance\Xp\dimen@ii\fi \advance\Xc\dimen@ii \dimen@ii= \cosDirection\dimen@ \ifPATHomitslide@@\else\advance\Yp\dimen@ii\fi \advance\Yc\dimen@ii \PATHomitslide@@false \resetupDirection@}} \xydef@\PATHslide@@{\z@} \xynew@{if}\ifPATHomitslide@@ \xydef@\PATHsegment@{% \addLT@\ifx\next \addGT@{\addLT@\DN@##1}{% \xy@{<##1>}{\dimen@=##1\relax \edef\PATHslide@@{\the\dimen@}}% \xyFN@\PATHsegment@@}% \else \let\next@=\PATHsegment@@ \fi \next@} \xylet@\cfrominitial@@=\relax \xylet@\cfromfinal@@=\relax \xydef@\PATHsegment@@{\PATHinit@@ \resetbreaks \addEQ@\PATHaction@\PATHevery@@ \addLT@\PATHaction@\PATHnext@@ \let\PATHnext@@=\empty \PATHextra@@ \xy@@{\edef\cfrominitial@@{\cfromthep@}\edef\cfromfinal@@{\cfromthec@}% \edef\pfromlastbreak@@{\pfromthep@}}\resetbreaks% \def\subsegmentno@{0}\toks@={}% \DN@{\xyFN@\PATHlabels@}\expandafter\next@\PATHbeforelabels@@} \xylet@\PATHlabelit@@=\empty \xydef@\PATHlabels@{% \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHlabels@}% \else \ifx ^\next \DN@##1{\xy@^{}\let\PATHlabelit@@=\PATHlabelabove@ \DNii@{}\xyFN@\PATHanchor@}% \else \ifx _\next \DN@##1{\xy@_{}\let\PATHlabelit@@=\PATHlabelbelow@ \DNii@{}\xyFN@\PATHanchor@}% \else \ifx |\next \DN@|{\xy@|{}\let\PATHlabelit@@=\PATHlabelbreak@ \DNii@{}\xyFN@\PATHanchor@}% \else \let\next@=\PATHsubsegments@ \fi\fi\fi\fi \next@} \xydef@\PATHanchor@{\begingroup \toks@={}\PATHanchor@i} \xydef@\PATHanchor@i{% \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHanchor@i}% \else\addDASH@\ifx \next \addDASH@\DN@{\expandafter\addtotoks@\expandafter{\PATHanchor@toks}% \xyFN@\PATHanchor@i}% \else \DNii@##1{\endgroup\afterPLACE{\xyFN@\PATHit@}##1}% \DN@{\expandafter\nextii@\expandafter{\the\toks@}}% \fi\fi \next@} {\xyuncatcodes \gdef\next{<>(.5)}} \xylet@\PATHanchor@toks=\next \xydef@\PATHit@{% \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHit@}% \else \ifx *\next \DN@*##1##{\PATHlabelit@@{##1}}% \else \addAT@\ifx\next \addAT@\DN@##1##{\PATHlabelit@@{\dir##1}}% \else \DN@{\PATHlabelit@@{}}% \fi\fi\fi \next@} \xydef@\PATHsubsegments@{\the\toks@ \toks@={}\xy@@{\ifx\bstartPLACE@\relax\else\def\bendPLACE@{1}\fi \pfromlastbreak@@\cfromfinal@@\setupDirection@}% \addDASH@\PATHaction@\PATHeverysub@@ \PATHpost@@ \PATHaction@/\PATHafter@@ \PATHcontinue@@} \xydef@\PATHaction@default#1#2{\xy@{PATHaction#1{#2}}{}\POS#2\relax} \xylet@\PATHaction=\PATHaction@default \xydef@\PATHaction@#1#2{\expandafter\PATHaction\expandafter#1\expandafter{#2}} \xylet@\PATHafterPOS@default=\afterPOS \xylet@\PATHafterPOS=\PATHafterPOS@default \xydef@\PATHlastout@@{3} \xydef@\PATHturn@{\afterCIRorDIAG\PATHturn@cir\PATHturn@diag} \xydef@\PATHturn@cir{\toks@={\xy@@{% \count@=\CIRin@@ \ifnum\count@<4\else\advance\count@-4\fi \count@@=\CIRout@@ \ifnum\count@@<4\else\advance\count@@-4\fi \ifnum\count@=\count@@ \xyerror@{ cannot be half or full}{% You asked for a ed segment with parallel in- and out-direction.^^J% This is not allowed because it is not possible to position it uniquely.}\fi}}% \edef\next@{{\CIRin@@}{\expandafter\noexpand\CIRorient@@}{\CIRout@@}}% \expandafter\PATHturn@i\next@} \xydef@\PATHturn@diag{\toks@={\xy@@{% \setupDirection@ \count@=\CIRin@@ \dimen@=\xydashl@ \ABfromdiag@ \ifdim \sinDirection\A@>\cosDirection\B@ \def\CIRorient@@{\CIRacw@}% \advance\count@\ifnum\count@<6 \tw@ \else -6\fi \else \def\CIRorient@@{\CIRcw@}% \advance\count@\ifnum\count@>\@ne -\tw@ \else 6\fi \fi \edef\CIRout@@{\the\count@}}}% \edef\next@{{\CIRin@@}{}{}}% \expandafter\PATHturn@i\next@} \xylet@\PATHpostpos@@=\empty \xydef@\PATHturn@i#1#2#3{% \DN@##1{\def\PATHinit@@{\xy@@{% \def\CIRin@@{#1}\def\CIRorient@@{#2}\def\CIRout@@{#3}% \ifnum\CIRin@@=8 \let\CIRin@@=\PATHlastout@@ \fi \R@=\turnradius@ ##1\relax \count@=\CIRin@@ \ifPATHomitslide@@ \dimen@=-\PATHslide@@ \ABfromdiag@ \advance\Xp-\B@ \advance\Yp\A@ \fi \enter@{\pfromthep@ \basefromthebase@}% \dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@ \ABfromdiag@ \advance\Xp-\B@ \advance\Yp\A@ \Xorigin=\Xp \Yorigin=\Yp \dimen@=\xydashl@ \ABfromdiag@ \Rc=\A@ \Uc=\B@ \count@=\CIRout@@ \dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@ \ABfromdiag@ \advance\Xc-\B@ \advance\Yc\A@ \dimen@=\xydashl@ \Xp=\Xc \Yp=\Yc \ABfromdiag@ \advance\Xp-\A@ \advance\Yp-\B@ \intersect@ \count@=\CIRin@@ \dimen@=\p@ \ABfromdiag@ \edef\next@{\expandafter\removePT@\the\A@}% \edef\nextii@{\expandafter\removePT@\the\B@}% \A@=\Xc \advance\A@-\Xorigin \B@=\Yc \advance\B@-\Yorigin \ifdim \next@\A@<-\nextii@\B@ \dontleave@ \cfromp@ \count@=\CIRin@@ \advance\count@\ifnum\count@<4 +4\else -4\fi \dimen@=\xydashl@ \Directionfromdiag@ \the\Edgec\z@ \count@=\CIRin@@ \dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@ \ABfromdiag@ \advance\Xc-\B@ \advance\Yc\A@ \dimen@=5sp \ABfromdiag@ \advance\Xc\A@ \advance\Yc\B@ \fi \dimen@ii=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\PATHslide@@ \advance\R@\dimen@ii \drop@\literal@{\hbox\bgroup\cir@i}% \Xp=\Xc \Yp=\Yc \count@=\CIRout@@ \dimen@=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\Rc \ABfromdiag@ \advance\Xp-\B@ \advance\Yp\A@ \edef\PATHpostpos@@{\Xc=\the\Xp \Yc=\the\Yp \noexpand\czeroEdge@ \noexpand\PATHomitslide@@true}% \count@=\CIRin@@ \dimen@=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\Rc \ABfromdiag@ \advance\Xc-\B@ \advance\Yc\A@ \czeroEdge@ \leave@ \count@=\CIRin@@ \dimen@=\PATHslide@@ \ABfromdiag@ \advance\Xp-\B@ \advance\Yp\A@ \edef\PATHlastout@@{\CIRout@@}% \count@=\CIRout@@ \dimen@=\xydashl@ \Directionfromdiag@}}}% \expandafter\next@\expandafter{\the\toks@}\toks@={}% \def\PATHextra@@{}% \def\PATHpost@@{\xy@@\PATHpostpos@@}% \xyFN@\PATHturn@ii} \xydef@\PATHturn@ii{% \ifx /\next \DN@ /{\afterassignment\nextii@\dimen@=}% \DNii@{% \edef\next@{\noexpand\xy@@{\edef\noexpand\turnradius@{\the\dimen@}}}\next@ \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}% \else \DN@{\xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}\fi \next@} \xydef@\ABfromdiag@{\ifcase\count@\relax \A@=-.7071\dimen@ \B@=-.7071\dimen@ \or \A@=\z@ \B@=-\dimen@ \or \A@=+.7071\dimen@ \B@=-.7071\dimen@ \or \A@=\dimen@ \B@=\z@ \or \A@=+.7071\dimen@ \B@=+.7071\dimen@ \or \A@=\z@ \B@=+\dimen@ \or \A@=-.7071\dimen@ \B@=+.7071\dimen@ \or \A@=-\dimen@ \B@=\z@ \else\xybug@{impossible ?}\fi} \xydef@\turnradius@{10pt} \xydef@\turnradius{\afterADDOP{\Addop@@\turnradius@}} \xydef@\PATHlabelabove@#1#2{\xy@@\save@ \droplabel@\belowDirection@{#1}{#2}% \xyFN@\PATHlabelalias@} \xydef@\PATHlabelbelow@#1#2{\xy@@\save@ \droplabel@\aboveDirection@{#1}{#2}% \xyFN@\PATHlabelalias@} \xydef@\droplabel@#1#2#3{% \xy@@{\enter@\DirectionfromtheDirection@}% \DN@{#2}\ifx\next@\empty \xy@@ix@{\labelbox{#3}}% \else \xy@@ix@{#2{#3}}\fi \xy@@{% \setbox\z@=\expandafter\object\the\toks9 \advance\Lc\labelmargin@ \advance\Rc\labelmargin@ \advance\Dc\labelmargin@ \advance\Uc\labelmargin@ \A@=\Xc \B@=\Yc #1\xydashl@ \the\Edgec\thr@@ \advance\A@-\Xc \advance\B@-\Yc \advance\Xc 2\A@ \advance\Yc 2\B@ \ht\z@=\Uc \dp\z@=\Dc \setbox\lastobjectbox@=\hbox{\kern\labelmargin@\Drop@@\kern\labelmargin@}% \drop@{\box\lastobjectbox@}{}% \leave@}}% \xylet@\labelmargin@=\objectmargin@ \xydef@\labelmargin{\afterADDOP{\Addop@@\labelmargin@}} \xylet@\pfromlastbreak@@=\empty \xylet@\breakcount@=\relax \def\next{\cfrominitial@@} \expandafter\let\csname cfrombreak0@\endcsname=\next \xydef@\resetbreaks{% \xy@@{\let\bstartPLACE@=\relax \let\bendPLACE@=\relax}} \xydef@\invisbreaks{\xy@@{\def\bstartPLACE@{}}} \xydef@\initbreaks{\xy@@{\ifx\bstartPLACE@\relax \def\bstartPLACE@{0}\def\bendPLACE@{1}\fi}} \xydef@\lastbreaks{\xy@@{\ifx\bstartPLACE@\relax \def\bstartPLACE@{0}\fi\def\bendPLACE@{1}}} \xylet@\bstartPLACE@=\relax \xylet@\bendPLACE@=\relax \xydef@\PATHlabelbreak@#1#2{% \DN@{#1}\ifx\next@\empty \drop\labelbox{#2}% \else \drop#1{#2}\fi \xy@@{\save@}% \count@=\subsegmentno@ \advance\count@\@ne \edef\subsegmentno@{\the\count@}% \DN@##1##2##3##4{% \addtotoks@{% \xy@@{\ifx\bstartPLACE@\relax\def\bstartPLACE@{0}% \else\edef\bstartPLACE@{\bendPLACE@}\fi \def\bendPLACE@{##4}}}% \xy@@{\expandafter\edef\csname cmergebreak##1@\endcsname {\DirectionfromtheDirection@ \cmergethecz@}% \expandafter\def\csname cfrombreak##3@\endcsname{\cfromfinal@@}% \expandafter\edef\csname cfrombreak##1@\endcsname {\DirectionfromtheDirection@ \cfromthec@}}% \addtotoks@{% \xy@@{\pfromlastbreak@@ \csname cfrombreak##3@\endcsname \csname cmergebreak##1@\endcsname }% \addDASH@\PATHaction@\PATHeverysub@@ \xy@@{\csname cfrombreak##2@\endcsname \csname cmergebreak##1@\endcsname \edef\pfromlastbreak@@{\pfromthec@}\def\bstartPLACE@{##4}}}}% \count@@=\count@ \advance\count@\@ne \advance\count@@\m@ne \ifx\PLACEf@\empty \edef\tmp@{{\subsegmentno@}{\the\count@@}{\the\count@}{}}% \else \edef\tmp@{{\subsegmentno@}{\the\count@@}{\the\count@}\PLACEf@}% \fi \expandafter\next@\tmp@ \xyFN@\PATHlabelalias@} \xydef@\cmergethecz@{% \noexpand\cmergez@{\the\Yc}{\the\Xc}{\the\Dc}{\the\Uc}{\the\Lc}{\the\Rc}} \xydef@\cmergez@#1#2#3#4#5#6{\the\Edgec4% \A@=#2\relax \B@=#1\relax \Lc=-\A@ \advance\Lc+#5\advance\Lc+\Xc \ifdim\Lc<\z@ \Lc=\z@ \fi \Rc=+\A@ \advance\Rc+#6\advance\Rc-\Xc \ifdim\Rc<\z@ \Rc=\z@ \fi \Dc=-\B@ \advance\Dc+#3\advance\Dc+\Yc \ifdim\Dc<\z@ \Dc=\z@ \fi \Uc=+\B@ \advance\Uc+#4\advance\Uc-\Yc \ifdim\Uc<\z@ \Uc=\z@ \fi \DN@{\Edgec={\rectangleEdge}}% \ifdim\Lc=\z@ \ifdim\Uc=\z@ \ifdim\Rc=\z@ \ifdim\Dc=\z@ \DN@{}\fi\fi\fi\fi \next@ } \xydef@\infinitize@#1{\the\Edgec4% \dimen@=\Xc \advance\dimen@-\Xp \def\next{TT}% \DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edgec}% \ifx\next@\nextii@ \def\next{TF}\fi \if\next \ifdim\dimen@<\z@ \Lc=\Xc \advance\Lc-\Xmin \advance\Lc1pc \else \ifdim\dimen@>\z@ \Rc=\Xmax \advance\Rc-\Xc \advance\Rc1pc \fi\fi \dimen@=\Yc \advance\dimen@-\Yp \ifdim\dimen@<\z@ \Dc=\Yc \advance\Dc-\Ymin \advance\Dc1pc \else\ifdim\dimen@>\z@ \Uc=\Ymax \advance\Uc-\Yc \advance\Uc1pc \fi\fi \Edgec={\rectangleEdge}\fi \let\next=\relax} \xylet@\labelstyle=\scriptstyle \xydef@\labelbox#1{\hbox{$\m@th\labelstyle{#1}$}} \xydef@\PATHlabelalias@{% \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHlabelalias@}% \else \addEQ@\ifx \next \addEQ@\DN@"##1"{\savealias@{##1}\xyFN@\PATHlabelalias@}% \else \DN@{\xy@@\leave@ \PATHlabels@}\fi\fi \next@} {\xyuncatcodes \gdef\next#1{\POS!C="#1"\relax}} \xylet@\savealias@=\next \message{\string\ar,} \xylet@\arvariant@@=\empty \xylet@\artail@@=\empty \xylet@\arstem@@=\empty \xylet@\arhead@@=\empty \xylet@\armodifiers@@=\empty \xylet@\arlabels@@=\empty \xylet@\arinit@@=\empty \xylet@\arexit@@=\empty \xylet@\arcomponent@@=\relax \xylet@\arcomponenttype@@=\relax \xylet@\afterarr@@=\relax \xydef@\ar{% \let\arvariant@@=\empty \def\artail@@{ {}}% \edef\arstem@@{\arvariant@@{-}}% \edef\arhead@@{\arvariant@@{>}}% \def\armodifiers@@{}% \def\arlabels@@{}% \def\arinit@@{}% \def\arexit@@{}% \xyFN@\arr@} \xydef@\arr@{% \ifx \space@\next \expandafter\DN@\space{\xyFN@\arr@}% \else \addAT@\ifx\next \addAT@\DN@{\xyFN@\arr@form}% \else\ifx |\next \DN@ |{\arr@anchor|}% \else\ifx ^\next \DN@ ^{\arr@anchor^}% \else\ifx _\next \DN@ _{\arr@anchor_}% \else \let\next@=\arr@x \fi\fi\fi\fi\fi \next@} \xydef@\arr@anchor#1{\begingroup \def\PATHlabelit@@##1##2{% \DN@####1{\endgroup\expandafter\def\expandafter\arlabels@@ \expandafter{\arlabels@@ ####1}}% \expandafter\next@\expandafter{\the\toks@*##1{##2}}\xyFN@\arr@}% \toks@={#1}% \def\xy@##1##2{\addtotoks@{##1}}\let\oxy@=\xy@ \let\xy@@ix@=\eat@ \DNii@{}\xyFN@\PATHanchor@} \xydef@\arr@form{% \ifx \space@\next \expandafter\DN@\space{\xyFN@\arr@form}% \else\ifx ^\next \DN@ ^{\xyFN@\arr@i}\edef\arvariant@@{\string^}% \else\ifx _\next \DN@ _{\xyFN@\arr@i}\edef\arvariant@@{\string_}% \else\ifx 0\next \DN@ 0{\xyFN@\arr@i}\def\arvariant@@{0}% \else\ifx 1\next \DN@ 1{\xyFN@\arr@i}\def\arvariant@@{1}% \else\ifx 2\next \DN@ 2{\xyFN@\arr@i}\def\arvariant@@{2}% \else\ifx 3\next \DN@ 3{\xyFN@\arr@i}\def\arvariant@@{3}% \else\ifx \bgroup\next \let\next@=\arr@i \else\ifx *\next \DN@ *{\arr@modifiers}% \else\ifx /\next \let\next@=\arr@curveslash \else\ifx '\next \DN@ '{\arr@curve}% \else \let\next@=\arr@error \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@} \xydef@\arr@error#1{\xyerror@{Illegal
ation (\meaning\next)}{}% \xyFN@\arr@} \xydef@\arr@i{% \ifx \bgroup\next \let\arcomponent@@=\arr@ii \let\arcomponenttype@@=\artip@ \DN@##1{\xyFN@\arcomponent@##1$}% \else \DN@{\xyFN@\arr@}% \fi \next@} \xydef@\arr@ii{% \ifx $\next \edef\arstem@@{\arvariant@@{-}}\let\next@=\arr@iv \else \expandafter\def\expandafter\artail@@\expandafter{\the\toks@}% \let\arcomponent@@=\arr@iii \let\arcomponenttype@@=\arconn@ \DN@{\xyFN@\arcomponent@}\fi \next@} \xydef@\arr@iii{% \expandafter\def\expandafter\arstem@@\expandafter{\the\toks@}% \let\arcomponent@@=\arr@iv \let\arcomponenttype@@=\artip@ \xyFN@\arcomponent@} \xydef@\arr@iv{% \expandafter\def\expandafter\arhead@@\expandafter{\the\toks@}% \ifx $\next \DN@ ${\xyFN@\arr@}% \else \xyerror@{illegal : \meaning\next\space not valid}{}\fi \next@} \xydef@\arr@x{% \let\PATHlabelbreak@@=\arlabelbreak@ \toks@={\arr@PATH}% \expandafter\addtotoks@\expandafter{\expandafter{\artail@@}}% \expandafter\addtotoks@\expandafter{\expandafter{\arstem@@}}% \expandafter\addtotoks@\expandafter{\expandafter{\arhead@@}}% \expandafter\addtotoks@\expandafter{\expandafter{\armodifiers@@}}% \expandafter\addtotoks@\expandafter{\expandafter{\arinit@@}}% \expandafter\addtotoks@\expandafter{\expandafter{\arexit@@}}% \expandafter\addtotoks@\expandafter{\expandafter{\arlabels@@}}% \addtotoks@{\afterarr@@}% \expandafter\DNii@\expandafter{\the\toks@}\toks@={}% \nextii@} {\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8{\afterPATH{#8}% ~={#5\invisbreaks\connect i#4\dir#2\resetbreaks}% ~<{\arsegment{?<*#4\dir#1}0}% ~>{\arsegment{?>*#4\dir#3}1}% ~-{\initbreaks\connect #4\dir#2}% ~/{#6}% ~+{#7}}} \xylet@\arr@PATH=\next \xylet@\artmp@@=\relax \xydef@\arsegment#1#2{\xy@@{\enter@\cfromthec@}% \POS#1\relax \xy@@{\edef\tmp@{\cmergethecz@}\leave@}% \ifcase#2\xy@@{\setupDirection@ \swap@ \tmp@ \infinitize@-\swap@}% \else \xy@@{\tmp@ \setupDirection@ \infinitize@+}\fi} \xydef@\arcomponent@{% \ifx ^\next \toks@ii={^}\DN@ ^{\xyFN@\arcomponent@i}% \else\ifx _\next \toks@ii={_}\DN@ _{\xyFN@\arcomponent@i}% \else\ifx 1\next \toks@ii={1}\DN@ 1{\xyFN@\arcomponent@i}% \else\ifx 2\next \toks@ii={2}\DN@ 2{\xyFN@\arcomponent@i}% \else\ifx 3\next \toks@ii={3}\DN@ 3{\xyFN@\arcomponent@i}% \else\ifx \bgroup\next \expandafter\toks@ii\expandafter{\arvariant@@}% \let\next@=\arcomponent@i \else\ifx *\next \DN@*##1##{\arcomponent@ii{##1}}% \else \expandafter\toks@ii\expandafter{\arvariant@@}\toks@={}% \let\next@=\arcomponenttype@@ \fi\fi\fi\fi\fi\fi\fi \next@} \xydef@\arcomponent@i#1{\toks@={#1}\arcomponent@x} \xydef@\arcomponent@ii#1#2{\toks@={*#1{#2}}\xyFN@\arcomponent@@} \xydef@\artip@{% \addGT@\ifx\next \addGT@\addtotoks@ \addGT@\DN@{\xyFN@\artip@}% \else\addLT@\ifx\next \addLT@\addtotoks@ \addLT@\DN@{\xyFN@\artip@}% \else\ifx (\next \addtotoks@(\DN@({\xyFN@\artip@}% \else\ifx )\next \addtotoks@)\DN@){\xyFN@\artip@}% \else\ifx |\next \addtotoks@|\DN@|{\xyFN@\artip@}% \else\addLQ@\ifx\next \addLQ@\addtotoks@ \addLQ@\DN@{\xyFN@\artip@}% \else\addRQ@\ifx\next \addRQ@\addtotoks@ \addRQ@\DN@{\xyFN@\artip@}% \else\addPLUS@\ifx \next \addPLUS@\addtotoks@ \addPLUS@\DN@{\xyFN@\artip@}% \else\ifx /\next \addtotoks@/\DN@/{\xyFN@\artip@}% \else\ifcat A\noexpand\next \DN@##1{\addtotoks@{##1}\xyFN@\artip@}% \else\ifx\space@\next \addtotoks@{ }\expandafter\DN@\space{\xyFN@\artip@}% \else \let\next@=\arcomponent@x \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@} \xydef@\arconn@{% \addDASH@\ifx\next \addDASH@\addtotoks@ \addDASH@\DN@{\xyFN@\arconn@}% \else\addEQ@\ifx\next \addEQ@\addtotoks@ \addEQ@\DN@{\xyFN@\arconn@}% \ifx\arvariant@@\empty \def\arvariant@@{2}\fi \else\addDOT@\ifx\next \addDOT@\addtotoks@ \addDOT@\DN@{\xyFN@\arconn@}% \else\ifx :\next \addtotoks@:\DN@:{\xyFN@\arconn@}% \ifx\arvariant@@\empty \def\arvariant@@{2}\fi \else\ifx ~\next \addtotoks@~\DN@~{\xyFN@\arconn@}% \else \let\next@=\arcomponent@x \fi\fi\fi\fi\fi \next@} \xydef@\arcomponent@x{% \DN@##1{\toks@=\expandafter{\the\toks@ii{##1}}}% \expandafter\next@\expandafter{\the\toks@}% \xyFN@\arcomponent@@} \xydef@\arr@curveslash/#1/{\expandafter\arr@curve\arr@slashing{#1}} {\xyuncatcodes \gdef\next#1{{**{} ?+/#1/+/#1/ @+c}}} \xylet@\arr@slashing=\next \xydef@\arr@curve#1{\curve@check \setcurvearrowinit@\arinit@@{#1}% \setcurvearrowexit@\arexit@@ \DN@##1{\def\arstem@@{*\crvs##1}}% \expandafter\next@\expandafter{\arstem@@}% \xyFN@\arr@} {\xyuncatcodes \gdef\next#1#2{\def#1{\save @(,#2\restore}}} \xylet@\setcurvearrowinit@=\next {\xyuncatcodes \gdef\next#1{\def#1{\POS @i @) }}} \xylet@\setcurvearrowexit@=\next \xydef@\curve@check{% \xyerror@{Formation @ only available when curve extension loaded}{}} \xywithoption{curve}{\let\curve@check=\relax} \xydef@\arr@modifiers#1{\def\armodifiers@@{#1}\xyFN@\arr@} \xyendinput