Parámetro opcional para \\ en la matriz de nodos matemáticos de Tikz para dejar espacio adicional después de la última línea

Parámetro opcional para \\ en la matriz de nodos matemáticos de Tikz para dejar espacio adicional después de la última línea

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 matrixestilo 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.

ingrese la descripción de la imagen aquí

La bmatrixversión se comporta como se desea.

Pregunta relacionada

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 tikzse 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:

ingrese la descripción de la imagen aquí

\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 \crejecutará algunos \vskips de acuerdo con los tamaños de las filas y si se usó between originso 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 \vskipprocedimiento.

(Se implementa una matriz PGF, \halignpor lo que se ven \crs y \noaligns en el código).


Por seguridad, agregaré un interruptor matrix bottom crcrpara 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}

Producción

ingrese la descripción de la imagen aquí

información relacionada