Необязательный параметр \\ в матрице математических узлов Tikz, чтобы оставить дополнительное пространство после последней строки

Необязательный параметр \\ в матрице математических узлов Tikz, чтобы оставить дополнительное пространство после последней строки

Я использую форму решенияПрепятствия к моделированию матрицы amsmath с помощью матрицы TiKZ математических узловсоздать tikz matrixв стиле bmatrix.

Я хотел бы оставить немного дополнительного места после последней строки и подумал, что использование \\[1.5ex]должно подойти для этой цели:

\matrix (m) {
   1 &  4 \\ 
   7 & 10 \\ 
  13 & 16 \\[1.5ex]% <--- This seems to have no effect.
};

но это, кажется, не имеет никакого эффекта. Использование этого необязательного параметра в любой строке, кроме последней, кажется, работает.

введите описание изображения здесь

Версия bmatrixведет себя так, как и хотелось бы.

Сопутствующий вопрос

Код:

\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}

Временное приложение:

Я попытался использовать решение Qrrbrbirlbel, но столкнулся с проблемой: координаты узлов больше не там, где tikzони должны быть. Используя преамбулу, представленную в ответе, со следующим кодом, кажется, что узлы (например, m-1-1.north west) смещены:

введите описание изображения здесь

\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}

решение1

Последнее [<vspace>]не имеет никакого эффекта, потому что PGF просто не выполняет тот же код, что и для обычного \\. Он оценивает его и сохраняет, чтобы мы могли использовать его в патче ниже. Когда это сделано, он проверяет, следует ли }(= \egroup), что указывает на конец содержимого матрицы.

Если этого не произойдет, после a \crон выполнит несколько \vskips в соответствии с размерами строк, а также независимо от того, использовался ли параметр between originsили , а затем перейдет к следующей строке.between borders

Если это так, то он просто заканчивает строку ( \cr) и заканчивает матрицу ( \pgf@end@matrix). Однако мы можем внести исправления в ту же \vskipпроцедуру.

(Матрица PGF реализована с помощью, \halignпоэтому вы видите \crs и \noaligns в коде.)


В целях безопасности я добавлю переключатель, matrix bottom crcrчтобы вы могли отключить эту функцию в случае, если что-то не будет работать должным образом с другими матрицами.

Код

\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}

Выход

введите описание изображения здесь

Связанный контент