有没有一种简单的方法可以修改 tikz-cd 图中两个节点之间的箭头的长度(同时保持节点之间的距离固定)?
例如,图中的对角箭头
\begin{tikzcd}[column sep = large, row sep = large]
* \dar \rar &* \dar \dlar[Rightarrow]{} \\
* \rar &*
\end{tikzcd}
如果长度减半,看起来会更符合我的需要(它是图中两条路径之间的箭头,而不是节点之间的箭头)。这可以通过更改起始和终止锚点坐标来实现,但如果您需要在不同形状的图表中重复执行此操作,那么这种方法就很笨重,而且扩展性也很糟糕。
答案1
改良版
在这个改进的版本中,你可以对箭头应用缩放因子:
\documentclass{article}
\usepackage{tikz-cd}
\usetikzlibrary{decorations.markings,intersections}
\tikzset{%
scalearrow/.style n args={3}{
decoration={
markings,
mark=at position (1-#1)/2*\pgfdecoratedpathlength
with {\coordinate (#2);},
mark=at position (1+#1)/2*\pgfdecoratedpathlength
with {\coordinate (#3);},
},
postaction=decorate,
}
}
\begin{document}
\noindent
Scaling factor=1 (no scaling):\par
\begin{tikzcd}[row sep=huge,column sep=huge]
A \dar\rar & B\dar\dlar[phantom,scalearrow={1}{start}{end}]\arrow[dr,Rightarrow,to path= (start) -- (end)] \\
C \rar & D
\end{tikzcd}
\par\medskip
\noindent
Scaling factor=0.5:\par
\begin{tikzcd}[row sep=huge,column sep=huge]
A \dar\rar & B\dar\dlar[phantom,scalearrow={0.5}{start}{end}]\arrow[dr,Rightarrow,to path= (start) -- (end)] \\
C \rar & D
\end{tikzcd}
\par\medskip
\noindent
Two arrows, each with scaling factor=0.3333:\par
\begin{tikzcd}[row sep=huge,column sep=huge]
A
\dar\rar
&
B
\dar
\dlar[phantom,scalearrow={0.3333}{starta}{enda}]
\arrow[dr,Rightarrow,to path= (starta) -- (enda)] &
C
\dar\lar
\\
D \rar
&
E
&
F
\lar
\ular[phantom,scalearrow={0.3333}{startb}{endb}]
\arrow[ul,Rightarrow,to path= (startb) -- (endb)]
\end{tikzcd}
\end{document}
这个想法是使用装饰来测量路径长度,\pgfdecoratedpathlength
并沿着路径放置两个标记,使得这些标记之间的距离就是按所需因子缩放的路径长度。
这是通过使用带有样式的“幻影”箭头来实现的scalearrow
;在此样式中,您可以设置缩放因子(样式的第一个参数)和内部用于缩放路径的起点和终点的两个名称,例如,
\dar[phantom,scalearrow={0.3333}{name1}{name2
从当前节点(我们将其称为X
)向其下方的节点(我们将其称为)放置一个向下的箭头,并在从到 的路径上的精确位置Y
设置两个称为name1
和的内部坐标,这样现在您可以使用这些名称来绘制缩放箭头(使用 的因子进行缩放),例如name2
X
Y
0.3333
\arrow[d,Rightarrow,to path= (name1) -- (name2)]
第一个版本
一个选项是使用shorten
:
\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}[column sep = large, row sep = large]
* \dar \rar &* \dar \dlar[Rightarrow,shorten >= 10pt,shorten <= 10pt]{} \\
* \rar &*
\end{tikzcd}
\end{document}