%% xy.tex from $Id: xy.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
%%
%% Basic Xy-pictures: Xy-pic bootstrap and kernel macros.
%% Copyright (c) 1991-1996 Kristoffer H. Rose <[email protected]>
%%
%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
%% Copyright (c) 1991-1996 Kristoffer H. Rose <[email protected]>
%%
%% 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\else\message{not reloaded}\endinput\fi
\let\xyloaded=\relax
\message{Bootstrap\string'ing\string:}
{\catcode96 12\catcode`\#6\catcode`\.12\catcode`\:12\catcode`\'12\catcode`\@11
\ifx\xywarnifdefined\undefined\else \immediate\write16{}%
\immediate\write16{Xy-pic Warning: \string\xywarnifdefined\space redefined.}%
\immediate\write16{}\fi
\gdef\xywarnifdefined#1{\ifx#1\undefined\else \immediate\write16{}%
\immediate\write16{Xy-pic Warning: `\string#1' redefined.}%
\immediate\write16{}\fi}
\xywarnifdefined\xydef@ \gdef\xydef@#1{\xywarnifdefined#1\gdef#1}
\xywarnifdefined\xylet@ \gdef\xylet@#1{\xywarnifdefined#1\global\let#1}
\xywarnifdefined\xynew@
\gdef\xynew@#1#2{\xywarnifdefined#2\csname new#1\endcsname#2}}
\message{catcodes\string,}
\xywarnifdefined\xyuncatcodes
\xywarnifdefined\xyreuncatcodes \def\xyreuncatcodes{\edef\xyuncatcodes{%
\catcode92 0 \catcode123 1 \catcode125 2 \catcode37 14
\catcode 9 \the\catcode 9 \catcode10 \the\catcode10 \catcode12 \the\catcode12
\catcode35 \the\catcode35 \catcode36 \the\catcode36 \catcode38 \the\catcode38
\catcode43 \the\catcode43 \catcode45 \the\catcode45 \catcode46 \the\catcode46
\catcode47 \the\catcode47
\catcode60 \the\catcode60 \catcode61 \the\catcode61 \catcode62 \the\catcode62
\catcode64 \the\catcode64 \catcode96 \the\catcode96
\newlinechar \the\newlinechar \endlinechar \the\endlinechar }}
\xyreuncatcodes
\xywarnifdefined\xycatcodes \def\xycatcodes{%
\catcode 9 10
\catcode 35 6 \catcode 36 3 \catcode 38 4
\catcode 43 12 \catcode 45 12 \catcode 46 12 \catcode 47 12
\catcode 60 12 \catcode 61 12 \catcode 62 12
\catcode 64 11 \catcode 96 12 }
\xycatcodes
\message{docmode,}
{\catcode`\|0 \xywarnifdefined|DOCMODE
\gdef|DOCMODE#1{\ifx(#1\relax \xycatcodes \expandafter\ignorespaces
\else \skipspecials@ \expandafter\docm@\fi}%
\xywarnifdefined\skipspecials@
\gdef\skipspecials@{%
\catcode`\\12 \catcode`\{12 \catcode`\}12 \catcode`\#12 \catcode`\%12
\catcode`\^^L12 \endlinechar`\^^J }%
\catcode`\/=12 \lccode`\/`\\%
\lccode`\D`\D \lccode`\O`\O \lccode`\C`\C \lccode`\M`\M \lccode`\E`\E
\lowercase{%
\xywarnifdefined\docm@ \gdef\docm@{\docm@i}%
\xywarnifdefined\docm@i \gdef\docm@i#1^^J{\docm@ii#1/DOCMODE\docm@iii}%
\xywarnifdefined\docm@ii
\gdef\docm@ii#1/DOCMODE{\def\next@{#1}\futurelet\next\docm@iii}%
\xywarnifdefined\docm@iii \gdef\docm@iii#1\docm@iii{%
\ifx\next\docm@iii \let\next\next@ \docecho@ \let\next@\docm@
\else\ifx\next@\empty \let\next@\docfinish@
\else \edef\next@{\noexpand\docm@iv\next@/DOCMODE#1\noexpand\docm@iv}%
\fi\fi \next@}%
\xywarnifdefined\docm@iv
\gdef\docm@iv#1/DOCMODE\docm@iv{\def\next{#1}\docecho@ \docm@}}%
\xywarnifdefined\docecho@ \global\let\docecho@\relax
\xywarnifdefined\docfinish@ \gdef\docfinish@{\xyuncatcodes|DOCMODE\next}}
\xydef@\xydefcsname@#1{\DN@{#1}\DNii@##1{%
\ifx ##1\relax\else \xywarning@{\string`\string##1\string' redefined}\fi
\def##1}%
\expandafter\nextii@\csname\codeof\next@\endcsname}
\xydef@\xyletcsnamecsname@#1#2{\def\1{#1}\def\2{#2}\DN@##1##2{%
\ifx ##1\relax\else \xywarning@{`\string##1\string' redefined}\fi
\let##1=##2}%
\expandafter\expandafter\expandafter\next@
\expandafter\csname\expandafter\codeof\expandafter\1\expandafter\endcsname
\csname\codeof\2\endcsname}
\xywarnifdefined\codeof
\xywarnifdefined\codeof@
{\catcode`\:=12
\gdef\codeof#1{\expandafter\codeof@\meaning#1<-:}
\gdef\codeof@#1:->#2<-:{#2}}
\xywarnifdefined\addAT@
\xywarnifdefined\addHASH@
\xywarnifdefined\addDOLL@
\xywarnifdefined\addAND@
\xywarnifdefined\addRQ@
\xywarnifdefined\addPLUS@
\xywarnifdefined\addDASH@
\xywarnifdefined\addDOT@
\xywarnifdefined\addLT@
\xywarnifdefined\addEQ@
\xywarnifdefined\addGT@
\xywarnifdefined\addLQ@
\xydef@\xymakeADD@#1#2 #3 {\ifnum\catcode#3=6 \def#1##1{##1#2#2}%
\else \def#1##1{##1#2}\fi}
\xydef@\xyrecat@{\xymakeADD@\addAT@}
\xydef@\xyrecat{\xyrecat@}
\xydef@\xyresetcatcodes{\def\xyrecat{\xyrecat@}\xyreuncatcodes
\input xyrecat \relax \xyuncatcodes}
\xyuncatcodes \xyresetcatcodes \xycatcodes
\input xyidioms
\xydef@\stripRCS$#1${\stripRCS@#1: @@ @@@}
\xydef@\stripRCS@#1: #2@ #3@@@{%
\ifx @#2\string?\else\ifx :#2\else\stripRCS@@#2\fi\fi}
\xydef@\stripRCS@@#1 #2: @{#1}
\edef\next{\stripRCS$Revision: 3.3 $}
\edef\next@{\stripRCS$Locker: $}
\xylet@\xyversion=\next
\def\next{ @}\ifx\next\next@
\edef\next{\stripRCS$Date: 1996/12/19 03:31:56 $}
\else\edef\xyversion{\xyversion+}
\edef\next{\number\year/\ifnum\month<10 0\fi\number\month
/\ifnum\day<10 0\fi\number\day}\fi
\xylet@\xydate=\next
\xydef@\Xygreet@{%
\W@{}%
\W@{ Xy-pic version \xyversion\space<\xydate>}%
\W@{ Copyright (c) 1991-1996 by Kristoffer H. Rose <[email protected]>}%
\W@{ Xy-pic is free software: see the User\string's Guide for details.}%
\W@{}}
\Xygreet@
\expandafter\everyjob\expandafter{\the\everyjob\Xygreet@}
\message{Loading kernel:}
\xydef@\Xy{\leavevmode
\hbox{\kern-.1em X\kern-.3em\lower.4ex\hbox{Y\kern-.15em}}}
\message{messages;}
\xywarnifdefined\thelineno@
\ifx\inputlineno\undefined \edef\thelineno@{\string?}
\else \def\thelineno@{\the\inputlineno}\fi
\xydef@\xytracelineno@{ \string[\jobname:\thelineno@\string]}
\xydef@\xywarning@#1{{\newlinechar=10
\W@{}\W@{Xy-pic Warning: #1\xytracelineno@.}\W@{}}}
\xydef@\xyerror@#1#2{\if\inxy@\xy@{ERROR #1}{}\fi
{\def\2{#2}\newlinechar=10
\ifx\2\empty \errhelp{See the Xy-pic manual for further information.}%
\else \errhelp{#2}\fi
\errmessage{Xy-pic error: #1}}}
\xydef@\xybug@#1{{\newlinechar=10
\errhelp{This is a bug in Xy-pic and should not happen!^^J%
If it did then please send a bug report with the offending Xy-pic code^^J%
to the author of Xy-pic, [email protected].}%
\errmessage{Xy-pic BUG: #1 -- notify [email protected].}}}
\message{fonts;}
\xydef@\xyfont@#1{\ifx#1\undefined \DN@{\global\font#1}\expandafter\next@
\else \xywarning@{Using previously loaded \string#1\space font}\fi}
\xyfont@\xydashfont=xydash10
\xydef@\xydashl@{\fontdimen6\xydashfont}
\xydef@\xydashh@{\fontdimen5\xydashfont}
\xydef@\xydashw@{\fontdimen8\xydashfont}
\xyfont@\xyatipfont=xyatip10
\xyfont@\xybtipfont=xybtip10
\xyfont@\xybsqlfont=xybsql10
\xydef@\xybsqll@{\fontdimen6\xybsqlfont}
\xydef@\xybsqlh@{\fontdimen5\xybsqlfont}
\xydef@\xybsqlw@{\fontdimen8\xybsqlfont}
\xyfont@\xycircfont=xycirc10
\message{allocations:}
\message{state,}
\xynew@{dimen}\X@c
\xynew@{dimen}\Y@c
\xynew@{dimen}\U@c
\xynew@{dimen}\D@c
\xynew@{dimen}\L@c
\xynew@{dimen}\R@c
\xynew@{toks}\Edge@c
\xynew@{dimen}\X@p
\xynew@{dimen}\Y@p
\xynew@{dimen}\U@p
\xynew@{dimen}\D@p
\xynew@{dimen}\L@p
\xynew@{dimen}\R@p
\xynew@{toks}\Edge@p
\xynew@{dimen}\X@origin \X@origin=\z@
\xynew@{dimen}\Y@origin \X@origin=\z@
\xynew@{dimen}\X@xbase \X@xbase=1mm
\xynew@{dimen}\Y@xbase \Y@xbase=\z@
\xynew@{dimen}\X@ybase \X@ybase=\z@
\xynew@{dimen}\Y@ybase \Y@ybase=1mm
\xynew@{dimen}\X@min
\xynew@{dimen}\Y@min
\xynew@{dimen}\X@max
\xynew@{dimen}\Y@max
\xynew@{box}\lastobjectbox@
\xynew@{box}\zerodotbox@
\setbox\zerodotbox@=\hbox{\dimen@=.5\xydashw@
\kern-\dimen@ \vrule width\xydashw@ height\dimen@ depth\dimen@}
\wd\zerodotbox@=\z@ \ht\zerodotbox@=\z@ \dp\zerodotbox@=\z@
\xynew@{dimen}\almostz@ \almostz@=50sp
\xydef@\zz@#1{\ifdim#1<\z@-\fi#1<\almostz@\relax}
\xynew@{if}\iftmp@
\message{direction,}
\xynew@{dimen}\d@X
\xynew@{dimen}\d@Y
\xydef@\sd@X{}
\xydef@\sd@Y{}
\xynew@{count}\K@ \K@=1024
\xynew@{count}\KK@ \KK@=32
\xynew@{count}\Direction
\xynew@{dimen}\K@dXdY
\xynew@{dimen}\K@dYdX
\xydef@\cosDirection{}
\xydef@\sinDirection{}
\xywarnifdefined\DirectionChar
\xywarnifdefined\SemiDirectionChar
\xynew@{read}\xyread@
\xynew@{write}\xywrite@
\xynew@{count}\csp@
\xynew@{dimen}\quotPTK@
\message{utility macros;}
\xydef@\addtotoks@#1{\toks@=\expandafter{\the\toks@#1}}
\xydef@\xyinputorelse@#1#2{%
\expandafter\let\expandafter\next@\csname#1loaded\endcsname
\ifx\next@\empty \else
\DN@{\xyinputorelse@@{#1}{\xyinputorelse@@{#1.doc}{#2}}}%
\fi \next@}
\xydef@\xyinputorelse@@#1#2{\openin\xyread@=#1
\ifeof\xyread@ \DN@{#2}\else \DN@{\closein\xyread@\input#1 }\fi \next@}
\global\csp@=\z@
\xydef@\enter@#1{\global\advance\csp@\@ne
\expandafter\xdef\csname cs@\number\csp@\endcsname{#1}\ignorespaces}
\xydef@\nter@#1{\global\advance\csp@\@ne
\expandafter\gdef\csname cs@\number\csp@\endcsname{#1}\ignorespaces}
\xydef@\dontleave@{\csname cs@\number\csp@\endcsname}
\xydef@\unenter@{\global\advance\csp@\m@ne}
\xydef@\leave@{\expandafter\unenter@\csname cs@\number\csp@\endcsname}
\quotPTK@=\p@ \divide\quotPTK@\K@
\xylet@\quotsign@@=\empty
\xywarnifdefined\removePT@
{\catcode`p=12 \catcode`t=12 \gdef\removePT@#1pt{#1}}
\xydef@\quotient@#1#2#3{\A@=#2\relax \B@=#3\relax
\ifdim\A@<\z@\def\quotsign@@{-}\else\def\quotsign@@{+}\fi
\ifdim\quotsign@@\A@<15pt \multiply\A@\K@
\else\ifdim\quotsign@@\A@<511pt \multiply\A@\KK@ \divide\B@\KK@
\else \divide\B@\K@ \fi\fi
\ifdim\ifdim\B@<\z@-\fi\B@<\quotPTK@ \xywarning@{division overflow}%
\else \advance\[email protected]\B@ \divide\A@\B@ \fi
\multiply\A@\quotPTK@ \edef#1{\expandafter\removePT@\the\A@}}
\xydef@\quotient@@#1#2#3{\A@=#2\relax \B@=#3\relax
\multiply\A@\KK@ \divide\B@\KK@ \divide\B@ 8
\ifdim\B@=\z@\else \advance\[email protected]\B@ \divide\A@\B@ \fi
\B@=.125\quotPTK@ \multiply\A@\B@ \edef#1{\expandafter\removePT@\the\A@}}
\xydef@\loop@#1\repeat@{\def\body@{#1}\iterate@}\xylet@\repeat@=\fi
\xydef@\iterate@{\body@\expandafter\iterate@\else\fi}
\xydef@\xyinitial@#1#2{\DN@{#1}%
\xyerror@{command used out of context: \codeof\next@}{}}
\xylet@\xy@=\xyinitial@
\xylet@\oxy@=\xy@
\xydef@\change@oxy@#1{\let\oxy@=#1\relax
}
\xydef@\inxy@{T\ifx\xy@\xyinitial@ F\else T\fi}
\xydef@\xyxy@@ix@{\begingroup
\xyuncatcodes\afterassignment\endgroup\global\toks9=}
\xydef@\xy@@{\xy@{}}
\xydef@\plainxy@{\let\xy@=\xyxy@ \change@oxy@\xy@ \let\xy@@ix@=\xyxy@@ix@}
\message{pictures: \string\xy,}
\xydef@\xy{\ifmmode\expandafter\xymath@\else\expandafter\xynomath@\fi}
\xydef@\xymath@{\hbox\bgroup \dimen@=\the\fontdimen22\textfont\tw@ \xyinside@}
\xydef@\xynomath@{\hbox\bgroup \dimen@=\z@ \xyinside@}
\xydef@\xyinside@{%
\saveXyStyle@ \aftergroup\xycheck@end
\setboxz@h\bgroup
\plainxy@
\X@c=\z@ \Y@c=\z@ \czeroEdge@
\X@p=\z@ \Y@p=\z@ \U@p=\z@ \D@p=\z@ \L@p=\z@ \R@p=\z@ \Edge@p={\zeroEdge}%
\X@min=\hsize \X@max=-\hsize \Y@min=\hsize \Y@max=-\hsize
\expandafter\POS\everyxy@@}
\xydef@\czeroEdge@{\U@c=\z@ \D@c=\U@c \L@c=\U@c \R@c=\U@c \Edge@c={\zeroEdge}}
\xydef@\xyxy@#1#2{#2}
\xywarnifdefined\everyxy
\expandafter\def\addEQ@\everyxy#1{\def\everyxy@@{#1}\ignorespaces}
\xylet@\everyxy@@=\empty
\xydef@\endxy{\if\inxy@\else\xyerror@{Unexpected \string\endxy}{}\fi
\relax
\dimen@=\Y@max \advance\dimen@-\Y@min
\ifdim\dimen@<\z@ \dimen@=\z@ \Y@min=\z@ \Y@max=\z@ \fi
\dimen@=\X@max \advance\dimen@-\X@min
\ifdim\dimen@<\z@ \dimen@=\z@ \X@min=\z@ \X@max=\z@ \fi
\edef\tmp@{\egroup
\setboxz@h{\kern-\the\X@min\boxz@}%
\ht\z@=\the\Y@max \dp\z@=-\the\Y@min \wdz@=\the\dimen@
\noexpand\maybeunraise@ \raise\dimen@\boxz@
\noexpand\recoverXyStyle@ \egroup \noexpand\xy@end
\U@c=\the\Y@max \D@c=-\the\Y@min \L@c=-\the\X@min \R@c=\the\X@max}\tmp@}
\xydef@\maybeunraise@{\if\inxy@\else \dimen@ii=\dp\z@
\ifdim\dimen@ii<\z@ \advance\dimen@\dimen@ii \fi\fi}
\xydef@\xycheck@end{\xyFN@\xycheck@end@}
\xydef@\xycheck@end@{\ifx\next\xy@end\DN@\xy@end{}\else\DN@{\xy@end}\fi\next@}
\xydef@\xy@end{%
\xyerror@{An \string\xy\space environment is not closed correctly.}%
{I expected \string\endxy. You probably have an umatched {} grouping.}}
\message{positions,}
\xydef@\POS{\afterPOS{}}
\xydef@\afterPOS#1{%
\DN@##1{\def\afterPOS@{\def\afterPOS@{##1}#1}}%
\expandafter\next@\expandafter{\afterPOS@}%
\afterCOORD{\xyFN@\POS@}}
\xylet@\afterPOS@=\empty
\xydef@\afterCOORD#1{%
\DN@##1{\def\afterCOORD@{\def\afterCOORD@{##1}#1}}%
\expandafter\next@\expandafter{\afterCOORD@}%
\afterVECTORorEMPTY{\xy@@\czeroEdge@ \afterCOORD@}{\xyFN@\COORD@}}
\xylet@\afterCOORD@=\empty
\xydef@\afterVECTORorEMPTY#1#2{%
\DN@##1{\def\afterVECTOR@{\def\afterVECTOR@{##1}%
\ifVECTORempty@\DN@{#2}\else\DN@{#1}\fi \next@}}%
\expandafter\next@\expandafter{\afterVECTOR@}%
\xyFN@\VECTOR@}
\xynew@{if}\ifVECTORempty@
\xylet@\afterVECTOR@=\empty
\xydef@\xyVECTOR@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\VECTOR@}%
\else \ifcat A\noexpand\next \let\next@=\VECTOR@letter
\else \let\next@=\VECTOR@other \fi\fi \next@}
\xylet@\VECTOR@=\xyVECTOR@
\def\notrelaxorelse@#1#2{\ifx#1\relax \expandafter#2\else\expandafter#1\fi}
\xydef@\VECTOR@letter{%
\ifx a\next \expandafter\VECTOR@a \else \expandafter\CORNER@ \fi}
\xydef@\VECTOR@a a(#1){\xy@{a(#1)}{\vfromcartesianangle@{#1}}%
\VECTORempty@false \afterVECTOR@}
\xydef@\CORNER@{%
\xy@{}{\A@=-.5\L@c \advance\[email protected]\R@c \B@=-.5\D@c \advance\[email protected]\U@c
\let\nextii@=\zeroit@}%
\VECTORempty@true\CORNER@i}
\xydef@\zeroit@#1{#1=\z@}
\xydef@\CORNER@i{%
\ifx D\next \DN@ D{\xy@{D}{\Y@c=-\D@c \nextii@\X@c \B@=\Y@c}\CORNER@ii}%
\else\ifx U\next \DN@ U{\xy@{U}{\Y@c= \U@c \nextii@\X@c \B@=\Y@c}\CORNER@ii}%
\else\ifx L\next \DN@ L{\xy@{L}{\X@c=-\L@c \nextii@\Y@c \A@=\X@c}\CORNER@ii}%
\else\ifx R\next \DN@ R{\xy@{R}{\X@c= \R@c \nextii@\Y@c \A@=\X@c}\CORNER@ii}%
\else\ifx C\next \DN@ C{\xy@{C}{\X@c= \A@ \Y@c= \B@}\CORNER@ii}%
\else\ifx E\next \DN@ E{\xy@{E}{%
\A@=\X@c \B@=\Y@c \the\Edge@c\z@ \advance\X@c-\A@ \advance\Y@c-\B@}%
\CORNER@ii}%
\else\ifx P\next \DN@ P{\xy@{P}{%
\A@=\X@c \B@=\Y@c \the\Edge@c\thr@@ \advance\X@c-\A@ \advance\Y@c-\B@}%
\CORNER@ii}%
\else\ifx (\next
\DN@(##1){\xy@{(##1)}{\X@c=##1\X@c \Y@c=##1\Y@c}\afterVECTOR@}%
\else \let\next@=\afterVECTOR@
\fi\fi\fi\fi\fi\fi\fi\fi \next@}
\xydef@\CORNER@ii{\xy@@{\let\nextii@=\eat@}%
\VECTORempty@false \xyFN@\CORNER@i}
\xydef@\VECTOR@other{%
\addLT@\ifx \next
\addGT@{\addLT@\DN@##1}{\xy@{<##1>}{\vfromabsolute@{##1}}%
\VECTORempty@false\afterVECTOR@}%
\else\ifx (\next
\DN@({\xyFN@\VECTOR@other@open}%
\else\ifx /\next
\DN@/##1/{\xy@@ix@{{##1}}%
\xy@{/##1/}{\expandafter\vfromslide@\the\toks9}%
\VECTORempty@false\afterVECTOR@}%
\else\ifx 0\next
\DN@ 0{\xy@{0}{\X@c=\z@ \Y@c=\z@}\VECTORempty@false\afterVECTOR@}%
\else
\DN@{\VECTORempty@true\afterVECTOR@}%
\fi\fi\fi\fi \next@}
\xydef@\VECTOR@other@open{%
\ifx *\next \DN@{\VECTORempty@true \xyFN@\afterVECTOR@(}%
\else
\DN@##1){\xy@{(##1)}{\vfromcartesian@{##1}}\VECTORempty@false\afterVECTOR@}%
\fi \next@}
\xydef@\xyCOORD@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\COORD@}%
\else \ifcat A\noexpand\next \let\next@=\xyCOORD@letter
\else \let\next@=\xyCOORD@other \fi\fi \next@}
\xylet@\COORD@=\xyCOORD@
\xydef@\xyCOORD@letter{%
\ifx c\next
\DN@ c{\xy@{c}{}\afterCOORD@}%
\else\ifx p\next
\DN@ p{\xy@{p}\cfromp@ \afterCOORD@}%
\else\ifx x\next
\DN@ x{\xy@{x}{\R@c=\X@xbase \U@c=\Y@xbase \intersect@}\afterCOORD@}%
\else\ifx y\next
\DN@ y{\xy@{y}{\R@c=\X@ybase \U@c=\Y@ybase \intersect@}\afterCOORD@}%
\else\ifx s\next
\DN@ s##1{\xy@{s{##1}}{\cfroms@{##1}}\afterCOORD@}%
\else \let\next@=\afterCOORD@ \fi\fi\fi\fi\fi \next@}
\xydef@\xyCOORD@other{%
\ifx "\next
\DN@"##1"{\xy@{"##1"}{\cfromid@{##1}}\afterCOORD@}%
\else\ifx \bgroup\next
\DN@##1{\xy@{{##1}}{\enter@{\pfromthep@\basefromthebase@}}%
\silencexy@ \POS##1\relax \unsilencexy@ \xy@@\leave@ \afterCOORD@}%
\else\ifx (\next
\DN@({\xyFN@\xyCOORD@other@open}%
\else \let\next@=\afterCOORD@ \fi\fi\fi \next@}
\xynew@{if}\ifsilentxy@
\xydef@\silencexy@{%
\ifsilentxy@ \nter@{}%
\else \nter@{\silentxy@false \let\xy@=\unsilent@@xy@}
\silentxy@true \let\unsilent@@xy@=\xy@ \def\xy@##1##2{\unsilent@@xy@{}{##2}}%
\fi}
\xydef@\unsilencexy@{\leave@}
\xydef@\xyCOORD@other@open{%
\ifx *\next
\DN@*##1*){\xy@{(*}{\enter@{\pfromthep@\basefromthebase@}}%
\POS##1\relax \xy@{*)}\leave@ \afterCOORD@}%
\else \DN@{\xyFN@\afterCOORD@(}%
\fi \next@}
\xydef@\xyPOS@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\POS@}%
\else\addPLUS@\ifx \next
\addPLUS@\DN@{\xy@+{\enter@\cplusthec@}%
\afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
\else\addDASH@\ifx \next
\addDASH@\DN@{\xy@-{\enter@\cplusthec@}%
\afterCOORD{\xy@@{\X@c=-\X@c \Y@c=-\Y@c\leave@}\xyFN@\POS@}}%
\else\ifx !\next
\DN@ !{\xy@!{\enter@\cskewthec@}\afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
\else\addDOT@\ifx \next
\addDOT@\DN@{\xy@.{\enter@\cmergethec@}%
\afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
\else\ifx ,\next
\DN@ ,{\xy@,{\comma@@}\afterCOORD{\xyFN@\POS@}}%
\else\ifx ;\next
\DN@ ;{\xy@;{\swap@}\afterCOORD{\xyFN@\POS@}}%
\else\ifx :\next
\DN@ :{\xyFN@\POS@colon}%
\else\addEQ@\ifx \next
\addEQ@\DN@{\xyFN@\saveid@}%
\else\ifx *\next
\DN@ *{\xyFN@\POS@star}%
\else \ifx ?\next
\DN@?{\xy@?{}\afterPLACE{\xyFN@\POS@}}%
\else \addAT@\ifx \next
\addAT@\DN@{\xyFN@\STACK@}%
\else
\let\next@=\afterPOS@
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
\xylet@\comma@@=\relax
\xylet@\POS@=\xyPOS@
\xydef@\POS@colon{\DNii@{\afterCOORD{\xyFN@\POS@}}%
\ifx :\next \xy@{::}{\setbase@@\X@c\Y@c}\DN@:{\nextii@}%
\else \xy@:{\setbase@\X@p\Y@p\X@c\Y@c}\let\next@=\nextii@ \fi
\next@}
\xydef@\POS@star{%
\ifx *\next
\DN@*##1##{\nextii@{##1}}%
\DNii@##1##2{\xy@@ix@{{##1}{##2}}%
\xy@{**##1{##2}}{\expandafter\connect@\the\toks9}\xyFN@\POS@}%
\else
\DN@##1##{\nextii@{##1}}%
\DNii@##1##2{\xy@@ix@{{##1}{##2}}%
\xy@{*##1{##2}}{\expandafter\drop@\the\toks9}\xyFN@\POS@}%
\fi
\next@}
\xydef@\cfromp@{\X@c=\X@p \Y@c=\Y@p \U@c=\U@p \D@c=\D@p \L@c=\L@p \R@c=\R@p
\Edge@c=\expandafter{\the\Edge@p}}
\xydef@\pfromc@{\X@p=\X@c \Y@p=\Y@c \U@p=\U@c \D@p=\D@c \L@p=\L@c \R@p=\R@c
\Edge@p=\expandafter{\the\Edge@c}}
\xydef@\swapdimen@#1#2{\dimen@=#1\relax #1=#2\relax #2=\dimen@}
\xynew@{toks}\swaptoks@@
\xydef@\swap@{\swapdimen@\X@c\X@p \swapdimen@\Y@c\Y@p
\swapdimen@\U@c\U@p\swapdimen@\D@c\D@p \swapdimen@\L@c\L@p\swapdimen@\R@c\R@p
\swaptoks@@=\Edge@c \Edge@c=\Edge@p \Edge@p=\swaptoks@@}
\xydef@\vfromabsolute@#1{\vfromabsolute@@#1,@}
\xydef@\vfromabsolute@@#1,#2@{\X@c=#1\relax
\DN@{#2}\ifx\next@\empty \Y@c=\X@c
\else \DN@##1,{\Y@c=##1}\next@#2\relax \fi
\advance\X@c 1sp \advance\Y@c 1sp
}
\xydef@\cfromthec@{\X@c=\the\X@c \Y@c=\the\Y@c
\U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
\Edge@c={\expandafter\noexpand\the\Edge@c}}
\xydef@\cfromthep@{\X@c=\the\X@p \Y@c=\the\Y@p
\U@c=\the\U@p \D@c=\the\D@p \L@c=\the\L@p \R@c=\the\R@p
\Edge@c={\expandafter\noexpand\the\Edge@p}}
\xydef@\pfromthep@{\X@p=\the\X@p \Y@p=\the\Y@p
\U@p=\the\U@p \D@p=\the\D@p \L@p=\the\L@p \R@p=\the\R@p
\Edge@p={\expandafter\noexpand\the\Edge@p}}
\xydef@\pfromthec@{\X@p=\the\X@c \Y@p=\the\Y@c
\U@p=\the\U@c \D@p=\the\D@c \L@p=\the\L@c \R@p=\the\R@c
\Edge@p={\expandafter\noexpand\the\Edge@c}}
\xydef@\cplusthec@{\advance\X@c\the\X@c \advance\Y@c\the\Y@c}
\xydef@\cskewthec@{%
\noexpand\cskew@{\the\Y@c}{\the\X@c}{\the\D@c}{\the\U@c}{\the\L@c}{\the\R@c}}
\xydef@\cskew@#1#2#3#4#5#6{%
\D@c=#3\advance\D@c \Y@c \ifdim\D@c<\z@ \D@c=\z@ \fi
\U@c=#4\advance\U@c-\Y@c \ifdim\U@c<\z@ \U@c=\z@ \fi
\advance\Y@c#1%
\L@c=#5\advance\L@c \X@c \ifdim\L@c<\z@ \L@c=\z@ \fi
\R@c=#6\advance\R@c-\X@c \ifdim\R@c<\z@ \R@c=\z@ \fi
\advance\X@c#2%
\Edge@c={\rectangleEdge}}
\xydef@\cmergethec@{%
\noexpand\cmerge@{\the\Y@c}{\the\X@c}{\the\D@c}{\the\U@c}{\the\L@c}{\the\R@c}}
\xydef@\cmerge@#1#2#3#4#5#6{\the\Edge@c4%
\A@=#2\advance\A@-\X@c \B@=#1\advance\B@-\Y@c
\dimen@=#5\advance\L@c \A@ \ifdim\L@c<\dimen@ \L@c=\dimen@ \fi
\dimen@=#6\advance\R@c-\A@ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
\dimen@=#3\advance\D@c \B@ \ifdim\D@c<\dimen@ \D@c=\dimen@ \fi
\dimen@=#4\advance\U@c-\B@ \ifdim\U@c<\dimen@ \U@c=\dimen@ \fi
\advance\X@c\A@ \advance\Y@c\B@}
\xydef@\halfroottwo{.70710678}
\xydef@\partroottwo{.29289322}
\xydef@\halfrootthree{.8660254}
\xydef@\vfromcartesian@#1{\vfromcartesian@@#1@}
\xydef@\vfromcartesian@@#1,#2@{%
\X@c=\X@origin \advance\X@c#1\X@xbase \advance\X@c#2\X@ybase
\Y@c=\Y@origin \advance\Y@c#1\Y@xbase \advance\Y@c#2\Y@ybase}
\xydef@\setbase@#1#2#3#4{%
\X@origin=#1\relax \Y@origin=#2\relax
\X@xbase=#3\relax \advance\X@xbase-\X@origin
\Y@xbase=#4\relax \advance\Y@xbase-\Y@origin
\X@ybase=-\Y@xbase \Y@ybase=\X@xbase}
\xydef@\setbase@@#1#2{%
\X@ybase=#1\relax \advance\X@ybase-\X@origin
\Y@ybase=#2\relax \advance\Y@ybase-\Y@origin}
\xydef@\basefromthebase@{\X@origin=\the\X@origin \Y@origin=\the\Y@origin
\X@xbase=\the\X@xbase \Y@xbase=\the\Y@xbase
\X@ybase=\the\X@ybase \Y@ybase=\the\Y@ybase}
\xydef@\vfromcartesianangle@#1{\enter@\basefromthebase@ \R@=#1\p@
\B@=360\p@
\loop@ \ifdim\R@<\z@ \advance\R@\B@ \repeat@
\loop@ \ifdim\R@>\B@ \advance\R@-\B@ \repeat@
\ifdim\R@<.5\B@\else \R@=-\R@ \advance\R@\B@
\X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi
\B@=180\p@
\ifdim\R@<.5\B@\else \R@=-\R@ \advance\R@\B@
\X@xbase=-\X@xbase \Y@xbase=-\Y@xbase \fi
\B@=90\p@
\ifdim\R@<.5\B@ \let\nextiii@=\literal@
\else \R@=-\R@ \advance\R@\B@ \def\nextiii@##1,##2@{##2,##1@}\fi
\dimen@=\z@ \DN@{1,0@}%
\dimen@ii=45\p@ \DNii@{.70710678,.70710678@}%
\chooseangleinterval@
{\chooseangleinterval@
{\chooseangleinterval@
{\chooseangleinterval@
{\chooseangleinterval@
{}%
{4.090909}{.99677570,.08023846@}%
{}}%
{6}{.99452190,.10452846@}%
{\chooseangleinterval@
{}%
{8.181818}{.98982144,.14231484@}%
{}}}%
{10}{.98480775,.17364818@}%
{\chooseangleinterval@
{}%
{12.857143}{.97492791,.22252093@}%
{}}}%
{15}{.96592583,.25881905@}%
{\chooseangleinterval@
{\chooseangleinterval@
{}%
{16.363636}{.95949297,.28173256@}%
{}}%
{18}{.95105652,.30901699@}%
{\chooseangleinterval@
{}%
{20}{.93969262,.34202014@}%
{}}}}%
{22.5}{.92387953,.38268343@}%
{\chooseangleinterval@
{\chooseangleinterval@
{\chooseangleinterval@
{}%
{24.545455}{.90963200,.41541501@}%
{}}%
{25.714286}{.90096887,.43388374@}%
{}}%
{30}{.86602540,.5@}%
{\chooseangleinterval@
{\chooseangleinterval@
{}%
{32.727273}{.84125353,.54064082@}%
{}}%
{36}{.80901699,.58778525@}%
{\chooseangleinterval@
{\chooseangleinterval@
{}%
{38.571429}{.78183148,.62348980@}%
{}}%
{40.909091}{.75574957,.65486073@}%
{\chooseangleinterval@
{}%
{40}{.76604444,.64278761@}%
{}}}}}%
\A@=\R@ \advance\A@-\dimen@
\ifdim\ifdim\A@<\z@-\fi\A@<.01\p@ \edef\next@{\expandafter\nextiii@\next@}%
\else \B@=\dimen@ii \advance\B@-\R@
\ifdim\A@<\B@ \dimen@=\toradians@\A@
\edef\next@{\next@ \expandafter\removePT@\the\dimen@ @}%
\else \dimen@=-\toradians@\B@
\edef\next@{\nextii@ \expandafter\removePT@\the\dimen@ @}%
\fi
\expandafter\interpolatepoint@\next@
\edef\next@{\expandafter\nextiii@\next@}%
\fi
\expandafter\vfromcartesian@@\next@
\leave@}
\xydef@\chooseangleinterval@#1#2#3#4{%
\B@=#2\p@ \def\next{#3}%
\ifdim\R@<\B@ \dimen@ii=\B@ \let\nextii@=\next #1%
\else \dimen@=\B@ \let\next@=\next \ifdim\B@<\R@ #4\fi\fi}
\xydef@\interpolateinterval@#1,#2@#3,#4@{%
\A@=#1\p@ \dimen@=#3\p@ \advance\dimen@-\A@ \advance\A@\next\dimen@
\B@=#2\p@ \dimen@=#4\p@ \advance\dimen@-\B@ \advance\B@\next\dimen@
\edef\next@{\expandafter\removePT@\the\A@,\expandafter\removePT@\the\B@ @}}
\xydef@\toradians@{0.01745329}
\xydef@\interpolatepoint@#1,#2@#3@{%
\A@=#1\p@ \dimen@ii=#3\A@ \dimen@ii=-.5\dimen@ii \advance\A@#3\dimen@ii
\dimen@=-#2\p@ \advance\A@#3\dimen@
\B@=#2\p@ \dimen@ii=#3\B@ \dimen@ii=-.5\dimen@ii \advance\B@#3\dimen@ii
\dimen@=#1\p@ \advance\B@#3\dimen@
\edef\next@{\expandafter\removePT@\the\A@,\expandafter\removePT@\the\B@ @}}
\xydef@\drop@#1#2{%
\global\setbox\lastobjectbox@=\object#1{#2}%
\ifHidden@ \dimen@=\X@c \advance\dimen@-\L@c \else
\dimen@=\Y@c \advance\dimen@ \U@c \ifdim\Y@max<\dimen@ \Y@max=\dimen@ \fi
\dimen@=\Y@c \advance\dimen@-\D@c \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi
\dimen@=\X@c \advance\dimen@ \R@c \ifdim\X@max<\dimen@ \X@max=\dimen@ \fi
\dimen@=\X@c \advance\dimen@-\L@c \ifdim\dimen@<\X@min \X@min=\dimen@ \fi
\fi
\ifInvisible@\else
\setboxz@h{\kern\dimen@ \raise\Y@c\box\lastobjectbox@}%
\ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ {\Drop@@}\fi}
\xydef@\connect@#1#2{\setupDirection@ \enter@{\cfromthec@}%
\global\setbox\lastobjectbox@=\object#1{#2}\leave@
\Connect@@}
\xydef@\preconnect@#1#2{\setupDirection@ \enter@{\cfromthec@}%
\global\setbox\lastobjectbox@=\object#1{#2}\leave@ \connectStore@
\ifInvisible@ \Connect@@ \else \Invisible@true\Connect@@\Invisible@false \fi}
\xynew@{box}\connectobjectbox@@
\xylet@\connectDrop@@=\empty
\xylet@\connectpreXY@style@=\empty
\xylet@\connectpostXY@style@=\empty
\xylet@\connectRest@@=\empty
\xydef@\connectStore@{%
\global\setbox\connectobjectbox@@=\copy\lastobjectbox@
\let\connectDrop@@=\Drop@@
\let\connectpreXY@style@ =\preXY@style@
\let\connectpostXY@style@=\postXY@style@
\xdef\connectRest@@{%
\def\noexpand\Upness@{\Upness@}%
\def\noexpand\Leftness@{\Leftness@}%
\ifInvisible@ \noexpand\Invisible@true \else \noexpand\Invisible@false \fi
\ifHidden@ \noexpand\Hidden@true \else \noexpand\Hidden@false \fi}}
\xydef@\connectRestore@{%
\ifvbox\connectobjectbox@@
\setbox\lastobjectbox@=\copy\voidb@x
\else
\global\setbox\lastobjectbox@=\copy\connectobjectbox@@
\fi
\let\Drop@@=\connectDrop@@
\global\let\preXY@style@ =\connectpreXY@style@
\global\let\postXY@style@=\connectpostXY@style@
\connectRest@@}
\xydef@\afterPLACE#1{%
\DN@##1{\def\afterPLACE@{\xy@@\leave@ \def\afterPLACE@{##1}#1}}%
\expandafter\next@\expandafter{\afterPLACE@}%
\def\PLACEf@{{.5}}%
\xy@@{\enter@{\pfromthep@}%
\Creset@@ \def\PLACEf@{{.5}}%
\let\PLACEedgep@@=\PLACEedgep@ \let\PLACEedgec@@=\PLACEedgec@}%
\xyFN@\PLACE@}
\xydef@\PLACEf@{}
\xydef@\PLACEedgep@@{}
\xydef@\PLACEedgec@@{}
\xydef@\PLACEedgep@{\Cshavep@@ \def\PLACEedgep@@{\Cslidep@@\jot}}
\xydef@\PLACEedgec@{\Cshavec@@ \def\PLACEedgec@@{\Cslidec@@{-\jot}}}
\xylet@\afterPLACE@=\empty
\xydef@\PLACE@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@}%
\else\addLT@\ifx \next
\addLT@\DN@{\addLT@\xy@{\def\PLACEf@{{0}}\PLACEedgep@@}\xyFN@\PLACE@}%
\else\addGT@\ifx \next
\addGT@\DN@{\addGT@\xy@{\def\PLACEf@{{1}}\PLACEedgec@@}\xyFN@\PLACE@}%
\else\ifx (\next
\DN@(##1){\def\PLACEf@{{##1}}\xy@{(##1)}{\def\PLACEf@{{##1}}}\xyFN@\PLACE@}%
\else\ifx !\next
\DN@!{\xyFN@\PLACE@intercept}%
\else
\DN@{\xy@@{\expandafter\Calong@@\PLACEf@ \czeroEdge@}\PLACE@@}%
\fi\fi\fi\fi\fi \next@}
\xydef@\PLACE@intercept{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@intercept}%
\else\ifx \bgroup\next
\DN@##1{\xy@{!{##1}}{}\PLACE@intercept@{##1}}%
\else\ifx (\next
\DN@(*##1*){\xy@{!(*##1*)}{}\PLACE@intercept@{##1}}%
\else \DN@{\xyerror@{{<pos>} expected after ! in <place>}{}}%
\fi\fi\fi \next@}
\xydef@\PLACE@intercept@#1{%
\xy@@{\enter@{\pfromthep@\basefromthebase@}\begingroup}%
\xy@@ix@{#1}\xy@@{\plainxy@ \expandafter\POS\the\toks9\relax
\edef\next@{\endgroup
\X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p}%
\next@ \Cintercept@@ \leave@}%
\PLACE@@}
\xydef@\PLACE@@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@@}%
\else\ifx /\next \DN@/##1/{\xy@{/##1/}{\Cslidec@@{##1}}\afterPLACE@}%
\else \let\next@=\afterPLACE@
\fi\fi \next@}
\xydef@\intersect@{%
\d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
\A@=\X@c \advance\A@-\X@origin \B@=\Y@c \advance\B@-\Y@origin
\edef\next@{\expandafter\removePT@\the\R@c}%
\edef\nextii@{\expandafter\removePT@\the\U@c}%
\D@c=\next@\d@Y \advance\D@c-\nextii@\d@X \divide\D@c\KK@
\L@c=\next@\B@ \advance\L@c-\nextii@\A@ \divide\L@c\KK@
\ifdim\D@c=\z@\zeroDivide@\else \quotient@\next@\L@c\D@c \fi
\advance\X@c-\next@\d@X \advance\Y@c-\next@\d@Y
\czeroEdge@}
\xydef@\zeroDivide@@{\zeroDivide@message{\intersect@}{treated as 0}\DN@{0}}
\xydef@\zeroDivide@message#1#2{\xywarning@{division by 0 in \string#1, #2}}
\xylet@\zeroDivide@=\zeroDivide@@
\xydef@\zeroDivideLimit@@{\ifdim\L@c=\z@ \DN@{0}%
\else\ifdim\L@c<\z@\DN@{-\zeroDivide@Limit}%
\else\DN@{\zeroDivide@Limit}\fi\fi
\zeroDivide@message{\intersect@}{replaced by \zeroDivide@Limit}}
\xydef@\zeroDivideLimit@#1{\edef\zeroDivide@Limit{#1}%
\let\zeroDivide@=\zeroDivideLimit@@}
\xylet@\zeroDivideLimit=\zeroDivideLimit@
\xydef@\vfromslide@#1{\enter@\DirectionfromtheDirection@ \begingroup
\plainxy@\afterDIRECTIONorEMPTY\vfromslide@i\vfromslide@i#1@}
\xydef@\vfromslide@i#1@{\DN@{#1}%
\edef\next{\endgroup
\ifx\next@\empty \dimen@=.5pc \else \dimen@=#1\relax \fi
\X@c=\cosDirection\dimen@ \Y@c=\sinDirection\dimen@}\next
\leave@}
\xydef@\s@bot{-1}
\xydef@\s@top{-1}
\xydef@\cfroms@#1{\tests@{#1}\runs@\outofranges@}
\xydef@\tests@#1#2#3{\DN@{#3}%
\count@=\s@top \advance\count@-#1\relax
\ifnum\count@>\s@bot\relax \ifnum\count@>\s@top\else\DN@{#2}\fi\fi
\next@}
\xydef@\runs@{\csname S@\the\count@\endcsname}
\xydef@\outofranges@{\count@=\s@top \advance\count@-\s@bot
\xyerror@{stack index out of range (should be 0..\the\count@)}{}}
\xydef@\STACK@{%
\addPLUS@\ifx\next
\addPLUS@\DN@{\xy@{@+}{}\afterCOORD{\xy@@\spushc@ \xyFN@\POS@}}%
\else\addDASH@\ifx\next
\addDASH@\DN@{\xy@{@-}{}\afterCOORD{\xy@@\spop@ \xyFN@\POS@}}%
\else \ifx i\next \DN@ i{\xy@{@i}\sinit@ \xyFN@\POS@}%
\else \ifx (\next \DN@ ({\xy@{@(}\senter@ \xyFN@\POS@}%
\else \ifx )\next \DN@ ){\xy@{@)}\sleave@ \xyFN@\POS@}%
\else\addEQ@\ifx\next \addEQ@\DN@{\STACK@load}%
\else\addAT@\ifx\next \addAT@\DN@{\xy@{@@}{}\smap@}%
\else \DN@##1{\xyerror@{illegal stack command ##1}{}\afterCOORD{\xyFN@\POS@}}%
\fi\fi\fi\fi\fi\fi\fi \next@}
\xydef@\STACK@load{\xy@{@=}{%
\if\sempty@\else \xywarning@{loading on top of non-empty stack}\sinit@ \fi
\let\comma@@=\spushc@}%
\afterCOORD{\xy@@{\spushc@ \let\comma@@=\relax}\xyFN@\POS@}}
\xydef@\spushc@{%
\count@=\s@top \advance\count@\@ne \edef\s@top{\the\count@}%
\expandafter\edef\csname S@\s@top\endcsname{\cfromthec@}}
\xydef@\spushid@#1{\DNii@{#1}\edef\nextii@{\codeof\nextii@}%
\expandafter\let\expandafter\next@\csname Q@\nextii@\endcsname
\ifx\next@\relax \xyerror@{<pos> \string"\nextii@\string" not defined}{}%
\else
\count@=\s@top \advance\count@\@ne \edef\s@top{\the\count@}%
\DNii@##1{\expandafter\def\csname S@\s@top\endcsname{##1}}%
\expandafter\nextii@\expandafter{\next@}%
\fi}
\xydef@\idfroms@#1#2{%
\tests@{#2}{\DN@{\idfromxy@{#1}}%
\expandafter\expandafter\expandafter\next@
\expandafter\expandafter\expandafter{\csname S@\the\count@\endcsname}%
}\outofranges@}
\xydef@\spop@{\count@=\s@top
\ifnum\count@>\s@bot \advance\count@\m@ne \edef\s@top{\the\count@}%
\else \xyerror@{nothing to pop from stack}{}\fi}
\xydef@\sinit@{\edef\s@top{\s@bot}}
\xydef@\senter@{%
\count@=\s@top \advance\count@\@ne
\expandafter\edef\csname S@\the\count@\endcsname{\s@bot}%
\edef\s@bot{\the\count@}\edef\s@top{\the\count@}}
\xydef@\sleave@{%
\ifnum\s@bot=\s@top\else \xywarning@{leaving non-empty stack}\sinit@ \fi
\ifnum\s@bot>\m@ne \edef\s@bot{\csname S@\s@top\endcsname}%
\count@=\s@top \advance\count@\m@ne \edef\s@top{\the\count@}%
\edef\sbot{\the\count@}\fi}
\xydef@\sempty@{\ifnum\s@top=\s@bot TT\else TF\fi}
\xydef@\xytotoks@#1#2{\addtotoks@{#2}}
\xydef@\xytotoks@@toksix@#1{\addtotoks@{\toks9={#1}}}
\xydef@\smap@{%
\begingroup \toks@={}\let\xy@=\xytotoks@ \change@oxy@\xy@
\let\xy@@ix@=\xytotoks@@toksix@
\afterCOORD{\expandafter\endgroup
\expandafter\smapxy@@\expandafter{\the\toks@}\xyFN@\POS@}}
\xydef@\smapxy@@#1{\xy@@{\edef\smapp@@{\s@bot}\smapxy@i{#1}}}
\xylet@\smapp@@=\empty
\xydef@\smapxy@i#1{%
\ifnum\smapp@@<\s@top
\count@=\smapp@@ \advance\count@\@ne \edef\smapp@@{\the\count@}%
\DN@{\csname S@\smapp@@\endcsname #1\relax \smapxy@i{#1}}%
\else \let\next@=\relax
\fi \next@}
\xydef@\saveid@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\saveid@}%
\else \ifx "\next\DN@"##1"{\xy@{="##1"}{\idfromc@{##1}}\xyFN@\POS@}%
\else \ifx :\next\DN@:##1"##2"{\xy@{=:"##2"}{\idfrombase@{##2}}\xyFN@\POS@}%
\else\addAT@\ifx\next
\addAT@\DN@"##1"{\xy@{=@"##1"}{\idfromstack@{##1}}\xyFN@\POS@}%
\else \ifx s\next
\DN@ s##1"##2"{\xy@{=s##1"##2"}{\idfroms@{##2}{##1}}\xyFN@\POS@}%
\else\addEQ@\ifx\next \let\saveid@COORD@@=\saveid@COORDii
\addEQ@\DN@{\xyFN@\saveid@COORD}%
\else \let\saveid@COORD@@=\saveid@COORDi \let\next@=\saveid@COORD
\fi\fi\fi\fi\fi\fi \next@}
\xylet@\saveid@COORD@@=\relax
\xydef@\idfromc@#1{\DN@{#1}%
\expandafter\edef\csname Q@\codeof\next@\endcsname{\cfromthec@}}
\xydef@\idfrombase@#1{\DN@{#1}%
\expandafter\edef\csname Q@\codeof\next@\endcsname{\basefromthebase@}}
\xydef@\idfromstack@#1{%
\toks@={\if\sempty@\else
\xywarning@{loading on top of non-empty stack}\sinit@ \fi}%
\count@=\s@bot \advance\count@\@ne
\ifnum\count@>\s@top\else
\loop@
\expandafter\let\expandafter\next@\csname S@\the\count@\endcsname
\expandafter\addtotoks@\expandafter{\next@}%
\ifnum\count@<\s@top \advance\count@\@ne \addtotoks@{\spushc@}\repeat@
\fi
\DN@{#1}\edef\next@##1{%
\def\expandafter\noexpand\csname Q@\codeof\next@\endcsname{##1}}%
\expandafter\next@\expandafter{\the\toks@}}
\xydef@\saveid@COORD{%
\begingroup \toks@={}\let\xy@=\xytotoks@ \change@oxy@\xy@
\let\xy@@ix@=\xytotoks@@toksix@
\afterCOORD{\expandafter\saveid@COORDi\expandafter{\the\toks@}}}
\xydef@\saveid@COORDi#1#2"#3"{\endgroup \xy@@{\idfromxy@{#3}{#1}}\xyFN@\POS@}
\xydef@\saveid@COORDii#1#2"#3"{\endgroup \xy@@{\idfromcxy@{#3}{#1}}\xyFN@\POS@}
\xydef@\idfromxy@#1#2{\DN@{#1}%
\expandafter\def\csname Q@\codeof\next@\endcsname{#2}}
\xydef@\idfromcxy@#1#2{\DN@{#1}%
\expandafter\edef\csname Q@\codeof\next@\endcsname{\cfromthec@#2}}
\xydef@\cfromid@#1{\DNii@{#1}\edef\nextii@{\codeof\nextii@}%
\expandafter\let\expandafter\next@\csname Q@\nextii@\endcsname
\ifx\next@\relax \xyerror@{<pos> \string"\nextii@\string" not defined}{}%
\else \expandafter\next@\fi}
\message{objects,}
\xydef@\OBJECT@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\OBJECT@}%
\else\ifcat A\noexpand\next \let\next@=\OBJECT@letter
\else \let\next@=\OBJECT@other \fi\fi \next@}
\xydef@\OBJECT@letter{%
\ifx i\next \DN@ i{\addtotoks@\Invisible@true \xyFN@\OBJECT@}%
\else\ifx h\next\DN@ h{\addtotoks@\Hidden@true \xyFN@\OBJECT@}%
\else\ifx o\next\DN@ o{\xywarning@{Obsolete o modifier used}\OBJECT@shape{o}}%
\else\ifx x\next\DN@ x{\xywarning@{Obsolete x modifier used}\OBJECT@shape{}}%
\else\ifx @\next\DN@ @##1##{%
\xywarning@{Impossible @ (letter) should not be here!!}
\OBJECT@@{\dir##1}}%
\else \let\next@=\OBJECT@direction
\fi\fi\fi\fi\fi \next@}
\xydef@\OBJECT@other{%
\ifx !\next \DN@!{\OBJECT@shift}%
\else\addPLUS@\ifx \next \DN@{\OBJECT@change}%
\else\addDASH@\ifx \next \DN@{\OBJECT@change}%
\else\addEQ@\ifx \next \DN@{\OBJECT@set}%
\else\ifx [\next
\DN@[##1]{\xy@{[##1]}{\OBJECT@shape{##1}}}%
\else\ifx ^\next \let\next@=\OBJECT@direction
\else\ifx _\next \let\next@=\OBJECT@direction
\else\ifx :\next \let\next@=\OBJECT@direction
\else\ifx ?\next
\DN@ ?{\xywarning@{\string? modifier used}\xyFN@\OBJECT@direction}%
\else\ifx (\next
\let\next@=\OBJECT@direction
\else\addAT@\ifx\next \addAT@\DN@##1##{\OBJECT@@{\dir##1}}%
\else \DN@##1##{\OBJECT@@{##1}}%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
\xydef@\prevEdge@@{\zeroEdge}
\xydef@\OBJECT@@#1#2{%
\expandafter\def\expandafter\prevEdge@@\expandafter{\the\Edge@c}%
\expandafter\Edge@c\expandafter{\objectEdge}%
\Invisible@false\Hidden@false
\def\Leftness@{.5}\def\Upness@{.5}%
\gdef\preXY@style@{}\gdef\postXY@style@{}%
\def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\relax}%
\DN@{#1}\ifx\next@\empty \DNii@{#2}%
\ifx\nextii@\empty \DN@{\hbox\bgroup\no@}\else \let\next@=\objectbox \fi\fi
\setbox\z@=\next@{#2}\L@c=\Leftness@\wdz@ \R@c=\wdz@ \advance\R@c-\L@c
\D@c=\dp\z@ \advance\D@c\ht\z@ \U@c=\Upness@\D@c \advance\D@c-\U@c
\R@p=\z@ \L@p=\L@c \U@p=\U@c \advance\U@p-\ht\z@ \D@p=-\U@p
\the\toks@\toks@={}\setboxz@h{\kern\R@p \raise\U@p\boxz@}%
\checkZeroEdge@
\dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c \boxz@
\OBJECT@x}
\xydef@\adjustLR@{%
\ifdim\zz@\wdz@ \L@c=\z@ \R@c=\z@ \dimen@=\Leftness@\p@
\ifdim\dimen@<\z@ \L@c=\dimen@ \R@c=-\L@c
\else\ifdim\dimen@>\p@ \L@c=\dimen@ \advance\L@c-\p@ \R@c=-\L@c \fi\fi
\else \L@c=\Leftness@\wdz@ \R@c=\wdz@ \advance\R@c-\L@c \fi}
\xydef@\adjustUD@{\dimen@=\ht\z@ \advance\dimen@\dp\z@
\ifdim\zz@\dimen@ \U@c=\z@ \D@c=\z@ \dimen@=\Upness@\p@
\ifdim\dimen@<\z@ \U@c=\dimen@ \D@c=-\L@c
\else\ifdim\dimen@>\p@ \U@c=\dimen@ \advance\U@c-\p@ \D@c=-\L@c \fi\fi
\else \D@c=\dimen@ \U@c=\Upness@\dimen@ \advance\D@c-\U@c \fi}
\xydef@\checkZeroEdge@{%
\expandafter\DN@\expandafter{\expandafter\noexpand\the\Edge@c}%
\DNii@{\noexpand\zeroEdge}%
\ifx\next@\nextii@ \DN@{\expandafter\Edge@c\expandafter{\objectEdge}}%
\ifdim\zz@\L@c \ifdim\zz@\R@c \ifdim\zz@\U@c \ifdim\zz@\D@c
\DN@{}\fi\fi\fi\fi
\else
\ifdim\zz@\L@c \ifdim\zz@\R@c \ifdim\zz@\U@c \ifdim\zz@\D@c
\DN@{\Edge@c={\zeroEdge}}\fi\fi\fi\fi
\fi \next@}
\xydef@\OBJECT@x{\toks@={\egroup\def\Drop@@}%
\expandafter\addtotoks@\expandafter{\expandafter{\Drop@@}\def\Connect@@}%
\expandafter\addtotoks@\expandafter{\expandafter{\Connect@@}}%
\edef\tmp@{\D@c=\the\D@c \U@c=\the\U@c \L@c=\the\L@c \R@c=\the\R@c
\Edge@c={\expandafter\noexpand\the\Edge@c}%
\ifInvisible@\noexpand\Invisible@true\else\noexpand\Invisible@false\fi
\ifHidden@\noexpand\Hidden@true\else\noexpand\Hidden@false\fi
\def\noexpand\Leftness@{\Leftness@}\def\noexpand\Upness@{\Upness@}}%
\expandafter\addtotoks@\expandafter{\tmp@}\the\toks@}
\xynew@{if}\ifInvisible@
\xynew@{if}\ifHidden@
\xydef@\Leftness@{}
\xydef@\Upness@{}
\xydef@\Drop@@{\styledboxz@}
\xydef@\Connect@@{}
\xydef@\objectbox#1{\hbox{$\m@th\objectstyle{#1}$}}
\xylet@\objectstyle=\textstyle
\xydef@\object{\hbox\bgroup\resetStyle@\object@}
\xydef@\object@{%
\edef\next@{={\DirectionfromtheDirection@}}\expandafter\toks@\next@
\plainxy@ \xyFN@\OBJECT@}
\xydef@\composite#1#{\hbox\bgroup\composite@{#1}}
\xydef@\composite@#1#2{%
\DN@{#1}\ifx\next@\empty\else\xywarning@{no variants of
\string\composite\space allowed}\fi
\global\setbox9=\hbox\bgroup
\D@p=-\maxdimen \U@p=-\maxdimen \L@p=-\maxdimen \R@p=-\maxdimen
\xyFN@\composite@i#2@}
\xydef@\composite@i{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\composite@i}%
\else\ifx *\next \DN@ *{\xyFN@\composite@i}%
\else\ifx @\next \DN@ @{\composite@x}%
\xyerror@{<composite> object expected}{}\czeroEdge@
\else \DN@{\composite@ii}\fi\fi\fi \next@}
\xydef@\composite@ii#1#{\composite@iii{#1}}
\xydef@\composite@iii#1#2{%
\setbox\z@=\object#1{#2}%
\ifInvisible@ \setboxz@h{}\else
\setboxz@h{\kern-\L@c \boxz@}\ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ {\Drop@@}\fi
\ifHidden@\else
\ifdim\U@p<\U@c \U@p=\U@c \fi \ifdim\D@p<\D@c \D@p=\D@c \fi
\ifdim\R@p<\R@c \R@p=\R@c \fi \ifdim\L@p<\L@c \L@p=\L@c \fi
\fi
\xyFN@\composite@iv}
\xydef@\composite@iv{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\composite@iv}%
\else \ifx @\next \DN@ @{\composite@x}%
\else \let\next@=\composite@i \fi\fi \next@}
\xydef@\composite@x{%
\edef\tmp@{\egroup
\D@c=\the\D@p \U@c=\the\U@p \L@c=\the\L@p \R@c=\the\R@p}\tmp@
\setboxz@h{\kern\L@c\box9}\ht\z@=\U@c \dp\z@=\D@c
\dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@
\Edge@c={\rectangleEdge}\computeLeftUpness@ \boxz@
\OBJECT@x}
\xydef@\computeLeftUpness@{%
\dimen@=\L@c \advance\dimen@\R@c
\ifdim\zz@\dimen@ \def\Connect@@{\straight@{\dottedSpread@\jot}}%
\ifdim\zz@\L@c\else
\DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edge@c}%
\ifx\next@\nextii@\Edge@c={\rectangleEdge}\fi\fi
\else \quotient@\Leftness@\L@c\dimen@ \fi
\dimen@=\U@c \advance\dimen@\D@c
\ifdim\zz@\dimen@ \def\Connect@@{\straight@{\dottedSpread@\jot}}%
\ifdim\zz@\U@c\else
\DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edge@c}%
\ifx\next@\nextii@\Edge@c={\rectangleEdge}\fi\fi
\else \quotient@\Upness@\U@c\dimen@ \fi}
\xydef@\xybox#1{\xy#1\endxy \Edge@c={\rectangleEdge}\computeLeftUpness@}
\xydef@\OBJECT@shift{%
\let\xy@=\xytotoks@ \afterVECTORorEMPTY
{\OBJECT@shift@}%
{\addtotoks@{\X@c=-\L@c \advance\X@c\R@p \advance\X@c\L@p \Y@c=\U@p}%
\OBJECT@shift@}}
\xydef@\OBJECT@shift@{%
\addtotoks@{\advance\U@p-\Y@c
\advance\L@c\X@c \advance\R@c-\X@c \advance\D@c\Y@c \advance\U@c-\Y@c
\computeLeftUpness@}%
\let\xy@=\oxy@ \xyFN@\OBJECT@}
\xylet@\objectmargin@=\jot
\xylet@\objectwidth@=\z@
\xylet@\objectheight@=\z@
\xydef@\objectmargin{\afterADDOP{\Addop@@\objectmargin@}}
\xydef@\objectwidth{\afterADDOP{\Addop@@\objectwidth@}}
\xydef@\objectheight{\afterADDOP{\Addop@@\objectheight@}}
\xydef@\OBJECT@change{%
\afterADDOP{%
\addEQ@\ifx \next
\addtotoks@{\X@c=\D@c \advance\X@c\U@c \Y@c=\L@c \advance\Y@c\R@c}%
\else
\addtotoks@{\X@c=\objectmargin@ \advance\X@c\X@c \Y@c=\X@c}%
\fi
\let\xy@=\xytotoks@
\afterVECTORorEMPTY\OBJECT@change@\OBJECT@change@}}
\xydef@\OBJECT@set{%
\afterADDOP{%
\let\xy@=\xytotoks@ \afterVECTORorEMPTY\OBJECT@change@
{\addtotoks@{\X@c=\objectwidth@ \Y@c=\objectheight@}\OBJECT@change@}}}
\xydef@\OBJECT@change@{%
\addtotoks@{\advance\R@c\L@c \advance\R@p-\L@c \let\tmp@=\R@c}%
\expandafter\addtotoks@\expandafter{\Addop@@\tmp@\X@c\R@c=\tmp@
\L@c=\Leftness@\R@c \advance\R@p\L@c \advance\R@c-\L@c}%
\addtotoks@{\advance\D@c\U@c \let\tmp@=\D@c}%
\expandafter\addtotoks@\expandafter{\Addop@@\tmp@\Y@c\D@c=\tmp@
\U@c=\Upness@\D@c \advance\D@c-\U@c}%
\let\xy@=\oxy@ \xyFN@\OBJECT@}
\xydef@\afterADDOP#1{\def\afterADDOP@{#1}\xyFN@\ADDOP@}
\xylet@\afterADDOP@=\empty
\xydef@\ADDOP@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\ADDOP@}%
\else\addPLUS@\ifx \next \addPLUS@\DN@{\xyFN@\ADDOP@plus}%
\else\addDASH@\ifx \next \addDASH@\DN@{\xyFN@\ADDOP@minus}%
\else\addEQ@\ifx \next
\addEQ@\DN@{\def\Addop@@{\Addop@0+=}\afterADDOP@}%
\else
\DN@{\def\Addop@@{\Addop@0+=}\afterADDOP@}%
\fi\fi\fi\fi \next@}
\xydef@\ADDOP@plus{%
\addEQ@\ifx \next
\addEQ@\DN@{\def\Addop@@{\Addop@0+<}\afterADDOP@}%
\else
\DN@{\def\Addop@@{\Addop@1+=}\afterADDOP@}%
\fi \next@}
\xydef@\ADDOP@minus{%
\addEQ@\ifx \next
\addEQ@\DN@{\def\Addop@@{\Addop@0+>}\afterADDOP@}%
\else
\DN@{\def\Addop@@{\Addop@1-=}\afterADDOP@}%
\fi \next@}
\xydef@\Addop@#1#2#3#4#5{%
\dimen@=#4\relax \edef#4{\the\dimen@}%
\dimen@=#1\dimen@ \advance\dimen@#2#5\relax \advance\dimen@ 1sp
\ifdim\dimen@#3#4\else \edef#4{\the\dimen@}\fi
\ifx\xy@\xyinitial@\else \DN@##1{\xy@@{\edef#4{##1}\checkZeroEdge@}}%
\expandafter\next@\expandafter{#4}\fi}
\xydef@\objectEdge{\rectangleEdge}
\xydefcsname@{shape [r]}{\advance\U@p\D@c \centerobject@
\ifdim\L@c>\D@c
\advance\R@c\L@c \L@c=.5\U@c \advance\[email protected]\D@c \advance\R@c-\L@c \fi
\advance\U@p-\D@c}
\xydefcsname@{shape [l]}{\advance\U@p\D@c \centerobject@
\ifdim\L@c>\D@c
\advance\L@c\R@c \R@c=.5\U@c \advance\[email protected]\D@c \advance\L@c-\R@c \fi
\advance\U@p-\D@c}
\xydefcsname@{shape [u]}{\advance\U@p\D@c \centerobject@
\ifdim\D@c>\L@c
\advance\U@c\D@c \D@c=.5\L@c \advance\[email protected]\R@c \advance\U@c-\D@c \fi
\advance\U@p-\D@c}
\xydefcsname@{shape [d]}{\advance\U@p\D@c \centerobject@
\ifdim\D@c>\L@c
\advance\D@c\U@c \U@c=.5\L@c \advance\[email protected]\R@c \advance\D@c-\U@c \fi
\advance\U@p-\D@c}
\xydefcsname@{shape [c]}{\advance\U@p\D@c \centerobject@ \advance\U@p-\D@c}
\xydef@\centerobject@{%
\advance\D@c\U@c \D@c=.5\D@c \U@c=\D@c \advance\L@c\R@c \L@c=.5\L@c \R@c=\L@c}
\xydef@\OBJECT@shape#1{\DN@{shape [#1]}%
\expandafter\let\expandafter\nextii@\csname\codeof\next@\endcsname
\ifx\nextii@\relax\DN@{style [#1]}%
\expandafter\let\expandafter\nextii@\csname\codeof\next@\endcsname
\ifx\nextii@\relax \DN@{\OBJECT@shapei[#1]}%
\else\DN@{\nextii@\xyFN@\OBJECT@}\fi
\else \expandafter\addtotoks@\expandafter{\nextii@}%
\DN@{\xyFN@\OBJECT@}%
\fi \next@}
\xydefcsname@{shape []}{\the\Edge@c5\relax}%
\xydefcsname@{shape [Outer]}{\the\Edge@c5\relax}%
\xydefcsname@{shape [Inner]}{\the\Edge@c4\relax}%
\xydefcsname@{shape [o]}{\Edge@c={\circleEdge}\the\Edge@c5\relax
\Edge@c={\circleEdge}\def\prevEdge@@{\circleEdge}}
\xydefcsname@{shape [.]}{\czeroEdge@}
\xydef@\OBJECT@shapei[#1#2]{\DN@{shape [#1...]}%
\expandafter\let\expandafter\next\csname\codeof\next@\endcsname
\ifx\next\relax\DN@{*stylechar@#1@}%
\expandafter\let\expandafter\next\csname\codeof\next@\endcsname
\ifx\next\relax\DNii@{shape [#1#2]}%
\xywarning@{illegal [<shape>] ignored: \codeof\nextii@\space not defined}%
\DN@{\xyFN@\OBJECT@}%
\else \expandafter\addtotoks@\expandafter{\next{#2}}%
\DN@{\next{#2}\xyFN@\OBJECT@}%
\fi
\else
\expandafter\addtotoks@\expandafter{\next{#2}}\DN@{\next{#2}\xyFN@\OBJECT@}%
\fi \next@}
\xydef@\preXY@style@{}
\xydef@\postXY@style@{}
\xydef@\resetStyle@{\gdef\preXY@style@{}\gdef\postXY@style@{}}
\xynew@{toks}{\styletoks@}
\xydef@\addtostyletoks@#1{%
\expandafter\styletoks@\expandafter{\the\styletoks@#1}}
\xydef@\styledboxz@{\xypre@Style@@\boxz@\xypost@Style@@}
\xydef@\xypre@Style@{\styletoks@={}\saveXyStyle@\preXY@style@
\expandafter\DN@\expandafter{\the\styletoks@}%
\ifx\next@\empty \DN@{\let\xypre@Style@@=\relax
\let\xypost@Style@@=\relax \xypre@skipStyle@}%
\else
\let\xypre@Style@@=\relax \let\xypost@Style@@=\xypost@Style@
\DN@{\expandafter\xydoprestyles@\expandafter{\the\styletoks@}}%
\fi \next@ }
\xydef@\xypost@Style@{\styletoks@={}\postXY@style@
\expandafter\xydopoststyles@\expandafter{\the\styletoks@}%
\let\xypost@Style@@=\relax \let\xypre@Style@@=\xypre@Style@ }
\xydef@\xypre@skipStyle@#1\xypost@Style@@{#1\relax
\let\xypre@Style@@=\xypre@Style@ }
\xydef@\xydoprestyles@@{\literal@}
\xydef@\xydopoststyles@@{\literal@}
\xylet@\xydoprestyles@=\xydoprestyles@@
\xylet@\xydopoststyles@=\xydopoststyles@@
\xydef@\modXYstyle@{%
\ifx\xy@style@\empty\resetStyle@\fi \checkXyStyle@
\expandafter\expandafter\expandafter\DN@
\expandafter\expandafter\expandafter{\preXYstyle@@}%
\ifx\next@\empty\else\DN@{\modXYstyle@@}\fi \next@ }
\xydef@\modXYstyle@@{%
\DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
\expandafter\next@\expandafter{\preStyle@@}%
\DN@##1{\expandafter\gdef\expandafter\preXY@style@\expandafter{%
\preXY@style@ ##1}}\expandafter\next@\expandafter{\tmp@}%
\DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
\expandafter\next@\expandafter{\postStyle@@}%
\DN@##1{\expandafter\gdef\expandafter\postXY@style@\expandafter{%
\tmp@ ##1}}\expandafter\next@\expandafter{\postXY@style@}}
\xydef@\xy@style@{}
\xydef@\checkXyStyle@{\ifx\xy@style@\empty\resetStyle@\fi
\let\xy@style@=\relax}
\xydef@\preStyle@@{}
\xydef@\postStyle@@{}
\xydef@\preXYstyle@@{\relax}
\xydef@\loadxystyle@{%
\let\xypre@Style@@=\xypre@Style@ \def\preXYstyle@@{\preStyle@@}}
\loadxystyle@
\xydef@\Unloadstyle@{%
\let\xypre@Style@@=\relax \let\xypost@Style@@=\relax
\def\preXYstyle@@{\relax}}
\xydefcsname@{shape [=...]}#1{\checkXyStyle@ \addtotoks@{\xynamestyle@{#1}}}
\xydef@\xynamestyle@#1{\checkXyStyle@
\expandafter\DNii@\expandafter{\csname shape [#1]\endcsname}%
\expandafter\ifx\nextii@\relax
\else\xywarning@{Redefining style [#1]}\fi
\expandafter\xynamestyle@@\csname shape [#1]\endcsname }
\xydef@\xynamestyle@@#1{%
\expandafter\def\expandafter\tmp@\expandafter{\preXY@style@}%
\DN@##1{\def\tmp@{\checkXyStyle@\gdef\preXY@style@{##1}}}%
\expandafter\next@\expandafter{\preXY@style@}%
\DN@##1{\expandafter\gdef\expandafter#1\expandafter{\tmp@
\gdef\postXY@style@{##1}}}%
\expandafter\next@\expandafter{\postXY@style@}\DN@{}}
\xydef@\prevXypreStyle@@{}
\xydef@\prevXypostStyle@@{}
\xydef@\saveXyStyle@{\expandafter
\def\expandafter\prevXypreStyle@@\expandafter{\preXY@style@}%
\expandafter\def\expandafter\prevXypostStyle@@\expandafter{%
\postXY@style@}}
\xydef@\recoverXyStyle@{\expandafter
\gdef\expandafter\preXY@style@\expandafter{\prevXypreStyle@@}%
\expandafter\gdef\expandafter\postXY@style@\expandafter{%
\prevXypostStyle@@}}
\xydef@\newxystyle#1#2#3{%
\DN@{#3}\ifx\next@\empty
\xydefcsname@{shape [#1]}{\csname xyshape@#1@\endcsname}%
\else \expandafter\def\csname shape [#1]\endcsname{%
\csname xyshape@#1@\endcsname}\fi
\DN@{#2}\ifx\next@\empty
\expandafter\def\csname xyshape@#1@\endcsname{%
\xyundefinedStyle@{#1}{}@@}%
\else \expandafter\def\csname xyshape@#1@\endcsname{#2}\fi}
\xydef@\xyundefinedStyle@#1#2@@{%
\xywarning@{style #1 not defined, nothing to apply}}
\xydef@\applyFIFOstyle@#1#2#3#4{\bgroup
\styletoks@={\egroup\gdef\preXY@style@}%
\expandafter\toks@\expandafter{\preXY@style@}%
\expandafter\addtotoks@\expandafter{\expandafter#1\expandafter{#2}}%
\expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}%
\gdef\postXY@style@}%
\expandafter\toks@\expandafter{\expandafter#3\expandafter{#4}}%
\expandafter\addtotoks@\expandafter{\postXY@style@}%
\expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}}%
\the\styletoks@ }
\xydef@\applyLIFOstyle@#1#2#3#4{\bgroup
\styletoks@={\egroup\gdef\preXY@style@}%
\expandafter\toks@\expandafter{\expandafter#1\expandafter{#2}}%
\expandafter\addtotoks@\expandafter{\preXY@style@}%
\expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}%
\gdef\postXY@style@}%
\expandafter\toks@\expandafter{\postXY@style@}%
\expandafter\addtotoks@\expandafter{\expandafter#3\expandafter{#4}}%
\expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}}%
\the\styletoks@ }
\xydef@\OBJECT@direction{\afterDIRECTIONorEMPTY{%
\edef\next@{{\DirectionfromtheDirection@}}\expandafter\addtotoks@\next@
\xyFN@\OBJECT@}%
{\xyFN@\OBJECT@}}
\xydef@\afterDIRECTIONorEMPTY#1#2{%
\DN@##1{\def\afterDIRECTION@{\def\afterDIRECTION@{##1}%
\ifDIRECTIONempty@\DN@{#2}\else\DN@{#1}\fi \next@}}%
\expandafter\next@\expandafter{\afterDIRECTION@}%
\xyFN@\DIRECTION@}
\xylet@\afterDIRECTION@=\empty
\xynew@{if}\ifDIRECTIONempty@
\xydef@\DIRECTION@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\DIRECTION@}%
\else\ifx v\next \DN@ v{\DIRECTION@v}%
\else\ifx \bgroup\next \let\next@=\DIRECTION@group
\else\ifx (\next \DN@({\xyFN@\DIRECTION@open}%
\else
\DN@{\count@=8
\afterDIAG{\ifnum\count@=8 \DN@{\DIRECTIONempty@true \xyFN@\DIRECTION@i}%
\else \DN@{\xy@@{\dimen@=\xydashl@}\Directionfromdiag@}\fi \next@}}%
\fi\fi\fi\fi \next@}
\xydef@\DIRECTION@open{%
\ifx *\next \DN@*##1*){\DIRECTION@group{##1}}%
\else \DN@{\xyerror@{(* <pos> *) expected}{} \xyFN@\DIRECTION@i}%
\fi \next@}
\def\afterDIAG#1{\def\afterDIAG@{#1}\xyFN@\DIAG@}
\xydef@\DIAG@{%
\ifx d\next \DN@ d{\count@=1 \xyFN@\DIAG@@}%
\else\ifx r\next \DN@ r{\count@=3 \xyFN@\DIAG@@}%
\else\ifx u\next \DN@ u{\count@=5 \xyFN@\DIAG@@}%
\else\ifx l\next \DN@ l{\count@=7 \xyFN@\DIAG@@}%
\else \let\next@=\afterDIAG@
\fi\fi\fi\fi \next@}
\xydef@\DIAG@@{\ifcase\count@ \or
\DIAG@@@ l0r2\or\or \DIAG@@@ d2u4\or\or \DIAG@@@ r4l6\or\or \DIAG@@@ u6d0%
\else\xybug@{impossible <diag> number}\fi
\next@}
\xydef@\DIAG@@@#1#2#3#4{%
\ifx #1\next \count@=#2\DN@#1{\afterDIAG@}%
\else \ifx #3\next \count@=#4\DN@#3{\afterDIAG@}%
\else \let\next@=\afterDIAG@ \fi\fi}
\xydef@\Directionfromdiag@{\ifcase\count@
\xy@@{\dlDirection@\dimen@}%
\or \xy@@{\dDirection@\dimen@}%
\or \xy@@{\drDirection@\dimen@}%
\or \xy@@{\rDirection@\dimen@}%
\or \xy@@{\urDirection@\dimen@}%
\or \xy@@{\uDirection@\dimen@}%
\or \xy@@{\ulDirection@\dimen@}%
\or \xy@@{\lDirection@\dimen@}%
\or
\else\xybug@{impossible <diag>}\fi
\DIRECTIONempty@false \xyFN@\DIRECTION@i}
\xydef@\DIRECTION@v{%
\xy@{v}{\enter@{\cfromthec@ \X@origin=\the\X@origin \Y@origin=\the\Y@origin
\X@p=\the\X@p \Y@p=\the\Y@p}%
\X@origin=\z@ \Y@origin=\z@}%
\afterVECTORorEMPTY
{\xy@@{\X@p=\z@ \Y@p=\z@ \setupDirection@ \leave@}%
\DIRECTIONempty@false \xyFN@\DIRECTION@i}%
{\xy@@\leave@ \xyerror@{<vector> expected after v}{}%
\DIRECTIONempty@false \xyFN@\DIRECTION@i}}
\xydef@\DIRECTION@group#1{%
\xy@@{\begingroup}\xy@@ix@{#1}\xy@@{\plainxy@\expandafter\POS\the\toks9\relax
\setupDirection@\edef\next@{\endgroup \DirectionfromtheDirection@}\next@}%
\DIRECTIONempty@false \xyFN@\DIRECTION@i}
\xydef@\DIRECTION@i{%
\ifx ^\next \DN@ ^{\xy@^{\aboveDirection@\xydashl@}%
\DIRECTIONempty@false \xyFN@\DIRECTION@i}%
\else\ifx _\next \DN@ _{\xy@_{\belowDirection@\xydashl@}%
\DIRECTIONempty@false \xyFN@\DIRECTION@i}%
\else\ifx :\next \DN@ :{%
\xy@{:}{\enter@{\cfromthec@ \basefromthebase@ \X@p=\the\X@p \Y@p=\the\Y@p}%
\X@origin=\z@ \Y@origin=\z@
\X@xbase=\cosDirection\xydashl@ \Y@xbase=\sinDirection\xydashl@
\X@ybase=-\Y@xbase \Y@ybase=\X@xbase}%
\afterVECTORorEMPTY
{\xy@@{\X@p=\z@ \Y@p=\z@ \setupDirection@ \leave@}%
\DIRECTIONempty@false \xyFN@\DIRECTION@i}%
{\xy@@\leave@ \xyerror@{<vector> expected after :}{}%
\DIRECTIONempty@false \xyFN@\DIRECTION@i}}%
\else
\let\next@=\afterDIRECTION@
\fi\fi\fi \next@}
\message{decorations;}
\xydef@\drop#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
\xy@{\drop#1{##1}}{\expandafter\drop@\the\toks9}\ignorespaces}\next@}
\xydef@\connect#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
\xy@{\connect#1{##1}}{\expandafter\connect@\the\toks9}\ignorespaces}\next@}
\xydef@\preconnect#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
\xy@{\connect#1{##1}}{\expandafter\preconnect@\the\toks9}\ignorespaces}\next@}
\xydef@\save{\relax\saveC}
\xydef@\saveC{\xy@\save\save@ \POS}
\xydef@\save@{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}}
\xydef@\restore{\xy@\restore\leave@ \ignorespaces}
\xydef@\xyecho{%
\xy@\xyecho{\let\xy@=\xyecho@ \message{\string\xyecho}}\POS}
\xydef@\xyecho@#1#2{{\def\1{#1}\ifx\1\empty\else\message{\codeof\1}\fi}%
\oxy@{#1}{#2}}
\xydef@\xyverbose{%
\xy@\xyverbose{\let\xy@=\xyverbose@
\W@{Xy: \string\xyverbose\xytracelineno@}}\POS}
\xydef@\xyverbose@#1#2{%
{\def\1{#1}\ifx\1\empty\else\W@{Xy: \codeof\1\xytracelineno@}\fi}%
\oxy@{#1}{#2}}
\xydef@\xytracing{%
\xy@\xytracing{\let\xy@=\xytracing@
\W@{Xy TRACE: \string\xytracing\xytracelineno@}\xystatus@:}\POS}
\xydef@\xytracing@#1#2{{\def\1{#1}\def\2{#2}%
\W@{Xy TRACE: \codeof\1 {\codeof\2}\xytracelineno@}}\oxy@{#1}{#2}\xystatus@:}
\xydef@\xystatus@c#1{%
\W@{#1<\the\X@c,\the\Y@c> \expandafter\string\the\Edge@c
\string[\the\L@c+\the\R@c,\the\D@c+\the\U@c\string]}}
\xydef@\xystatus@#1{%
\W@{#1 c=<\the\X@c,\the\Y@c> \expandafter\string\the\Edge@c
\string[\the\L@c+\the\R@c,\the\D@c+\the\U@c\string]}%
\W@{#1 p=<\the\X@p,\the\Y@p> \expandafter\string\the\Edge@p
\string[\the\L@p+\the\R@p,\the\D@p+\the\U@p\string]}%
\W@{#1 [d=<\the\d@X,\the\d@Y>
Direction=\the\Direction=\string(\cosDirection,\sinDirection\string)]
S=\the\csp@}%
\W@{#1 base = <\the\X@origin,\the\Y@origin> +
x\string*<\the\X@xbase,\the\Y@xbase> +
y\string*<\the\X@ybase,\the\Y@ybase>}%
\W@{#1 min/max = <\the\X@min,\the\Y@min> / <\the\X@max,\the\Y@max>,
IH=\ifInvisible@ T\else F\fi\ifHidden@ T\else F\fi.}}
\xydef@\xyquiet{\xy@\xyquiet{\let\xy@=\oxy@}}
\xydef@\xyignore#1{\xy@\xyignore{\xyignore@{#1}}\ignorespaces}
\xydef@\xyignore@#1{{\let\xy@=\xyeat@ \change@oxy@\xy@ \POS#1\relax}}
\xydef@\xyeat@#1#2{}
\xydef@\xycompile@@{\jobname-}
\xydef@\xycompileno@@{0}
\xydef@\CompilePrefix#1{%
\def\xycompile@@{#1}\xdef\xycompile@@{\codeof\xycompile@@}%
\xdef\xycompileno@@{0}}
\xydef@\xycompile{%
\count@=\xycompileno@@ \advance\count@\@ne
\xdef\xycompileno@@{\ifnum10>\count@ 0\fi \the\count@}%
\edef\next{\noexpand\xycompileto{\xycompile@@\xycompileno@@}}\next}
\xylet@\compilename@@=\empty
\xylet@\xyrecompile@@=\relax
\xydef@\xycompileto#1#2{%
\if\inxy@ \DN@{\xy@@{\nter@{}}}%
\else \DN@{\xy \xy@@{\nter@{\endxy}}}\fi \next@
\ifxysaving@ \xyerror@{Compilations can not be nested}{}\fi
\DN@{#1}\edef\compilename@@{\codeof\next@}\DNii@{#2}%
\def\xyrecompile@@{recompiling TRUNCATED}%
\expandafter\xyinputorelse@@\expandafter{\compilename@@.xyc}%
{\def\xyrecompile@@{compiling to}}%
\ifx\xyrecompile@@\relax \else \expandafter\xyrecompile@ \fi
\xy@@\leave@ \ignorespaces}
\xydef@\xyrecompile@{%
\message{(\xyrecompile@@\space\string`\compilename@@.xyc\string'}%
\DN@{\immediate\openout\xywrite@=}\expandafter\next@\compilename@@.xyc
\immediate\write\xywrite@{%
\string\xycompiled{\compilename@@}%
{\the\year/\the\month/\the\day\string:\the\time\xytracelineno@}%
{Xy-pic \xyversion}\xycomment@}%
\immediate\write\xywrite@{{\codeof\nextii@}\relax}%
{\xysaving@ \expandafter\POS\nextii@ \relax}%
\immediate\write\xywrite@{\string\xyendcompiled}%
\immediate\closeout\xywrite@ \message{done)}%
\expandafter\input\compilename@@.xyc
\outlines@@\writeoutline@\writeoutline@}
\xydef@\xysaving@{\let\xy@=\xysave@ \change@oxy@\xy@
\let\xy@@ix@=\xysave@@toksix@ \xysaving@true}
\xynew@{if}\ifxysaving@ \xysaving@false
\xydef@\xysave@#1#2{{\DN@{{#1}{#2}}%
\immediate\write\xywrite@{\string\xy@\codeof\next@\xycomment@}}}
\xydef@\xysave@@toksix@#1{{\DN@{{#1}}%
\immediate\write\xywrite@{\string\xy@@ix@\codeof\next@\relax}}}
\xywarnifdefined\xycomment@
{\catcode`\%=12 \catcode`\(=1 \catcode`\)=2 \gdef\xycomment@(%)}
\xydef@\xycompiled#1#2#3#4{\DN@{#1}\edef\next@{\codeof\next@}%
\ifx\next@\compilename@@\else
\xywarning@{This file does not contain the result of
\string\xycompileto{\compilename@@}{...}^^J%
but of \string\xycompileto{\next@}}\fi
\edef\next{Xy-pic \xyversion}\DN@{#3}\ifx\next\next@
\DN@{#4}\ifx\next@\nextii@ \xycatcodes \outlines@@\relax\readoutline@
\else \def\xyrecompile@@{recompiling to}\endinput \fi
\else \def\xyrecompile@@{Xy-pic version change - recompiling}\endinput \fi}
\xydef@\xyendcompiled{\let\xyrecompile@@=\relax \xyuncatcodes\endinput}
\xydef@\CompileFixPoint#1{%
\expandafter\ifx\csname#1FIX@@\endcsname\relax
\expandafter\xdef\csname#1FIX@@\endcsname{\xycompileno@@}%
\else
\xdef\xycompileno@@{\csname#1FIX@@\endcsname}\fi}
\xydef@\outlines@no#1#2{}
\xydef@\outlines@make#1#2{#1}
\xydef@\outlines@only#1#2{#2}
\xylet@\outlines@@=\outlines@no
\xylet@\writeoutline@@=\relax
\xylet@\readoutline@@=\relax
\xydef@\MakeOutlines{\let\outlines@@=\outlines@make}
\xydef@\OnlyOutlines{\xywarning@{Compiled pictures only shown as outlines}%
\let\outlines@@=\outlines@only}
\xydef@\ShowOutlines{\let\readoutline@@=\typesetoutline@}
\xydef@\NoOutlines{\let\outlines@@=\outlines@no}
\xydef@\writeoutline@{%
\DN@{\immediate\openout\xywrite@=}\expandafter\next@\compilename@@.xyd
\immediate\write\xywrite@{\xycomment@\space\compilename@@.xyd}
\immediate\write\xywrite@{%
\string\X@min=\the\X@min \string\X@max=\the\X@max
\string\Y@min=\the\Y@min \string\Y@max=\the\Y@max \string\relax}%
\writeoutline@@
\immediate\closeout\xywrite@}
\xynew@{if}\ifoutlineread@
\xydef@\readoutline@{\outlineread@true
\expandafter\xyinputorelse@@\expandafter{\compilename@@.xyd}%
{\def\xyrecompile@@{outline missing - recompiling to}\outlineread@false}%
\ifoutlineread@ \readoutline@@
\writeoutline@\expandafter\xyendcompiled\fi}
\xydef@\typesetoutline@{%
\xy@@{\czeroEdge@ \U@p=\z@ \D@p=\z@ \L@p=\z@ \R@p=\z@ \Edge@p={\zeroEdge}%
\X@p=\X@min \Y@p=\Y@min \X@c=\X@min \Y@c=\Y@max \connect@\dir{.}%
\X@p=\X@c \Y@p=\Y@c \X@c=\X@max \Y@c=\Y@max \connect@\dir{.}%
\X@p=\X@c \Y@p=\Y@c \X@c=\X@max \Y@c=\Y@min \connect@\dir{.}%
\X@p=\X@c \Y@p=\Y@c \X@c=\X@min \Y@c=\Y@min \connect@\dir{.}}}
\message{kernel objects:}
\message{directionals,}
\xydef@\dir{\hbox\bgroup\xyFN@\dir@i}
\xydef@\dir@i{\ifx *\next \DN@*{\resetStyle@\object@}%
\else \let\next@=\dir@ii \fi \next@}
\xydef@\dir@ii#1#{\dir@{#1}}
\xydef@\dir@#1#2{\DN@{dir#1{#2}}%
\expandafter\let\expandafter\next\csname\codeof\next@\endcsname
\ifx\next\relax \DN@{dir{#2}}%
\expandafter\let\expandafter\next\csname\codeof\next@\endcsname
\ifx\next\relax \DN@{\dir#1{#2}}%
\xyerror@{illegal <dir>: \codeof\next@\space not defined}{}%
\let\next=\no@ \fi\fi \next}
\xydefcsname@{dir{}}{\no@}
\xyletcsnamecsname@{dir0{}}{dir{}}
\xyletcsnamecsname@{dir1{}}{dir{}}
\xyletcsnamecsname@{dir^{}}{dir{}}
\xyletcsnamecsname@{dir_{}}{dir{}}
\xyletcsnamecsname@{dir2{}}{dir{}}
\xyletcsnamecsname@{dir3{}}{dir{}}
\xyletcsnamecsname@{dir{ }}{dir{}}
\xydef@\no@{\egroup \czeroEdge@
\def\Leftness@{.5}\def\Upness@{.5}%
\def\Drop@@{\setbox\z@=\copy\voidb@x}\def\Connect@@{\no@@}}
\xydefcsname@{dir1{-}}{\line@}
\xydefcsname@{dir2{-}}{\line@ \double@\xydashh@}
\xydefcsname@{dir3{-}}{\line@ \triple@\xydashh@}
\xyletcsnamecsname@{dir0{-}}{dir{}}
\xyletcsnamecsname@{dir{-}}{dir1{-}}
\xyletcsnamecsname@{dir{=}}{dir2{-}}
\xydef@\line@{\dimen@=\sd@Y\sinDirection\xydashl@
\ifnum\SemiDirectionChar<31 \D@c=\z@ \U@c=\dimen@ \DN@{\d@Y<\z@}%
\else\ifnum\SemiDirectionChar<64 \D@c=\dimen@ \U@c=\z@ \DN@{\z@<\d@Y}%
\else\ifnum\SemiDirectionChar<96 \D@c=\dimen@ \U@c=\z@ \DN@{\d@X<\z@}%
\else \D@c=\z@ \U@c=\dimen@ \DN@{\d@X<\z@}\fi\fi\fi
\setboxz@h{\line@@}\ht\z@=\U@c \dp\z@=\D@c
\L@c=\z@ \R@c=\wdz@
\ifdim\next@ \dimen@=\R@c \R@c=\L@c \L@c=\dimen@
\dimen@=\U@c \U@c=\D@c \D@c=\dimen@ \advance\dimen@-\U@c
\lower\dimen@\boxz@
\else \boxz@ \fi
\edef\tmp@{\egroup \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c}%
\tmp@
\Edge@c={\rectangleEdge}%
\ifdim\z@<\U@c \def\Upness@{1}\else \def\Upness@{0}\fi
\ifdim\z@<\L@c \def\Leftness@{1}\else \def\Leftness@{0}\fi
\def\Drop@@{\styledboxz@}\def\Connect@@{\solid@}}
\xydef@\line@@{{\xydashfont\SemiDirectionChar\/}}
\xydef@\solid@{%
\let\solidhrule@@=\solidhrule@
\let\solidvrule@@=\solidvrule@
\DN@{}\checkXy@rules@\next@
\straight@\solidSpread@}
\xydef@\checkXy@rules@{%
\dimen@=\Y@c \advance\dimen@-\Y@p
\[email protected]>\ifdim\dimen@<\z@-\fi\dimen@
\DN@{\solidhrule@@}%
\else \dimen@=\X@c \advance\dimen@-\X@p
\[email protected]>\ifdim\dimen@<\z@-\fi\dimen@
\DN@{\solidvrule@@}%
\fi\fi }
\xydef@\solidSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi}
\xylet@\ifjusthvtest@=\ifdim
\xydef@\NoRules{\let\ifjusthvtest@=\iffalse}
\xydef@\UseRules{\let\ifjusthvtest@=\ifdim}
\xydef@\solidvrule@{\no@@ \solidvrule@typeset \ifHidden@\else\noinsert@\fi
\solidvrule@i}
\xydef@\solidvrule@i{%
\def\Cbreak@@{\connectRestore@ \swap@\lastbreak@@\swap@
\solidvrule@typeset \edef\lastbreak@@{\cfromthec@}\Creset@@}%
\def\Clast@@{\connectRestore@ \Creset@@\swap@\lastbreak@@\swap@
\solidvrule@typeset \Creset@@ \edef\lastbreak@@{\cfromthep@}}%
}
\xydef@\solidvrule@typeset{%
\ifInvisible@ \let\next@=\relax \else \let\next@=\solidvrule@typeset@ \fi
\checkoverlap@@ \next@}
\xydef@\solidvrule@typeset@{{%
\ifdim\Y@c<\Y@p
\dimen@=\Y@c \Y@c=\Y@p \Y@p=\dimen@ \advance\Y@c-\D@p \advance\Y@p\U@c
\else \advance\Y@c-\D@c \advance\Y@p\U@p
\fi
\advance\[email protected]\xydashw@
\setboxz@h{\kern\X@c \vrule width\xydashw@ height\Y@c depth-\Y@p}%
\ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}%
}}
\xydef@\solidhrule@{\no@@ \solidhrule@typeset \ifHidden@\else\noinsert@\fi
\solidhrule@i}
\xydef@\solidhrule@i{%
\def\Cbreak@@{\connectRestore@ \swap@\lastbreak@@\swap@
\solidhrule@typeset \edef\lastbreak@@{\cfromthec@}\Creset@@}%
\def\Clast@@{\connectRestore@ \Creset@@\swap@\lastbreak@@\swap@
\solidhrule@typeset \Creset@@ \edef\lastbreak@@{\cfromthep@}}%
}
\xydef@\solidhrule@typeset{%
\ifInvisible@ \let\next@=\relax \else \let\next@=\solidhrule@typeset@ \fi
\checkoverlap@@ \next@}
\xydef@\solidhrule@typeset@{{%
\ifdim\X@c<\X@p \advance\X@c\R@c \advance\X@p-\L@p
\else \dimen@=\X@c \X@c=\X@p \X@p=\dimen@ \advance\X@c\R@p \advance\X@p-\L@c
\fi
\advance\X@p-\X@c \advance\[email protected]\xydashw@ \advance\[email protected]\xydashw@
\setboxz@h{\kern\X@c \vrule width\X@p height\Y@c depth-\Y@p}%
\ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}%
}}
\xydef@\zerodot{\copy\zerodotbox@}
\xydefcsname@{dir1{.}}{\point@}
\xydefcsname@{dir2{.}}{\point@ \double@\xydashh@}
\xydefcsname@{dir3{.}}{\point@ \triple@\xydashh@}
\xyletcsnamecsname@{dir0{.}}{dir{}}
\xyletcsnamecsname@{dir{.}}{dir1{.}}
\xyletcsnamecsname@{dir{:}}{dir2{.}}
\xydef@\point@{\pointlike@\zerodot\p@}
\xydef@\pointlike@#1#2{%
\setboxz@h{#1}\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@\egroup
\def\Leftness@{.5}\def\Upness@{.5}\ctipEdge@
\def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@{#2}}}}
\xydef@\dottedSpread@#1{%
\dimen@=#1\relax \DN@{\A@=2\A@ \B@=2\B@ \dottedSpread@i}%
\A@=\sd@X\cosDirection\dimen@ \B@=\sd@Y\sinDirection\dimen@
\dimen@=\A@ \advance\dimen@\B@
\dimen@ii=\sd@X\d@X \advance\dimen@ii\sd@Y\d@Y
\ifdim\dimen@>\dimen@ii \DN@{\count@@=\z@}\fi
\next@}
\xydef@\dottedSpread@i{%
\global\setbox8=\hbox to\A@{\hss
\kern.5\A@\box\lastobjectbox@\kern.5\A@\hss}\dp8=.5\B@ \ht8=.5\B@
\advance\d@X\sd@X\A@ \advance\d@Y\sd@Y\B@
\advance\X@c\[email protected]\A@ \advance\Y@c\[email protected]\B@
\ifdim\sd@Y\d@Y<\sd@X\d@X \dimen@=\sd@X\d@X
\ifdim\zz@\A@\else \divide\dimen@\A@ \fi \count@@=\dimen@
\else \dimen@=\sd@Y\d@Y
\ifdim\zz@\B@\else \divide\dimen@\B@ \fi \count@@=\dimen@
\fi \advance\count@@\@ne}
\xydefcsname@{dir1{~}}{\squiggle@}
\xydefcsname@{dir2{~}}{\squiggle@ \double@\xybsqlh@}
\xydefcsname@{dir3{~}}{\squiggle@ \triple@\xybsqlh@}
\xyletcsnamecsname@{dir0{~}}{dir{}}
\xyletcsnamecsname@{dir{~}}{dir1{~}}
\xydef@\squiggle@{\xybsqlfont
\dimen@=\sd@X\cosDirection\xybsqll@ \advance\[email protected]\p@
\dimen@ii=\sd@Y\sinDirection\xybsqll@
\kern\dimen@\squiggle@@
\edef\tmp@{\egroup \U@c=\the\dimen@ii \L@c=\the\dimen@}\tmp@
\wdz@=2\L@c \R@c=\L@c \ht\z@=\U@c \D@c=\U@c \dp\z@=\U@c
\Edge@c={\rectangleEdge}%
\def\Leftness@{.5}\def\Upness@{.5}%
\def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\squiggledSpread@}}
\xydef@\squiggle@@{\DirectionChar \count@=\DirectionChar
\advance\count@-64 \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}
\xydef@\squiggledSpread@{%
\dimen@=\d@X \advance\dimen@-\sd@X\count@@\A@ \advance\dimen@\[email protected]\p@
\advance\[email protected]\dimen@ \advance\d@X-\dimen@
\dimen@=\d@Y \advance\dimen@-\sd@Y\count@@\B@ \advance\dimen@\[email protected]\p@
\advance\[email protected]\dimen@ \advance\d@Y-\dimen@}
\xydef@\double@#1{\edef\Drop@@{\dimen@=#1\relax
\dimen@=.5\dimen@ \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
\setboxz@h{\setbox2=\hbox{\kern\A@\raise\B@\copy\z@}%
\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
\setbox2=\hbox{\kern-\A@\raise-\B@ \noexpand\boxz@}%
\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 }%
\ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \noexpand\styledboxz@}}
\xydef@\triple@#1{\edef\Drop@@{\dimen@=#1\relax
\A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
\setboxz@h{\setbox2=\hbox{\kern\A@\raise\B@\copy\z@}%
\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
\setbox2=\hbox{\kern-\A@\raise-\B@\copy\z@}%
\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
\dp\z@=\z@ \ht\z@=\z@ \wdz@=\z@ \noexpand\boxz@}%
\ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \noexpand\styledboxz@}}
\xydefcsname@{dir1{--}}{\dash@}
\xydefcsname@{dir2{--}}{\dash@ \double@\xydashh@}
\xydefcsname@{dir3{--}}{\dash@ \triple@\xydashh@}
\xyletcsnamecsname@{dir0{--}}{dir{}}
\xyletcsnamecsname@{dir{--}}{dir1{--}}
\xyletcsnamecsname@{dir{==}}{dir2{--}}
\xydef@\dash@{\line@ \wdz@=2\wdz@ \ht\z@=2\ht\z@ \dp\z@=2\dp\z@
\multiply\D@c\tw@ \multiply\U@c\tw@ \multiply\L@c\tw@ \multiply\R@c\tw@
\def\Connect@@{\straight@\dashedSpread@}}
\xydef@\dashedSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi
\advance\d@X\[email protected]\A@ \advance\d@Y\[email protected]\B@
\ifdim\z@<\d@X \advance\[email protected]\A@ \fi \advance\Y@c\[email protected]\B@}
\xydefcsname@{dir1{~~}}{\dashsquiggle@}
\xydefcsname@{dir2{~~}}{\dashsquiggle@ \double@\xybsqlh@}
\xydefcsname@{dir3{~~}}{\dashsquiggle@ \triple@\xybsqlh@}
\xyletcsnamecsname@{dir0{~~}}{dir{}}
\xyletcsnamecsname@{dir{~~}}{dir1{~~}}
\xydef@\dashsquiggle@{\squiggle@
\multiply\D@c\tw@ \multiply\U@c\tw@ \multiply\L@c\tw@ \multiply\R@c\tw@
\dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c
\def\Connect@@{\straight@\dashsquiggledSpread@}}
\xydef@\dashsquiggledSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi
\advance\[email protected]\A@ \advance\[email protected]\A@ \advance\[email protected]\B@ \advance\[email protected]\B@}
\xyletcsnamecsname@{dir1{..}}{dir{.}}
\xyletcsnamecsname@{dir2{..}}{dir2{.}}
\xyletcsnamecsname@{dir3{..}}{dir3{.}}
\xyletcsnamecsname@{dir{..}}{dir1{.}}
\xyletcsnamecsname@{dir{::}}{dir2{.}}
\xylet@\ctipEdge@=\czeroEdge@
\xydefcsname@{dir1{>}}{\tip@}
\xydefcsname@{dir^{>}}{\atip@}
\xydefcsname@{dir_{>}}{\btip@}
\xyletcsnamecsname@{dir0{>}}{dir{}}
\xyletcsnamecsname@{dir{>}}{dir1{>}}
\xydefcsname@{dir1{<}}{\reverseDirection@\tip@}
\xydefcsname@{dir^{<}}{\reverseDirection@\btip@}
\xydefcsname@{dir_{<}}{\reverseDirection@\atip@}
\xyletcsnamecsname@{dir0{<}}{dir{}}
\xyletcsnamecsname@{dir{<}}{dir1{<}}
\xydef@\tip@{\tip@x\tip@@}
\xydef@\atip@{\tip@x\atip@@}
\xydef@\btip@{\tip@x\btip@@}
\xydef@\tip@x#1{#1\egroup
\ctipEdge@
\def\Leftness@{.5}\def\Upness@{.5}%
\def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
\xydef@\tip@@{\atip@@\btip@@}
\xydef@\atip@@{\xyatipfont\DirectionChar}
\xydef@\btip@@{\xybtipfont\DirectionChar}
\xydefcsname@{dir2{>}}{\Tip@}
\xydefcsname@{dir2{<}}{\reverseDirection@\Tip@}
\xydef@\Tip@{\kern2.5pt \vrule height2.5pt depth2.5pt width\z@
\Tip@@ \kern2.5pt \egroup
\U@c=2.5pt \D@c=2.5pt \L@c=2.5pt \R@c=2.5pt \Edge@c={\circleEdge}%
\def\Leftness@{.5}\def\Upness@{.5}%
\def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
\xydef@\Tip@@{\count@=\DirectionChar
\advance\count@-4 \ifnum\count@<\z@ \advance\count@128 \fi
\xyatipfont\char\count@
\advance\count@ 8 \ifnum127<\count@ \advance\count@-128 \fi
\xybtipfont\char\count@}
\xydefcsname@{dir3{>}}{\Ttip@}
\xydefcsname@{dir3{<}}{\composite@{}{:(-1,0)\dir3{>}}}
\xydef@\Ttip@{\kern3.2pt \vrule height3.2pt depth3.2pt width\z@
\Ttip@@ \kern3.2pt \egroup
\U@c=3.2pt \D@c=3.2pt \L@c=3.2pt \R@c=3.2pt \Edge@c={\circleEdge}%
\def\Leftness@{.5}\def\Upness@{.5}%
\def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
\xydef@\Ttip@@{%
\setboxz@h\bgroup\reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
\kern-\L@c \boxz@ \kern\L@c
{\vDirection@(1,-.31)\xydashl@ \xyatipfont\char\DirectionChar}%
{\vDirection@(1,+.31)\xydashl@ \xybtipfont\char\DirectionChar}}
\xydefcsname@{dir1{|}}{\stopper@}
\xydefcsname@{dir^{|}}{\aboveDirection@\xydashl@
\shiftdir@\line@\z@ \pointlike@{}\xydashh@}
\xydefcsname@{dir_{|}}{\belowDirection@\xydashl@
\shiftdir@\line@\z@ \pointlike@{}\xydashh@}
\xydefcsname@{dir2{|}}{\stopper@ \double@\xydashh@}
\xydefcsname@{dir3{|}}{\stopper@ \double@{2\xydashh@}}
\xyletcsnamecsname@{dir0{|}}{dir{}}
\xyletcsnamecsname@{dir{|}}{dir1{|}}
\xydef@\stopper@{\tip@x\stopper@@}
\xydef@\stopper@@{\setboxz@h{\count@=\SemiDirectionChar \advance\count@64
\ifnum127<\count@ \advance\count@-128 \fi \xydashfont\char\count@\/}%
\setboxz@h{\kern-.5\wdz@ \dimen@=\sd@Y\cosDirection\xydashl@
\ifnum\SemiDirectionChar=95 \dimen@=\sd@X\sd@Y\dimen@ \fi
\raise.5\dimen@\boxz@}%
\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
\xydefcsname@{dir1{(}}{\hook@}
\xydefcsname@{dir^{(}}{\ahook@}
\xydefcsname@{dir_{(}}{\bhook@}
\xyletcsnamecsname@{dir0{(}}{dir{}}
\xyletcsnamecsname@{dir{(}}{dir1{(}}
\xydefcsname@{dir1{)}}{\reverseDirection@\hook@}
\xydefcsname@{dir^{)}}{\reverseDirection@\bhook@}
\xydefcsname@{dir_{)}}{\reverseDirection@\ahook@}
\xyletcsnamecsname@{dir0{)}}{dir{}}
\xyletcsnamecsname@{dir{)}}{dir1{)}}
\xydef@\hook@{\tip@x\hook@@}
\xydef@\hook@@{\setboxz@h{\xybsqlfont
\vDirection@(1,-1){.707107\xybsqll@}%
\hbox{\DirectionChar
\kern-\d@Y\raise\d@X\hbox{\count@=\DirectionChar \advance\count@-32
\ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}}%
\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
\xydef@\ahook@{\tip@x\ahook@@}
\xydef@\ahook@@{\setboxz@h{\xybsqlfont
\vDirection@(1,-1){.707107\xybsqll@}\kern-\d@X
\lower\d@Y\hbox{\DirectionChar
\kern-\d@Y\raise\d@X\hbox{\count@=\DirectionChar \advance\count@-32
\ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}}%
\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
\xydef@\bhook@{\tip@x\bhook@@}
\xydef@\bhook@@{\setboxz@h{\xybsqlfont
\vDirection@(-1,-1){.707107\xybsqll@}\DirectionChar
\kern\d@X\raise\d@Y\hbox{\count@=\DirectionChar \advance\count@-96
\ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}%
\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
\xydefcsname@{dir^{'}}{\reverseDirection@\bturn@}
\xydefcsname@{dir_{'}}{\reverseDirection@\aturn@}
\xydefcsname@{dir^{`}}{\aturn@}
\xydefcsname@{dir_{`}}{\bturn@}
\xydef@\aturn@{\tip@x\aturn@@}
\xydef@\aturn@@{\setboxz@h{\xybsqlfont
\vDirection@(1,-1){.707107\xybsqll@}\kern-\d@X
\lower\d@Y\hbox{\DirectionChar}}%
\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
\xydef@\bturn@{\tip@x\bturn@@}
\xydef@\bturn@@{\setboxz@h{\xybsqlfont
\vDirection@(-1,-1){.707107\xybsqll@}\DirectionChar}%
\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
\xydef@\newdir#1#{\newdir@{#1}}
\xydef@\newdir@#1#2#3{\xydefcsname@{dir#1{#2}}{\composite@{}{#3}}}
\xydef@\shiftdir@#1#2{%
\setbox\z@=\hbox\bgroup#1\relax
\setboxz@h{\dimen@ii=#2\relax
\dimen@=-\cosDirection\dimen@ii \advance\dimen@-\L@c
\kern\dimen@ \lower\sinDirection\dimen@ii\boxz@}%
\wdz@\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
\xylet@\tipjot@=\jot
\xydefcsname@{dir1{>>}}{\shiftdir@\tip@\tipjot@ \tip@}
\xydefcsname@{dir^{>>}}{\shiftdir@\atip@\tipjot@ \atip@}
\xydefcsname@{dir_{>>}}{\shiftdir@\btip@\tipjot@ \btip@}
\xydefcsname@{dir2{>>}}{\composite@{}{h!/\tipjot@/\dir2{>}*\dir2{>}}}
\xydefcsname@{dir3{>>}}{\composite@{}{h!/\tipjot@/\dir3{>}*\dir3{>}}}
\xyletcsnamecsname@{dir0{>>}}{dir{}}
\xyletcsnamecsname@{dir{>>}}{dir1{>>}}
\xydefcsname@{dir1{<<}}{\reverseDirection@ \shiftdir@\tip@\tipjot@ \tip@}
\xydefcsname@{dir^{<<}}{\reverseDirection@ \shiftdir@\btip@\tipjot@ \btip@}
\xydefcsname@{dir_{<<}}{\reverseDirection@ \shiftdir@\atip@\tipjot@ \atip@}
\xydefcsname@{dir2{<<}}{\composite@{}{h!/-\tipjot@/\dir2{<}*\dir2{<}}}
\xydefcsname@{dir3{<<}}{\composite@{}{h!/-\tipjot@/\dir3{<}*\dir3{<}}}
\xyletcsnamecsname@{dir0{<<}}{dir{}}
\xyletcsnamecsname@{dir{<<}}{dir1{<<}}
\xydefcsname@{dir1{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
\pointlike@{}\jot}
\xydefcsname@{dir^{||}}{\shiftdir@{\aboveDirection@\xydashl@\line@}\xydashh@
\shiftdir@{\aboveDirection@\xydashl@\line@}\z@ \pointlike@{}\jot}
\xydefcsname@{dir_{||}}{\shiftdir@{\belowDirection@\xydashl@\line@}\xydashh@
\shiftdir@{\belowDirection@\xydashl@\line@}\z@ \pointlike@{}\jot}
\xydefcsname@{dir2{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
\pointlike@{}\jot \double@\xydashh@}
\xydefcsname@{dir3{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
\pointlike@{}\jot \double@{2\xydashh@}}
\xyletcsnamecsname@{dir0{||}}{dir{}}
\xyletcsnamecsname@{dir{||}}{dir1{||}}
\xydefcsname@{dir1{>|}}{\shiftdir@\stopper@\z@ \tip@}
\xydefcsname@{dir2{>|}}{\composite@{}{\dir2{>}*\dir2{|}}}
\xydefcsname@{dir3{>|}}{\composite@{}{\dir3{>}*\dir3{|}}}
\xyletcsnamecsname@{dir0{>|}}{dir{}}
\xyletcsnamecsname@{dir{>|}}{dir1{>|}}
\xydefcsname@{dir1{>>|}}{\shiftdir@\stopper@\z@ \shiftdir@\tip@\tipjot@ \tip@}
\xydefcsname@{dir2{>>|}}{\composite@{}{h!/\tipjot@/\dir2{>}*\dir2{>}*\dir2{|}}}
\xydefcsname@{dir3{>>|}}{\composite@{}{h!/\tipjot@/\dir3{>}*\dir3{>}*\dir3{|}}}
\xyletcsnamecsname@{dir0{>>|}}{dir{}}
\xyletcsnamecsname@{dir{>>|}}{dir1{>>|}}
\xydefcsname@{dir1{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \tip@}
\xydefcsname@{dir2{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \Tip@}
\xydefcsname@{dir3{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \Ttip@}
\xyletcsnamecsname@{dir0{|<}}{dir{}}
\xyletcsnamecsname@{dir{|<}}{dir1{|<}}
\xydefcsname@{dir1{|<<}}{\reverseDirection@
\shiftdir@\stopper@\z@ \shiftdir@\tip@\tipjot@ \tip@}
\xydefcsname@{dir2{|<<}}{%
\composite@{}{h!/-\tipjot@/\dir2{<}*\dir2{<}*\dir2{|}}}
\xydefcsname@{dir3{|<<}}{%
\composite@{}{h!/-\tipjot@/\dir3{<}*\dir3{<}*\dir3{|}}}
\xyletcsnamecsname@{dir0{|<<}}{dir{}}
\xyletcsnamecsname@{dir{|<<}}{dir1{|<<}}
\xydefcsname@{dir1{|-}}{\shiftdir@\stopper@\z@
\shiftdir@\line@\z@ \pointlike@{}\jot}
\xydefcsname@{dir^{|-}}{\shiftdir@{\aboveDirection@\xydashl@ \line@}\z@
\shiftdir@\line@\z@ \pointlike@{}\jot}
\xydefcsname@{dir_{|-}}{\shiftdir@{\belowDirection@\xydashl@ \line@}\z@
\shiftdir@\line@\z@ \pointlike@{}\jot}
\xydefcsname@{dir2{|-}}{\shiftdir@\stopper@\z@
\shiftdir@\line@\z@ \pointlike@{}\jot \double@\xydashh@}
\xydefcsname@{dir3{|-}}{\shiftdir@\stopper@\z@
\shiftdir@\line@\z@ \pointlike@{}\jot \triple@\xydashh@}
\xyletcsnamecsname@{dir0{|-}}{dir{}}
\xyletcsnamecsname@{dir{|-}}{dir1{|-}}
\xyletcsnamecsname@{dir{|=}}{dir2{|-}}
\xydefcsname@{dir{+}}{%
\DN@##1{\composite@{}{##10\dir{|}*!C##10\dir{-}}}\addEQ@\next@}
\xyletcsnamecsname@{dir0{+}}{dir{}}
\xydefcsname@{dir{x}}{\vDirection@(1,1)\jot
\DN@##1{\composite@{}{##10\dir{|}*!C##10\dir{-}}}\addEQ@\next@}
\xyletcsnamecsname@{dir0{x}}{dir{}}
\xydefcsname@{dir{/}}{\vDirection@(1,-.3)\jot \stopper@}
\xyletcsnamecsname@{dir0{/}}{dir{}}
\xydefcsname@{dir{//}}{\vDirection@(1,-.3)\jot
\shiftdir@\stopper@\xydashh@ \stopper@}
\xyletcsnamecsname@{dir0{//}}{dir{}}
\xydefcsname@{dir{*}}{\solidpoint@}
\xydef@\solidpoint@{%
\pointlike@{\kern-1.8pt\lower1.8pt\hbox{$\scriptstyle\bullet$}}\jot}
\xyletcsnamecsname@{dir0{*}}{dir{}}
\xydefcsname@{dir{o}}{\hollowpoint@}
\xydef@\hollowpoint@{%
\pointlike@{\kern-1.8pt\lower1.8pt\hbox{$\scriptstyle\circ$}}\jot}
\xyletcsnamecsname@{dir0{o}}{dir{}}
\message{circles,}
\xydef@\cir#1#{\hbox\bgroup
\afterVECTORorEMPTY{\xy@@{\R@=\X@c}\cir@}{\xy@@{\R@=\R@c}\cir@}#1@}
\xydef@\cir@#1@#2{%
\DN@{#1}\ifx\next@\empty\else \xyerror@{illegal circle <radius>: must be
<vector> or <empty>}{}\fi
\afterCIRorDIAG{\xyFN@\cir@cir}{\xyFN@\cir@diag}#2@}
\xydef@\cir@cir{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\cir@cir}%
\else \ifx @\next \DN@ @{\cir@i}%
\else \xyerror@{illegal <cir>: must have form <diag><orient><diag> or
<empty>}{}%
\fi\fi \next@}
\xydef@\cir@diag{%
\DN@{\xyerror@{illegal <cir>: must have form <diag><orient><diag> or
<empty>}{}}%
\ifx @\next \ifnum\count@=8
\DN@ @{\def\CIRin@@{0}\def\CIRorient@@{\CIRfull@}\def\CIRout@@{7}\cir@i}%
\fi\fi \next@}
\xydef@\cir@i{%
\ifnum\CIRin@@=8 \xyerror@{incomplete <cir> specification}{%
The <cir> you specified as <diag><orient><diag> is not sufficiently specific.}%
\def\CIRin@@{0}\fi
\ifdim\R@<.5\p@ \R@=\z@ \zerodot
\else \CIRorient@@ \cirbuild@ \fi
\L@c=\R@ \R@c=\R@ \D@c=\R@ \U@c=\R@ \def\Leftness@{.5}\def\Upness@{.5}%
\def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\relax}%
\Edge@c={\circleEdge}\OBJECT@x}
\xydef@\CIRin@@{3}
\xydef@\CIRout@@{3}
\xylet@\CIRorient@@=\empty
\xydef@\afterCIRorDIAG#1#2{\def\afterCIR@{#1}\def\afterCIRDIAG@{#2}\xyFN@\CIR@}
\xylet@\afterCIR@=\empty
\xylet@\afterCIRDIAG@=\empty
\xydef@\CIR@{\count@=8 \afterDIAG{\edef\CIRin@@{\the\count@}\xyFN@\CIR@@}}
\xydef@\CIR@@{%
\ifx \space@\next \expandafter\DN@\space{\xyFN@\CIR@@}%
\else\ifx ^\next
\DN@ ^{\def\CIRorient@@{\CIRacw@}%
\afterDIAG{\edef\CIRout@@{\the\count@}\afterCIR@}}%
\else\ifx _\next
\DN@_{\def\CIRorient@@{\CIRcw@}%
\afterDIAG{\edef\CIRout@@{\the\count@}\afterCIR@}}%
\else
\DN@{\def\CIRorient@@{\relax}\afterCIRDIAG@}%
\fi\fi\fi \next@}
\xylet@\CIRtest@@=\relax
\xydef@\CIRlo@@{0}
\xydef@\CIRhi@@{0}
\xydef@\CIRfull@{\def\CIRtest@@##1##2{##2}}
\xydef@\cirbuild@{\cirrestrict@@ \multiply\count@8
\circhar@0\circhar@7\kern\dimen@
\circhar@1\circhar@6\kern\dimen@
\circhar@2\circhar@5\kern\dimen@
\circhar@3\circhar@4\kern\dimen@}
\xydef@\circhar@#1{%
\setboxz@h{\circhar@@{#1}}\dimen@=\wdz@ \wdz@=\z@ \ht\z@=\R@ \dp\z@=\R@
\CIRtest@@#1{\styledboxz@}\setbox\z@=\copy\voidb@x}
\xydef@\circhar@@#1{{\xycircfont \advance\count@#1\relax \char\count@}}
\xydef@\cirrestrict@@{\begingroup \dimen@=\R@
\setboxz@h{\xycircfont\char\z@\char\@ne}\A@=\wdz@
\ifdim\R@<8\A@ \count@=\dimen@ \divide\count@\A@ \advance\count@\m@ne
\else\ifdim\R@<16\A@ \count@=\dimen@
\dimen@=2\A@ \divide\count@\dimen@ \advance\count@3
\else\ifdim\R@<32\A@ \count@=\dimen@
\dimen@=4\A@ \divide\count@\dimen@ \advance\count@7
\else \count@=15 \fi\fi\fi
\R@=\A@
\ifnum\count@<8 \multiply\R@\count@ \advance\R@\A@
\else\ifnum\count@<12 \multiply\R@\count@ \multiply\R@\tw@ \advance\R@-6\A@
\else\ifnum\count@<16 \multiply\R@\count@ \multiply\R@ 4 \advance\R@-28\A@
\else \multiply\R@ 32 \fi\fi\fi
\edef\@tmp{\endgroup \R@=\the\R@ \count@=\the\count@}\@tmp}
\xydef@\CIRacw@{\count@@=\CIRin@@ \count@=\CIRout@@
\ifnum\count@=8 \count@=\count@@
\ifnum\count@<6 \advance\count@\tw@ \else \advance\count@-6 \fi \fi
\ifnum\count@@<\@ne \advance\count@@7 \else \advance\count@@\m@ne \fi
\ifnum\count@<\@ne \advance\count@7 \else \advance\count@\m@ne \fi
\ifnum\count@@>\count@ \let\CIRtest@@=\CIRtest@outside
\edef\CIRlo@@{\the\count@}\edef\CIRhi@@{\the\count@@}%
\else \let\CIRtest@@=\CIRtest@inside
\edef\CIRlo@@{\the\count@@}\edef\CIRhi@@{\the\count@}%
\fi}
\xydef@\CIRcw@{\count@@=\CIRin@@ \count@=\CIRout@@
\ifnum\count@=8 \count@=\count@@
\ifnum\count@>\@ne \advance\count@-\tw@ \else \advance\count@6 \fi \fi
\ifnum\count@@<5 \advance\count@@\thr@@ \else \advance\count@@-5 \fi
\ifnum\count@<5 \advance\count@\thr@@ \else \advance\count@-5 \fi
\ifnum\count@@<\count@ \let\CIRtest@@=\CIRtest@outside
\edef\CIRlo@@{\the\count@@}\edef\CIRhi@@{\the\count@}%
\else \let\CIRtest@@=\CIRtest@inside
\edef\CIRlo@@{\the\count@}\edef\CIRhi@@{\the\count@@}%
\fi}
\xydef@\CIRtest@inside#1#2{\let\next@=\relax
\ifnum\CIRlo@@>#1\else \ifnum#1<\CIRhi@@\DN@{#2}\fi\fi \next@}
\xydef@\CIRtest@outside#1#2{\let\next@=\relax
\ifnum\CIRlo@@>#1\DN@{#2}\else \ifnum#1<\CIRhi@@\else\DN@{#2}\fi\fi \next@}
\message{text;}
\xydef@\txt{\ifvmode\leavevmode\fi\hbox\bgroup \xyFN@\txt@}
\xydef@\txt@{%
\addLT@\ifx\next \addGT@{\addLT@\DN@##1}{\A@=##1\txt@i}%
\else \DN@{\A@=\maxdimen \txt@i}\fi \next@}
\xydef@\txt@i#1#{%
\setboxz@h{#1\mathstrut}\dimen@=\ht\z@ \advance\dimen@\dp\z@
\baselineskip=1.1\dimen@ \lineskip=.2\dimen@ \lineskiplimit=\lineskip
\def\txtline@@##1{\txtline@{#1}{##1}}\object@\txt@ii}
\xylet@\txtline@@=\eat@
\xydef@\txtline@#1#2{\relax\setboxz@h{#1\ignorespaces #2\unskip}%
\ifdim\A@<\wdz@ \setboxz@h{\hsize=\A@
\leftskip=0pt plus4em \rightskip=\leftskip
\parfillskip=0pt \parindent=0pt
\spaceskip=.3333em \xspaceskip=.5em
\pretolerance=9999 \tolerance=9999
\hyphenpenalty=9999 \exhyphenpenalty=9999
\vbox{#1\noindent\ignorespaces #2\unskip}}%
\else\ifdim\A@<\maxdimen\setboxz@h to\A@{\hfil\boxz@\hfil}\fi\fi
\boxz@}
\xydef@\txt@ii#1{\vbox{%
\let\\=\cr
\tabskip=\z@skip \halign{\relax\hfil\txtline@@{##}\hfil\cr\leavevmode#1\crcr}}}
\message{options;}
\xylet@\xyoption@@=\relax
\xydef@\xyoption#1{\DN@{#1}\edef\next@{\codeof\next@}%
\csname xyeveryrequest@\next@ @\endcsname
\xyinputorelse@{xy#1}{\xyoption@truncated#1@@@@@@@@@,#1@}%
\def\xyoption@@{#1}\edef\xyoption@@{\codeof\xyoption@@}
\expandafter\let\expandafter\next@\csname xy\xyoption@@ version\endcsname
\expandafter\let\csname xy\xyoption@@ loaded\endcsname=\next@
\runxywith@ \ignorespaces}
\xydef@\xyoption@truncated#1#2#3#4#5#6#7@#8,#9@{%
\DN@{#7}\ifx\next@\empty \DN@##1##2{##2}\else\let\next@=\xyinputorelse@ \fi
\next@{xy#1#2#3#4#5#6}%
{\DN@{#1#2#3#4#5#6}\edef\next@{\codeof\next@}%
\xyerror@{No `\next@' option}{%
Your \xyoption{#9} request could not be granted: the required^^J%
file `xy#9.tex' could not be located. Please make sure that it is^^J%
properly installed before continuing.}}}
\xydef@\xyrequire#1{\DN@{#1}\edef\next@{\codeof\next@}%
\csname xyeveryrequest@\next@ @\endcsname
\expandafter\let\expandafter\next@\csname xy\codeof\next@ loaded\endcsname
\ifx \next@\relax \DN@{\xyoption{#1}}\else \DN@{\ignorespaces}\fi \next@}
\xylet@\xywith@@=\empty
\xydef@\runxywith@{\let\xywithdo@@=\xywithtest@ \xywith@@}
\xydef@\xywithoption#1#2{\DN@{#1}\edef\next@{\codeof\next@}%
\expandafter\let\expandafter\nextii@\csname xy\next@ loaded\endcsname
\ifx \nextii@\relax
\expandafter\def\expandafter\xywith@@\expandafter{\xywith@@
\xywithdo@@{#1}{#2}}%
\else \expandafter\xywithrun@\expandafter{\next@}{#2}\fi}
\xydef@\xywithtest@#1#2{\DN@{#1}\edef\next@{\codeof\next@}%
\ifx\next@\xyoption@@ \expandafter\xywithrun@\expandafter{\next@}{#2}\fi}
\xydef@\xywithrun@#1#2{\csname xyeverywithoption@#1@\endcsname #2}
\xydef@\xyevery@#1#2#3{\DN@{#2}\edef\next@{\codeof\next@}%
\expandafter\ifx\csname xyevery#1@\next@ @\endcsname\relax
\expandafter\let\csname xyevery#1@\next@ @\endcsname=\empty \fi
\DNii@##1{\expandafter\def\expandafter##1\expandafter{##1#3}}%
\expandafter\nextii@\csname xyevery#1@\next@ @\endcsname}
\xydef@\xyeveryrequest{\xyevery@{request}}
\xydef@\xyeverywithoption{\xyevery@{withoption}}
\xydef@\xyprovide#1#2#3#4#5#6{%
\def\xyoption@@{#1}\edef\xyoption@@{\codeof\xyoption@@}\edef\next@{#3}%
\message{ Xy-pic option: #2 v.\next@}%
\expandafter\let\expandafter\nextii@\csname xy\xyoption@@ loaded\endcsname
\ifx \next@\nextii@ \message{not reloaded}\endinput
\else
\ifx \nextii@\relax\else \xyerror@{Option `\xyoption@@' version mismatch}{%
You previously loaded, or the format has preloaded, a different version^^J%
of this option. Just continue to try to load this version instead (and^^J%
be prepared for a lot of warnings about redefinitions).}%
\fi
\expandafter\let\csname xy\xyoption@@ version\endcsname=\next@
\expandafter\let\expandafter\xyenddocmode@\csname DOCMODE\endcsname
\expandafter\let\csname DOCMODE\endcsname\xyprovidedocmode@
\xycatcodes
\fi \ignorespaces}
\xydef@\xyendinput{\expandafter\let\csname DOCMODE\endcsname=\xyenddocmode@
\message{loaded}\xyuncatcodes\endinput}
\expandafter\xylet@\expandafter\xyprovidedocmode@\csname DOCMODE\endcsname
\xylet@\xyenddocmode@=\relax
\xydef@\xydriversloaded@@{\do{unload}}
\xylet@\xydriversselected@@=\empty
\xylet@\xydriver@unload@support@@=\empty
\xydef@\selectdriver@#1{\DN@{#1}\edef\next@{\codeof\next@}%
\expandafter\selectdriver@@\expandafter{\next@}}
\xydef@\selectdriver@single#1{\xysetup@@{\def\xydriversselected@@{\do{#1}}%
\xyLoadDrivers@}\let\selectdriver@@=\changedriver@single}
\xydef@\changedriver@single#1{\xysetup@@{\def\xydriversselected@@{\do{#1}}%
\xyReloadDrivers@}}
\xydef@\selectdriver@multiple#1{\expandafter\xysetup@@\expandafter{%
\expandafter\def\expandafter\xydriversselected@@\expandafter{%
\xydriversselected@@ \do{#1}}%
\let\do=\activatedriver@ \xydriversselected@@}}
\xydef@\UseSingleDriver{\let\selectdriver@@=\selectdriver@single}
\xydef@\MultipleDrivers{\let\selectdriver@@=\selectdriver@multiple}
\xydef@\xyLoadDrivers@{\let\do=\activatedriver@ \xydriversselected@@}
\xydef@\xyReloadDrivers@{\activatedriver@{unload}\xyLoadDrivers@}
\xylet@\xyReloadDrivers=\xyReloadDrivers@
\xydef@\activatedriver@#1{%
\let\doii=\activatedriversupport@ \csname xydriver@#1@support@@\endcsname}
\xydef@\activatedriversupport@#1#2{%
\expandafter\ifx\csname xy#1loaded\endcsname\relax\DN@{}%
\else\DN@{#2}\fi \next@}
\UseSingleDriver
\xydef@\xyselectoptionsupport@{\let\do=\activatedriver@ \xydriversselected@@}
\xydef@\xyShowDrivers{{\W@{Loaded:}\let\do=\doShow \xydriversloaded@@
\let\next@=\empty
\def\do##1{\ifx\next@\empty \DN@{##1}%
\else \expandafter\DN@\expandafter{\next@, ##1}\fi}%
\xydriversselected@@\W@{Selected: \next@.}}}
\def\doShow#1{\let\next@=\empty
\def\doii##1##2{\ifx\next@\empty \DN@{##1}%
\else \expandafter\DN@\expandafter{\next@, ##1}\fi}%
\csname xydriver@#1@support@@\endcsname
\W@{ <driver> #1 supports \next@.}}
\xydef@\newdriver#1{%
\def\nextiii@##1{%
\expandafter\def\expandafter\xydriversloaded@@
\expandafter{\xydriversloaded@@\do{##1}}%
\expandafter\let\csname xydriver@\xyoption@@ @support@@\endcsname=\empty}%
\def\do##1{\DNii@{##1}\ifx\xyoption@@\nextii@ \let\nextiii@=\eat@ \fi}%
\xydriversloaded@@ \expandafter\nextiii@\expandafter{\xyoption@@}%
#1\relax
\DN@##1{\xywithoption{##1}{%
\selectdriver@{##1}\xyeveryrequest{##1}{\selectdriver@{##1}}}}%
\expandafter\next@\expandafter{\xyoption@@}\ignorespaces}
\xydef@\xyaddsupport{\expandafter\xyadddriversupport@\expandafter{\xyoption@@}}
\xydef@\xyaddunsupport{\xyadddriversupport@{unload}}
\xydef@\xyadddriversupport@#1#2#3{%
\DNii@{#1}\edef\nextii@{\codeof\nextii@}%
\def\nextiii@{#2}\edef\nextiii@{\codeof\nextiii@}%
\def\next{\xybug@{<driver> \nextii@\space not loaded}}%
\def\do##1{\DN@{##1}\edef\next@{\codeof\next@}%
\ifx\next@\nextii@ \let\next=\relax \fi}\xydriversloaded@@ \next
\def\next{\xybug@{<driver> \nextii@\space already supports \nextiii@}}%
\def\doii##1##2{\DN@{##1}\edef\next@{\codeof\next@}%
\ifx\next@\nextiii@ \let\next=\relax \fi}\xydriversloaded@@ \next
\DN@##1##2{\ifx##1\relax \let##1=\empty \fi
\expandafter\def\expandafter##1\expandafter{##1\doii{##2}{#3}}}%
\expandafter\expandafter\expandafter\next@
\expandafter\expandafter\csname xydriver@\nextii@ @support@@\endcsname
\expandafter{\nextiii@}%
\DN@##1{\expandafter\xyeverywithoption\expandafter{\nextiii@}{%
\xytestforsupport@{##1}}}%
\expandafter\next@\expandafter{\nextii@}\xydriversloaded@@
\ignorespaces}
\xydef@\xytestforsupport@#1{\def\do##1{\DN@{##1}\DNii@{#1}%
\ifx\next@\nextii@ \expandafter\xyselectoptionsupport@ \fi}}
\xynew@{if}\ifunsupportwarnings@
\xydef@\xyunsupportwarning@#1#2{{%
\DN@{#1}\edef\next@{\codeof\next@}
\expandafter\ifx\csname xywarn@unload@\next@ @\endcsname\relax
\expandafter\gdef\csname xywarn@unload@\next@ @\endcsname{}%
\ifunsupportwarnings@ \xyclosedown@@\xyunsupportwarnings@@ \fi
\global\unsupportwarnings@true
\expandafter\gdef\expandafter\xyunsupportwarnings@@\expandafter{%
\xyunsupportwarnings@@ \W@{ #2.}}%
\W@{}%
\W@{Xy-pic Warning: `\next@' reproduction is NOT EXACT\xytracelineno@:}%
\W@{ #2.}%
\W@{}%
\fi}}
\xydef@\xyunsupportwarnings@@{\W@{}%
\W@{Xy-pic Warning: The produced DVI file is NOT EXACT:}}
\xynew@{if}\ifsupportwarnings@
\xydef@\xysupportwarning@#1#2{{%
\DN@{#1}\edef\next@{\codeof\next@}\DNii@{#2}\edef\nextii@{\codeof\nextii@}%
\expandafter\ifx\csname xywarn@\next@ @\nextii@ @\endcsname\relax
\expandafter\gdef\csname xywarn@\next@ @\nextii@ @\endcsname{}%
\ifsupportwarnings@ \xyclosedown@@\xysupportwarnings@@ \fi
\global\supportwarnings@true
\expandafter\gdef\expandafter\xysupportwarnings@@\expandafter{%
\xysupportwarnings@@ \driverextensioncomplain@{#1}{#2}}%
\W@{}%
\W@{Xy-pic Warning: The produced DVI file is NOT PORTABLE\xytracelineno@:}%
\driverextensioncomplain@{#1}{#2}%
\W@{}%
\fi}}
\xydef@\xysupportwarnings@@{%
\W@{Xy-pic Warning: The produced DVI file is NOT PORTABLE:}}
\xydef@\driverextensioncomplain@#1#2{%
\DN@{#1}\edef\next@{\codeof\next@}\DNii@{#2}\edef\nextii@{\codeof\nextii@}%
\W@{ It contains <driver> `\next@' \string\special s for the `\nextii@'
extension.}}
\xydef@\dvimessage@#1#2{\xysupportwarning@{#1}{#2}}
\xynew@{if}\ifxydrivernoloads@
\xydef@\xydrivernoload@#1{\xyerror@{Could not load xy#1.tex}{}%
\xydrivernoloads@true}
\xydef@\xydriverfail@#1{\xyerror@{Sorry, #1 not supported.}{}}
\xydef@\xyunload@#1{\xywarning@{Unloading #1.}}
\message{algorithms: directions,}
\xydef@\DirectionfromtheDirection@{\noexpand\Direction=\the\Direction
\noexpand\d@X=\the\d@X \noexpand\d@Y=\the\d@Y
\def\noexpand\sd@X{\sd@X}\def\noexpand\sd@Y{\sd@Y}%
\noexpand\K@dXdY=\the\K@dXdY \noexpand\K@dYdX=\the\K@dYdX
\chardef\noexpand\DirectionChar=\the\DirectionChar
\chardef\noexpand\SemiDirectionChar=\the\SemiDirectionChar
\def\noexpand\cosDirection{\cosDirection}%
\def\noexpand\sinDirection{\sinDirection}%
\noexpand\resetupDirection@}
\xydef@\Directiontest@@#1#2{#2}
\xydef@\setupDirection@{%
\d@X=\X@c\advance\d@X-\X@p \d@Y=\Y@c\advance\d@Y-\Y@p
\Directiontest@@\relax\setupDirection@i}
\xydef@\setupDirection@i{\DN@{\setupDirection@ii}%
\ifdim\d@X=\d@Y
\ifdim\zz@\d@Y \DN@{}%
\else\ifdim\d@X<\z@ \DN@{\dlDirection@{-1.4142\d@X}}%
\else \DN@{\urDirection@{1.4142\d@X}}\fi\fi
\else\ifdim\d@X<\d@Y
\ifdim\zz@\d@X \DN@{\uDirection@\d@Y}%
\else\ifdim\zz@\d@Y \DN@{\lDirection@{-\d@X}}%
\else\ifdim-\d@X=\d@Y \DN@{\ulDirection@{-1.4142\d@X}}\fi\fi\fi
\else
\ifdim\zz@\d@X \DN@{\dDirection@{-\d@Y}}%
\else\ifdim\zz@\d@Y \DN@{\rDirection@\d@X}%
\else\ifdim\d@X=-\d@Y \DN@{\drDirection@{1.4142\d@X}}\fi\fi\fi
\fi\fi \next@}
\xydef@\dlDirection@{\Direction=\z@
\def\cosDirection{-.7071}\def\sinDirection{-.7071}\def\sd@X{-}\def\sd@Y{-}%
\chardef\DirectionChar=127\relax\chardef\SemiDirectionChar=127\relax
\K@dXdY=1\K@ \K@dYdX=1\K@ \fixedDirection@}
\xydef@\dDirection@{\Direction=\K@
\def\cosDirection{0}\def\sinDirection{-1}\def\sd@Y{-}%
\edef\sd@X{\ifdim\X@c<\X@p-\else+\fi}%
\chardef\DirectionChar=15\relax\chardef\SemiDirectionChar=31\relax
\K@dXdY=\z@ \K@dYdX=\KK@\K@ \fixedDirection@}
\xydef@\drDirection@{\dimen@ii=2\K@ \Direction=\dimen@ii
\def\cosDirection{+.7071}\def\sinDirection{-.7071}\def\sd@X{+}\def\sd@Y{-}%
\chardef\DirectionChar=31\relax\chardef\SemiDirectionChar=63\relax
\K@dXdY=-1\K@ \K@dYdX=-1\K@ \fixedDirection@}
\xydef@\rDirection@{\dimen@ii=3\K@ \Direction=\dimen@ii
\def\cosDirection{+1}\def\sinDirection{0}\def\sd@X{+}%
\edef\sd@Y{\ifdim\Y@c<\Y@p-\else+\fi}%
\chardef\DirectionChar=47\relax\chardef\SemiDirectionChar=95\relax
\K@dXdY=\KK@\K@ \K@dYdX=\z@ \fixedDirection@}
\xydef@\urDirection@{\dimen@ii=4\K@ \Direction=\dimen@ii
\def\cosDirection{+.7071}\def\sinDirection{+.7071}\def\sd@X{+}\def\sd@Y{+}%
\chardef\DirectionChar=63\relax\chardef\SemiDirectionChar=127\relax
\K@dXdY=1\K@ \K@dYdX=1\K@ \fixedDirection@}
\xydef@\uDirection@{\dimen@ii=-3\K@ \Direction=\dimen@ii
\def\cosDirection{0}\def\sinDirection{+1}\def\sd@Y{+}%
\edef\sd@X{\ifdim\X@c<\X@p-\else+\fi}%
\chardef\DirectionChar=79\relax\chardef\SemiDirectionChar=31\relax
\K@dXdY=\z@ \K@dYdX=\KK@\K@ \fixedDirection@}
\xydef@\ulDirection@{\dimen@ii=-2\K@ \Direction=\dimen@ii
\def\cosDirection{-.7071}\def\sinDirection{+.7071}\def\sd@X{-}\def\sd@Y{+}%
\chardef\DirectionChar=95\relax\chardef\SemiDirectionChar=63\relax
\K@dXdY=-1\K@ \K@dYdX=-1\K@ \fixedDirection@}
\xydef@\lDirection@{\Direction=-\K@
\def\cosDirection{-1}\def\sinDirection{0}\def\sd@X{-}%
\edef\sd@Y{\ifdim\Y@c<\Y@p-\else+\fi}%
\chardef\DirectionChar=111\relax\chardef\SemiDirectionChar=95\relax
\K@dXdY=\KK@\K@ \K@dYdX=\z@ \fixedDirection@}
\xydef@\fixedDirection@#1{\dimen@ii=#1\relax
\d@X=\cosDirection\dimen@ii \d@Y=\sinDirection\dimen@ii
\resetupDirection@}
\xydef@\setupDirection@ii{%
\ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
\ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
\K@dXdY=\sd@X\d@X \ifdim\K@dXdY<500pt \multiply\K@dXdY\KK@ \fi
\dimen@=\sd@Y\d@Y \advance\[email protected]\KK@ \divide\dimen@\KK@
\ifdim\dimen@=\z@\else
\advance\K@dXdY by.5\dimen@\relax \divide\K@dXdY\dimen@
\fi \K@dXdY=\sd@X\sd@Y\K@dXdY
\K@dYdX=\sd@Y\d@Y \ifdim\K@dYdX<500pt \multiply\K@dYdX\KK@ \fi
\dimen@=\sd@X\d@X \advance\[email protected]\KK@ \divide\dimen@\KK@
\ifdim\dimen@=\z@\else
\advance\K@dYdX by.5\dimen@\relax \divide\K@dYdX\dimen@
\fi \K@dYdX=\sd@X\sd@Y\K@dYdX
\Direction=\maxdimen
\ifnum\K@dXdY<-\K@ \else \ifnum\K@<\K@dXdY \else
\ifdim \d@Y<\z@
\Direction=\K@ \advance\Direction-\K@dXdY
\else
\Direction=\K@ \multiply\Direction-\thr@@ \advance\Direction-\K@dXdY
\fi\fi\fi
\ifnum-\K@<\K@dYdX \ifnum\K@dYdX<\K@
\ifdim \d@X<\z@
\Direction=-\K@ \advance\Direction\K@dYdX
\else
\Direction=\K@ \multiply\Direction\thr@@ \advance\Direction\K@dYdX
\fi\fi\fi
\ifnum\Direction=\maxdimen
\Direction=\K@dYdX \advance\Direction-\K@dXdY \divide\Direction\tw@
\ifnum\K@dXdY<\z@ \advance\Direction\K@ \advance\Direction\K@
\else \advance\Direction-\K@ \advance\Direction-\K@ \fi
\fi
\imposeDirection@i
\resetupDirection@
}
\xydef@\imposeDirection@{\count@@=\Direction
\loop@\ifnum\count@@>4096 \advance\count@@-8192 \repeat@
\loop@\ifnum\count@@<-4096 \advance\count@@8192 \repeat@
\def\sd@X{+}\ifnum\count@@<\K@ \relax
\ifnum\count@@>-3072 \def\sd@X{-}\fi\fi
\def\sd@Y{+}\ifnum\count@@<3072 \relax
\ifnum\count@@>-\K@ \relax\def\sd@Y{-}\fi\fi
\imposeDirection@i
\d@X=\cosDirection\xydashl@ \d@Y=\sinDirection\xydashl@
\resetupDirection@}
\xydef@\imposeDirection@i{%
\count@@=\K@ \multiply\count@@ by8 \advance\count@@\Direction
\count@=\count@@ \advance\count@\KK@ \divide\count@64 \advance\count@\m@ne
\loop@\ifnum127<\count@ \advance\count@-128 \repeat@
\chardef\DirectionChar\count@
\advance\count@@16 \divide\count@@\KK@ \advance\count@@\m@ne
\loop@\ifnum127<\count@@ \advance\count@@-128 \repeat@
\chardef\SemiDirectionChar\count@@
\setbox8=\hbox{\xydashfont\SemiDirectionChar\/}%
\quotient@@\cosDirection{\sd@X\wd8}\xydashl@
\setbox8=\hbox{\xydashfont\count@=\SemiDirectionChar\advance\count@-64
\ifnum\count@<\z@ \advance\count@128 \fi \char\count@\/}%
\quotient@@\sinDirection{\sd@Y\wd8}\xydashl@}
\xydef@\getxyDirection@#1{\xy@@\bgroup\xy@@ix@{#1}%
\xy@@{\expandafter\POS\the\toks9\relax\setupDirection@
\edef\next@{\egroup \Direction=\the\Direction}\next@ \imposeDirection@ }}
\xydef@\reverseDirection@{%
\d@X=-\d@X \d@Y=-\d@Y
\ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
\ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
\dimen@=4\K@ \ifnum\Direction<\z@ \advance\Direction\dimen@
\else \advance\Direction-\dimen@ \fi
\count@=\DirectionChar \ifnum\count@<64 \advance\count@64
\else \advance\count@-64 \fi \chardef\DirectionChar=\count@
\edef\cosDirection{\if-\cosDirection\else-\cosDirection\fi}%
\edef\sinDirection{\if-\sinDirection\else-\sinDirection\fi}%
\resetupDirection@}
\xydef@\aboveDirection@#1{%
\dimen@=\d@X \d@X=-\d@Y \d@Y=\dimen@
\dimen@=\K@dXdY \K@dXdY=-\K@dYdX \K@dYdX=-\dimen@
\ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
\ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
\dimen@=2\K@ \ifdim 1\Direction<\dimen@\else \dimen@=-6\K@ \fi
\advance\Direction\dimen@
\count@=\DirectionChar \ifnum\count@<96 \advance\count@32
\else \advance\count@-96 \fi \chardef\DirectionChar=\count@
\count@=\SemiDirectionChar \ifnum\count@<64 \advance\count@64
\else \advance\count@-64 \fi \chardef\SemiDirectionChar=\count@
\let\tmp@=\cosDirection
\edef\cosDirection{\if-\sinDirection\else-\sinDirection\fi}%
\let\sinDirection=\tmp@
\dimen@=#1\relax \d@X=\cosDirection\dimen@ \d@Y=\sinDirection\dimen@
\resetupDirection@}
\xydef@\belowDirection@#1{%
\dimen@=\d@X \d@X=\d@Y \d@Y=-\dimen@
\dimen@=\K@dXdY \K@dXdY=-\K@dYdX \K@dYdX=-\dimen@
\ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
\ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
\dimen@=-2\K@\ifdim 1\Direction<\dimen@\dimen@=6\K@\fi
\advance\Direction\dimen@
\count@=\DirectionChar \ifnum\count@<32 \advance\count@96
\else \advance\count@-32 \fi \chardef\DirectionChar=\count@
\count@=\SemiDirectionChar \ifnum\count@<64 \advance\count@64
\else \advance\count@-64 \fi \chardef\SemiDirectionChar=\count@
\let\tmp@=\sinDirection
\edef\sinDirection{\if-\cosDirection\else-\cosDirection\fi}%
\let\cosDirection=\tmp@
\dimen@=#1\relax \d@X=\cosDirection\dimen@ \d@Y=\sinDirection\dimen@
\resetupDirection@}
\xydef@\vDirection@(#1,#2)#3{\dimen@ii=#3\relax
\dimen@=#1\dimen@ii \dimen@ii=#2\dimen@ii
\d@X=\cosDirection\dimen@ \advance\d@X-\sinDirection\dimen@ii
\d@Y=\sinDirection\dimen@ \advance\d@Y \cosDirection\dimen@ii
\X@p=\X@c \advance\X@p-\d@X \Y@p=\Y@c \advance\Y@p-\d@Y
\setupDirection@\ignorespaces}
\xydef@\resetDirection@{%
\d@X=\X@c\advance\d@X-\X@p \d@Y=\Y@c\advance\d@Y-\Y@p
\let\next@=\resetupDirection@
\ifdim\sd@X\d@X<\z@ \let\next@=\setupDirection@i \fi
\ifdim\sd@Y\d@Y<\z@ \let\next@=\setupDirection@i \fi
\next@}
\xydef@\resetupDirection@{%
\edef\Directiontest@@##1##2{\noexpand\DN@{##2}%
\noexpand\ifdim\noexpand\d@X=\the\d@X\relax
\noexpand\ifdim\noexpand\d@Y=\the\d@Y\relax \noexpand\DN@{##1}%
\noexpand\fi\noexpand\fi \noexpand\next@}}
\xydef@\unsetupDirection@{\def\Directiontest@@##1##2{##2}}
\uDirection@\xydashl@
\message{edges,}
\xynew@{if}\ifInside@
\xydef@\zeroEdge#1{%
\ifcase#1\relax \or \Inside@false \or \dimen@=\z@
\or \else \Edge@c={\rectangleEdge}\fi}
\xydef@\circleEdge#1{\ifcase#1\expandafter\circleEdge@
\or \expandafter\circleUnder@ \or \dimen@=\R@c
\or \expandafter\circleProp@ \or \expandafter\circleInner@
\else \expandafter\circleOuter@ \fi}
\xydef@\circleEdge@{\DN@{\ellipseEdge@}%
\ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
\ifdim\R@c=\U@c\DN@{\circlecentredEdge@}%
\else\DN@{\ellipsecentredEdge@}\fi
\fi\fi \next@}
\xydef@\circleProp@{\DN@{\reverseDirection@\ellipseEdge@}%
\ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
\ifdim\R@c=\U@c\DN@{\reverseDirection@\circlecentredEdge@}%
\else\DN@{\reverseDirection@\ellipsecentredEdge@}\fi
\fi\fi \next@}
\xydef@\circleUnder@{\Inside@false
\ifdim\X@p=\X@c \relax \ifdim\Y@p=\Y@c \Inside@true \fi \fi
\ifInside@ \else \expandafter \circleCentre@ \fi}
\xydef@\circleCentre@{{%
\ifdim\L@c=\R@c \relax\else
\dimen@=\R@c\advance\dimen@-\L@c \divide\dimen@\tw@
\advance\X@c\dimen@ \advance\R@c-\dimen@ \fi
\d@X=\X@c \advance\d@X-\X@p \d@X=\ifdim\d@X<\z@-\fi\d@X
\ifdim\U@c=\D@c\relax \else
\dimen@=\U@c\advance\dimen@-\D@c \divide\dimen@\tw@
\advance\Y@c\dimen@ \advance\U@c-\dimen@ \fi
\d@Y=\Y@c \advance\d@Y-\Y@p \d@Y=\ifdim\d@Y<\z@-\fi\d@Y
\DN@{}\ifdim\d@X>\R@c \relax \else \ifdim\d@Y>\U@c \relax
\else \ifdim\U@c=\R@c \DN@{\circlecentredUnder@}%
\else \DN@{\ellipsecentredUnder@}\fi
\fi\fi \next@}}
\xydef@\circleInner@{\DN@{\ellipseInner@}%
\ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
\ifdim\R@c=\U@c\DN@{\circlecentredInner@}%
\else\DN@{\ellipsecentredInner@}\fi
\fi\fi \next@}
\xydef@\circleOuter@{\DN@{\ellipseOuter@}%
\ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
\ifdim\R@c=\U@c\DN@{\circlecentredOuter@}%
\else\DN@{\ellipsecentredOuter@}\fi
\fi\fi \next@}
\xydef@\circlecentredEdge@{%
\dimen@=-\cosDirection\R@c \advance\X@c\dimen@
\dimen@=-\sinDirection\R@c \advance\Y@c\dimen@}
\xydef@\circlecentredUnder@{%
\loop\ifdim\R@c>100\p@ \circlescale@ \repeat
\edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\R@c
\edef\tmp@{\expandafter\removePT@\the\d@X}\advance\dimen@-\tmp@\d@X
\edef\tmp@{\expandafter\removePT@\the\d@Y}\advance\dimen@-\tmp@\d@Y
\ifdim\dimen@>\z@ \aftergroup\Inside@true \fi}
\xydef@\circlescale@{\divide\R@c\KK@ \divide\d@X\KK@ \divide\d@Y\KK@ }
\xydef@\circlecentredInner@{%
\L@c=\sd@X\cosDirection\R@c \D@c=\sd@Y\sinDirection\R@c
\R@c=\L@c \U@c=\D@c \Edge@c={\rectangleEdge}}
\xydef@\circlecentredOuter@{%
\L@c=\R@c \D@c=\R@c \U@c=\D@c \Edge@c={\rectangleEdge}}
\xydef@\ellipsecentredEdge@{\bgroup \X@p=\X@c \Y@p=\Y@c
\ifdim\U@c>\R@c
\X@c=\cosDirection\U@c \Y@c=\sinDirection\U@c
\quotient@\tmp@\U@c\R@c \X@c=\tmp@\X@c \R@c=\U@c
\else
\X@c=\cosDirection\R@c \Y@c=\sinDirection\R@c
\quotient@\tmp@\R@c\U@c \Y@c=\tmp@\Y@c
\fi
\advance\X@c\X@p \advance\Y@c\Y@p
\setupDirection@ \X@c=\X@p \Y@c=\Y@p \circlecentredEdge@
\d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
\ifdim\U@c>\L@c \quotient@\tmp@\L@c\U@c \d@X=\tmp@\d@X
\else \quotient@\tmp@\U@c\R@c \d@Y =\tmp@\d@Y \fi
\X@c=\X@p \advance\X@c\d@X \Y@c=\Y@p \advance\Y@c\d@Y
\edef\next@{\egroup \X@c=\the\X@c \Y@c=\the\Y@c}\next@ }%
\xydef@\ellipsecentredUnder@{%
\ifdim\R@c>64\p@ \circlescale@ \divide\U@c\KK@
\else \ifdim\U@c>64\p@ \circlescale@ \divide\U@c\KK@ \fi\fi
\edef\tmp@{\expandafter\removePT@\the\R@c}\d@Y=\tmp@\d@Y
\edef\tmp@{\expandafter\removePT@\the\U@c}\d@X=\tmp@\d@X
\R@c=\tmp@\R@c \circlecentredUnder@ }
\xydef@\ellipsecentredOuter@{\Edge@c={\rectangleEdge}}
\xydef@\ellipsecentredInner@{%
\bgroup \X@p=\X@c \Y@p=\Y@c \ellipsecentredEdge@
\advance\X@c-\X@p \L@c=\ifdim\X@c<\z@-\fi\X@c
\advance\Y@c-\Y@p \D@c=\ifdim\Y@c<\z@-\fi\Y@c
\edef\next@{\egroup \L@c=\the\L@c \D@c=\the\D@c}\next@
\R@c=\L@c \U@c=\D@c \Edge@c={\rectangleEdge}}
\xydef@\ellipseEdge@{\bgroup
\A@=\R@c \B@=\U@c
\ifdim\R@c=\L@c \d@X=\z@
\else \d@X=.5\R@c \advance\[email protected]\L@c
\advance\A@\L@c \divide\A@\tw@ \fi
\ifdim\U@c=\D@c \d@Y=\z@
\else \d@Y=.5\U@c \advance\[email protected]\D@c
\advance\B@\D@c \divide\B@\tw@ \fi
\bgroup
\L@c=\A@ \U@c=\B@
\R@p=\U@c \advance\R@p\L@c \multiply\R@p\tw@
\ifdim\B@<\A@ \quotient@\tmp@\U@c\L@c \R@c=\tmp@\p@ \D@c=\p@
\quotient@\tmp@\R@p\L@c \R@p=\tmp@\p@
\else
\ifdim\A@<\B@ \quotient@\tmp@\L@c\U@c \D@c=\tmp@\p@ \R@c=\p@
\quotient@\tmp@\R@p\U@c \R@p=\tmp@\p@
\else
\R@c=\p@ \D@c=\p@ \quotient@\tmp@\R@p\U@c \R@p=\tmp@\p@
\fi\fi
\quotient@\sd@X\d@X\L@c \d@X=\sd@X\p@
\quotient@\sd@Y\d@Y\U@c \d@Y=\sd@Y\p@
\loop
\bgroup \U@p=-\p@ \D@p=\z@
\ifdim\R@c<\p@
\edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\R@p
\advance\d@X\cosDirection\dimen@
\else \advance\d@X\cosDirection\R@p \fi
\edef\sd@X{\expandafter\removePT@\the\d@X}%
\advance\U@p\sd@X\d@X
\ifdim\R@c<\p@
\edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\d@X
\advance\D@p\cosDirection\dimen@
\else \advance\D@p\cosDirection\d@X \fi
\ifdim\D@c<\p@
\edef\tmp@{\expandafter\removePT@\the\D@c}\dimen@=\tmp@\R@p
\advance\d@Y\sinDirection\dimen@
\else \advance\d@Y\sinDirection\R@p \fi
\edef\sd@Y{\expandafter\removePT@\the\d@Y}%
\advance\U@p\sd@Y\d@Y
\ifdim\D@c<\p@
\edef\tmp@{\expandafter\removePT@\the\D@c}\dimen@=\tmp@\d@Y
\advance\D@p\sinDirection\dimen@
\else \advance\D@p\sinDirection\d@Y \fi
\multiply\D@p\tw@
\dimen@=\ifdim\U@p<\z@-\fi\U@p
\ifdim\dimen@<.01\p@ \U@p=\z@
\else
\quotient@\tmp@\U@p\D@p \U@p=\tmp@\p@
\ifdim\U@p<\z@\xywarning@{poor convergence}\U@p=\z@
\else \advance\R@p-\U@p \U@p=\ifdim\U@p<\z@-\fi\U@p
\fi \fi
\edef\next@{\egroup \R@p=\the\R@p \U@p=\the\U@p \D@p=\the\D@p}\next@
\ifdim\U@p>\z@ \repeat
\edef\next@{\egroup \dimen@=\the\R@p}\next@
\edef\tmp@{\expandafter\removePT@\the\dimen@}%
\ifdim\B@<\A@ \dimen@=\tmp@\B@ \else \dimen@=\tmp@\A@ \fi
\dimen@=-\dimen@
\advance\X@c\cosDirection\dimen@
\advance\Y@c\sinDirection\dimen@
\edef\next@{\egroup \X@c=\the\X@c \Y@c=\the\Y@c}\next@ }%
\xydef@\ellipseOuter@{\Edge@c={\rectangleEdge}}
\xydef@\ellipseInner@{%
\bgroup \X@p=\X@c \Y@p=\Y@c \ellipseEdge@
\d@X=\X@c\advance\d@X-\X@p
\ifdim\d@X>\z@ \R@p=\d@X \L@p=\R@p
\ifdim\L@c=\R@c\else\advance\L@p\L@c \advance\L@p-\R@c \fi
\else \L@p=-\d@X \R@p=\L@p
\ifdim\L@c=\R@c \else\advance\R@p\R@c \advance\R@p-\L@c \fi
\fi
\d@Y=\Y@c\advance\d@Y-\Y@p
\ifdim\d@Y>\z@ \U@p=\d@Y \D@p=\U@p
\ifdim\D@c=\U@c\else\advance\D@p\D@c \advance\D@p-\U@c \fi
\else \D@p=-\d@Y \U@p=\D@p
\ifdim\D@c=\U@c\else\advance\U@p\U@c \advance\U@p-\D@c \fi
\fi
\edef\next@{\egroup
\L@c=\the\L@p \D@c=\the\D@p \R@c=\the\R@p \U@c=\the\U@p}%
\next@ \Edge@c={\rectangleEdge}}
\xydef@\rectangleEdge#1{\ifcase#1\expandafter\rectangleEdge@
\or \expandafter\rectangleUnder@ \or \expandafter\rectangleDist@
\or \expandafter\rectangleProp@
\else \relax \fi}
\xydef@\rectangleEdge@{%
\ifdim\d@Y<-.05\p@ \rectangleEdge@i
\else\ifdim\d@Y<.05\p@ \rectangleEdge@ii
\else \rectangleEdge@iii\fi\fi
\resetupDirection@}
\xydef@\rectangleEdge@i{%
\ifdim\d@X<-.05\p@
\settomin@\X@c+\R@c\U@c\d@X\d@Y \settomin@\Y@c+\U@c\R@c\d@Y\d@X%1a
\else\ifdim\d@X<.05\p@ \advance\Y@c\U@c
\else \settomin@\X@c-\L@c\U@c\d@X\d@Y \settomin@\Y@c+\U@c\L@c\d@Y\d@X
\fi\fi}
\xydef@\rectangleEdge@ii{%
\ifdim\d@X<-.05\p@ \advance\X@c\R@c
\else\ifdim\d@X<.05\p@
\else \advance\X@c-\L@c
\fi\fi}
\xydef@\rectangleEdge@iii{%
\ifdim\d@X<-.05\p@
\settomin@\X@c+\R@c\D@c\d@X\d@Y \settomin@\Y@c-\D@c\R@c\d@Y\d@X%3a
\else\ifdim\d@X<.05\p@ \advance\Y@c-\D@c
\else \settomin@\X@c-\L@c\D@c\d@X\d@Y \settomin@\Y@c-\D@c\L@c\d@Y\d@X
\fi\fi}
\xydef@\settomin@#1#2#3#4#5#6{%
\edef\nextii@{\A@=\the\A@ \B@=\the\B@}\quotient@\next@{#5}{#6}\nextii@
\dimen@=\sd@X\sd@Y\next@#4\relax
\ifdim#3<\dimen@ \dimen@=#3\fi \advance#1#2\dimen@}
\xydef@\rectangleUnder@{\Inside@false
\ifdim\X@p=\X@c \ifdim\Y@p=\Y@c \Inside@true \fi\fi
\ifInside@ \else
\dimen@=\X@p \advance\dimen@-\X@c
\ifdim \dimen@>-\L@c \relax \ifdim\dimen@<\R@c
\dimen@=\Y@p \advance\dimen@-\Y@c
\ifdim \dimen@>-\D@c \relax \ifdim\dimen@<\U@c
\Inside@true
\fi\fi\fi\fi\fi }
\xydef@\rectangleDist@{\let\next@=\rectangleDist@i
\ifdim\d@X<-.05\p@ \dimen@=\R@c
\else\ifdim\d@X<.05\p@ \dimen@=\z@ \DN@{\dimen@=\dimen@ii}%
\else \dimen@=\L@c \fi\fi
\ifdim\d@Y<-.05\p@ \dimen@ii=\U@c
\else\ifdim\d@Y<.05\p@ \DN@{}%
\else \dimen@ii=\D@c \fi\fi
\next@}
\xydef@\rectangleDist@i{%
\begingroup \quotient@\next\p@{\sd@X\cosDirection\p@}%
\edef\next{\endgroup \dimen@=\next\dimen@}\next
\begingroup \quotient@\next\p@{\sd@Y\sinDirection\p@}%
\edef\next{\endgroup \dimen@ii=\the\dimen@ii}\next
\ifdim\dimen@ii<\dimen@ \dimen@=\dimen@ii \fi}
\xydef@\rectangleProp@{%
\enter@{\A@=\the\A@ \B@=\the\B@ \DirectionfromtheDirection@}%
\reverseDirection@
\dimen@=1\Direction \count@=\K@ \multiply\count@\tw@
\ifnum \Direction>\count@
\DN@{0}%
\advance\dimen@-2\K@ \quotient@\nextii@{\dimen@}{2\K@}%
\else\ifnum \Direction>\z@
\dimen@=-\dimen@ \advance\dimen@2\K@ \quotient@\next@{\dimen@}{2\K@}%
\DNii@{0}%
\else\ifnum \Direction>-\count@
\DN@{1}%
\quotient@\nextii@{-\dimen@}{2\K@}%
\else
\advance\dimen@4\K@ \quotient@\next@{\dimen@}{2\K@}%
\DNii@{1}%
\fi\fi\fi
\advance\X@c-\L@c \dimen@=\L@c \advance\dimen@\R@c
\ifdim\dimen@=\z@ \advance\X@c 2\L@c \else \advance\X@c\next@\dimen@ \fi
\advance\Y@c+\U@c \dimen@=\D@c \advance\dimen@\U@c
\ifdim\dimen@=\z@ \advance\Y@c-2\U@c \advance\Y@c\Upness@\U@c
\else \advance\Y@c-\nextii@\dimen@ \fi
\leave@}
\message{connections;}
\xydef@\Creset@@{}
\xydef@\Cshavep@@{\noCshavep@@}
\xydef@\Cshavec@@{\noCshavec@@}
\xydef@\Cslidep@@{\noCslidep@@}
\xydef@\Cslidec@@{\noCslidec@@}
\xydef@\Calong@@{\noCalong@@}
\xydef@\Cintercept@@{\noCintercept@@}
\xydef@\Cbreak@@{\noCbreak@@}
\xydef@\Clast@@{\noClast@@}
\xylet@\lastbreak@@=\empty
\xydef@\noCshavep@@{\setupDirection@
\enter@{\cfromthec@ \DirectionfromtheDirection@}%
\reverseDirection@ \cfromp@ \the\Edge@c\z@
\pfromc@ \leave@ \resetDirection@}
\xydef@\noCshavec@@{\setupDirection@ \the\Edge@c\z@ \resetDirection@}
\xydef@\noCslidep@@#1{\dimen@=#1\relax
\advance\X@p\cosDirection\dimen@ \advance\Y@p\sinDirection\dimen@
\resetDirection@}
\xydef@\noCslidec@@#1{\dimen@=#1\relax
\advance\X@c\cosDirection\dimen@ \advance\Y@c\sinDirection\dimen@
\resetDirection@}
\xydef@\noCalong@@#1{%
\d@X=#1\d@X \d@Y=#1\d@Y \X@c=\X@p \Y@c=\Y@p \advance\X@c\d@X \advance\Y@c\d@Y
\resetupDirection@}
\xydef@\noCintercept@@{\enter@{\pfromthep@}%
\begingroup\Creset@@ \edef\tmp@{\endgroup
\X@origin=\the\X@p \Y@origin=\the\Y@p \R@c=\the\d@X \U@c=\the\d@Y}\tmp@
\loop@\dimen@=\ifdim\R@c<\z@-\fi\R@c \advance\dimen@\ifdim\U@c<\z@-\fi\U@c
\ifdim\dimen@>10\p@ \advance\R@c \ifdim\R@c<\z@-\fi 16sp \divide\R@c\KK@
\advance\U@c \ifdim\U@c<\z@-\fi 16sp \divide\U@c\KK@ \repeat@
\intersect@ \leave@}
\xydef@\noCbreak@@{\edef\lastbreak@@{\cfromthec@}}
\xydef@\noClast@@{\Creset@@ \edef\lastbreak@@{\cfromthep@}}
\xydef@\no@@{\setupDirection@ \edef\lastbreak@@{\cfromthep@}%
\enter@{\cfromthec@\pfromthep@\DirectionfromtheDirection@}%
\edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
\edef\next@{{\sd@X}{\sd@Y}}\expandafter\straightcheckoverlap@\next@
\setupDirection@ \the\Edge@c\z@
\swap@\reverseDirection@\the\Edge@c\z@\swap@\reverseDirection@
\resetDirection@
\edef\Cshavep@@{\DirectionfromtheDirection@
\pfromthep@\noexpand\resetDirection@}%
\edef\Cshavec@@{\DirectionfromtheDirection@
\cfromthec@\noexpand\resetDirection@}%
\leave@
\def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
\def\Calong@@{\noCalong@@}\def\Cintercept@@{\noCintercept@@}%
\def\Cbreak@@{\noCbreak@@}\def\Clast@@{\noClast@@}\noinsert@}
\xydef@\noinsert@{\ifHidden@\else
\ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
\ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
\ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
\ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi
\fi}
\xydef@\Spread@@{}
\xydef@\checkoverlap@@{}
\xydef@\straight@#1{\setupDirection@ \def\Spread@@{#1}%
\edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
\edef\lastbreak@@{\cfromthep@}%
\edef\next@{{\sd@X}{\sd@Y}}\expandafter\straightcheckoverlap@\next@
\setupDirection@ \the\Edge@c\z@
\swap@\reverseDirection@\the\Edge@c\z@\swap@\reverseDirection@
\resetDirection@
\edef\Cshavep@@{\DirectionfromtheDirection@
\pfromthep@\noexpand\resetDirection@}%
\edef\Cshavec@@{\DirectionfromtheDirection@
\cfromthec@\noexpand\resetDirection@}%
\noinsert@
\straight@typeset
\DN@{\def\Cbreak@@{\straightCbreak@}\def\Clast@@{\straightClast@}}%
\DNii@{\solidSpread@}\ifx\nextii@\Spread@@
\let\solidhrule@@=\solidhrule@i \let\solidvrule@@=\solidvrule@i
\checkXy@rules@
\fi\next@
\def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
\def\Calong@@{\noCalong@@}\def\Cintercept@@{\noCintercept@@}%
\Creset@@}
\xydef@\straightcheckoverlap@#1#2{\def\checkoverlap@@{%
\ifdim#1\X@p>#1\X@c \let\next@=\relax \fi
\ifdim#2\Y@p>#2\Y@c \let\next@=\relax \fi}}
\xydef@\straight@typeset{%
\ifInvisible@ \let\next@=\relax
\else\ifdim 1\Direction<-2\K@ \let\next@=\straightv@
\else\ifdim 1\Direction<\z@ \let\next@=\straighth@
\else\ifdim 1\Direction<2\K@ \let\next@=\straightv@
\else \let\next@=\straighth@ \fi\fi\fi\fi
\checkoverlap@@ \next@}
\xylet@\nextbreak@@=\empty
\xydef@\straightCbreak@{\edef\nextbreak@@{\cfromthec@}\connectRestore@
\Creset@@ \swap@ \the\Edge@c4\enter@{\cmergethec@}\lastbreak@@ \leave@
\swap@ \the\Edge@c4\enter@{\cmergethec@}\nextbreak@@ \leave@
\setupDirection@
\the\Edge@c\z@
\swap@ \reverseDirection@ \the\Edge@c\z@ \swap@ \reverseDirection@
\resetDirection@ \noinsert@ \straight@typeset
\Creset@@ \let\lastbreak@@=\nextbreak@@}
\xydef@\straightClast@{\connectRestore@
\Creset@@ \swap@ \the\Edge@c4\enter@{\cmergethec@}\lastbreak@@ \leave@
\swap@
\setupDirection@
\the\Edge@c\z@
\swap@\reverseDirection@ \the\Edge@c\z@ \swap@\reverseDirection@
\resetDirection@ \noinsert@ \straight@typeset
\Creset@@ \edef\lastbreak@@{\cfromthep@}}
\xydef@\straighth@{\setbox\z@=\hbox{%
\setbox8=\copy\lastobjectbox@
\A@=\wd8\relax \B@=\dp8\relax \advance\B@\ht8\relax
\ifdim \A@=\z@ \count@@=\m@ne
\else \dimen@=\sd@X\d@X \divide\dimen@\A@ \count@@=\dimen@ \fi
\Spread@@
\ifdim\d@X>\z@ \advance\X@c-\wd8\relax\fi
\dimen@=-\sd@X\wd8\relax
\multiply\dimen@\K@dYdX \divide\dimen@\K@
\ifdim\d@X>\z@ \advance\Y@c\dimen@ \advance\Y@c-\Leftness@\dimen@
\else \advance\Y@c\Leftness@\dimen@ \fi
\dimen@=\wd8\relax \A@=\sd@X\d@X \advance\A@-\dimen@
\B@=\sd@X\dimen@ \multiply\B@\K@dYdX \divide\B@\K@
\advance\B@-\d@Y \B@=\sd@Y\B@
\count@=\count@@ \advance\count@\m@ne
\ifnum\z@<\count@ \divide\A@\count@ \divide\B@\count@ \fi
\A@=-\sd@X\A@ \B@=\sd@Y\B@ \wd8=\A@
\kern\X@c \count@=\z@
\loop@\ifnum\count@<\count@@ \advance\count@\@ne
\raise\Y@c\copy8\relax \advance\Y@c\B@ \repeat@}%
\ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}
\xydef@\straightv@{\setbox\z@=\vtop{%
\setbox8=\copy\lastobjectbox@
\A@=\wd8\relax \B@=\dp8\relax \advance\B@\ht8\relax
\ifdim \B@=\z@ \count@@=\m@ne
\else \dimen@=\sd@Y\d@Y \divide\dimen@\B@ \count@@=\dimen@ \fi
\Spread@@
\dimen@=\dp8\relax \advance\dimen@\ht8\relax
\B@=\sd@Y\d@Y \advance\B@-\dimen@
\A@=\sd@Y\dimen@ \multiply\A@\K@dXdY \divide\A@\K@ \advance\A@-\d@X
\A@=\sd@X\A@ \count@=\count@@ \advance\count@\m@ne
\ifnum\z@<\count@ \divide\B@\count@ \divide\A@\count@ \fi
\B@=\sd@Y\B@ \A@=\sd@X\A@ \ht8=\B@ \dp8=\z@
\ifdim\d@Y<\z@
\advance\Y@c\dimen@ \advance\Y@c\Upness@\B@
\else
\advance\dimen@\Upness@\B@ \advance\Y@c-\dimen@ \advance\Y@c\B@
\fi
\advance\Y@c\B@
\ifdim\d@X<\z@ \else \advance\X@c-\wd8\relax \fi
\null \kern-\Y@c \count@=\z@
\loop@\ifnum\count@<\count@@ \advance\count@\@ne
\nointerlineskip \moveright\X@c\copy8\relax \advance\X@c\A@
\repeat@}%
\ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}
\message{ Xy-pic loaded}\xyuncatcodes \endinput
|