Setzen Sie das Label über den Knoten in Tikzcd, ohne den Abstand zu ändern

Setzen Sie das Label über den Knoten in Tikzcd, ohne den Abstand zu ändern

Ich möchte einen Knoten mit tikz-cd beschriften, ohne den vertikalen Abstand zwischen den Zeilen zu ändern.

Hier ist ein Beispiel:

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

drei Diagramme

Links sehen Sie das Diagramm ohne Beschriftung. Ich möchte, dass zwischen den beiden Zeilen der gleiche Abstand besteht, wenn ich über C eine Beschriftung * anfüge. Die beiden Diagramme rechts zeigen vergebliche Versuche, dies zu erreichen.

Antwort1

Dies hängt vom Inhalt Ihrer Beschriftungen/Überlagerungen ab und davon, ob Pfeile die Beschriftungen/Überlagerungen in irgendeiner Form berücksichtigen sollen.

Hier sind einige Ansätze:

  • Für \oversetkönnen Sie verwenden, \ooversetwodurch die vertikale Dimension des Übersatzes ignoriert wird.

  • Für das Etikett:

    • Sie können overlayes tun, wodurch TikZ es nicht für den Begrenzungsrahmen der Zelle oder das gesamte Diagramm berücksichtigt. → Hinzufügen overlayzu /tikz/every label.
    • Sie können es später hinzufügen, wenn die Matrix erstellt ist. → Verwenden Sie cd label.

Schließlich können Sie einfach die row sepAration auf die Verwendung von einstellen between origins. Dadurch wird der Mittelpunkt aller Knoten auf einem Raster mit einem festen Abstand platziert, wobei der Inhalt der Zellen ignoriert wird. Sie können jetzt \oversetund die Normale verwenden label, ohne dass dies den vertikalen Abstand beeinflusst.


Alle diese Lösungen haben den Nachteil, dass es zu Überschneidungen kommen kann, wenn man nicht darauf achtet.

Mit Ausnahme der \overset- between originsKombination *wird keines von beiden berücksichtigt, wenn ein Pfeil platziert wird, der Cvon irgendwo oben trifft.

Code

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

Ausgabe

Bildbeschreibung hier eingeben

Antwort2

Da Pfeile den Abstand zwischen den Zellen nicht ändern, können Sie Ihr Etikett über einem Phantompfeil platzieren (der nirgendwohin zeigt):

Bildbeschreibung hier eingeben

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

verwandte Informationen