在 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 separation 设置为使用即可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}

相关内容