%% xymatrix.tex from $Id: xymatrix.doc,v 2.12 1994/10/25 11:34:25 kris Exp $
%%
%% XY-pic ``Matrix'' feature.
%% Copyright (c) 1991-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{matrix}{Matrix feature}{\stripRCS$Revision: 2.12 $}%
 {Kristoffer H.~Rose}{kris@diku.dk}%
 {Computer Science, University of Copenhagen, Universitetsparken~1,
 DK--2100 K{\o}benhavn~{\O}}
\xynew@{count}\row@
\xynew@{count}\col@
\xylet@\maxrow@=\z@
\xylet@\maxcol@=\z@
\xylet@\maxcolrow@=\z@
\xynew@{toks}\queue@
\xynew@{toks}\queue@@
\xynew@{count}\qcount@
\xynew@{count}\qcount@@
\xydef@\clearq@{%
 \global\queue@={}\global\qcount@=\@ne
 \global\queue@@={}\global\qcount@@=\z@}
\xydef@\addq@#1{\global\advance\matrixsize@\@ne
 \ifnum\qcount@@<\qcount@ \let\addq@@=\addq@i
 \else \let\addq@@=\addq@ii \fi
 \expandafter\addq@@\the\queue@@\addq@@{#1}}
\xylet@\addq@@=\relax
\xydef@\addq@i#1\addq@@#2{%
 \global\advance\qcount@@\@ne \global\queue@@={#1#2}}
\xydef@\addq@ii#1\addq@@#2{%
 \global\advance\qcount@\@ne \global\qcount@@=\z@ 
 \global\queue@=\expandafter{\the\queue@#1#2}\global\queue@@={}}
\xydef@\finishq@{\expandafter\addq@ii\the\queue@@\addq@@{}}
\xynew@{count}\matrixsize@
\xydef@\xymatrix{\message{<xymatrix}\global\matrixsize@=\z@
 \if\inxy@ \DN@{\xy@@{\nter@{}}}%
 \else \DN@{\xy\xytracing\xy@@{\nter@\endxy}}\fi \next@
 \xy@{MATRIX}{\save@ \edef\matrixorigin@{\Xc=\the\Xc \Yc=\the\Yc}}%
 \xyFN@\xymatrix@}
\xydef@\xymatrix@{%
 \addAT@\ifx\next \addAT@\DN@{%
 \afterDIRECTIONorEMPTY{\xymatrix@rotation \xyFN@\xymatrix@}{\xyFN@\xymatrix@}}%
 \else \let\next@=\xymatrix@i \fi \next@}
\xydef@\xymatrix@i#1#{\DN@{#1}\ifx\next@\empty \expandafter\xymatrix@ii
 \else \xyerror@{\string\xymatrix: {<rows>} expected}{}\fi}
\xydef@\xymatrix@ii#1{%
 \xymatrix@pretypeset{#1}\message{\maxcol@ x\maxrow@}%
 \xymatrix@measureit \xymatrix@setup
 \xymatrix@typeset{#1}\restore \xymatrix@insert
 \xy@@\leave@ \message{\the\matrixsize@>}\ignorespaces}
\xydef@\xymatrixcos@@{1}
\xydef@\xymatrixsin@@{0}
\xydef@\xymatrix@rotation{%
 \xy@@{\edef\xymatrixcos@@{\cosDirection}\edef\xymatrixsin@@{\sinDirection}}}
\xylet@\xymatrixsavedCOORD@=\relax
\xydef@\xymatrix@pretypeset#1{\xy@{MATRIX PRETYPESET}{}%
 \global\row@=\z@ \global\let\maxcol@=\z@ \clearq@
 \setbox8=\vtop{%
 \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
 \let\COORD@=\xymatrixCOORD@
 \everycr{}\let\\=\cr \tabskip=\z@ \offinterlineskip
 \halign{\prentry@ ##!@&&\xyFN@\prentry@@##!@\cr#1\prentry@@@\crcr}}%
 \xdef\maxrow@{\the\row@}%
 \finishq@}
\xydef@\prentry@{\relax
 \ifnum\row@>\z@
 \ifnum\maxcol@<\col@ \xdef\maxcol@{\the\col@}\xdef\maxcolrow@{\the\row@}\fi
 \expandafter\xdef\csname maxcol@\the\row@\endcsname{\the\col@}\fi
 \global\advance\row@\@ne \global\col@=\z@ \xyFN@\prentry@@}
\xylet@\lastprentry@@=\relax
\xydef@\xyeatall@{\let\xy@=\xyeat@ \let\oxy@=\xyeat@ \let\xy@@ix@=\eat@}
\xydef@\prentry@@{\global\advance\col@\@ne
 \let\next@=\prentry@@norm
 \ifoldxymatrix@\else \ifx *\next \DN@*##1##{\prentry@@star{##1}}\fi \fi
 \next@}
\xydef@\prentry@@star#1#2#3!@{\gdef\lastprentry@@{*#1{#2}#3}%
 \setbox\lastobjectbox@=\object#1{#2}%
 \prentry@@x}
\xydef@\prentry@@norm#1!@{\gdef\lastprentry@@{#1}%
 \DN@{\setbox\lastobjectbox@=\object}%
 \expandafter\next@\entrymodifiers@{\xyeatall@ \everyentry@ #1}%
 \prentry@@x}
\xydef@\prentry@@x{%
 \edef\next@{{\noexpand\XYsetRC@{\the\row@}{\Upness@}{\the\col@}{\Leftness@}%
 {\the\Lc}{\the\Rc}{\the\Dc}{\the\Uc}{\expandafter\noexpand\the\Edgec}}}%
 \expandafter\addq@\next@
 \box\lastobjectbox@}
\xynew@{if}\ifoldxymatrix@ \oldxymatrix@false
\xydef@\prentry@@@{\relax \let\next@=\prentry@@@i
 \ifoldxymatrix@ \ifnum\col@=\@ne \ifx\lastprentry@@\empty
 \global\advance\row@\m@ne \let\next@=\relax \fi\fi\fi
 \global\let\lastprentry@@=\relax \next@}
\xydef@\prentry@@@i{%
 \ifnum\maxcol@<\col@ \xdef\maxcol@{\the\col@}\xdef\maxcolrow@{\the\row@}\fi
 \expandafter\xdef\csname maxcol@\the\row@\endcsname{\the\col@}}
\xydef@\XYsetRC@#1#2#3#4#5#6#7#8#9{%
 \edef\nextii@{{\csname Yrow@#1\endcsname}{\csname Hrow@#1\endcsname}%
 {\csname Xcol@#3\endcsname}{\csname Wcol@#3\endcsname}}%
 \DN@##1##2##3##4{%
 \xy@{SETUP "#1,#3"}{\matrixorigin@
 \dimen@ =-##2\dimen@ =.5\dimen@ \advance\dimen@ ##1\relax
 \dimen@ii= ##4\dimen@ii=.5\dimen@ii \advance\dimen@ii##3\relax
 \advance\Xc \xymatrixcos@@\dimen@ii \advance\Xc-\xymatrixsin@@\dimen@
 \advance\Yc \xymatrixsin@@\dimen@ii \advance\Yc \xymatrixcos@@\dimen@
 \Lc=#5\Rc=#6\Dc=#7\Uc=#8\Edgec={#9}%
 \idfromc@{#1,#3}}}%
 \expandafter\next@\nextii@}
\xydef@\xymatrix@measureit{\xy@{MATRIX MEASURE}{}%
 \setbox6=\vbox{\unvbox8 \global\row@=\maxrow@
 \loop@ \dimen@ii=\lastskip\unskip \ifnum\z@<\row@
 \setbox4=\lastbox \dimen@=\dp4 \advance\dimen@\ht4
 \expandafter\xdef\csname Hrow@\the\row@\endcsname{\the\dimen@}%
 \ifnum\row@=\maxcolrow@
 \setbox2=\hbox{\unhbox4
 \global\col@=\maxcol@
 \loop@ \dimen@ii=\lastskip\unskip \ifnum\z@<\col@
 \setbox\z@=\lastbox
 \expandafter\xdef\csname Wcol@\the\col@\endcsname{\the\wdz@}%
 \global\advance\col@\m@ne
 \repeat@}\fi
 \global\advance\row@\m@ne
 \repeat@}%
 \count@=\@ne
 \dimen@=\csname Wcol@1\endcsname \dimen@=-.5\dimen@
 \loop@
 \expandafter\xdef\csname Xcol@\the\count@\endcsname{\the\dimen@}%
 \advance\dimen@\csname Wcol@\the\count@\endcsname
 \advance\dimen@\xymatrixcolsep@
 \ifnum\count@<\maxcol@ \advance\count@\@ne \repeat@
 \count@=\@ne
 \dimen@=\csname Hrow@1\endcsname \dimen@=.5\dimen@
 \loop@
 \expandafter\xdef\csname Yrow@\the\count@\endcsname{\the\dimen@}%
 \advance\dimen@-\csname Hrow@\the\count@\endcsname
 \advance\dimen@-\xymatrixrowsep@
 \ifnum\count@<\maxrow@ \advance\count@\@ne \repeat@}
\xydef@\xymatrix@setup{\xy@{MATRIX SETUP}{}%
 \the\queue@ \global\queue@={}}
\xydef@\xymatrix@typeset#1{%
 \xy@{MATRIX TYPESET}{}%
 \clearq@
 \hbox{\vtop{\xyqall@
 \xy@@{\ifx\xymatrixsavedCOORD@\relax
 \enter@{\noexpand\let\noexpand\COORD@\noexpand\xymatrixsavedCOORD@}%
 \let\xymatrixsavedCOORD@=\COORD@ \let\COORD@=\xymatrixCOORD@
 \else \enter@{}\fi}%
 \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
 \let\COORD@=\xymatrixCOORD@
 \kern\z@ \global\row@=\z@
 \everycr{}\let\\=\cr \tabskip=\z@ \offinterlineskip
 \halign{\entry@##!@&&\entry@@##!@\cr#1\crcr}%
 \xy@@{\leave@}%
 }}%
 \finishq@
 \expandafter\xy@@\expandafter{\the\queue@}\global\queue@={}%
}
\xydef@\entry@{\relax \global\advance\row@\@ne \global\col@=\z@ \entry@@}
\xylet@\entry@minmax=\empty
\xydef@\entry@@{\global\advance\col@\@ne
 \DN@##1,##2@{\xy@{ENTRY "##1,##2"}{\row@=##1 \col@=##2\relax
 \entry@minmax \cfromid@{##1,##2}\pfromc@}}%
 \edef\nextii@{\the\row@,\the\col@ @}\expandafter\next@\nextii@
 \xyFN@\entry@@i}
\xydef@\entry@@i{\let\next@=\entry@@norm
 \ifoldxymatrix@\else \ifx *\next \DN@*##1##{\entry@@star{##1}}\fi \fi
 \next@}
\xydef@\entry@@star#1#2#3!@{%
 \xy@@ix@{{#1}{#2}}\xy@@{\expandafter\dropentry@\the\toks9}%
 \setboxz@h{\xyqall@
 \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
 \let\COORD@=\xymatrixCOORD@ \everyentry@ #3}%
 \setbox\z@=\copy\voidb@x}
\xydef@\entry@@norm#1!@{%
 \DN@##1{\expandafter\xy@@ix@
 \expandafter{\expandafter{\entrymodifiers@}{##1}}}%
 \expandafter\next@\expandafter{\everyentry@#1}%
 \xy@@{\expandafter\dropentry@\the\toks9}%
 \setbox\z@=\expandafter\object\entrymodifiers@{\xyqall@
 \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
 \let\COORD@=\xymatrixCOORD@ \everyentry@ #1}%
 \setbox\z@=\copy\voidb@x}
\xydef@\dropentry@#1#2{\drop@{#1}{\xyeatall@
 \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
 \let\COORD@=\xymatrixCOORD@ #2}}
\xydef@\xyqall@{%
 \ifxysaving@ \let\xy@=\xyqs@ \let\xy@@ix@=\xysave@@toksix@
 \else \let\xy@=\xyq@ \let\xy@@ix@=\xyq@@toksix@ \fi
 \let\oxy@=\xy@}
\xydef@\xyq@#1#2{\addq@{#2}}
\xydef@\xyq@@toksix@{\begingroup
 \xyuncatcodes \afterassignment\xyq@@toksix@i \global\toks9=}
\xydef@\xyq@@toksix@i{%
 \DN@##1{\endgroup \xy@@{\global\toks9={##1}}}%
 \expandafter\next@\expandafter{\the\toks9}}
\xydef@\xyqs@{\global\advance\matrixsize@\@ne \xysave@}
\xydef@\xymatrix@insert{%
 \edef\nextii@{{\csname Xcol@1\endcsname}{\csname Xcol@\maxcol@\endcsname}%
 {\csname Wcol@\maxcol@\endcsname}{\csname Yrow@\maxrow@\endcsname}%
 {\csname Hrow@1\endcsname}{\csname Yrow@1\endcsname}}%
 \expandafter\xymatrix@insert@\nextii@}
\xydef@\xymatrix@insert@#1#2#3#4#5#6{%
 \xy@{MATRIX INSERT}{\Lc=-#1\Rc=#2\advance\Rc#3\relax
 \Dc=-#4\advance\Dc#5\Uc=#6\relax
 \Edgec={\rectangleEdge}}}
\xylet@\thematrixCOORD@@=\relax
\xydef@\xymatrixCOORD@{%
 \ifx [\next
 \DN@[##1]{\xy@{[##1]}{\def\thematrixCOORD@@{[##1]}}%
 \xyFN@\xymatrixCOORD@i##1]}%
 \else \let\next@=\xymatrixsavedCOORD@
 \fi \next@}
\xydef@\xymatrixCOORD@i{\count@=\row@ \count@@=\col@
 \ifcat A\next \let\next@=\xymatrixCOORD@letter
 \else\ifx ]\next \let\next@=\xymatrixCOORD@letter
 \else \let\next@=\xymatrixCOORD@other \fi\fi \next@}
\xydef@\xymatrixCOORD@letter{%
 \ifx u\next \advance\count@\m@ne \DN@ u{\xyFN@\xymatrixCOORD@letter}%
 \else\ifx d\next \advance\count@\@ne \DN@ d{\xyFN@\xymatrixCOORD@letter}%
 \else\ifx l\next \advance\count@@\m@ne \DN@ l{\xyFN@\xymatrixCOORD@letter}%
 \else\ifx r\next \advance\count@@\@ne \DN@ r{\xyFN@\xymatrixCOORD@letter}%
 \else\ifx ]\next \DN@]{\xymatrixCOORD@x}%
 \else \let\next@=\xymatrixCOORD@letter
 \xyerror@{illegal <coord>: only letters lrud within \string[\string]s}{}%
 \fi\fi\fi\fi\fi \next@}
\xydef@\xymatrixCOORD@other#1,#2]{%
 \advance\count@#1\advance\count@@#2\xymatrixCOORD@x}
\xydef@\xymatrixCOORD@x{\DN@##1{\xy@@{%
 \expandafter\let\expandafter\next@\csname Q@##1\endcsname
 \ifx\next@\relax \xyerror@RC{##1}\else \next@\fi}%
 \afterCOORD@}%
 \edef\nextii@{{\the\count@,\the\count@@}}\expandafter\next@\nextii@}
\xydef@\xyerror@RC#1{\xyerror@{in entry \string"\the\row@,\the\col@\string": No
 \codeof\thematrixCOORD@@\space (is \string"#1\string") from here}{}}
\xydef@\xymatrixrowsep@{2pc}
\xydef@\xymatrixcolsep@{2pc}
\xydef@\xymatrixrowsep{\afterADDOP{\Addop@@\xymatrixrowsep@}}
\xydef@\xymatrixcolsep{\afterADDOP{\Addop@@\xymatrixcolsep@}}
\xywarnifdefined\entrymodifiers
\expandafter\def\addEQ@\entrymodifiers#1{\def\entrymodifiers@{#1}\ignorespaces}
\xydef@\entrymodifiers@{\entrybox}
\xydef@\entrybox#1{\hbox{\setbox\z@=\objectbox{#1}%
 \Lp=\wdz@ \Dp=\ht\z@ \advance\Dp\dp\z@
 \dimen@=\objectwidth@ \advance\dimen@-\Lp
 \ifdim\dimen@>\z@ \advance\Lp\dimen@ \Rp=.5\dimen@ \else \Rp=\z@ \fi
 \dimen@=\objectheight@ \advance\dimen@-\Dp
 \ifdim\dimen@>\z@ \advance\Dp\dimen@ \fi
 \dimen@=\objectmargin@ \advance\Lp2\dimen@ \advance\Dp2\dimen@ 
 \Up=-.5\ht\z@ \advance\Up.5\dp\z@ \advance\Rp\objectmargin@
 \setboxz@h{\kern\Rp \raise\Up\boxz@}%
 \wdz@=\Lp \ht\z@=.5\Dp \dp\z@=.5\Dp \boxz@}}
\xywarnifdefined\everyentry
\expandafter\def\addEQ@\everyentry#1{\def\everyentry@{#1}\ignorespaces}
\xylet@\everyentry@=\empty
\xyendinput
