我在用 弯曲箭头时遇到了一个恼人的问题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] 是相对于起始节点的结束节点的位置。通常,d2
to不是必需的(并且会产生丑陋的结果)。您可以使用_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 corners
rl 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}