Я пытался ответитьвопросно TikZcd, который я хотел бы набрать, не очень удачно расположен по вертикали между фигурными скобками (красные линии нарисованы, чтобы лучше показать проблему):
\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
\begin{tikzcd}[
ampersand replacement=\&,
every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red},
row sep=0pt,
column sep=10pt,
]
#1\ar[rr]\ar[dr]\&\\ar[dl]\\
\
\end{tikzcd}%
}
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}
решение1
После создания изображения TikZ оно будет представлять собой просто прямоугольник с самой низкой точкой ограничивающего прямоугольника на базовой линии.
TikZ-CD перезаписывает это значение по умолчанию. Для однорядной диаграммы он будет размещен таким образом, что базовая линия узлов будет на базовой линии окружающего текста.
Для любой другой диаграммы его базовая линия будет центром матрицы (не всего изображения), что такжеу= 0 баллов по умолчанию.
Обычно это хороший выбор, поскольку диаграмма либо располагается на отдельной строке (например, в figure
среде), либо является единственным элементом среды отображения математических данных.
Для встроенных диаграмм необходимо сместить блок вверх так, чтобы центр матрицы оказался на высоте выступа этой скобки. TikZ-CD предоставляет функцию PGFMath, axis_height
которая позволяет использовать это расстояние внутри PGF/TikZ.
Таким образом, вам понадобится
baseline={([yshift=-axis_height]\tikzcdmatrixname)}
% or, if no vertical shifting of the matrix has been applied, just
baseline=-axis_height
для ваших встроенных диаграмм.
Я позволил себе настроить некоторые внутренние и внешние разделители, чтобы узлы и матрица были плотно упакованы, но узлы все еще имели немного отступов для стрелок. Если метки, т. е. узлы вдоль стрелок, должны быть использованы, их outer sep
следует снова установить на 0pt
или по умолчанию .5\pgflinewidth
.
Примечания:
Я добавил изогнутую (но
overlay
вытянутую) стрелку, которая не мешает измерению подтяжек.Библиотека
matrix
предоставляетleft delimiter
иright delimiter
. Однако, поскольку\left
/\right
не выводит точные длины для разделителей, а библиотека размещает разделители несколько неудачно, их нельзя использовать здесь без корректировки того, как TikZ их размещает.Решение с разделителями TikZ прокомментировано в коде ниже.
Код
\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}
%\makeatletter
%\tikzset{better delimiters/.style={
% /tikz/every left delimiter/.append style={at=(\tikz@last@[email protected]),anchor=east},
% /tikz/every right delimiter/.append style={at=(\tikz@last@[email protected]),anchor=west}}}
%\makeatother
\newcommand{\tricd}[3]{%
\begin{tikzcd}[
baseline={([yshift=-axis_height]\tikzcdmatrixname)},
ampersand replacement=\&,
% /tikz/better delimiters,
every matrix/.append style={% https://tex.stackexchange.com/a/653533/16595
% left delimiter=\{, right delimiter=\},
every outer matrix/.append style={inner sep=+0pt, outer sep=+0pt},
cells={nodes={inner sep=+0pt, outer sep=+.15em, draw=red}},
draw=red},
row sep=0pt, column sep=10pt]
#1\ar[rr]\ar[dr]\&\\ar[dl] \ar[ll, bend right, overlay]\\
\
\end{tikzcd}}
\begin{document}
Why is the Ti\emph{k}Zcd not well vertically aligned between braces?
\( \left\{ \tricd{X}{Y}{Z} \right\} \)
\end{document}
Выход
решение2
вы увидите то же самое с \left\{\begin{array}[t]...
X выровнены по базовой линии, поэтому конструкция имеет большую глубину, но \{
вертикально центрированы. Сдвиньте базовую линию tikz:
\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
\begin{tikzcd}[
baseline=-2pt,
ampersand replacement=\&,
every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red},
row sep=0pt,
column sep=10pt,
]
#1\ar[rr]\ar[dr]\&\\ar[dl]\\
\
\end{tikzcd}%
}
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}
решение3
Использовать gathered
.
\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
\begin{gathered}%
\begin{tikzcd}[
ampersand replacement=\&,
every matrix/.append style={nodes={inner sep=0pt}},
row sep=0pt,
column sep=10pt,
]
#1\ar[rr]\ar[dr]\&\\ar[dl]\\
\
\end{tikzcd}%
\end{gathered}%
}
\begin{document}
The Ti\emph{k}Zcd is well
vertically aligned between braces! \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}
решение4
Вы можете добавить \vcenter{\hbox{...}}
вокруг tikzcd
.
\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
\vcenter{\hbox{\begin{tikzcd}[
ampersand replacement=\&,
every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red},
row sep=0pt,
column sep=10pt,
]
#1\ar[rr]\ar[dr]\&\\ar[dl]\\
\
\end{tikzcd}}}%
}
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}