我想使用 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
aration 设置为使用即可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}