%% xygraph.tex from $Id: xygraph.doc,v 2.12 1994/10/25 11:34:25 kris Exp $
%%
%% XY-pic ``Graph Combinator feature'' option.
%% Copyright (c) 1994 Kristoffer H. Rose <kris@diku.dk>
%%
%% This file is part of the XY-pic package for graphs and diagrams in TeX.
%% See the companion README and INSTALL files for further information.
%% Copyright (c) 1991-1994 Kristoffer H. Rose <kris@diku.dk>
%%
%% The XY-pic package is free software; you can redistribute it and/or modify
%% it under the terms of the GNU General Public License as published by the
%% Free Software Foundation; either version 2 of the License, or (at your
%% option) any later version.
%%
%% The XY-pic package is distributed in the hope that it will be useful, but
%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
%% for more details.
%%
%% You should have received a copy of the GNU General Public License along
%% with this package; if not, write to the Free Software Foundation, Inc.,
%% 675 Mass Ave, Cambridge, MA 02139, USA.
%%
\ifx\xyloaded\undefined \input xy \fi
\xyprovide{graph}{Graph Combinator feature}{\stripRCS$Revision: 2.12 $}%
 {Kristoffer H.~Rose}{kris@diku.dk}%
 {Computer Science, University of Copenhagen, Universitetsparken~1,
 DK--2100 K{\o}benhavn~{\O}}
\xyrequire{arrow}\xycatcodes
\xydef@\xygraph#1{\relax \if\inxy@ \DN@{\xy@@{\nter@{}}}%
 \else \DN@{\addGT@{\addLT@\xy 0ex,.8ex}\xy@\xy{\nter@\endxy}}\fi \next@
 \xy@\xygraph{\senter@ \idfromc@{?NODE}%
 \expandafter\let\expandafter\next@\csname Q@graphbase\endcsname
 \ifx\next@\relax \setbase@\z@\z@{3pc}\z@
 \else \expandafter\next@ \fi}%
 \xyFN@\GRAPH@ #1\GRAPH@}
\xydef@\GRAPH@{%
 \ifx \space@\next \expandafter\DN@\space{\xyFN@\GRAPH@}%
 \else\ifx :\next \DN@:{\xy@:{}\GRAPHarr@}%
 \else\addDASH@\ifx\next \addDASH@\DN@{\addAT@{\xyFN@\GRAPH@:}{-}}%
 \else\ifx (\next \DN@({\xy@({\spushc@ \idfromc@{?NODE}}\xyFN@\GRAPH@}%
 \else\ifx ,\next
 \DN@,{\xy@,{\if\sempty@ \xyerror@{, only allowed in <list>}{}\fi
 \cfromid@{?NODE}}\xyFN@\GRAPH@}%
 \else\ifx )\next
 \DN@){\xy@){\if\sempty@ \xyerror@{) only allowed after (}{}\fi
 \cfromid@{?NODE}\spop@ \idfromc@{?NODE}}\xyFN@\GRAPH@}%
 \else\ifx \GRAPH@\next \DN@\GRAPH@{\xy@@{\sleave@\leave@}}%
 \else\ifx ~\next
 \DN@~{\xy@@{\enter@\cfromthec@}\afterNODE{\leave@ \xyFN@\GRAPH@}!}%
 \else \DN@{\afterNODE{\xyFN@\GRAPH@}}%
 \fi\fi\fi\fi\fi\fi\fi\fi \next@}
\xylet@\GRAPHsaved@PATHafterPOS=\PATHafterPOS
\xylet@\GRAPHsaved@afterarr@@=\afterarr@@
\xydef@\GRAPHarr@{%
 \let\PATHafterPOS=\afterNODE \let\afterarr@@=\GRAPHafterarr@ \ar}
\xydef@\GRAPHafterarr@{%
 \let\PATHafterPOS=\GRAPHsaved@PATHafterPOS
 \let\afterarr@@=\GRAPHsaved@afterarr@@
 \xy@@{\lastNODE@@}\xyFN@\GRAPH@}
\xylet@\afterNODE@@=\empty
\xydef@\afterNODE#1{%
 \DN@##1{\def\afterNODE@@{\def\afterNODE@@{##1}#1}}%
 \expandafter\next@\expandafter{\afterNODE@@}%
 \xyFN@\NODE@}
