@Section
   @Title { Matrices }
   @Tag { matrices }
@Begin
@PP
The @Code matrix symbol {@PageMark matrix} builds an array of objects:
mathematics.matrix @SubIndex { @Code "matrix" symbol }
matrix.mathematics @Index { @Code "matrix" symbol (mathematics) }
@ID {
@Code @Verbatim {
matrix
   atleft { blpar }
   atright { brpar }
{
   row col x sup 2 col y sup 2 col z sup 2
   row col x col y col z
   row col 1 col 1 col 1
}
}
||9ct
@Math {
matrix
   atleft { blpar }
   atright { brpar }
{
   row col x sup 2 col y sup 2 col z sup 2
   row col x col y col z
   row col 1 col 1 col 1
}
}
}
The @Code atleft and @Code atright options place vertically scaled
versions of their values at each side; if either is omitted the value
is taken to be an empty object of zero width.  Although @Code blpar
and @Code brpar are used here, since the options are vertically
scaled it would also be reasonable to use just
@ID @OneRow @Code @Verbatim {
matrix
   atleft { ( }
   atright { ) }
}
The right parameter of @Code matrix is the array itself.  It must be
enclosed in braces.  It is a sequence of rows introduced by
@Code row symbols; each row is a sequence of objects introduced
by @Code col symbols.  The @Code row and @Code col symbols have
low precedence (Section {@NumberOf mat_summ}), but not as low as
white space between objects, so it is safest to enclose the entries
in braces, except in simple cases.
@PP
Entries built with the @Code col symbol have their objects centred in
the column.  Also available are @Code lcol for left-justified entries,
@Code ccol meaning the same as {@Code col}, @Code rcol for
right-justified entries, and @Code mcol for alignment along column
marks.  Each column may contain entries of different kinds, except
that @Code mcol does not work well with any other sort.
@PP
When several matrices appear side by side, slight differences in height
can cause an unsightly appearance:
@ID @Math {
matrix
   atleft { ( }
   atright { ) }
{
   row col a sub 11 col a sub 12
   row col a sub 21 col a sub 22
}
matrix
   atleft { ( }
   atright { ) }
{
   row col b sub 11 col b sub 12
   row col b sub 21 col b sub 22
}
=
matrix
   atleft { ( }
   atright { ) }
{
   row col c sub 11 col c sub 12
   row col c sub 21 col c sub 22
}
}
To assist in resolving this problem, the @Code "matrix" symbol has
a @Code "strut" option, which causes a strut to be inserted into
every row, guaranteeing that every row has height at least equal
to the height of the strut.  By using
@ID @Code {
"matrix"
"    strut { Yes }"
"..."
}
in each of the three matrices above, the result is improved to
@ID @Math {
matrix
   atleft { ( }
   atright { ) }
   strut { Yes }
{
   row col a sub 11 col a sub 12
   row col a sub 21 col a sub 22
}
matrix
   atleft { ( }
   atright { ) }
   strut { Yes }
{
   row col b sub 11 col b sub 12
   row col b sub 21 col b sub 22
}
=
matrix
   atleft { ( }
   atright { ) }
   strut { Yes }
{
   row col c sub 11 col c sub 12
   row col c sub 21 col c sub 22
}
}
By default, the strut has height @Code "0.5f" (half the current font
size) both above and below the axis of the row.  This can be changed
by giving any length as the value of the @Code "strut" option:
@Code "strut { 2.0c }" for two centimetres above and below
the axis, and so on.
@PP
Some symbols are defined which produce `matrices' with commonly needed
@Code atleft and @Code atright options already set for you:
@ID {
@Code { "fmatrix { {n+1} over 2 }" }
|7ct
@Math { fmatrix { {n+1} over 2 } }
}
As this example shows, these symbols are very useful for getting large
scaled delimiters around things that aren't necessarily matrices at all.
Section {@NumberOf mat_summ} has the full list of these symbols.
@PP
Every fragment of mathematics has an @I axis running through it which
is used to position it vertically
mathematics.axis @SubIndex { axis of }
axis @Index { axis (in mathematics) }
with respect to nearby objects.  In the Expert's Guide to Lout
@Cite { $kingston1995lout.expert } this is called a @I { row mark },
but we'll stick with axis.  Here are some examples with the axis
shown as a dashed line:
@ID {
@ShowHMark @Math { x sup 2 }
||2c
@ShowHMark @Math { non + }
||2c
@ShowHMark @Math { @ExA }
}
When these objects are placed adjacent to one another, their
axes are merged:
@ID @ShowHMark @Math { x sup 2 + @ExA }
Most of the time you do not need to think about vertical
positioning, because for most objects there is just one
sensible place for the axis to go, and Lout puts it there.
@PP
Matrices and the delimiters that enclose them are the two
exceptions.  Lout makes the axis of a matrix pass through
its exact centre, and it shifts the axes of delimiters
so that they exactly enclose the thing delimited.  These
choices are never disastrous, but there are other possibilities
that might be better sometimes.
@PP
The axis of a matrix could reasonably be set to the axis
of any of its rows:
@ID {
@ShowHMark @Math {
matrix userow { yes } {
  axisrow col { x sup 3 } col { y sup 3 } col { z sup 3 }
  row     col { x sup 2 } col { y sup 2 } col { z sup 2 }
  row     col { x } col { y } col { z }
}
}
||2c
@ShowHMark @Math {
matrix userow { yes } {
  row     col { x sup 3 } col { y sup 3 } col { z sup 3 }
  axisrow col { x sup 2 } col { y sup 2 } col { z sup 2 }
  row     col { x } col { y } col { z }
}
}
||2c
@ShowHMark @Math {
matrix userow { yes } {
  row     col { x sup 3 } col { y sup 3 } col { z sup 3 }
  row     col { x sup 2 } col { y sup 2 } col { z sup 2 }
  axisrow col { x } col { y } col { z }
}
}
}
Alternatively, it could be set to where Lout usually places it,
through the exact centre:
@ID {
@ShowHMark @Math {
matrix {
  row     col { x sup 3 } col { y sup 3 } col { z sup 3 }
  row     col { x sup 2 } col { y sup 2 } col { z sup 2 }
  row     col { x } col { y } col { z }
}
}
}
Delimiters could reasonably keep the axes that they naturally
have (approximately through their centres, but not exactly):
@ID {
@ShowHMark @Math { pmatrix userow { yes } shiftdelim { no } { @ExA } }
}
or they could have their axes moved in the way that Lout usually does,
to the point which allows them to evenly cover the thing delimited:
@ID {
@ShowHMark @Math { pmatrix userow { yes } { @ExA } }
}
Altogether then there are four possibilities when these two alternatives
interact:
@CD lines @Break @Tbl
  aformat { @Cell 0.5w @VShift A | @Cell | @Cell B | @Cell | @Cell C }
{
@Rowa
  A { }
  B { Matrix axis
uses row axis }
  C { Matrix axis passes
through centre }
@Rowa
  A { Delimiter
keeps its axis }
  B { @ShowHMark @Math { pmatrix userow {yes} shiftdelim {no } { @ExA } } }
  C { @ShowHMark @Math { pmatrix userow {no } shiftdelim {no } { @ExA } } }
@Rowa
  A { Delimiter
axis shifted }
  B { @ShowHMark @Math { pmatrix userow {yes} shiftdelim {yes} { @ExA } } }
  C { @ShowHMark @Math { pmatrix userow {no } shiftdelim {yes} { @ExA } } }
}
To supply these possibilities, the @Code "matrix" symbol and all
its variants (@Code "fmatrix" etc.) have two options whose
values may be {@Code "yes"} or {@Code "no"}:
@ID @Code @Verbatim {
matrix
    userow { no }
    shiftdelim { yes }
{
    ...
}
}
The @Code "userow" option determines whether the axis of the
matrix will use a row axis; the default is not to, i.e. to
centre the axis.  The @Code "shiftdelim" option determines whether
the axis of the delimiter will be shifted so that the delimiter
evenly covers the thing delimited; the default is to do this.
@PP
If @Code "userow" is {@Code "yes"}, the next question is
which row's axis to use to make the overall axis.  If you
do nothing, the first (or only) row's axis becomes the
overall axis.  To select some other row instead, replace
the @Code "row" symbol that precedes the row by {@Code "axisrow"}:
@ID @Code @Tbl
  mv { 0.5vx }
  mh { 1s }
  aformat { @Cell A | @Cell | @Cell B | @Cell | @Cell C | @Cell |
            @Cell D }
  bformat { @Cell A | @Cell " col" | @Cell B | @Cell " col" | @Cell C |
            @Cell "  col" | @Cell D }
{
@Rowa
  A { "matrix userow { yes } {" &0io }
@Rowb
  A { "    row" }
  B { "x sup 3" }
  C { "y sup 3" }
  D { "z sup 3" }
@Rowb
  A { "    axisrow" }
  B { "x sup 2" }
  C { "y sup 2" }
  D { "z sup 2" }
@Rowb
  A { "    row" }
  B { "x" }
  C { "y" }
  D { "z" }
@Rowa
  A { "}" }
}
The result of this is
@ID @ShowHMark @Math {
matrix userow { yes } {
  row     col { x sup 3 } col { y sup 3 } col { z sup 3 }
  axisrow col { x sup 2 } col { y sup 2 } col { z sup 2 }
  row     col { x } col { y } col { z }
}
}
with the axis through the second row as desired.
@End @Section
