% PTMATRIX.TEX   VERSION 2.0
% COPYRIGHT (C) 1991 BY THE TEXPLORATORS CORPORATION
% ALL RIGHTS RESERVED

% THIS FILE SHOULD NOT BE CHANGED IN ANY WAY.

\catcode`\@=11
\let\alloc@\alloc@@
\newif\ifformat@
\newcount\ptmrowcount@
\newcount\ptmcolcount@
\newcount\ptmColcount@
\newcount\maxptmrow@
\newbox\ptmbox@
\def\qstrut@{\ifnum\ptmrowcount@<\@ne\Mathstrut@\fi}
\def\GAM@{\global\advance\ptmcolcount@\@ne}
\newif\iflastmrow@
\def\partition\matrix{\global\format@false\bgroup
 \let\endmatrix\ptmendmatrix@
 \null\,\vcenter\bgroup\hbox\bgroup$\global\setbox\ptmbox@\vbox\bgroup
 \Let@\vspace@\normalbaselines\openup\spreadmlines@
 \global\ptmrowcount@\m@ne\global\ptmcolcount@\z@\global\ptmColcount@\z@
 \everycr{\noalign{\iflastmrow@\else\global\advance\ptmrowcount@\@ne
  \ifnum\ptmcolcount@<\ptmColcount@\else\global\ptmColcount@\ptmcolcount@
  \global\maxptmrow@\ptmrowcount@\fi\global\ptmcolcount@\z@\fi}}%
 \tabskip\z@skip\halign\bgroup\hfil\qstrut@$\m@th##$\hfil\GAM@
  &&\quad\hfil$\m@th##$\hfil\GAM@\crcr}
\def\format{\crcr\egroup\iffalse{\fi\ifnum`}=\z@\fi
 \global\advance\ptmrowcount@\m@ne
 \global\format@true\format@}
