
Я хотел бы пометить узел с помощью 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}
Выход
решение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}