也许是手动方式?

也许是手动方式?

如何确保tikz-cd跨越多行和多列的交换图中连续的对角箭头位于一条直线上(连续的水平箭头自动位于一条直线上)?

我怀疑强制所有中心节点位于规则网格上就足够了,但我不知道如何实现这一点。

我能想到的发生这种情况的最简单的例子是:

\begin{tikzcd}
  A  \arrow{dr}{\alpha} & B \arrow{dr}{\beta} & C & D \\
  A & B \times B \times B \arrow{dr}{\gamma} & C \arrow{dr}{\delta} & D \\
  A & B & C & D
\end{tikzcd}

答案1

该选项on grid不起作用,因为图表内部是用 构建的\matrix

但原始/tikz/column sep(和/tikz/row sep)风格理解该选择between origins

问题在于tikz-cd没有提供(好的)钩子来添加between origins到已经定义的分隔符或任意距离(例如column sep={between origins}column sep={normal,between origins}column sep={10ex,between origins})。

我的解决方案提供

  • 重新定义原始\tikzcd@sep#1#2宏,用于tikz cd设置分隔符并进行排序column sep=<named distance>
  • 重新定义原来的/tikz/commutative diagrams/column sep/tikz/commutative diagrams/row sep键以适应的变化\tikzcd@sep;以及
  • /tikz/commutative diagrams/bo row sep
  • /tikz/commutative diagrams/bo col sep其功能(有点)与原装按键类似。

“有点” 因为我选择了将 作为一个因子来1.7命名距离(tinysmallscriptsizenormallargehuge),因为由于节点宽度不影响分隔符(就像on grid会一样),所以距离现在更小了。

代码

\documentclass[tikz]{standalone}
\usepackage{tikz-cd}
\makeatletter
\pgfqkeys{/tikz/commutative diagrams}{
  row sep/.code={\tikzcd@sep{row}{#1}{}},
  column sep/.code={\tikzcd@sep{column}{#1}{}},
  bo row sep/.code={\tikzcd@sep{row}{#1}{between origins}},
  bo column sep/.code={\tikzcd@sep{column}{#1}{between origins}},
  bo column sep/.default=normal,
  bo row sep/.default=normal,
}
\def\tikzcd@sep#1#2#3{% re-defintion of original package macro!
  \pgfkeysifdefined{/tikz/commutative diagrams/#1 sep/#2}%
    {\pgfkeysalso{/tikz/#1 sep={\ifx\\#3\\1*\else1.7*\fi\pgfkeysvalueof{/tikz/commutative diagrams/#1 sep/#2},#3}}}%
    {\pgfkeysalso{/tikz/#1 sep={#2,#3}}}}
\makeatother
\begin{document}
\begin{tikzcd}[bo column sep]
  A \arrow{dr}{\alpha} & B \arrow{dr}{\beta}                    & C                    & D \\
  A                    & B \times B \times B \arrow{dr}{\gamma} & C \arrow{dr}{\delta} & D \\
  A                    & B                                      & C                    & D
\end{tikzcd}
\end{document}

输出

在此处输入图片描述

也许是手动方式?

本例中的其他几个选项包括

  • 左搭接和右搭接最大节点(mathtools必需):

    \mathllap{B \times} B \mathrlap{\times B}
    
  • 设置固定节点宽度,该宽度为所有宽度中的最大值:

    text width=\widthof{$B \times B \times B$}
    

代码

\documentclass[tikz]{standalone}
\usepackage{tikz-cd} \usepackage{mathtools}
\begin{document}

\begin{tikzcd}
  A  \arrow[shorten >=8pt]{dr} & B \arrow{dr} & C & D \\
  A & \mathllap{B \times} B \mathrlap{\times B} \arrow{dr} & C \arrow{dr} & D \\
  A & B & C & D
\end{tikzcd}

\begin{tikzcd}[column sep=-1ex,cells={nodes={align=center,text width=\widthof{$B \times B \times B$}}}]
  A  \arrow{dr} & B \arrow{dr} & C & D \\
  A & \mathllap{B \times} B \mathrlap{\times B} \arrow{dr} & C \arrow{dr} & D \\
  A & B & C & D
\end{tikzcd}
\end{document}

输出

在此处输入图片描述

在此处输入图片描述

答案2

尝试指定text width节点的 等以及对齐方式。为了阻止这影响箭头上的标签,您应该将其放在单元格的规范内。例如,如下所示:

在此处输入图片描述

\documentclass{article}

\usepackage{tikz,tikz-cd}

\begin{document}

\begin{tikzcd}[/tikz/cells={/tikz/nodes={shape=asymmetrical
  rectangle,text width=1.5cm,text height=2ex,text depth=0.3ex,align=center}}]
  A  \arrow{dr}{t} & B_X \arrow{dr}{p} & C & D \\
  A & B \arrow{dr} \times B \times B & C^Y \arrow{dr} & D \\
  A & B & C & D
\end{tikzcd}

\end{document}

相关内容