Problema con un TikZcd entre llaves

Problema con un TikZcd entre llaves

Estaba tratando de responderuna preguntapero el TikZcd que me gustaría componer no está bien colocado verticalmente entre las llaves (las líneas rojas están dibujadas para mostrar mejor el 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}

ingrese la descripción de la imagen aquí

Respuesta1

Cuando se haya creado una imagen TikZ, será solo un cuadro con el punto más bajo del cuadro delimitador en la línea de base.

TikZ-CD sobrescribe este valor predeterminado. Para un diagrama de 1 fila, se colocará de tal manera que la línea base de los nodos estará en la línea base del texto circundante.
Para cualquier otro diagrama, su línea base será el centro de la matriz (no la imagen completa), que también esy= 0 puntos por defecto.

Esta suele ser una buena opción porque el diagrama está en su propia línea (por ejemplo, en el figureentorno) o es el único elemento de un entorno matemático de visualización.

Para diagramas en línea, es necesario desplazar el cuadro hacia arriba para que el centro de la matriz esté a la altura de la protuberancia de esa llave. TikZ-CD trae consigo una función PGFMath axis_heightque le permite utilizar esta distancia dentro de PGF/TikZ.

Por lo tanto, necesitará

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

para sus diagramas en línea.


Me tomé la libertad de ajustar algunos espacios internos y externos para que los nodos y la matriz queden bien empaquetados, pero a los nodos todavía les queda un poco de relleno para las flechas. Si se pueden utilizar etiquetas, es decir, nodos a lo largo de las flechas, se outer sepdeben establecer nuevamente en 0ptel valor predeterminado .5\pgflinewidth.

Notas:

  • Agregué una overlayflecha doblada (pero ed) que no interfiere con la forma en que se miden los tirantes.

  • La matrixbiblioteca ofrece left delimitery right delimiter. Sin embargo, dado que \left/ \rightno genera longitudes exactas para los delimitadores y la biblioteca coloca los delimitadores con cierta mala suerte, estos no se pueden usar aquí sin ajustar cómo TikZ los coloca.

    La solución con los delimitadores de TikZ se comenta en el código siguiente.

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}

Producción

ingrese la descripción de la imagen aquí

Respuesta2

ingrese la descripción de la imagen aquí

Verías lo mismo con \left\{\begin{array}[t]... Las X están alineadas en la línea de base, por lo que la construcción tiene una gran profundidad, pero \{están centradas verticalmente. Empuja la línea de base del 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}

Respuesta3

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}

ingrese la descripción de la imagen aquí

Respuesta4

Puedes agregar \vcenter{\hbox{...}}alrededor del tikzcd.

ingrese la descripción de la imagen aquí

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

información relacionada