\xylet@\lastNODE@@=\relax
\xylet@\theMOVE@@=\relax
\xydef@\NODE@{%
 \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@}%
 \else\ifx "\next \DN@ "##1"{\xy@{"##1"}{\cfromid@{##1}}\xyFN@\NODE@i}%
 \else\ifx ?\next \DN@ ?{\xy@?{\cfromid@{?NODE}}\xyFN@\NODE@i}%
 \else\ifx [\next \DN@[##1]{\xy@{[##1]}{}\def\theMOVE@@{[##1]}\xyFN@\MOVE@##1]}%
 \else\ifx !\next \DN@!{\xyFN@\NODE@escape}%
 \else \xyerror@{illegal <node>}{}%
 \fi\fi\fi\fi\fi \next@}
\xydef@\MOVE@{\xy@@{\count@=\z@ \count@@=\z@}%
 \ifx \space@\next \expandafter\DN@\space{\xyFN@\MOVE@}%
 \else\ifcat A\next \let\next@=\MOVE@letter
 \else \let\next@=\MOVE@x \fi\fi \next@}
\xydef@\MOVE@letter{%
 \ifx \space@\next \expandafter\DN@\space{\xyFN@\MOVE@letter}%
 \else\ifx u\next \DN@ u{\xy@@{\advance\count@\@ne}\xyFN@\MOVE@letter}%
 \else\ifx d\next \DN@ d{\xy@@{\advance\count@\m@ne}\xyFN@\MOVE@letter}%
 \else\ifx l\next \DN@ l{\xy@@{\advance\count@@\m@ne}\xyFN@\MOVE@letter}%
 \else\ifx r\next \DN@ r{\xy@@{\advance\count@@\@ne}\xyFN@\MOVE@letter}%
 \else \let\next@=\MOVE@x \fi\fi\fi\fi\fi \next@}
\xydef@\MOVE@x{%
 \ifx ]\next
 \DN@ ]{\xy@@{\czeroEdge@ \enter@\cplusthec@
 \edef\next@{\the\count@@,\the\count@ @}%
 \expandafter\vfromcartesian@@\next@
 \advance\Xc-\Xorigin \advance\Yc-\Yorigin \leave@}\xyFN@\NODE@i}%
 \else \xyerror@{illegal <move>: \theMOVE@@}{}\let\next@=\NODE@i
 \fi \next@}
\xydef@\NODE@i{%
 \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@i}%
 \else\ifcat A\noexpand\next \let\next@=\NODE@it
 \else\ifx \bgroup\next \let\next@=\NODE@it
 \else\ifx *\next \let\next@=\NODE@it
 \else\ifx 0\next \let\next@=\NODE@it
 \else\ifx 1\next \let\next@=\NODE@it
 \else\ifx 2\next \let\next@=\NODE@it
 \else\ifx 3\next \let\next@=\NODE@it
 \else\ifx 4\next \let\next@=\NODE@it
 \else\ifx 5\next \let\next@=\NODE@it
 \else\ifx 6\next \let\next@=\NODE@it
 \else\ifx 7\next \let\next@=\NODE@it
 \else\ifx 8\next \let\next@=\NODE@it
 \else\ifx 9\next \let\next@=\NODE@it
 \else\addEQ@\ifx \next
 \addEQ@\DN@"##1"{\xy@{="##1"}{\idfromc@{##1}}\xyFN@\NODE@i}%
 \else \xy@@{\edef\lastNODE@@{\cfromthec@}}\let\next@=\afterNODE@@
 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
\xydef@\NODE@it{\let\PATHlabelit@@=\NODEit@ \PATHit@}
\xydef@\NODEit@#1{%
 \DN@{#1}\ifx\next@\empty \DN@{\addPLUS@\NODEit@i}%
 \else \DN@{\NODEit@i{#1}}\fi \next@}
\xydef@\NODEit@i#1#2{\xy@{*#1{#2}}{\drop@{#1}{#2}\idfromc@{#2}}\xyFN@\NODE@i}
\xydef@\NODE@escape{%
 \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@escape}%
 \else\ifx M\next \DN@ M##1##{\NODE@matrix{##1}}%
 \else\ifx P\next \DN@ P##1##{\NODE@poly{##1}}%
 \else\ifx \bgroup\next
 \DN@##1{\xy@{!{##1}}{}\POS##1\relax \xyFN@\NODE@i}%
 \else \DN@{\xyerror@{Unknown graph <escape>}{}\xyFN@\NODE@i}%
 \fi\fi\fi\fi \next@}
\xydef@\NODE@matrix#1#2{\xyerror@{matrix feature not loaded}{}\xyFN@\GRAPH@}
\xydef@\NODE@matrix@#1#2{\xy@{!M#1{#2}}{}%
 \def\everyentry@{\GRAPHeveryentry}%
 \xymatrix#1{#2}%
 \let\everyentry@=\empty \insertmatrixingraph@ \xyFN@\NODE@i}
\xydef@\GRAPHeveryentry{\def\:{\ar}\def\="##1"{\xy@@{\idfromc@{##1}}}}
\xywithoption{matrix}{\let\NODE@matrix=\NODE@matrix@}
\xydef@\insertmatrixingraph@{%
 \xy@@{\enter@{\cfromthec@ \pfromthep@}%
 \expandafter\let\expandafter\next@\csname Q@1,1\endcsname
 \ifx\next@\relax\else
 \next@ \swap@
 \expandafter\let\expandafter\next@\csname Q@1,2\endcsname
 \ifx\next@\relax\else \next@ \setbase@\Xp\Yp\Xc\Yc
 \expandafter\let\expandafter\next@\csname Q@2,1\endcsname
 \ifx\next@\relax\else
 \next@ \setbase@@{-\Xc}{-\Yc}\fi\fi\fi
 \leave@}}
\xydef@\NODE@poly#1#2{\xyerror@{poly(gon) feature not loaded}{}\xyFN@\GRAPH@}
\xydef@\NODE@poly@#1#2{\xy@{!P#1{#2}}{}\xypoly@#1{#2}\xyFN@\NODE@i}
\xywithoption{poly}{\let\NODE@poly=\NODE@poly@}
\xyendinput
