设置角落中的元素以使 tikzcd 交换图中的箭头长度保持相同

设置角落中的元素以使 tikzcd 交换图中的箭头长度保持相同

在我的 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和 的代码。它在几种情况下应该很有用。\mathrlapmathtools

\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

这里有两件事需要解决:

  1. 箭头的长度应相同。(只有水平的?)

    最简单的解决方法是使每列中的所有节点具有相同的宽度。

  2. 并且其中一个单元格的右侧不应该是相同宽度的一部分。

    在这个简单的例子中,最容易实现的是使用与其前一列没有列分隔的第三列。

对于 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

我使用了另一种策略,即在下面的代码中使用\mkernxshift

\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}

在此处输入图片描述

相关内容