我试图在节点之间画两个箭头,如下所示:
A ------> B
<--/---
箭头应平行,方向相反,但不能重叠。(我可以弯曲箭头,但这不是我想要的。)
在 TikZ 中执行此操作的最简洁方法是什么?我可以像示例中那样只将其中一个箭头“划掉”吗?
答案1
这里有一种方法可以回答您的两个问题。它用于yshift
将两条路径的起点和终点向上/向下移动5pt
。可以通过沿 x 轴移动起点/终点来进一步改善结果,以使路径真正与节点的圆接触。
使用自定义 TikZ 样式在第二条路径的中间添加删除线标记。这可以进一步参数化,以允许将标记移动到路径上的任何位置等。
但我无法判断这是否是最优雅的解决方案。
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{decorations,decorations.markings}
\tikzset{
strike through/.style={
postaction=decorate,
decoration={
markings,
mark=at position 0.5 with {
\draw[-] (-5pt,-5pt) -- (5pt, 5pt);
}
}
}
}
\begin{document}
\begin{tikzpicture}
\node[draw,circle] (foo) at (0,0) { foo };
\node[draw,circle] (bar) at (4,0) { bar };
\draw[>=latex,->] ([yshift= 5pt] foo.east) -- ([yshift= 5pt] bar.west);
\draw[>=latex,<-,strike through] ([yshift=-5pt] foo.east) -- ([yshift=-5pt] bar.west);
\end{tikzpicture}
\end{document}
它看起来是这样的:
答案2
我认为 Ti钾这里的 Z 答案有点过时了,我将提供一个使用pic
s 更自动化且无需加载任何库的解决方案。
可以将其strike through
绘制为一个简单的\draw[-] (-135:0.5) -- (45:0.5);
,并在绘制过程中通过或中间路径/.pic
调用(选项是因为s 继承了路径选项,因此会覆盖任何可能的箭头提示):\pic[options]{strike through}
pic[options]{strike trhough}
-
pic
\tikzset{strike through/.pic={\draw[-] (-135:.5) -- (45:.5);}}
\draw[->] (foo) -- pic{strike through} (bar);
对于双箭头,我不太喜欢移动,因为有时移动值可能会很棘手。使用 bent edge
s 可以用很少的代码实现非常好的结果:
\draw[->] (foo) edge[bend right,draw=none] coordinate[at start](foo-b) coordinate[at end](bar-b) (bar)
edge[bend left,draw=none] coordinate[at start](foo-t) coordinate[at end](bar-t) (bar)
(foo-t) -- (bar-t);
\draw[->] (bar-b) -- (foo-b);
嗯,也许不是所以有点...但这非常强大,因为无论箭头放在哪里,foo
箭头bar
都会完美分离!箭头分离的程度也可以通过键控制bend angle
。所以,让我们开始吧:考虑到这个想法,可以制作一种样式和/或一种pic
来绘制所有内容,同时让我们的绘图区域尽可能干净,并且绘图尽可能灵活钾Z 可以提供!
我们首先创建一个样式double arrows={#1-#2}
,用于插入边并放置坐标,如(#1-t)
和节点的 op 和 ottom 部分(#1-b)
,t
节点也是如此。稍后我们可以使用此样式创建坐标,以便我们手动绘制路径(这对于放置s 和s 中间路径很有用)。b
#1
#2
pic
node
\tikzset{double arrows/.style args={#1-#2}{%
insert path={(#1) edge[bend right,draw=none] coordinate[at start](#1-b) coordinate[at end](#2-b) (#2)
edge[bend left,draw=none] coordinate[at start](#1-t) coordinate[at end](#2-t) (#2)
}}}
\draw[double arrows={foo-bar},->] (foo-t) -- node[above]{$F(x)$} (bar-t);
\draw[->] (bar-b) -- pic{strike through} (foo-b);
最后,我们可以用 让一切变得非常自动化\pic[options]{double arrows={foo-bar}}
。为了使一切更像 tikz,我们创建了一些样式,一个every double arrows
由图片加载的样式double arrows
,如果修改,所有双箭头图片都会随之修改。也可以通过样式bend angle
将 赋予特定的样式(默认值为 10)。此外,还引入了一个键,以便箭头不会接触节点(默认值为 2mm)。完整的 MWE:pic
double arrows split
shorten
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{strike through/.pic={\draw (-135:.5) -- (45:.5);},
shorten/.style={shorten <=#1, shorten >=#1},
every double arrows/.style={-latex, shorten=2mm},
double arrows split/.style={bend angle=#1},
double arrows split/.default={10},
double arrows/.style args={#1-#2}{%
insert path={(#1) edge[bend right,draw=none] coordinate[at start](#1-b) coordinate[at end](#2-b) (#2)%
edge[bend left,draw=none] coordinate[at start](#1-t) coordinate[at end](#2-t) (#2)
}
},
pics/double arrows/.style args={#1-#2}{%
code={%
\begin{scope}[double arrows split]
\draw[double arrows={#1-#2}, every double arrows] (#1-t) -- (#2-t);%
\draw[every double arrows] (#2-b) -- (#1-b);%
\end{scope}
}
}%
}
\begin{document}
\begin{tikzpicture}[every node/.style={draw, circle}]
\node (foo) at (0,0) {foo};
\node[right=3cm of foo] (bar) {bar};
\node[below right=1cm and 2cm of foo] (fow) {fow};
\node[above right=1cm and 1cm of foo] (bow) {bow};
\begin{scope}[bend angle=20]
\draw[double arrows={foo-bar}, shorten=4pt, -latex] (foo-t) -- node[above, draw=none, rectangle]{$F(x)$} (bar-t);
\draw[-latex, shorten=4pt] (bar-b) -- pic[-,red,thick]{strike through} (foo-b);
\end{scope}
\pic{double arrows={foo-bow}};
\pic[every double arrows/.style={->, shorten=0mm}]{double arrows={foo-fow}};
\pic[red]{double arrows={bar-bow}};
\pic{double arrows={fow-bar}};
\end{tikzpicture}
\end{document}
答案3
使用 PSTricks。不幸的是,没有选项可以将半径更改为\circlenode
均匀。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-node}
\psset{arrows=->,arrowinset=0}
\begin{document}
\begin{pspicture}[showgrid](5,2)
\rput(1,1){\circlenode{Left}{left}}
\rput(4,1){\circlenode{Right}{right}}
\ncline[offset=5pt]{Left}{Right}
\ncline[offset=5pt]{Right}{Left}
\ncput{\psline[arrows=-](5pt;45)(5pt;-135)}
\end{pspicture}
\end{document}