Tikz 행렬의 왼쪽 구분 기호와 오른쪽 구분 기호의 위쪽과 아래쪽을 개별적으로 조정합니다.

Tikz 행렬의 왼쪽 구분 기호와 오른쪽 구분 기호의 위쪽과 아래쪽을 개별적으로 조정합니다.

솔루션 양식을 사용하고 있습니다.수학 노드의 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}

산출

여기에 이미지 설명을 입력하세요

관련 정보