
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}
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\ooverset
el cual ignorará la dimensión vertical del desplazamiento.Para la etiqueta:
- Puedes
overlay
hacerlo, lo que hará que TikZ no lo considere para el cuadro delimitador de la celda o para todo el diagrama. → Añadiroverlay
a/tikz/every label
. - Puede agregarlo más tarde cuando se construya la matriz. → Usar
cd label
.
- Puedes
Finalmente, puedes simplemente configurar la row sep
configuració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 \overset
y lo normal label
sin 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 C
en 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
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):
\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}