ConTeXt:带有标记列的块数组

ConTeXt:带有标记列的块数组

我想显示一个用方括号括起来的矩阵,方括号外有行和列标签。在 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}

结果是:

带有 blockarray 的结果

我已经能够使用块矩阵在 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

您可以使用环境创建它bbordermatrix,它产生与正常环境相同的结果,bordermatrix但用括号替换括号。

\starttext

\startformula
    \startbbordermatrix
    \NC    \NC C1 \NC C2 \NR
    \NC R1 \NC -1 \NC 0  \NR
    \NC R2 \NC -1 \NC 0  \NR
    \stopbbordermatrix
\stopformula

\stoptext

带括号的边框矩阵

答案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

相关内容