TikZ 中的双箭头?

TikZ 中的双箭头?

我试图在节点之间画两个箭头,如下所示:

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 答案有点过时了,我将提供一个使用pics 更自动化且无需加载任何库的解决方案。

可以将其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 edges 可以用很少的代码实现非常好的结果:

\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#2picnode

\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:picdouble arrows splitshorten

\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}

相关内容