Ich verwende das LösungsformularHindernisse bei der Simulation einer Amsmath-Matrix durch eine TiKZ-Matrix aus mathematischen Knotenum ein tikz
matrix
im Stil von a zu erstellen bmatrix
.
Ich möchte nach der letzten Zeile etwas mehr Platz lassen und dachte, dass dies mit Folgendem \\[1.5ex]
funktionieren sollte:
\matrix (m) {
1 & 4 \\
7 & 10 \\
13 & 16 \\[1.5ex]% <--- This seems to have no effect.
};
aber das scheint keine Wirkung zu haben. Die Verwendung dieses optionalen Parameters in jeder Zeile außer der letzten scheint zu funktionieren.
Die bmatrix
Version verhält sich wie gewünscht.
Verwandte Frage
- Passen Sie die Ober- und Unterseite des linken und rechten Trennzeichens der Tikz-Matrix einzeln an
- Wie kann ich die Zeilenhöhe bei der Verwendung von Buchregistern erhöhen?. Hier geht es nicht um
tikz
ein ähnliches Problem mit dem vertikalen Abstand.
Code:
\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}
Vorläufiger Nachtrag:
Ich habe versucht, die Lösung von Qrrbrbirlbel zu verwenden, bin aber auf ein Problem gestoßen: Die Koordinaten der Knoten sind nicht mehr dort, wo tikz
sie sein sollen. Wenn ich die in der Antwort bereitgestellte Präambel mit dem folgenden Code verwende, scheint es, als ob die Knoten (z. B. m-1-1.north west
) verschoben sind:
\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}
Antwort1
Letzteres [<vspace>]
hat keine Auswirkung, da PGF einfach nicht denselben Code ausführt wie für ein normales \\
. Es wertet ihn aus und speichert ihn, sodass wir ihn im folgenden Patch verwenden können. Wenn das erledigt ist, prüft es, ob ein }
(= \egroup
) folgt, das das Ende des Matrixinhalts anzeigt.
Wenn dies nicht der Fall ist, \cr
führt es nach einer Weile einige \vskip
s entsprechend der Zeilengröße aus und prüft, ob between origins
oder between borders
verwendet wurde, und fährt dann mit der nächsten Zeile fort.
Wenn dies der Fall ist, wird einfach die Zeile ( \cr
) und die Matrix ( \pgf@end@matrix
) beendet. Wir können jedoch dieselbe \vskip
Prozedur einfügen.
(Eine PGF-Matrix wird über implementiert, \halign
weshalb Sie im Code \cr
s und s sehen.)\noalign
Aus Sicherheitsgründen werde ich matrix bottom crcr
hierfür einen Schalter hinzufügen, sodass Sie es deaktivieren können, falls bei anderen Matrizen etwas nicht richtig funktioniert.
Code
\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}