Definir rótulo sobre nó no tikzcd sem alteração de espaçamento

Definir rótulo sobre nó no tikzcd sem alteração de espaçamento

Gostaria de rotular um nó usando tikz-cd sem alterar o espaçamento vertical entre as linhas.

Aqui está um exemplo:

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

três diagramas

À esquerda você vê o diagrama sem nenhum rótulo. Gostaria de ter a mesma distância entre as duas linhas ao adicionar um rótulo * sobre C. Os dois diagramas à direita mostram tentativas inúteis de fazer isso.

Responder1

Isso dependerá do conteúdo de seus rótulos/oversets e se você deseja que as setas considerem os rótulos/oversets de qualquer forma.

Aqui estão algumas abordagens:

  • Para \overset, você pode usar \ooversetwhich irá ignorar a dimensão vertical do overset.

  • Para o rótulo:

    • Você pode overlayfazer isso com que o TikZ não o considere para a caixa delimitadora da célula ou para todo o diagrama. → Adicionar overlaya /tikz/every label.
    • Você pode adicioná-lo mais tarde, quando a matriz for construída. → Usar cd label.

Finalmente, você pode simplesmente definir a row separação a ser usada between origins. Isto coloca o centro de todos os nós em uma grade com uma distância fixa, ignorando o conteúdo das células. Agora você pode usar \overseto normal labelsem afetar o espaçamento vertical.


Todas essas soluções têm a desvantagem de que as coisas podem se sobrepor quando não são cuidadas.

Exceto pelo combo \overset- between origins, nenhum dos dois *será considerado ao colocar uma flecha que venha Cde algum lugar acima.

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}

Saída

insira a descrição da imagem aqui

Responder2

Como as setas não alteram o espaçamento entre as células, você pode colocar seu rótulo acima de uma seta fantasma (que não aponta para lugar nenhum):

insira a descrição da imagem aqui

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

informação relacionada