
솔루션 양식을 사용하고 있습니다.수학 노드의 TiKZ 행렬로 amsmath 행렬을 시뮬레이션하는 데 방해가 되는 장애물tikz
matrix
의 스타일로 을 생성합니다 bmatrix
. 이것은 기본 사양으로 꽤 잘 작동합니다.
every delimiter/.style={yshift=-1pt}.
하지만 가끔은 그러고 싶을 때도 있어수동으로tikz
왼쪽/오른쪽 구분 기호의 상단을 개별적으로 조정하여 왼쪽/오른쪽 구분 기호의 하단을 형성하므로 이를 수행하는 방법을 찾으려고 노력합니다 . 나는 할 수 있었다마구 자르기수직 룰을 배치하여 이를 수행 phantom
할 수 있지만 이를 위한 tikz 스타일을 사용하는 것이 훨씬 더 좋을 것입니다. 이상적으로 솔루션은 다음과 같은 스타일을 갖습니다.
left delimiter top y shift=
left delimiter bottom y shift=
right delimiter top y shift=
right delimiter bottom y shift=
상단 및 하단 구분 기호(여기에서는 사용되지 않음)와 관련된 항목에도 유사합니다.
top delimiter left x shift=
top delimiter right x shift=
bottom delimiter left x shift=
bottom delimiter right x shift=
분명히 말하면 자동화된 솔루션을 기대하는 것이 아니라 필요에 따라 구분 기호를 수동으로 조정하는 것입니다.
아래는인위적인예(놀랍게도 bmatrix
기본적으로 원하는 결과를 생성하지만 방법을 이해하지 못합니다) 두 경우 모두에 대한 행렬의 첫 번째 줄은 다음과 같습니다.
\smash{1} & \smash{4} \\
암호:
\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}
답변1
delim' top
두 개의 추가 키( 및 ) 를 사용하여 구분 기호를 다시 구현할 수만 있습니다 delim' bot
.
비대칭 접근 방식(왼쪽과 오른쪽, 위쪽과 아래쪽에 서로 다른 값을 가짐)이 좋은 생각인지 아니면 조금 지나치게 복잡해지는지는 알 수 없습니다.
암호
\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}