
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}
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
\overset
können Sie verwenden,\ooverset
wodurch die vertikale Dimension des Übersatzes ignoriert wird.Für das Etikett:
- Sie können
overlay
es tun, wodurch TikZ es nicht für den Begrenzungsrahmen der Zelle oder das gesamte Diagramm berücksichtigt. → Hinzufügenoverlay
zu/tikz/every label
. - Sie können es später hinzufügen, wenn die Matrix erstellt ist. → Verwenden Sie
cd label
.
- Sie können
Schließlich können Sie einfach die row sep
Aration 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 \overset
und 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 origins
Kombination *
wird keines von beiden berücksichtigt, wenn ein Pfeil platziert wird, der C
von 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
Antwort2
Da Pfeile den Abstand zwischen den Zellen nicht ändern, können Sie Ihr Etikett über einem Phantompfeil platzieren (der nirgendwohin zeigt):
\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}