如何确保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
命名距离(tiny
,small
,scriptsize
,normal
,large
和huge
),因为由于节点宽度不影响分隔符(就像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}