我正在尝试创建一个分为四个部分的矩阵环境,如下所示:
理想情况下,我希望它可以像下面这样使用:
M =
\left(
\begin{croosmatrix}
\begin{matrix}
a & b & c & d \\
e & f & g & h \\
i & j & k & l
\end{matrix}
& B \\
C & D \\
\end{crossmatrix}
\right)
我已经知道如何手动实现这样的结果,如下所述矩阵中的分界线. 类似下面这样:
M =
\left(
\begin{array}{c|c}
\begin{matrix}
a & b & c & d \\
e & f & g & h \\
i & j & k & l
\end{matrix}
& B \\
\hline
C & D \\
\end{array}
\right)
我的问题是,我怎样才能使其成为一个环境?换句话说,有没有办法以编程方式\hile
在数组上放置一个“彼此之间”?是否有可能为这样的事情创建一个环境?
答案1
您可以使用nicematrix
它来构建矩阵,同时创建 Tikz 节点。您可以使用这些节点在 Tikz 中绘制您想要的内容。
\documentclass{article}
\usepackage{nicematrix,tikz}
\NewDocumentEnvironment {crossmatrix} { }
{ \begin{pNiceArray}{cc}[margin] }
{
\CodeAfter
\tikz \draw (2-|1) -- (2-|3) (1-|2) -- ([yshift=1pt]2-|2) ++ (0,-2pt) -- (3-|2) ;
\end{pNiceArray}
}
\begin{document}
$M =
\begin{crossmatrix}
\begin{matrix}
a & b & c & d \\
e & f & g & h \\
i & j & k & l
\end{matrix}
& B \\
C & D
\end{crossmatrix}$
\end{document}
答案2
您想将\halign
嵌套表 () 中的项目插入到外部表 ( )中。如果嵌套实现为读取其参数的宏,则\haling
没有问题。然后,此类参数可以包含制表符并用于其内部嵌套。但是,如果您想使用带有分隔参数的宏,而不是,那么制表符和此类参数将被解释\halign
{...}
&
\cr
\halign
{...}
&
\cr
读取参数时作为外部的标签\halign
。
嵌套\begin{matrix}..&..&.\end{matrix}
读取其参数以\end{matrix}
(no in {...}
) 结尾,因此&
此处使用的制表符由外部 解释\halign
。当然,您可以通过 隐藏这些制表符,{\begin{mattrix}..&..&.\end{matrix}}
但标记表格和使用嵌套 LaTeX 环境的 LaTeX 逻辑会丢失。
以下示例显示了原生 TeX 语言中的问题:
\def\a#1{\vbox{\halign{##&##\cr#1\cr}}}
\halign{X#Y&Z#W\cr ..\a{b&c}..& d\cr}
有效,因为b&c
在内部读取{}
,所以&
这里的不被外部的解释\halign
。
\def\a[#1]{\vbox{\halign{##&##\cr#1\cr}}}
\halign{X#Y&Z#W\cr ..\a[b&c]..& d\cr}
不起作用,因为当b&
读入参数时,TeX 会将其解释&
为外部的选项卡\halign
,并且继续读取参数,Y
然后\endtemplate
禁止将其读入参数。
\def\a[#1]{\vbox{\halign{##&##\cr#1\cr}}}
\halign{X#Y&Z#W\cr ..{\a[b&c]}..& d\cr}
作品。
答案3
问题在于语法。这里我建议将各部分指定为环境的参数。
\documentclass{article}
\usepackage{amsmath}
\newenvironment{crossmatrix}[3]
{
\left(
\def\crossmatrixfinal{\\\hline#2}
\begin{array}{@{}c|c@{}}
\begin{matrix}
}
{
\end{matrix}
\crossmatrixfinal
\end{array}
\right)
}
\begin{document}
\[
\begin{crossmatrix}{B}{C}{D}
a & b & c & d \\
e & f & g & h \\
i & j & k & l
\end{crossmatrix}
\]
\end{document}