Ajuste a parte superior e inferior do delimitador esquerdo e do delimitador direito da matriz tikz individualmente

Ajuste a parte superior e inferior do delimitador esquerdo e do delimitador direito da matriz tikz individualmente

Estou usando o formulário de soluçãoObstáculos à simulação de uma matriz amsmath por uma matriz TiKZ de nós matemáticospara criar um tikz matrixno estilo de um bmatrix. Isso funciona muito bem, com a especificação padrão de

every delimiter/.style={yshift=-1pt}.

Mas, às vezes eu queromanualmenteajuste a parte superior do delimitador esquerdo/direito separadamente da parte inferior do delimitador esquerdo/direito, tentando encontrar uma tikzmaneira de fazer isso. eu pudessehackearcolocando uma phantomrégua vertical, mas seria muito melhor ter um estilo tikz para isso. Idealmente, a solução teria um estilo como o seguinte:

left delimiter top y shift=
left delimiter bottom y shift=
right delimiter top y shift=
right delimiter bottom y shift=

e da mesma forma para os delimitadores associados superior e inferior (que não são usados ​​​​aqui)

top delimiter left x shift=
top delimiter right x shift=
bottom delimiter left x shift=
bottom delimiter right x shift=

Só para deixar claro, não estou esperando soluções automatizadas, mas sim um ajuste manual dos delimitadores conforme necessário.

Abaixo está uminventadoexemplo (e para minha surpresa bmatrixproduz os resultados desejados por padrão, mas não entendo como) onde a primeira linha da matriz para ambos os casos é

\smash{1} &  \smash{4} \\ 

insira a descrição da imagem aqui

Código:

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

Responder1

Só posso fornecer uma reimplementação dos delimitadores com duas chaves extras: delim' tope delim' bot.

Não sei se a abordagem assimétrica (com valores diferentes para esquerda e direita, bem como acima e abaixo) é uma boa ideia ou apenas complica um pouco…

Código

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

Saída

insira a descrição da imagem aqui

informação relacionada