Estoy usando el formulario de solución.Obstáculos para simular una matriz amsmath mediante una matriz TiKZ de nodos matemáticospara crear un tikz
matrix
estilo de bmatrix
.
Me gustaría dejar un poco de espacio extra después de la última línea y pensé que usar \\[1.5ex]
debería funcionar:
\matrix (m) {
1 & 4 \\
7 & 10 \\
13 & 16 \\[1.5ex]% <--- This seems to have no effect.
};
pero eso no parece tener ningún efecto. Usar este parámetro opcional para cualquier línea excepto la última parece funcionar.
La bmatrix
versión se comporta como se desea.
Pregunta relacionada
- Ajuste la parte superior e inferior del delimitador izquierdo y derecho de la matriz tikz individualmente
- ¿Cómo aumentar la altura de la fila mientras se usan pestañas?. No se trata de
tikz
una cuestión similar de espaciado vertical.
Código:
\documentclass{article}
\usepackage{mathtools}% for amsmath {bmatrix}
\usepackage{tikz}
\usetikzlibrary{matrix}
%% https://tex.stackexchange.com/questions/26866/obstacles-to-simulating-an-amsmath-matrix-by-a-tikz-matrix-of-math-nodes
\newlength\mtxrowsep \setlength\mtxrowsep{1.5ex}
\newlength\mtxcolsep \setlength\mtxcolsep{2\arraycolsep}
\tikzset{
ams/.style={
baseline=-.7ex,
every delimiter/.style={yshift=-1pt},
every left delimiter/.style={xshift=2pt},
every right delimiter/.style={xshift=-2pt},
every node/.style={inner sep=0pt},
},
ams matrix/.style={
inner sep=1pt,
column sep=\mtxcolsep,
row sep=\mtxrowsep,
% Following is also commented at https://tex.stackexchange.com/questions/26866
%ampersand replacement=\&,
matrix of math nodes,
},
bmatrix/.style={
ams,
every matrix/.style={
ams matrix,
left delimiter={[},
right delimiter={]},
}
},
Bmatrix/.style={
ams,
every matrix/.style={
ams matrix,
left delimiter={\lbrace},
right delimiter={\rbrace},
}
},
pmatrix/.style={
ams,
every matrix/.style={
ams matrix,
left delimiter={(},
right delimiter={)},
}
},
vmatrix/.style={
ams,
every matrix/.style={
ams matrix,
left delimiter={|},
right delimiter={|},
}
},
Vmatrix/.style={
ams,
every matrix/.style={
ams matrix,
left delimiter={\|},
right delimiter={\|},
}
},
}
%% This does not seem to be necessary here
%\let\matamp=&
%
%\catcode`\&=13
%\makeatletter
%\def&{\iftikz@is@matrix
% \pgfmatrixnextcell
% \else
% \matamp
% \fi}
%\makeatother
\begin{document}
\hspace*{0.2em}
\begin{tikzpicture}[bmatrix]
\matrix (m) {
1 & 4 \\
7 & 10 \\
13 & 16 \\[1.5ex]% <--- This seems to have no effect.
};
\end{tikzpicture}
%% ----------------
\hspace*{0.3em}
$\begin{bmatrix}
\smash{1} & \smash{4} \\
7 & 10 \\
13 & 16 \\[1.5ex]
\end{bmatrix}$
tikz matrix \hspace*{0.6em} bmatrix
\end{document}
Anexo temporal:
Intenté utilizar la solución de Qrrbrbirlbel, pero me encontré con un problema: las coordenadas de los nodos ya no están donde tikz
se cree que están. Usando el preámbulo proporcionado en la respuesta con el siguiente código, parece que los nodos (por ejemplo m-1-1.north west
) están desplazados:
\newcommand{\FillMatrix}{%
\fill [rounded corners=3pt, fill opacity=.35, fill=green!80]
([shift={(0pt, 2pt)}]m-1-1.north west)
-- ([shift={(0pt,-2pt)}]m-2-1.south west)
-- ([shift={(2pt,-2pt)}]m-2-2.south east)
-- ([shift={(2pt, 0pt)}]m-2-2.north east)
-- cycle;
}%
\begin{document}
\hspace*{0.2em}
\begin{tikzpicture}[bmatrix]
\matrix (m) {
1 & 4 \\
7 & 10 \\
13 & 16 \\[-2pt]
};
\FillMatrix
\end{tikzpicture}
%% ----------------
\hspace*{0.3em}
\begin{tikzpicture}[bmatrix, matrix bottom crcr]
\matrix (m) {
1 & 4 \\
7 & 10 \\
13 & 16 \\[-2pt]
};
\FillMatrix
\end{tikzpicture}
\hspace*{0.6em} default \hspace*{0.6em} matrix bottom crcr
\end{document}
Respuesta1
Esto último [<vspace>]
no tiene ningún efecto porque PGF simplemente no ejecuta el mismo código que lo haría para un archivo \\
. Lo evalúa y lo guarda para que podamos usarlo en el siguiente parche. Cuando se hace esto, verifica si sigue un }
(= \egroup
) que indica el final del contenido de la matriz.
Si no es así, después de a \cr
ejecutará algunos \vskip
s de acuerdo con los tamaños de las filas y si se usó between origins
o y luego continuará con la siguiente fila.between borders
Si es así, simplemente termina la fila ( \cr
) y termina la matriz ( \pgf@end@matrix
). Sin embargo , podemos parchear con el mismo \vskip
procedimiento.
(Se implementa una matriz PGF, \halign
por lo que se ven \cr
s y \noalign
s en el código).
Por seguridad, agregaré un interruptor matrix bottom crcr
para que puedas desactivarlo en caso de que algo no funcione correctamente con otras matrices.
Código
\documentclass{article}
\usepackage{mathtools}% for amsmath {bmatrix}
\usepackage{tikz}
\usetikzlibrary{matrix}
%% https://tex.stackexchange.com/questions/26866/obstacles-to-simulating-an-amsmath-matrix-by-a-tikz-matrix-of-math-nodes
\newlength\mtxrowsep \setlength\mtxrowsep{1.5ex}
\newlength\mtxcolsep \setlength\mtxcolsep{2\arraycolsep}
\tikzset{
ams/.style={
baseline=-.7ex,
every delimiter/.style={yshift=-1pt},
every left delimiter/.style={xshift=2pt},
every right delimiter/.style={xshift=-2pt},
every node/.style={inner sep=0pt},
},
ams matrix/.style={
inner sep=1pt,
column sep=\mtxcolsep,
row sep=\mtxrowsep,
matrix of math nodes,
},
create ams matrix/.style n args={3}{#1matrix/.style={
ams, every matrix/.style={
ams matrix, left delimiter={#2}, right delimiter={#3}}}},
create ams matrix/.list={b[], B\lbrace\rbrace, p(), v||, V\|\|},
}
\makeatletter
\let\pgf@matrix@finish@line@orig\pgf@matrix@finish@line
\tikzset{
matrix bottom crcr/.is choice, matrix bottom crcr/.default=enabled,
matrix bottom crcr/enabled/.code=
\let\pgf@matrix@finish@line\qrr@pgf@matrix@finish@line
\def\pgf@matrix@last@line@y{\ifpgf@matrix@noendrow@skip0pt\else\the\pgf@y\fi},
matrix bottom crcr/disabled/.code=
\let\pgf@matrix@finish@line\pgf@matrix@finish@line@orig
\def\pgf@matrix@last@line@y{0pt}}
\def\qrr@pgf@matrix@finish@line{%
\global\pgf@y=\pgf@y%
\pgf@ya=-\pgf@y%
\global\advance\pgf@ya by\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname%
\expandafter\xdef\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname{\the\pgf@ya}%
\pgfutil@ifnextchar\egroup{\pgf@matrix@eom@found}{\pgf@matrix@no@eom@found}% Qrr: change
}%
\def\pgf@matrix@eom@found{% Qrr: overwrite (unused before)
\cr
\unless\ifpgf@matrix@noendrow@skip
\noalign{%
\vskip\pgf@y
\ifpgf@matrix@fixed % Qrr: “between borders”
\vskip\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname% unskip
\vskip\pgf@y
\pgf@y=-\pgf@y
\expandafter\xdef\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname{\the\pgf@y}%
\fi
}%
\fi
\pgf@end@matrix
}%
\usepackage{etoolbox}
\patchcmd\pgf@matrix@compute@origin{0pt}{\pgf@matrix@last@line@y}{}{\PatchFailed}
\def\pgf@matrix@last@line@y{0pt}
\newif\ifpgf@matrix@noendrow@skip
\patchcmd\pgfmatrixendrow
{\pgfutil@ifnextchar[{\pgfmatrixendrow@skip}{\pgf@matrix@finish@line}}
{\pgfutil@ifnextchar[{\global\pgf@matrix@noendrow@skipfalse\pgfmatrixendrow@skip}
{\global\pgf@matrix@noendrow@skiptrue\pgf@matrix@finish@line}}
{}{\PatchFailed}
\makeatother
\newcommand{\FillMatrix}{%
\fill [rounded corners=3pt, fill opacity=.35, fill=green!80]
([shift={(0pt, 2pt)}]m-1-1.north west)
-- ([shift={(0pt,-2pt)}]m-2-1.south west)
-- ([shift={(2pt,-2pt)}]m-2-2.south east)
-- ([shift={(2pt, 0pt)}]m-2-2.north east)
-- cycle;
}%
\newcommand*\AMSMATH[1]{$\begin{bmatrix}\smash{1} & \smash{4} \\ 7 & 10 \\ 13 & 16 \\#1\end{bmatrix}$}
\begin{document}
no patch, \verb|\\|:\par
\begin{tikzpicture}[bmatrix]
\matrix (m) {
1 & 4 \\
7 & 10 \\
13 & 16 \\
};
\FillMatrix
\end{tikzpicture}\AMSMATH{}\medskip
no patch, \verb|\\[1.5ex]|:\par
\begin{tikzpicture}[bmatrix]
\matrix (m) [row sep=0pt]{
1 & 4 \\
7 & 10 \\
13 & 16 \\[1.5ex]
};
\FillMatrix
\end{tikzpicture}\AMSMATH{[1.5ex]}\bigskip
patch, \verb|\\|:\par
\begin{tikzpicture}[bmatrix, matrix bottom crcr]
\matrix (m) {
1 & 4 \\
7 & 10 \\
13 & 16 \\
};
\FillMatrix
\end{tikzpicture}\AMSMATH{}\medskip
patch, \verb|\\[1.5ex]| (row sep + arg inserted) (\AmS: \verb|[3.0ex]|):\par
\begin{tikzpicture}[bmatrix, matrix bottom crcr]
\matrix (m) [row sep=0pt]{
1 & 4 \\
7 & 10 \\
13 & 16 \\[1.5ex]
};
\FillMatrix
\end{tikzpicture}\AMSMATH{[3ex]}\medskip
patch, \verb|\\[-\pgfmatrixrowsep]| (row sep compensated):\par
\begin{tikzpicture}[bmatrix, matrix bottom crcr]
\matrix (m) [row sep=0pt]{
1 & 4 \\
7 & 10 \\
13 & 16 \\[-\pgfmatrixrowsep]
};
\FillMatrix
\end{tikzpicture}
\end{document}