我想显示一个用方括号括起来的矩阵,方括号外有行和列标签。在 LaTeX 中,我将使用blockarray
如下方法:
\documentclass[preview]{standalone}
\usepackage{blkarray}
\begin{document}
\begin{blockarray}{rcc}
& C1 & C2 \\
\begin{block}{r[cc]}
R1 & -1 & 0 \\
R2 & -1 & 0 \\
\end{block}
\end{blockarray}
\end{document}
结果是:
我已经能够使用块矩阵在 ConTeXt 中重现类似的内容,但我不知道如何更进一步并跨不同的块对齐两列:
\starttext
\definemathmatrix[smatrix][left={\left[}, right={\right]}]
\definemathmatrix[omatrix][left={\phantom{[}}, right={\phantom{]}}]
\startformula
\startmatrix
\NC
\NC
\startomatrix[n=2]
\NC C1 \NC C2 \NR
\stopomatrix
\NR
\NC
\startmatrix[n=1]
\NC R1 \NR
\NC R2 \NR
\stopmatrix
\NC
\NC % Need an extra \NC, might be a bug
\startsmatrix[n=2]
\NC -1 \NC 0 \NR
\NC -1 \NC 0 \NR
\stopsmatrix
\NR
\stopmatrix
\stopformula
\stoptext
结果是:
事实上情况还不算太糟,但列标签与实际列不对齐,并且列值越复杂,这种情况就越明显。
我可以使用元素来破解对齐phantom
,但是有没有更通用的方法来获取列标签?
答案1
答案2
为了扩展 Metafox 的答案,对于那些安装了旧版 ConTeXt 的人来说,它似乎bbordermatrix
也是由 Hans Hagen 在邮件列表中定义的。来源可以在这里找到:https://mailman.ntg.nl/pipermail/ntg-context/2017/089694.html。
为了方便起见,这里复制一份:
\unprotect
\unexpanded\def\math_border_matrix#1#2#3% adapted plain
{\begingroup
%
\pushmacro\cr
%
\setbox\scratchbox\hbox\bgroup
\mr B%
\egroup
\scratchdimenone\wd\scratchbox
%
\scratchdimentwo.2\bodyfontsize
%
\mathsurround\zeropoint
%
\setbox\scratchboxone\vbox\bgroup
\def\cr{%
\crcr
\noalign\bgroup
\kern\scratchdimentwo
\global\let\cr\endline
\egroup
}%
\ialign{%
\startimath\alignmark\alignmark\stopimath
\hfil
\kern\dimexpr\scratchdimentwo+\scratchdimenone\relax
\aligntab
\thinspace
\hfil
\startimath\alignmark\alignmark\stopimath
\hfil
\aligntab
\aligntab
\quad
\hfil
\startimath\alignmark\alignmark\stopimath
\hfil
\crcr
\omit
\strut
\hfil
\crcr
\noalign{\kern-\baselineskip}%
#3\crcr
\omit
\strut
\cr
}%
\egroup
\setbox\scratchboxtwo\vbox\bgroup
\unvcopy\scratchboxone
\global\setbox\globalscratchbox\lastbox
\egroup
\setbox\scratchboxtwo\hbox\bgroup
\unhbox\globalscratchbox
\unskip
\global\setbox\globalscratchbox\lastbox
\egroup
\setbox\scratchboxtwo\hbox\bgroup
\startimath
\kern\dimexpr\wd\globalscratchbox-\scratchdimenone\relax
\left#1\relax
\kern-\wd\globalscratchbox
\global\setbox\globalscratchbox\vbox\bgroup
\box\globalscratchbox
\kern\scratchdimentwo
\egroup
\vcenter\bgroup
\kern-\ht\globalscratchbox
\unvbox\scratchboxone
\kern-\baselineskip
\egroup
\thinspace
\right#2\relax
\stopimath
\egroup
\null
\thickspace
\vbox\bgroup
\kern\ht\globalscratchbox
\box\scratchboxtwo
\egroup
%
\popmacro\cr
%
\endgroup}
\unexpanded\def\bordermatrix {\math_border_matrix()}
\unexpanded\def\bbordermatrix{\math_border_matrix[]}
\protect
\starttext
A plain border matrix:
\startformula
\bordermatrix{
a & b & c & d \cr
e & f & G & h \cr
i & j & k & l \cr}
\stopformula
\startformula
\bbordermatrix{
a & b & c & d \cr
e & f & G & h \cr
i & j & k & l \cr}
\stopformula
\stoptext