在我的 MWE 中的交换图中,我希望保持箭头长度固定,以使元素(数学项或方程式)的长度不会影响单个箭头长度。这是我的 MWE:
\documentclass{report}
\usepackage{amsmath}
\usepackage{tikz-cd}
\begin{document}
$$
\begin{tikzcd}
\Psi \arrow[d, "\partial_a"]\arrow[r, "U"] & \Psi' \arrow[d, ]\\
\partial_a \Psi \arrow[r, "U"] & (\partial_a\Psi)' = U(\partial_a\Psi)
\end{tikzcd}
$$
\end{document}
我得到的输出如下:
我该怎么做?
答案1
对于具体情况,
\documentclass{report}
\usepackage{amsmath,mathtools}
\usepackage{tikz-cd}
\begin{document}
\noindent X\dotfill X
\[
\begin{tikzcd}
\Psi \arrow[d, "\partial_a"]\arrow[r, "U"] & \Psi' \arrow[d, ]\\
\partial_a \Psi \arrow[r, "U"] & (\partial_a\Psi)'\mathrlap{{} = U(\partial_a\Psi)}
\end{tikzcd}
\hphantom{{} = U(\partial_a\Psi)}
\]
\end{document}
多余的部分排版在右侧的零宽度框中。添加相同的材料作为幻影,以确保居中正确。
请注意,$$
LaTeX 并不好,自 1982 年左右首次发布以来(大约 40 年)一直如此。
答案2
这是使用包的宏\mathllap
和 的代码。它在几种情况下应该很有用。\mathrlap
mathtools
\documentclass{report}
\usepackage{mathtools}
\usepackage{tikz-cd}
\begin{document}
\section*{KO}
\[
\begin{tikzcd}
\Psi \arrow[d, "\partial_a"]\arrow[r, "U"] & \Psi' \arrow[d, ]\\
\partial_a \Psi \arrow[r, "U"] & (\partial_a\Psi)' = U(\partial_a\Psi)
\end{tikzcd}
\]
\section*{OK}
\[
\begin{tikzcd}
\mathllap{\Psi}
\arrow[d, "\partial_a", shift right=4pt]
\arrow[r, "U"]
& \mathrlap{\Psi'}
\arrow[d, shift left=4pt]
\\
\mathllap{\partial_a \Psi}
\arrow[r, "U"]
& \mathrlap{(\partial_a\Psi)' = U(\partial_a\Psi)}
\end{tikzcd}
\]
\section*{Another use}
\[
\begin{tikzcd}
\mathllap{(\partial_a\Psi)' = U(\partial_a\Psi)}
\arrow[d, "\partial_a", shift right=4pt]
\arrow[r, "U"]
& \mathrlap{(\partial_a\Psi)' = U(\partial_a\Psi)}
\arrow[d, "\partial_a", shift left=4pt]
\\
\mathllap{\partial_a \Psi}
\arrow[r, "U"]
& \mathrlap{(\partial_a\Psi)' = U(\partial_a\Psi)}
\end{tikzcd}
\]
\end{document}
相应的输出。
答案3
这里有两件事需要解决:
箭头的长度应相同。(只有水平的?)
最简单的解决方法是使每列中的所有节点具有相同的宽度。
并且其中一个单元格的右侧不应该是相同宽度的一部分。
在这个简单的例子中,最容易实现的是使用与其前一列没有列分隔的第三列。
对于 2。我使用的键no csep
是获取不应与其后继列分隔的列的列表。在这里,您只需要no csep = 2
。
对于 1. 您可以使用set widest math
每个列最宽内容的列表,这里:set widest math={\partial_a \Psi, (\partial_a\Psi)'}
。
有关 2 的其他解决方案,请查看我的另一个答案我将在这里探讨一些想法。如果您不喜欢处理额外的列,那么答案 2. 和 3. 的解决方案更合适。
对于 1 的其他解决方案,您可以直接让 TikZ 测量每个节点并应用所需minimum width
的下次运行时。
如果你实际上不想让列居中,你实际上可以使用情况1这个答案。
在下面的代码中,我注释了连接第二行节点的北锚点的箭头,以表明垂直箭头的长度也不相同。
代码
\documentclass{report}
\usepackage{mathtools, tikz-cd}
\tikzcdset{
no csep/.style={/utils/temp/.style={/tikz/column ##1/.append style={
column sep=-2*(\pgfkeysvalueof{/pgf/inner xsep})}},/utils/temp/.list={#1}},
set widest math/.style={
/utils/exec=\def\pgfmathcounter{0},
/utils/temp/.code=\edef\pgfmathcounter{\pgfinteval{\pgfmathcounter+1}}%
\pgfkeysalso{/tikz/column \pgfmathcounter/.append style={
align=center, text width={width("$##1$")}}},
/utils/temp/.list={#1}}}
\usepackage[showframe, pass]{geometry}
\begin{document}
\[
\begin{tikzcd}[set widest math={\partial_a \Psi, (\partial_a\Psi)'}, no csep=2]
\Psi \arrow[d, "\partial_a"] \arrow[r, "U"]
& \Psi' \arrow[d] \\
\partial_a \Psi \arrow[r, "U"]
& (\partial_a\Psi)'
& {} = U(\partial_a\Psi)
% \ar[help lines, start anchor=north, end anchor=north, l]
\end{tikzcd}
\]
\end{document}
输出
答案4
我使用了另一种策略,即在下面的代码中使用\mkern
和xshift
。
\documentclass[a4paper,12pt]{article}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}[column sep=0pt]
\mkern2mu\Psi \arrow[r, "U",{xshift=4pt}] \arrow[d, "\partial_a"] & \Psi' \arrow[d] \\
\partial_a \Psi \arrow[r, "U",end anchor={[xshift=6.67em]}]{r} & \mkern115mu (\partial_a\Psi)' = U(\partial_a\Psi)
\end{tikzcd}
\end{document}