간격을 변경하지 않고 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

  • 라벨의 경우:

    • overlayTikZ가 셀의 경계 상자 또는 전체 다이어그램에 대해 이를 고려하지 않도록 만들 수 있습니다. → 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}

산출

여기에 이미지 설명을 입력하세요

답변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}

관련 정보