在 tikzcd 中設定節點標籤而不改變間距

在 tikzcd 中設定節點標籤而不改變間距

我想使用 tikz-cd 標記節點而不改變行之間的垂直間距。

這是一個例子:

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

三張圖

在左側您會看到沒有任何標籤的圖表。當我在 C 上新增標籤 * 時,我希望兩行之間的距離相同。

答案1

這將取決於標籤/重疊的內容以及您是否希望箭頭考慮任何形式的標籤/重疊。

以下是一些方法:

  • 對於\overset,您可以使用\ooverset它將忽略重疊的垂直尺寸。

  • 對於標籤:

    • 你可以overlay這樣做,這將使 TikZ 不考慮單元格或整個圖表的邊界框。 →overlay加到/tikz/every label.
    • 您可以稍後在建立矩陣時添加它。 → 使用cd label.

最後,您只需設定row sep要使用的配給between origins。這會將所有節點的中心放置在具有固定距離的網格上,忽略單元格的內容。現在您可以使用\overset和 法線,label而不會影響垂直間距。


所有這些解決方案都有缺點,如果不加以處理,事情可能會重疊。

除了\overset-between origins組合之外,在放置從上方某處*相交的箭頭時,兩者都不會被考慮。C

程式碼

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

輸出

在此輸入影像描述

答案2

由於箭頭不會改變儲存格之間的間距,因此您可以將標籤放置在虛像箭頭上方(不指向任何地方):

在此輸入影像描述

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

相關內容