
Ich verwende das LösungsformularHindernisse bei der Simulation einer Amsmath-Matrix durch eine TiKZ-Matrix aus mathematischen Knotenum eine tikz
matrix
im Stil von a zu erstellen bmatrix
. Das funktioniert ziemlich gut, mit der Standardspezifikation von
every delimiter/.style={yshift=-1pt}.
Aber manchmal möchte ichmanuellIch versuche, die Oberseite des linken/rechten Trennzeichens getrennt von der Unterseite des linken/rechten Trennzeichens zu optimieren tikz
. Ich könntehackenes durch Platzieren einer phantom
vertikalen Linie, aber es wäre viel schöner, dafür einen Tikz-Stil zu haben. Idealerweise hätte die Lösung einen Stil wie den folgenden:
left delimiter top y shift=
left delimiter bottom y shift=
right delimiter top y shift=
right delimiter bottom y shift=
und analog dazu die zugehörigen oberen und unteren Trennzeichen (die hier nicht verwendet werden)
top delimiter left x shift=
top delimiter right x shift=
bottom delimiter left x shift=
bottom delimiter right x shift=
Nur um das klarzustellen: Ich erwarte keine automatisierte Lösung, sondern eine manuelle Anpassung der Trennzeichen nach Bedarf.
Nachfolgend finden Sie einegekünsteltBeispiel (und zu meiner großen Überraschung bmatrix
liefert es standardmäßig die gewünschten Ergebnisse, aber ich verstehe nicht wie), wobei die erste Zeile der Matrix für beide Fälle lautet
\smash{1} & \smash{4} \\
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
%\let\matamp=&
%
%\catcode`\&=13
%\makeatletter
%\def&{\iftikz@is@matrix
% \pgfmatrixnextcell
% \else
% \matamp
% \fi}
%\makeatother
\begin{document}
\hspace*{0.2em}
\begin{tikzpicture}[bmatrix]
\matrix (m) {
\smash{1} & \smash{4} \\
7 & 10 \\
13 & 16 \\
};
\end{tikzpicture}
%% ----------------
\hspace*{0.3em}
$\begin{bmatrix}
\smash{1} & \smash{4} \\
7 & 10 \\
13 & 16 \\
\end{bmatrix}$
tikz matrix \hspace*{0.6em} bmatrix
\end{document}
Antwort1
Ich kann nur eine Neuimplementierung der Trennzeichen mit zwei zusätzlichen Schlüsseln bereitstellen: delim' top
und delim' bot
.
Ich weiß nicht, ob der asymmetrische Ansatz (mit unterschiedlichen Werten für links und rechts sowie oben und unten) eine gute Idee ist oder es einfach ein wenig komplizierter macht …
Code
\documentclass{article}
\usepackage{mathtools}% for amsmath {bmatrix}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset{% similar to axis_height of TikZ-CD
vcenter/.code=\begingroup$\relax$\pgfmathreturn
\the\fontdimen22\textfont2\endgroup
\pgfsetbaseline{-\pgfmathresult pt}}
\tikzset{
delimiter' top/.code=\pgfmathparse{#1}% self-evaluating
\pgfkeyssetevalue{/tikz/delimiter' top}{\pgfmathresult pt},
delimiter' bot/.code=\pgfmathparse{#1}% self-evaluating
\pgfkeyssetevalue{/tikz/delimiter' bot}{\pgfmathresult pt},
delimiter' top=0pt, delimiter' bot=0pt}
\makeatletter
\tikzset{
left delimiter'/.style={delimiter'={south east}{south west}
{every delimiter,every left delimiter,every left delimiter'}
{south}{north}{#1}{.}{\pgf@y}},
right delimiter'/.style={delimiter'={south west}{south east}
{every delimiter,every right delimiter,every right delimiter'}
{south}{north}{.}{#1}{\pgf@y}},
above delimiter'/.style={delimiter'={south east}{north west}
{every delimiter,every above delimiter,every above delimiter',rotate=-90}
{west}{east}{#1}{.}{\pgf@x}},
below delimiter'/.style={delimiter'={south west}{south west}
{every delimiter,every below delimiter,every below delimiter',rotate=-90}
{west}{east}{.}{#1}{\pgf@x}},
every delimiter'/.style={outer sep=+0pt,inner sep=+0pt,path only},
delimiter'/.style n args={8}{append after command={
\bgroup% similar to original delims
\pgfextra{\let\tikz@save@last@fig@name\tikz@last@fig@name
\tikz@node@is@a@labelfalse}
node[every delimiter',anchor=#1,at=(\tikz@last@fig@name.#2),#3,%
yshift=-\pgfkeysvalueof{/tikz/delimiter' bot}]{%
{\nullfont\pgf@process{%
\pgfpointdiff{\pgfpointanchor{\tikz@last@fig@name}{#4}}
{\pgfpointanchor{\tikz@last@fig@name}{#5}}}}%
$\left#6\vcenter{%
\hrule height\dimexpr.5#8+\pgfkeysvalueof{/tikz/delimiter' top}\relax
depth\dimexpr.5#8+\pgfkeysvalueof{/tikz/delimiter' bot}\relax
width0pt}\right#7$}
\pgfextra{\global\let\tikz@last@fig@name\tikz@save@last@fig@name}
\egroup}}}
\makeatother
\tikzset{
every left delimiter'/.style={
delimiter' top= \pgfkeysvalueof{/tikz/left delimiter top yshift},
delimiter' bot=-(\pgfkeysvalueof{/tikz/left delimiter bottom yshift})},
every right delimiter'/.style={
delimiter' top= \pgfkeysvalueof{/tikz/right delimiter top yshift},
delimiter' bot=-(\pgfkeysvalueof{/tikz/right delimiter bottom yshift})},
every above delimiter'/.style={
delimiter' top= \pgfkeysvalueof{/tikz/above delimiter right xshift},
delimiter' bot=-(\pgfkeysvalueof{/tikz/above delimiter left xshift})},
every below delimiter'/.style={
delimiter' top= \pgfkeysvalueof{/tikz/below delimiter right xshift},
delimiter' bot=-(\pgfkeysvalueof{/tikz/below delimiter left xshift})},
left delimiter top yshift/.initial=0pt,
left delimiter bottom yshift/.initial=0pt,
right delimiter top yshift/.initial=0pt,
right delimiter bottom yshift/.initial=0pt,
above delimiter left xshift/.initial=0pt,
above delimiter right xshift/.initial=0pt,
below delimiter left xshift/.initial=0pt,
below delimiter right xshift/.initial=0pt}
\tikzset{
ams/.style={
vcenter, inner sep=+0pt,
every delimiter/.style={yshift=+-1pt},
every left delimiter/.style={xshift=+ 2pt},
every right delimiter/.style={xshift=+-2pt}},
ams matrix/.style={
every outer matrix/.append style={inner sep=+1pt},
matrix anchor=center, matrix of math nodes,
row sep=1.5ex, column sep=2\arraycolsep},
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\|\|},
ams delim' top/.style={
left delimiter top yshift={#1}, right delimiter top yshift={#1}},
ams delim' bot/.style={
left delimiter bottom yshift={#1}, right delimiter bottom yshift={#1}}}
\begin{document}
\hspace*{0.2em}
\tikz[bmatrix, ams delim' top=2ex]
\matrix {
\smash{1} & \smash{4} \\
7 & 10 \\
13 & 16 \\
};
%% ----------------
\hspace*{0.3em}
$\begin{bmatrix}
\smash{1} & \smash{4} \\
7 & 10 \\
13 & 16
\end{bmatrix}$
tikz matrix \hspace*{0.6em} bmatrix
\bigskip
\noindent
\foreach \top in {-3, -2.5, ..., 3}{
\tikz[bmatrix, ams delim' top=\top ex, ampersand replacement=\&]
\matrix[label=below:\tiny\color{gray}$\top$ex]{
\smash{1} \& \smash{4} \\ 7 \& 10 \\ 13 \& 16 \\};}
%
\tikz[
vcenter,
every below delimiter/.style={yshift=1.5ex},
below delimiter left xshift= 1ex,
below delimiter right xshift=-1ex,
above delimiter left xshift= 1ex,
above delimiter right xshift=-1ex,
]\matrix[
matrix of math nodes, above delimiter'=[, below delimiter'={]},
]{\smash{1} & \smash{4} \\ 7 & 10 \\ 13 & 16 \\};
\end{document}