間隔を変更せずに 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}

3つの図

左側にはラベルのない図があります。C の上にラベル * を追加して、2 つの行間の距離を同じにしたいと思います。右側の 2 つの図は、それを実現するための無駄な試みを示しています。

答え1

これは、ラベル/オーバーセットの内容と、矢印がラベル/オーバーセットを任意の形式で考慮するかどうかによって異なります。

以下にいくつかのアプローチを示します。

  • の場合、オーバーセットの垂直方向の寸法を無視する を\overset使用できます。\ooverset

  • ラベルの場合:

    • こうoverlayすることで、TikZ はセルの境界ボックスまたはダイアグラム全体に対してこれを考慮しなくなります。→overlayに追加します/tikz/every label
    • マトリックスが構築されたら後で追加できます。→ を使用しますcd label

row sep最後に、 aration を を使用するように設定するだけです。これにより、セルの内容を無視して、すべてのノードの中心が固定距離のグリッド上に配置されます。これで、垂直間隔に影響を与えずに と法線between originsを使用できるようになります。\oversetlabel


これらの解決策にはすべて、適切に対処しないと重複してしまう可能性があるという欠点があります。

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

関連情報