\def\format@#1\\{\def\preamble@{#1}%
 \def\l{\noexpand\qstrut@$\m@th\the\hashtoks@$\hfil\noexpand\GAM@}%
 \def\c{\noexpand\qstrut@\hfil$\m@th\the\hashtoks@$\hfil\noexpand\GAM@}%
 \def\r{\noexpand\qstrut@\hfil$\m@th\the\hashtoks@$\noexpand\GAM@}%
 \edef\Preamble@{\preamble@}\global\let\Preamble@@\Preamble@
 \ifnum`{=\z@\fi\iffalse}\fi\tabskip\z@skip\halign\bgroup\span\Preamble@\crcr}
\def\formatmatrixgap@{\global\let\matrixgap@\empty
 \setbox4=\vbox{\ialign{\span\Preamble@@\cr\the\toks@\cr}}%
 \setbox4=\vbox{\unvbox4 
  \setboxzl@
  \setboxz@h{\unhbox\z@\count@\z@
   \loop\unskip\setboxzl@\ifvoid\z@\else
   {\let\or\relax\xdef\matrixgap@{\matrixgap@
    \ifnum\count@=\z@\else\or\fi\the\wdz@}}%
   \advance\count@\@ne
   \repeat}%
   {\let\or\relax
   \xdef\matrixgap@##1{\noexpand\ifcase##1 \matrixgap@\noexpand\fi}}%
  }%
}
\newcount\mcolcount@
\newcount\bordercount@
\def\ptmendmatrix@{\crcr\noalign{\global\lastmrow@true}\Mathstrut@\crcr
 \noalign{\global\lastmrow@false\kern-\baselineskip}%
 \egroup\egroup
 \bordercount@\ptmrowcount@\advance\bordercount@\m@ne
 \setbox\z@\vbox   
  {\unvcopy\ptmbox@\unkern\setboxzl@\unskip\setboxzl@
   \count@\ptmrowcount@
   \loop
    \ifnum\count@>\maxptmrow@
    \unskip\setboxzl@\advance\count@\m@ne
   \repeat 
   \global\let\matrixgap@\empty\global\mcolcount@\tw@
   \setbox\tw@\hbox
    {\unhcopy\z@\unskip\setboxzl@\unskip\setboxzl@
     \loop\unskip\setboxzl@
     \ifvoid\z@\else\global\advance\mcolcount@\@ne
     {\let\or\relax\xdef\matrixgap@{\matrixgap@\or10pt}}%
    \repeat}%
   {\let\or\relax\xdef\matrixgap@##1{\noexpand
    \ifcase##1 10pt\matrixgap@\or0pt\noexpand\fi}}%
   \ifformat@
    \toks@{&}\count@\tw@
    \loop
     \ifnum\count@<\mcolcount@\advance\count@\@ne
     \toks@\expandafter{\the\toks@&}%
    \repeat
    \formatmatrixgap@
   \fi
   \xdef\rowbot@{\ifdim\dp\z@>\dp\Mathstrutbox@-\the\dp\z@\else
    -\the\dp\Mathstrutbox@\fi}%
   \xdef\rowtop@{\ifdim\ht\z@>\ht\Mathstrutbox@\the\ht\z@
    \else\the\ht\Mathstrutbox@\fi}%
   \xdef\midrow@{\the\ht\z@}\xdef\midcol@{0pt}%
   \dimen@\z@
   \setbox\tw@\hbox
    {\unhbox\z@ 
     \count@\z@
     \loop
     \unskip\setboxzl@
     \ifvoid\z@\else
     \advance\dimen@\wdz@
     \dimen@ii\matrixgap@\count@
     \advance\dimen@-.5\dimen@ii
     {\let\or\relax\xdef\midcol@{\the\dimen@\or\midcol@}}%
     \advance\dimen@-.5\dimen@ii
     {\let\or\relax\xdef\leftcol@{\the\dimen@\ifnum\count@=\z@\else
      \or\leftcol@\fi}}%
     {\advance\dimen@-\wdz@\advance\dimen@\dimen@ii\let\or\relax
      \xdef\rightcol@{\the\dimen@\ifnum\count@=\z@\else\or\rightcol@\fi}}%
     \advance\dimen@\dimen@ii\advance\count@\@ne
     \repeat
    }%
   \global\let\matrixgap@\relax 
   {\let\or\relax\xdef\midcol@##1{\noexpand
    \ifcase##1 \midcol@\noexpand\else\noexpand\Err@{##1 too large}%
    \noexpand\fi}%
   \xdef\leftcol@##1{\noexpand\ifcase##1 \noexpand\or\leftcol@\noexpand\fi}%
   \xdef\rightcol@##1{\noexpand\ifcase##1 \noexpand\or\rightcol@\noexpand\fi}%
   }%
  }%
  \setbox\z@\vbox
   {\unvcopy\ptmbox@\unkern\setboxzl@\unskip
    \setboxzl@
    \xdef\rowbl@{0pt}%
    \dimen@ii\ht\z@
    \dimen@\midrow@\relax\skip@\lastskip\unskip
    \advance\skip@\lastskip\unskip
    \advance\dimen@.5\skip@\xdef\midrow@{\the\dimen@}%
    \loop
     \setboxzl@
     \ifvoid\z@\else
      \advance\dimen@ii\skip@
      {\let\or\relax\xdef\rowbot@{\rowbot@\or\the\dimen@ii}}%
      \advance\dimen@ii\dp\z@
      {\let\or\relax\xdef\rowbl@{\rowbl@\or\the\dimen@ii}}%
      \advance\dimen@ii\ht\z@
      {\let\or\relax\xdef\rowtop@{\rowtop@\or\the\dimen@ii}}%
      \advance\dimen@.5\skip@
      \advance\dimen@\dp\z@\advance\dimen@\ht\z@
      \skip@\lastskip\unskip\advance\skip@\lastskip\unskip
      \advance\dimen@.5\skip@
      {\let\or\relax\xdef\midrow@{\midrow@\or\the\dimen@}}%
    \repeat
    {\let\or\relax\xdef\midrow@##1{\noexpand
     \ifcase##1 0pt\or\midrow@\noexpand\else
     \noexpand\Err@{##1 too large}\noexpand\fi}%
    \xdef\rowbot@##1{\noexpand\ifcase##1 \or\rowbot@\noexpand\fi}% 
    \xdef\rowbl@##1{\noexpand\ifcase##1 \or\rowbl@\noexpand\fi}%
    \xdef\rowtop@##1{\noexpand\ifcase##1 \or\rowtop@\noexpand\fi}%
    }%
   }%
  \box\ptmbox@
  \let\midcol\midcol@\global\let\midcol@\relax
  \let\midrow\midrow@\global\let\midrow@\relax
}
\def\endpartition{$\egroup\egroup\,\egroup
 \global\let\leftcol@\relax \global\let\rightcol@\relax
 \global\let\rowbot@\relax \global\let\rowtop@\relax
 \global\let\rowbl@\relax}
\newcount\count@@@@@
\edef\countdimen@#1{\setboxz@h{\def\noexpand\next@{\global\dimen@i}%
 \afterassignment\noexpand\next@\global
 \count@@@@@\noexpand\strip@#1 \space0pt}}
\def\hsolid{\ifnum\catcode`\:=\active\expandafter\hsolidA@\else
 \expandafter\hsolidO@\fi}
\def\hsolidO@#1:#2#3{\hsolid@{#1}{#2}{#3}}
\def\hsolid@#1#2#3{\def\HLEADERS{\hsolidleaders}\HPARTITION{#1}{#2}{#3}}
\def\hdashed{\ifnum\catcode`\:=\active\expandafter\hdashedA@\else
 \expandafter\hdashedO@\fi}
\def\hdashedO@#1:#2#3{\hdashed@{#1}{#2}{#3}}
\def\hdashed@#1#2#3{\def\HLEADERS{\hdashedleaders}\HPARTITION{#1}{#2}{#3}}
\def\HPARTITION#1#2#3{\countdimen@{#1}\dimen@\midrow\count@@@@@
 \advance\dimen@\dimen@i\advance\dimen@\dp\Mathstrutbox@
 \smash{\llap{\raise\dimen@
  \hbox{\countdimen@{#2}\dimen@\midcol\count@@@@@\advance\dimen@-\dimen@i
  \countdimen@{#3}\dimen@ii\midcol\count@@@@@\advance\dimen@ii-\dimen@i
  \advance\dimen@-\dimen@ii
  \HLEADERS\hskip\dimen@\hskip\dimen@ii}}}}
\def\vsolid{\ifnum\catcode`\:=\active\expandafter\vsolidA@\else
 \expandafter\vsolidO@\fi}
