拥有特殊的to path

拥有特殊的to path

我在用 弯曲箭头时遇到了一个恼人的问题xypic。我阅读了手册的第 2.8 部分(http://www-bcf.usc.edu/~cautis/tools/xypic.pdf‎)关于弯曲箭头,但我不明白。这是我能做的最好的事情(更新:第一个版本是我以前用的;在不同的 LaTeX 运行中,输出看起来莫名其妙地不同。第二个版本是基于下面评论的建议。它仍然很丑,但也许这是我能做的最好的了?):

\documentclass{article}
\usepackage[all]{xy}

\begin{document}
$$\xymatrix{
A \ar `/40pt[d] `[ddd] [ddd] \\ LongEntry \\ LongEntry \\ LongEntry
} \quad \xymatrix{
A \ar `/40pt[ddd] `/10pt[ddd] [ddd] \\ LongEntry \\ LongEntry \\ LongEntry
}$$
\end{document}

输出如下:

啊啊!

我该如何让箭的末端合理?为了加分,一般来说,如何弯曲箭?

(我对答案更感兴趣xypic,因为这是一个大图表的一部分,但tikz-cd如果答案特别清晰的话,那就更好了。这个图表的错误促使我进行了转换)。

答案1

这里有两个 xy-pic 解决方案。

\documentclass{article}
\usepackage[all]{xy}
\begin{document}
\[\xymatrix{
A \ar `r [r]`[ddd][ddd]&\\ LongEntry \\ LongEntry \\ LongEntry
}
\qquad
\xymatrix{
A \ar `r []+<5em,0cm>`[ddd][ddd]\\ LongEntry \\ LongEntry \\ LongEntry
}\]
\end{document}

第一个比较容易理解,但您需要添加一个额外的列。它是这样工作的:\ar `r [r]`[ddd][ddd]表示箭头从方向开始r,然后转到[r](相对坐标)——因此需要一个额外的列——并旋转四分之一圈,然后转到 `[ddd] 位置(相对坐标)并再旋转四分之一圈,最后结束于 [ddd](“绝对”位置,即相对于箭头的起点)。

第二个示例避免使用一个额外的列,并且工作方式相同。唯一的区别是使用[]_<5em,0em>而不是[r]。但这意味着:实际坐标 ( []) 加上<5em,0em>

最后——为了加分和完整性——一般语法是

\ar `d1[p1]`d2[p2] ... `dn[pn] [f]

这意味着:从这里开始沿方向 d1 前往 [p1],然后沿方向 d2 前往 [p2](相对于 p1),等等,最后以 [f] 结束,其中 [f] 是相对于起始节点的结束节点的位置。通常,d2to不是必需的(并且会产生丑陋的结果)。您可以使用_d[p]dn控制转弯的方向。^d[p]`` or. You can also control the radius as in ```d/16pt[p]

注意:您还可以使用(例如)更改箭头的尖端,\usepackage[all,cmtip]{xy} 有关更多解释,您可以查阅xy-pic 用户指南。如果您想要更多带有弯曲箭头的 xy-pic 图表示例,您可以查看以下示例这里这里(如果我可以引用我自己的话)。

结果 :

多田

答案2

拥有特殊的to path

您可以使用特殊的 来执行此操作to path。我假设这只会在节点上使用(对于 来说是正确的tikz-cd)。

我已经包含了两个实现:一个带有calc库(称为rl),一个不带有库而是使用普通的 PGF 宏(稍微快一点)。

方法是一样的。我提取了X路径最右边点(锚点east)的值,然后我检查两者中的哪一个X值更大(更靠右),并添加传递的长度。这将是X垂直线部分的值。

节点(仅)放置在这个垂直部分上(而使用rl下面的路径操作符,您可以沿着整个路径放置节点)。

代码

\documentclass[tikz,convert=false]{standalone}
\usepackage{tikz-cd}
\usetikzlibrary{calc}
\makeatletter
\tikzset{
  RL/.style={% without calc
    rounded corners={#1-.1pt},
    to path={% we asume that you use this path only on nodes (otherwise it will get tricky)
      \pgfextra
        \pgf@process{\pgfpointanchor{\tikztostart}{east}}%
        \pgf@xa\pgf@x\pgf@ya\pgf@y
        \pgf@process{\pgfpointanchor{\tikztotarget}{east}}%
        \pgf@xb\pgf@x\pgf@yb\pgf@y
        \ifdim\pgf@xb>\pgf@xa
          \pgf@xa\pgf@xb
        \fi
        \pgfmathsetlength\pgf@xc{#1}%
        \advance\pgf@xa\pgf@xc
      \endpgfextra
      -- (+\pgf@xa,+\pgf@ya) -- (+\pgf@xa,+\pgf@yb) \tikztonodes -- (\tikztotarget)
    }
  },
  RL/.default=.5cm}
\makeatother
\tikzset{
  rl/.style={% with calc
    rounded corners={#1-.1pt},
    to path={% we asume that you use this path only on nodes (otherwise it will get tricky)
        let \p{@aux1}=(\tikztostart.east),
            \p{@aux2}=(\tikztotarget.east),
            \n{@aux@x}={#1+max(\x{@aux1},\x{@aux2})}
        in
      -- (+\n{@aux@x},+\y{@aux1}) -- (+\n{@aux@x},+\y{@aux2}) \tikztonodes -- (\tikztotarget)
    }
  },
  rl/.default=.5cm,
}
\begin{document}
\begin{tikzcd}
A \arrow[RL]{ddd}\\
LongEntry \\
LongEntry \\
LongEntry
\end{tikzcd}
\begin{tikzcd}
A \arrow[rl]{ddd}\\
LongEntry \\
LongEntry \\
LongEntry
\end{tikzcd}
\end{document}

路径运算符rl

与我的paths.ortho(→另一个答案) 库您可以非常轻松地做到这一点。

路径运算符rl表示线的起点和目标都由一条水平线、一条垂直线和一条水平线的组合连接。在这种情况下(rl而不是lr)表示垂直线位于两个节点(或坐标)的右侧。即首先到右r,然后向下或向上,然后到左l。给定的距离是从最右边的节点/坐标测量的。

由于paths.ortho已经安装了rl使用rl路径运算符的样式,我将添加另一种样式,为半径和RL设置适当的量。是必要的,以便正确放置箭头尖端。rounded cornersrl distance-.1pt

这不考虑其他节点。因此,如果起点和目标之间有另一个非常长的节点,则无论如何都需要进行手动调整。

代码

\documentclass[tikz,convert=false]{standalone}
\usepackage{tikz-cd}
\usetikzlibrary{paths.ortho}
\tikzset{
  RL/.style={
    rounded corners={#1-.1pt},
    rl distance={#1},
    rl
  },
  RL/.default=.5cm
}
\usepackage[all]{xy}
\begin{document}
\begin{tikzcd}
A \arrow[RL]{ddd}\\
LongEntry \\
LongEntry \\
LongEntry
\end{tikzcd}
\end{document}

输出

在此处输入图片描述

相关内容