I appreciate the other answers. This was bothering me for a while, and as it sat unanswered for so long (I think it is too specific, no one but me apparently needed to be able to do this) I had found a way to do it by patching the spalign
commands. Just in case anyone else ever wonders how to do this, I'll post my answer here.
I had to dig into the existing spalign
code a bit. The matrices are built using array
s as expected, so I initially thought to just replace \begin{align}
by \begin{align}[t]
. However, this creates a problem where the delimiters are also centered on the top line:

To solve that problem, I used delarray
as suggested in this answer (and as suggested again by egreg's answer this question).
However, this required a much more complicated find-and-replace in the existing code of spalign
, since the macros in that package put the delimiters outside of the array
environment (as is usual when not using delarray
. At any rate, I became a little obsessed with solving this problem and managed it with xpatch
and some trial-and-error. I think it's a bit of a mess (partly because of the way *
s are handled in spalign
), but the following code creates duplicates of several of the spalign
environments, aligned with their top rows, with all optional arguments and starred versions intact:
\documentclass[12pt]{report}
\usepackage{amsmath}
\usepackage[delims={[}{]},sysdelims={.}{.}]{spalign} %set to square brackets on matrices and no delimiters on systems
\usepackage{letltxmacro}
\usepackage{delarray}
\usepackage{xpatch}
\makeatletter
\let\tmat=\spalignmat
\let\tmatx=\spalignmat@x
\LetLtxMacro\tmatstar\spalignmat@star
\xpatchcmd{\tmat}{\spalignmat@x}{\tmatx}{}{}
\xpatchcmd{\tmatx}{\spalignmat@star}{\tmatstar}{}{}
\xpatchcmd{\tmatstar}{\spalign@maybedelim}{\spalignenv}{}{}
\xpatchcmd{\tmatstar}{\begin{array}{\spalign@repeated}}%
{\begin{array}[t]\ifspalign@star\else\spalign@leftdelim\fi%
{@{\spalignmatdelimskip}\spalign@repeated @{\spalignmatdelimskip}}%
\ifspalign@star\else\spalign@rightdelim\fi}{}{}
\xpatchcmd{\tmatstar}{{\hskip-\arraycolsep\spalignmatdelimskip}}{}{}{}
\providecommand{\dtmat}[2][r]{{\detm \tmat[#1]{#2}}}
\let\tamatn=\spalignaugmatn
\let\tamatnx=\spalignaugmatn@x
\LetLtxMacro\tamatnstar\spalignaugmatn@star
\xpatchcmd{\tamatn}{\spalignaugmatn@x}{\tamatnx}{}{}
\xpatchcmd{\tamatnx}{\spalignaugmatn@star}{\tamatnstar}{}{}
\xpatchcmd{\tamatnstar}{\spalign@maybedelim}{\spalignenv}{}{}
\xpatchcmd{\tamatnstar}{\begin{array}{\spalign@repeated@one|\spalign@repeated@two}}%
{\begin{array}[t]\ifspalign@star\else\spalign@leftdelim\fi%
{@{\spalignmatdelimskip}\spalign@repeated@one|\spalign@repeated@two @{\spalignmatdelimskip}}\ifspalign@star\else\spalign@rightdelim\fi}{}{}
\xpatchcmd{\tamatnstar}{{\hskip-\arraycolsep\spalignmatdelimskip}}{}{}{}
\providecommand{\tamat}[1][r]{%
\tamatn[#1]{1}%
}%
\let\tamath=\spalignaugmathalf
\let\tamathx=\spalignaugmathalf@x
\LetLtxMacro\tamathstar\spalignaugmathalf@star
\xpatchcmd{\tamath}{\spalignaugmathalf@x}{\tamathx}{}{}
\xpatchcmd{\tamathx}{\spalignaugmathalf@star}{\tamathstar}{}{}
\xpatchcmd{\tamathstar}{\spalign@maybedelim}{\spalignenv}{}{}
\xpatchcmd{\tamathstar}{\begin{array}{\spalign@repeated@one|\spalign@repeated@two}}%
{\begin{array}[t]\ifspalign@star\else\spalign@leftdelim\fi%
{@{\spalignmatdelimskip}\spalign@repeated@one|\spalign@repeated@two @{\spalignmatdelimskip}}\ifspalign@star\else\spalign@rightdelim\fi}{}{}
\xpatchcmd{\tamathstar}{{\hskip-\arraycolsep\spalignmatdelimskip}}{}{}{}
\let\tsys=\spalignsys
\let\tsysx=\spalignsys@x
\let\tsysstar=\spalignsys@star
\xpatchcmd{\tsys}{\spalignsys@x}{\tsysx}{}{}
\xpatchcmd{\tsysx}{\spalignsys@star}{\tsysstar}{}{}
\xpatchcmd{\tsysstar}{\vcenter}{\vtop}{}{}
\makeatother
\begin{document}
\[
A=\spalignmat{1 2 3;4 5 6;7 8 9}. \quad A=\tmat{1 2 3;4 5 6;7 8 9}.
\]
\[
A=\spalignaugmat{1 2 3;4 5 6;7 8 9}. \quad A=\tamat{1 2 3;4 5 6;7 8 9}.
\]
\[
A=\spalignaugmatn{2}{1 2 3 4 5 6;4 5 6 7 8 9;7 8 9 1 2 3}. \quad A=\tamatn{2}{1 2 3 4 5 6;4 5 6 7 8 9;7 8 9 1 2 3}.
\]
\[
A=\spalignaugmathalf{1 2 3 4 5 6;4 5 6 7 8 9;7 8 9 1 2 3}. \quad A=\tamath{1 2 3 4 5 6;4 5 6 7 8 9;7 8 9 1 2 3}.
\]
System of equations:
$\spalignsys{2x + 3y = 1;x - y = 10}$.\quad
Top aligned:
$\tsys{2x + 3y = 1;x - y = 10}$.
\end{document}
Which produces:

Those were all I needed, so they're all I patched. Others could be done similarly.
The *
ed versions omit the delimiters, and the matrices take optional arguments to specify column alignments. Both of these features still work as in the original spalign
.
It would perhaps be easier to just define anew the macros I want instead of using \xpatchcmd
, but I found it instructive to do it this way. I had never used xpatch
before and learned a lot in this first attempt.
I was not able to get the delimiters top-aligned for a system of equations because spalign
uses halign
for that instead of the array
environment. For me, this was not a problem, since the book I am teaching from doesn't use delimiters on systems anyway, and I wanted to use consistent notation.