Problema com um TikZcd entre chaves

Problema com um TikZcd entre chaves

Eu estava tentando responderuma perguntamas o TikZcd que eu gostaria de compor não está bem posicionado verticalmente entre as chaves (as linhas vermelhas são desenhadas para mostrar melhor o problema):

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}

\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
    \begin{tikzcd}[
        ampersand replacement=\&, 
        every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red}, 
        row sep=0pt,
        column sep=10pt,
        ]
        #1\ar[rr]\ar[dr]\&\&#2\ar[dl]\\
        \&#3
    \end{tikzcd}%
    }
    
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}

insira a descrição da imagem aqui

Responder1

Quando uma imagem TikZ for criada, ela será apenas uma caixa com o ponto mais baixo da caixa delimitadora na linha de base.

TikZ-CD substitui esse padrão. Para um diagrama de 1 linha, ele será colocado de forma que a linha de base dos nós fique na linha de base do texto circundante.
Para qualquer outro diagrama, sua linha de base será o centro da matriz (não a imagem inteira), que também ésim= 0 pt por padrão.

Geralmente, essa é uma boa escolha porque o diagrama está em sua própria linha (por exemplo, no figureambiente) ou é o único elemento de um ambiente de exibição matemática.

Para diagramas embutidos, a caixa precisa ser deslocada para cima, de modo que o centro da matriz fique na altura do nó da chave. O TikZ-CD traz consigo uma função PGFMath axis_heightque permite usar essa distância dentro do PGF/TikZ.

Assim, você precisará

baseline={([yshift=-axis_height]\tikzcdmatrixname)}
% or, if no vertical shifting of the matrix has been applied, just
baseline=-axis_height

para seus diagramas embutidos.


Tomei a liberdade de ajustar algumas divisões internas e externas para que os nós e a matriz fiquem bem compactados, mas os nós ainda tenham um pouco de preenchimento para as setas restantes. Se os rótulos, ou seja, os nós ao longo das setas, puderem ser usados, eles outer sepdeverão ser definidos como 0ptou o padrão .5\pgflinewidthnovamente.

Notas:

  • Eu adicionei uma overlayseta dobrada (mas ed) que não interfere na forma como os colchetes são medidos.

  • A matrixbiblioteca fornece left delimitere right delimiter. No entanto, como \left/ \rightnão produz comprimentos exatos para os delimitadores e a biblioteca coloca os delimitadores de forma um tanto azarada, eles não podem ser usados ​​​​aqui sem ajustar como o TikZ os posiciona.

    A solução com os delimitadores do TikZ está comentada no código abaixo.

Código

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}
%\makeatletter
%\tikzset{better delimiters/.style={
%  /tikz/every left delimiter/.append style={at=(\tikz@last@[email protected]),anchor=east},
%  /tikz/every right delimiter/.append style={at=(\tikz@last@[email protected]),anchor=west}}}
%\makeatother
\newcommand{\tricd}[3]{%
  \begin{tikzcd}[
    baseline={([yshift=-axis_height]\tikzcdmatrixname)},
    ampersand replacement=\&,
%    /tikz/better delimiters,
    every matrix/.append style={% https://tex.stackexchange.com/a/653533/16595
%      left delimiter=\{, right delimiter=\},
      every outer matrix/.append style={inner sep=+0pt, outer sep=+0pt},
      cells={nodes={inner sep=+0pt, outer sep=+.15em, draw=red}},
      draw=red},
    row sep=0pt, column sep=10pt]
    #1\ar[rr]\ar[dr]\&\&#2\ar[dl] \ar[ll, bend right, overlay]\\
    \&#3
  \end{tikzcd}}
\begin{document}
Why is the Ti\emph{k}Zcd not well vertically aligned between braces?
\( \left\{ \tricd{X}{Y}{Z} \right\} \)
\end{document}

Saída

insira a descrição da imagem aqui

Responder2

insira a descrição da imagem aqui

você veria o mesmo com \left\{\begin{array}[t]... o X alinhado na linha de base, de modo que a construção tenha grande profundidade, mas \{centralizada verticalmente. Desloque a linha de base do tikz:

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}

\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
    \begin{tikzcd}[
baseline=-2pt,
        ampersand replacement=\&, 
        every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red}, 
        row sep=0pt,
        column sep=10pt,
        ]
        #1\ar[rr]\ar[dr]\&\&#2\ar[dl]\\
        \&#3
    \end{tikzcd}%
    }
    
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}

Responder3

Usar gathered.

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}

\newcommand{\tricd}[3]{%
  \begin{gathered}%
    \begin{tikzcd}[
        ampersand replacement=\&,
        every matrix/.append style={nodes={inner sep=0pt}},
        row sep=0pt,
        column sep=10pt,
        ]
        #1\ar[rr]\ar[dr]\&\&#2\ar[dl]\\
        \&#3
    \end{tikzcd}%
  \end{gathered}%
}

\begin{document}

The Ti\emph{k}Zcd is well
vertically aligned between braces! \(
\left\{\tricd{X}{Y}{Z}\right\}
\)

\end{document}

insira a descrição da imagem aqui

Responder4

Você pode adicionar \vcenter{\hbox{...}}em torno do tikzcd.

insira a descrição da imagem aqui

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}

\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
    \vcenter{\hbox{\begin{tikzcd}[
        ampersand replacement=\&, 
        every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red}, 
        row sep=0pt,
        column sep=10pt,
        ]
        #1\ar[rr]\ar[dr]\&\&#2\ar[dl]\\
        \&#3
    \end{tikzcd}}}%
    }
    
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}

informação relacionada