我试图回答一个问题但我想要排版的 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 pt。
这通常是一个不错的选择,因为图表要么位于其自己的行上(例如在环境中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
用于您的内联图表。
我擅自调整了一些内部和外部 sep,以便节点和矩阵紧密排列,但节点仍然为箭头左侧留出一些填充。如果标签(即箭头上的节点)可以使用,则应将其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}