diff options
Diffstat (limited to 'macros/generic/misc/kbordermatrix.sty')
-rw-r--r-- | macros/generic/misc/kbordermatrix.sty | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/macros/generic/misc/kbordermatrix.sty b/macros/generic/misc/kbordermatrix.sty new file mode 100644 index 0000000000..67d486929f --- /dev/null +++ b/macros/generic/misc/kbordermatrix.sty @@ -0,0 +1,151 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{kbordermatrix}[2011/09/21 Bordered matrix with brackets] + +% Author: Kim C Border <kcborder@caltech.edu> +% Date: SuperBowl XXXVII (Go Bucs) + +% Revised 2003/09/20 +% to allow flush right option. +% Revised 2011/09/21 +% at urging of Bruno Calfa (CMU) +% to coexist with package arydshln +% by adding \def\@xarraycr ... + +% Defines \kbordermatrix along the lines of plain tex's +% \bordermatrix (which is still available in LaTeX). + +% In particular, as with \bordermatrix, +% 1. It takes the array as an argument. It does not use \begin{}..\end{}. +% Is this a feature or a bug? +% 2. The first row is spaced a bit further apart from the rest. +% 3. The lower (n-1) by (n-1) block is set off by delimiters. +% 4. There is an invisible bottom row of the same height as the segregated +% top row that adds to the height of the equation. + +% Differences from \bordermatrix: +% 1. Square brackets are used in place of parentheses. +% 2. You may use \\ instead of \cr. +% 3. The line heights agree with LaTeX's line heights for the +% array environment, and \arraystretch is respected. This means +% the bottom (n-1) rows align with the rows of an (n-1)-rowed +% \begin{array}..\end{array} (with or without delimiters). +% 4. All columns are centered. +% ** Modified 2003-9-20 to allow flush right option. +% 5. The first column is spaced a bit further apart from the rest. + + +% Differences from \left\[\begin{array}...\end{array}\right\] +% 1. It takes the array as an argument. It does not use \begin{}..\end{}. +% Is this a feature or a bug? +% 2. Consequently, you cannot use a column specifier (e.g., {l|cr}). +% 3. Consequently the maximum number of columns is not specified. +% 4. Vertical rules must be put in each row in a separate column. +% 5. You can use \hline and \cline. + +% At least it works in the cases I have tried, but I offer no guarantees. + + + +% cf. \bordermatrix p. 361, and \vrulealign p. 392 of The TeXbook + + + +% Style parameters, they may be redefined according to taste. + \newcommand{\kbldelim}{[} % Left delimiter + \newcommand{\kbrdelim}{]}% Right delimiter + + \newcommand{\kbrowstyle}{\scriptstyle}% Style applied to first row + \newcommand{\kbcolstyle}{\scriptstyle}% Style applied to first column + + \newlength{\kbcolsep} % Extra separation after first border column + \newlength{\kbrowsep} % Extra separation after first border row + + \setlength{\kbcolsep}{.5\arraycolsep} + \setlength{\kbrowsep}{.2ex} + + \newif\ifkbalignright + +% Scratch lengths (to be computed) + \newlength{\br@kwd} % Width of delimiter + \newlength{\k@bordht} % Height of border column + +% This is it +\newcommand{\kbordermatrix}[1]{% +\begingroup + % \br@kwd depends on font size, so compute it now. + \setbox0=\hbox{$\left\kbldelim\right.$} + \setlength{\br@kwd}{\wd0} + % Compute the array strut based on current value of \arraystretch. + \setbox\@arstrutbox\hbox{\vrule + \@height\arraystretch\ht\strutbox + \@depth\arraystretch\dp\strutbox + \@width\z@} + % Compute height of first row and extra space. + \setlength{\k@bordht}{\kbrowsep} + \addtolength{\k@bordht}{\ht\@arstrutbox} + \addtolength{\k@bordht}{\dp\@arstrutbox} + % turn off mathsurround + \m@th + % Set the first row style + \def\@kbrowstyle{\kbrowstyle} + % Swallow the alignment into box0: + \setbox0=\vbox{% + % Define \cr for first row to include the \kbrowsep + % and to reset the row style + \def\cr{\crcr\noalign{\kern\kbrowsep + \global\let\cr=\endline + \global\let\@kbrowstyle=\relax}} + % Redefine \\ a la LaTeX: + \let\\\@arraycr + % The following are needed to make a solid \vrule with no gaps + % between the lines. + \lineskip\z@skip + \baselineskip\z@skip + % Compute the length of the skip after the first column + \dimen0\kbcolsep \advance\dimen0\br@kwd + % Here begins the alignment: + \ialign{\tabskip\dimen0 % This space will show up after the first column + \kern\arraycolsep\hfil\@arstrut$\kbcolstyle ##$\hfil\kern\arraycolsep& + \tabskip\z@skip % Cancel extra space for other columns + \kern\arraycolsep\hfil$\@kbrowstyle ##$\ifkbalignright\relax\else\hfil\fi\kern\arraycolsep&& + \kern\arraycolsep\hfil$\@kbrowstyle ##$\ifkbalignright\relax\else\hfil\fi\kern\arraycolsep\crcr + % That ends the template. + % Here is the argument: + #1\crcr}% End \ialign + }% End \setbox0. + % \box0 now holds the array. + % + % This next line uses \box2 to hold a throwaway + % copy of \box0, leaving \box0 intact, + % while putting the last row in \box5. + \setbox2=\vbox{\unvcopy0 \global\setbox5=\lastbox} + % We want the width of the first column, + % so we lop off columns until there is only one left. + % It's not elegant or efficient, but at 1 gHz, who cares. + \loop + \setbox2=\hbox{\unhbox5 \unskip \global\setbox3=\lastbox} + \ifhbox3 + \global\setbox5=\box2 + \global\setbox1=\box3 + \repeat + % \box1 now holds the first column of last row. + % + % This next line stores the alignment in \box2, + % while calculating the proper + % delimiter height and placement. + \setbox2=\hbox{$\kern\wd1\kern\kbcolsep\kern-\arraycolsep + \left\kbldelim + \kern-\wd1\kern-\kbcolsep\kern-\br@kwd + % + % Here is the output. The \vcenter aligns the array with the "math axis." + % The negative vertical \kern only shrinks the delimiter's height. + % BTW, I didn't find this in the TeXbook, + % I had to try various \kerns to see what they did in a + % \left[\vcenter{}\right]. + \vcenter{\kern-\k@bordht\vbox{\unvbox0}} + \right\kbrdelim$} + \null\vbox{\kern\k@bordht\box2} + % + \endgroup +} + |