\def\vsolidO@#1:#2#3{\vsolid@{#1}{#2}{#3}}
\def\vsolid@#1#2#3{\def\VLEADERS{\vsolidleaders}\VPARTITION{#1}{#2}{#3}}
\def\vdashed{\ifnum\catcode`\:=\active\expandafter\vdashedA@\else
 \expandafter\vdashedO@\fi}
\def\vdashedO@#1:#2#3{\vdashed@{#1}{#2}{#3}}
\def\vdashed@#1#2#3{\def\VLEADERS{\vdashedleaders}\VPARTITION{#1}{#2}{#3}}
\newdimen\vextra@
\def\VPARTITION#1#2#3{\countdimen@{#3}\dimen@\midrow\count@@@@@
 \advance\dimen@\dimen@i\advance\dimen@\dp\Mathstrutbox@
 \countdimen@{#2}\dimen@ii\midrow\count@@@@@
 \advance\dimen@ii\dimen@i\advance\dimen@ii\dp\Mathstrutbox@
 \setbox\z@\vbox to\p@{\VLEADERS\vfil}\vextra@\wdz@
 \llap{\hbox{\smash{\vbox to\dimen@{\VLEADERS\vfil\vskip\dimen@ii}}%
  \hskip-\vextra@\relax\countdimen@{#1}\hskip\midcol\count@@@@@
  \hskip-\dimen@i}}}
\def\vleft{\ifnum\catcode`\:=\active\expandafter\vleftA@\else
 \expandafter\vleftO@\fi}
\def\vleftO@#1#2:#3#4{\vleft@#1{#2}{#3}{#4}}
\def\vleft@#1#2#3#4{\dimen@\rowtop@{#4}\advance\dimen@-\rowbot@{#3}%
 \dimen@ii\rowbl@{#3}\advance\dimen@ii.5\dimen@\advance\dimen@ii-\mathaxis@
 \countdimen@{#2}%
 \llap{\hbox{\smash{\raise\dimen@ii\hbox{$\left#1\vcenter{\vbox to
  \dimen@{}}\right.$}}\hskip\leftcol@\count@@@@@\hskip-\dimen@i}}}
\def\vright{\ifnum\catcode`\:=\active\expandafter\vrightA@\else
 \expandafter\vrightO@\fi}
\def\vrightO@#1#2:#3#4{\vright@#1{#2}{#3}{#4}}
\def\vright@#1#2#3#4{\dimen@\rowtop@{#4}\advance\dimen@-\rowbot@{#3}%
 \dimen@ii\rowbl@{#3}\advance\dimen@ii.5\dimen@\advance\dimen@ii-\mathaxis@
 \countdimen@{#2}%
 \llap{\hbox{\smash{\raise\dimen@ii\hbox{\setboxz@h{$\left.\vcenter{\vbox to
  \dimen@{}}\right#1$}\global\dimen\thr@@\wdz@\boxz@}}}%
  \hskip\rightcol@\count@@@@@\hskip-\dimen@i\hskip-\dimen\thr@@}}%
{\catcode`\:=\active
 \gdef\hsolidA@#1:#2#3{\hsolid@{#1}{#2}{#3}}
 \gdef\hdashedA@#1:#2#3{\hdashed@{#1}{#2}{#3}}
 \gdef\vsolidA@#1:#2#3{\vsolid@{#1}{#2}{#3}}
 \gdef\vdashedA@#1:#2#3{\vdashed@{#1}{#2}{#3}}
 \gdef\vleftA@#1#2:#3#4{\vleft@#1{#2}{#3}{#4}}
 \gdef\vrightA@#1#2:#3#4{\vright@#1{#2}{#3}{#4}}
}
\def\bdmatrix#1\\#2\\#3\endbdmatrix{\partition
 \matrix\format\c&\quad\hskip\jot\c&&\quad\c\\
 #1\\\vspace{\jot}\Mathstrut@#2\\#3\endmatrix
 \vleft@(21\bordercount@
 \vright@)\ptmColcount@1\bordercount@\endpartition}
\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
  \ch@ck#1#4#2%
  \allocationnumber=\count1#1%
  \global#3#5=\allocationnumber
  \wlog{\string#5=\string#2\the\allocationnumber}}
\catcode`\@=\active

\def\hsolidleaders{\leaders\hrule}

\def\vsolidleaders{\leaders\vrule}

\def\hdashedleaders{\xleaders\hbox to5pt{\hfil
  \leaders\hrule\hskip2.5pt\hfil}}

\def\vdashedleaders{\xleaders\vbox to5pt{\vfil\leaders\vrule\vskip2.5pt}}

