答案1
首先,TikZ-cdto
在其实现中使用路径运算符\ar
(这就是out = 0, in = -135
它如此工作的原因)。你总是可以使用to path
手动绘制箭头:
\begin{tikzcd}[labels={draw,help lines}]
A \ar[rr, ""' name=x] & &[2cm] B\\
& C \ar[ur, "" name=y, out=0, in=-135]
\ar[to path=(x) -- (x|-y), Rightarrow, red]
\ar[to path=(x-|y) -- (y), Rightarrow, blue]
\end{tikzcd}
在上面的例子中,我选择显示标签,即沿箭头放置的节点,因为即使指定空文本,它们也有大小""
。这会影响-|
和|-
坐标规范,因为它们仅使用节点的中心来查找相交坐标。
这就是红色箭头结束的高度与蓝色箭头不在同一高度,蓝色箭头开始的高度与红色箭头不在同一位置的原因。
我将使用坐标代替节点,并稍微缩短箭头:
\begin{tikzcd}[/tikz/name*/.style={name={#1},shape=coordinate}]
A \ar[rr, "" name*=x] & &[2cm] B\\
& C \ar[ur, "" name*=y, out=0, in=-135]
\ar[shorten=2pt, to path=(x) -- (x|-y), Rightarrow, red]
\ar[shorten=2pt, to path=(x-|y) -- (y), Rightarrow, blue]
\end{tikzcd}
现在,我认为明确写下每一个是不明智的to path
。我们应该使用样式来实现这一点。我以前在我的答案到Tikz:从 nodeA.south 到 nodeB.north 的纯垂直箭头以及稍微复杂一点的版本都是ext.paths.ortho
我的tikz-ext
包库的一部分。
最简单的形式是
\tikzset{
|*/.style={to path={--(\tikztostart|-\tikztotarget)\tikztonodes}},
*|/.style={to path={(\tikztostart-|\tikztotarget)--(\tikztotarget)\tikztonodes}},
-*/.style={to path={--(\tikztostart-|\tikztotarget)\tikztonodes}},
*-/.style={to path={(\tikztostart|-\tikztotarget)--(\tikztotarget)\tikztonodes}}}
\begin{tikzcd}[/tikz/name*/.style={name={#1},shape=coordinate}]
A \ar[rr, "" name*=x] & &[2cm] B\\
& C \ar[ur, "" name*=y, out=0, in=-135]
\ar[shorten=2pt, from=x, to=y, |*, Rightarrow, red]
\ar[shorten=2pt, from=x, to=y, *|, Rightarrow, blue]
\end{tikzcd}
利用提到的ext.paths.ortho
库,可用的库to path
会尝试考虑起点和终点的边界。
\begin{tikzcd}[labels={draw,help lines}, /tikz/ortho/install shortcuts]
A \ar[rr, ""' name=x] & &[2cm] B\\
& C \ar[ur, "" name=y, out=0, in=-135]
\ar[from=x, to=y, |*, Rightarrow, red]
\ar[from=x, to=y, *|, Rightarrow, blue]
\end{tikzcd}
这里/tikz/ortho/install shortcuts
实际上将|*
et al 定义为only vertical first
etc 的快捷方式,它们在库中始终可用。
如果您需要垂直线与弯曲箭头保持特定距离,则需要使用该intersections
库。
代码
\documentclass[tikz]{standalone}
\usepackage{tikz-cd}
\usetikzlibrary{ext.paths.ortho}
\begin{document}
\begin{tikzcd}[labels={draw,help lines}]
A \ar[rr, ""' name=x] & &[2cm] B\\
& C \ar[ur, "" name=y, out=0, in=-135]
\ar[to path=(x) -- (x|-y), Rightarrow, red]
\ar[to path=(x-|y) -- (y), Rightarrow, blue]
\end{tikzcd}
\begin{tikzcd}[/tikz/name*/.style={name={#1},shape=coordinate}]
A \ar[rr, "" name*=x] & &[2cm] B\\
& C \ar[ur, "" name*=y, out=0, in=-135]
\ar[shorten=2pt, to path=(x) -- (x|-y), Rightarrow, red]
\ar[shorten=2pt, to path=(x-|y) -- (y), Rightarrow, blue]
\end{tikzcd}
\tikzset{
|*/.style={to path={--(\tikztostart|-\tikztotarget)\tikztonodes}},
*|/.style={to path={(\tikztostart-|\tikztotarget)--(\tikztotarget)\tikztonodes}},
-*/.style={to path={--(\tikztostart-|\tikztotarget)\tikztonodes}},
*-/.style={to path={(\tikztostart|-\tikztotarget)--(\tikztotarget)\tikztonodes}}}
\begin{tikzcd}[/tikz/name*/.style={name={#1},shape=coordinate}]
A \ar[rr, "" name*=x] & &[2cm] B\\
& C \ar[ur, "" name*=y, out=0, in=-135]
\ar[shorten=2pt, from=x, to=y, |*, Rightarrow, red]
\ar[shorten=2pt, from=x, to=y, *|, Rightarrow, blue]
\end{tikzcd}
\begin{tikzcd}[labels={draw,help lines}, /tikz/ortho/install shortcuts]
% /tikz/ortho/install shortcuts overwrites previously defined |*, *|, -*, *-
A \ar[rr, ""' name=x] & &[2cm] B\\
& C \ar[ur, "" name=y, out=0, in=-135]
\ar[from=x, to=y, |*, Rightarrow, red]
\ar[from=x, to=y, *|, Rightarrow, blue]
\end{tikzcd}
\end{document}