Establecer etiqueta sobre nodo en tikzcd sin cambiar el espaciado

Establecer etiqueta sobre nodo en tikzcd sin cambiar el espaciado

Me gustaría etiquetar un nodo usando tikz-cd sin cambiar el espacio vertical entre filas.

Aquí hay un ejemplo:

\documentclass{amsart}
\usepackage{tikz-cd}


\begin{document}

$$
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    C \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    \overset{*}{C} \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    |[label=*]|{C} \ar{r} & D
\end{tikzcd}
$$
\end{document}

tres diagramas

A la izquierda ves el diagrama sin ninguna etiqueta. Me gustaría tener la misma distancia entre las dos filas cuando agrego una etiqueta * sobre C. Los dos diagramas de la derecha muestran intentos inútiles de hacerlo.

Respuesta1

Esto dependerá del contenido de sus etiquetas/desbordamientos y de si desea que las flechas consideren las etiquetas/desbordamientos en cualquier forma.

Aquí hay algunos enfoques:

  • Para \overset, puede utilizar \ooversetel cual ignorará la dimensión vertical del desplazamiento.

  • Para la etiqueta:

    • Puedes overlayhacerlo, lo que hará que TikZ no lo considere para el cuadro delimitador de la celda o para todo el diagrama. → Añadir overlaya /tikz/every label.
    • Puede agregarlo más tarde cuando se construya la matriz. → Usar cd label.

Finalmente, puedes simplemente configurar la row sepconfiguración a usar between origins. Esto coloca el centro de todos los nodos en una cuadrícula con una distancia fija, ignorando el contenido de las celdas. Ahora puedes usar \oversety lo normal labelsin que afecte el espaciado vertical.


Todas estas soluciones tienen la desventaja de que las cosas pueden superponerse si no se atienden.

A excepción del combo \overset- between origins, ninguno de los dos *se considerará al colocar una flecha que se encuentre Cen algún lugar arriba.

Código

\documentclass[varwidth, class=amsart]{standalone}
%\documentclass{amsart}
\usepackage{tikz-cd}

\newcommand*\ooverset[2]{\vphantom{#2}\smash{\overset{#1}{#2}}}
\tikzset{
  cd label/.code={%
    \arrow[to path={% math-mode because everything else is also math mode
      [every label/.append style={execute at begin node=$,execute at end node=$}]
      node also[label={#1}](\tikztostart)}]%
  }
}
\begin{document}

Setting the row separation to \texttt{between origins}:
\[
\tikzcdset{diagrams={row sep={3.75em,between origins}}}
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    C \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    \overset{*}{C} \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    |[label=*]|{C} \ar{r} & D
\end{tikzcd}
\]\medskip

Using \texttt{\string\ooverset} instead of \texttt{\string\overset}
and \texttt{overlay}ing the label(s):
\[
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    C \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    \ooverset{*}{C} \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}[/tikz/every label/.append style={overlay}]
    A \ar{r} & B \ar{d} \\
    |[label=*]|{C} \ar{r} & D
\end{tikzcd}
\]\medskip

Using \texttt{\string\ooverset} (again)
and a \texttt{cd label}, a label that isn't overlayed
but gets added after the matrix has been built.
This is almost like \texttt{overlay}.
The label still contributes to the bounding box of the TikZ picture
but not that of the cells.
\[
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    C \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    \ooverset{*}{C} \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    |[cd label=*]|{C} \ar{r} & D
\end{tikzcd}
\]
\end{document}

Producción

ingrese la descripción de la imagen aquí

Respuesta2

Dado que las flechas no cambian el espacio entre las celdas, puedes colocar tu etiqueta encima de una flecha fantasma (que no apunta a ninguna parte):

ingrese la descripción de la imagen aquí

\documentclass{amsart}
\usepackage{tikz-cd}

\begin{document}

\[
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    C \ar{r} & D
\end{tikzcd}
\quad
\begin{tikzcd}
    A \ar{r} & B \ar{d} \\
    {C} \ar{r}\ar[phantom, "*"above=4pt] & D
\end{tikzcd}
\]

\end{document}

información relacionada