tikz-cd 中的直线坐标

tikz-cd 中的直线坐标

在图中

\documentclass{scrartcl}
\usepackage{tikz-cd}
\begin{document}
    \[
        \begin{tikzcd}
            A \ar[rr, ""' name=x] &&[2cm] B\\
            &C   \ar[ur, "" name=y, out=0, in=-135]
                    \ar[from=x, to=y, Rightarrow]
        \end{tikzcd}
    \]
\end{document}

在此处输入图片描述

如果双击箭头完全垂直,无论是从 开始(x -| y)还是从 结束(x |- y),那当然会更好。但 tikz-cd 似乎不喜欢-|- 语法。我该如何实现这一点?

答案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 firstetc 的快捷方式,它们在库中始终可用。


如果您需要垂直线与弯曲箭头保持特定距离,则需要使用该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}

答案2

@Qrrbrbirlbel 的评论概述了使用-|符号的通用解决方案tikz-cd。一个稍微简单的解决方案就是添加一个额外的列并绘制一个缩短的向下箭头。

在此处输入图片描述

\documentclass{scrartcl}
\usepackage{tikz-cd}
\begin{document}
    \[
        \begin{tikzcd}
            A \ar[rrr] && \ar[d, Rightarrow, shorten >=3.5mm] & B\\
            & C \ar[urr, out=0, in=-135] & {}
        \end{tikzcd}
    \]
\end{document}

相关内容