# How to programmatically insert an \hline between each line of an array

I'm trying to create an environment for matrices that are divided in four sections, such as the following:

Ideally, I'd like to make it so that it can be used like the following:

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)


I already know how to achieve such result manually, as decribed in Dividing line in a matrix. Something like the following:

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)


My question is, how could I make it an environment? In other words, is there a way to programmatically place an \hile between each like on an array? Is it possible to create an environment for such a thing?

• I'd recommend just to switch to nicematrix, which supports blocks and lines and much more. – user194703 May 27 at 21:51

You can use nicematrix which constructs the matrix while creating Tikz nodes. You can use these nodes to draw what you want with Tikz.

\documentclass{article}
\usepackage{nicematrix,tikz}

\NewDocumentEnvironment {crossmatrix} { }
{ \begin{pNiceArray}{CC}[margin] }
{
\CodeAfter
\tikz \draw (row-2-|col-1) -- (row-2-|col-3)
(row-1-|col-2) -- ([yshift=1pt]row-2-|col-2)
++ (0,-2pt) -- (row-3-|col-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}


• +1. I would put everything on one \draw command \draw (row-2-|col-1) -- (row-2-|col-3) (row-1-|col-2) -- ([yshift=1pt]row-2-|col-2) ++ (0,-2pt) -- (row-3-|col-2) ;, mostly because, while you are not doing this, your code may be mistaken to nest tikzpictures. – user194703 May 27 at 23:04
• @ Schrödinger's cat: You're right. I have modified my answer. – F. Pantigny May 28 at 9:29

You want to insert to the item of the outer table (\halign) the nested table (\haling). It is not problem if the nested \halign is realized as a macro which reads its parameter in {...}. Then such parameter can include tabs & and \cr used for its inner nested \halign. But if you want to use a macro with separated parameter and not in {...} then the tabs & and \cr in such parameter are interpreted during reading of the parameter as tabs for outer \halign.

The nested \begin{matrix}..&..&.\end{matrix} reads its parameter terminated by \end{matrix} (no in {...}), so tabs & used here are interpreted by the outer \halign. Of course, you can hide these tabs by {\begin{mattrix}..&..&.\end{matrix}} but the LaTeX logic of tagging tables and using nested LaTeX environments is lost.

The following example shows the problem in native TeX language:

\def\a#1{\vbox{\halign{##&##\cr#1\cr}}}

\halign{X#Y&Z#W\cr    ..\a{b&c}..& d\cr}


Works, because the b&c is read inside {}, so the & here is not interpreted by the outer \halign.

\def\a[#1]{\vbox{\halign{##&##\cr#1\cr}}}

\halign{X#Y&Z#W\cr    ..\a[b&c]..& d\cr}


Doesn't work because when b& is read into the parameter then TeX interprets & as the tab for outer \halign and the reading of the parameter continues by Y followed by \endtemplate which is prohibited read it to a parameter.

\def\a[#1]{\vbox{\halign{##&##\cr#1\cr}}}

\halign{X#Y&Z#W\cr    ..{\a[b&c]}..& d\cr}


Works.

The problem is the syntax. Here I propose to specify the parts as arguments to the environment.

\documentclass{article}
\usepackage{amsmath}

\newenvironment{crossmatrix}[3]
{
\left(
\def\crossmatrixfinal{&#1\\\hline#2&#3}
\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}