Tengo una matriz de bloques aparentemente simple que quiero configurar con la menor cantidad de dependencias posible. Ya tengo amsmath y amigos cargados. Lo único que intento evitar es blkarray.
Esto es lo que quiero hacer:
Aquí hay un intento fallido mío, que produce el espaciado más atroz imaginable con líneas que no se juntan para formar esquinas.
\begin{equation}
\begin{pmatrix}[ccc]
J_1 & \begin{array}{|cc}0 & 0\\ 0 & 0\end{array} & \begin{array}{cc}0 & 0\\ 0 & 0\end{array}\\ \cline{1-2}
\begin{array}{cc|}0&0\\0&0\end{array} & J_2 & \begin{array}{|cc}0&0\\0&0\end{array}\\ \cline{2-3}
\begin{array}{cc}0 & 0\\ 0 & 0\end{array} & \begin{array}{cc|}0 & 0\\ 0 & 0\end{array} & J_3
\end{pmatrix}
\end{equation}
Lo cual es feo como todos dicen:
NB: He modificado pmatrix para que tome las especificaciones de columna como argumento opcional. Simplemente finge que es una matriz.
Mi dificultad parece surgir del hecho de que quiero bloques de 2x2, mientras que la mayoría de los que he visto parecen patinar usando varias filas o varias columnas, pero no ambas.
Editar: esto no es tan feo, pero las líneas verticales solo cubren la mitad de la distancia de la fila múltiple:
\begin{equation}
\begin{array}{cccccc}
\multicolumn{2}{c|}{\multirow{2}{*}{$J_1$}} & 0 & 0 & 0 & 0\\
& & 0 & 0 & 0 & 0\\ \cline{1-4}
0 & 0 & \multicolumn{2}{|c|}{\multirow{2}{*}{$J_1$}} & 0 & 0\\
0 & 0 & & & 0 & 0\\ \cline{3-6}
0 & 0 & 0 & 0 & \multicolumn{2}{|c}{\multirow{2}{*}{$J_1$}} \\
0 & 0 & 0 & 0 & & \\
\end{array}
\end{equation}
Respuesta1
La parte fundamental de la construcción matricial se ve así:
\documentclass{article}
\newcommand{\mc}{\multicolumn{1}{c}}
\begin{document}
\[
\renewcommand{\arraystretch}{1.2}
\left(
\begin{array}{ c c | c c | c c }
\multicolumn{1}{|c}{} & & 0 & \mc{0} & 0 & 0 \\
\multicolumn{2}{|c|}{\raisebox{.6\normalbaselineskip}[0pt][0pt]{$J_1$}} & 0 & \mc{0} & 0 & 0 \\
\cline{1-4}
0 & 0 & & & 0 & 0 \\
0 & 0 & \multicolumn{2}{c|}{\raisebox{.6\normalbaselineskip}[0pt][0pt]{$J_2$}} & 0 & 0 \\
\cline{3-6}
0 & \mc{0} & 0 & 0 & & \multicolumn{1}{c|}{} \\
0 & \mc{0} & 0 & 0 & \multicolumn{2}{c|}{\raisebox{.6\normalbaselineskip}[0pt][0pt]{$J_3$}}
\end{array}
\right)
\]
\end{document}
Quizás sería mejor asignar variables a los otros componentes (como A
y B
) para mantener el espaciado de la matriz.
Respuesta2
Con {pNiceMatrix}
de nicematrix
. Ese entorno es similar al entorno clásico {pmatrix}
(de amsmath
), pero crea nodos PGF/Tikz debajo de las filas, celdas y columnas. Es posible usar esos nodos para dibujar cualquier regla que desees con Tikz en el archivo \CodeAfter
.
\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz}
\begin{document}
$\begin{pNiceMatrix}[margin]
\Block{2-2}{J_1} & & 0 & 0 & 0 & 0 \\
& & 0 & 0 & 0 & 0 \\
0 & 0 & \Block{2-2}{J_2} & & 0 & 0 \\
0 & 0 & & & 0 & 0 \\
0 & 0 & 0 & 0 & \Block{2-2}{J_3} \\
0 & 0 & 0 & 0 \\
\CodeAfter
\begin{tikzpicture}
\draw (1-|1) |- (3-|5) -- (7-|5) ;
\draw (1-|3) |- (5-|7) -- (7-|7) ;
\end{tikzpicture}
\end{pNiceMatrix}$
\end{document}
Necesita varias compilaciones (debido a los nodos PGF/Tikz).
Si no deseas utilizar Tikz explícitamente, también puedes especificar los bordes de los bloques con la tecla borders
del comando \Block
.
\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz}
\begin{document}
$\begin{pNiceMatrix}[margin]
\Block[borders={left,bottom,right}]{2-2}{J_1} & & 0 & 0 & 0 & 0 \\
& & 0 & 0 & 0 & 0 \\
0 & 0 & \Block[draw]{2-2}{J_2} & & 0 & 0 \\
0 & 0 & & & 0 & 0 \\
0 & 0 & 0 & 0 & \Block[borders={left,top,right}]{2-2}{J_3} \\
0 & 0 & 0 & 0 \\
\end{pNiceMatrix}$
\end{document}
La salida es la misma.