绘制带有指向两个节点之间的来回箭头的 tikz 流程图的正确方法

绘制带有指向两个节点之间的来回箭头的 tikz 流程图的正确方法

如果这是重复的,我很抱歉,但我很难找到一个优雅的解决方案。我有一个“有用”但感觉不稳定的东西。

我正在用 Beamer 做演示,我想让带有箭头的框在对象之间来回指向。以下是我想要实现的想法:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{calc,arrows,shapes}

\begin{document}
\begin{frame}
  \tikzstyle{service} = [draw, fill=blue!20]
  \begin{figure}
  \begin{tikzpicture}[node distance=2cm, auto,>=latex', thick]
      \path[->] node[service] (svc1) {service 1};
      \path[->] node[service, right of=svc1,xshift=2cm] (svc2) {service 2}
                    (svc1.10) edge node {restarts} (svc2.170);
      \path[->] node[service, below of=svc2] (svc3) {service 3}
                    (svc2.280) edge node {configures} (svc3.80);
      \path[<-] (svc2.240) edge node {} (svc3.120);
      \path[<-] (svc1.-10) edge node {} (svc2.190);
  \end{tikzpicture}
  \end{figure}
\end{frame}
\end{document}

然而,我相信这看起来像是一个非常简单的问题,与输入角度相比,一定存在一个更优雅(自动化)的解决方案。

答案1

改进代码的几个技巧:

  • 如果节点发生移动,使用(svc1.10) edge node {restarts} (svc2.170)可能会产生不良结果(不是完美的水平规则);您可以使用垂直坐标系来保证水平线,如下所示

    (svc1.10) edge node {restarts} (svc2.west|-svc1.10)
    

    垂直规则也有类似的注释。甚至可以定义一个带参数的样式来自动化这种双箭头。

  • 该语法of =已被弃用,您应该使用定位库和= of

  • \tikzstyle是旧语法;您应该改用\tikzset

代码:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{calc,arrows,shapes,positioning}

\begin{document}
\begin{frame}
\tikzset{service/.style={draw, fill=blue!20}}
  \begin{figure}
  \begin{tikzpicture}[node distance=1.5cm and 2cm, auto,>=latex', thick]
      \path[->] node[service] (svc1) {service 1};
      \path[->] node[service, right = of svc1] (svc2) {service 2}
                    (svc1.10) edge node {restarts} (svc2.west|-svc1.10);
      \path[->] node[service, below = of svc2] (svc3) {service 3}
                    (svc2.280) edge node {configures} (svc2.280|-svc3.north);
      \path[<-] (svc2.240) edge node {} (svc2.240|-svc3.north);
      \path[<-] (svc1.-10) edge node {} (svc2.west|-svc1.-10);
  \end{tikzpicture}
  \end{figure}
\end{frame}
\end{document}

enter image description here

答案2

使用tikz-cdshift rightshift left选项。

虽然,不可能做到,edge[shift …=…]但是

(<start>) {[shift …=…] edge … (<target>)}

需要将选项重写为,以便to path能够将它们用作边缘的选项。

代码

\documentclass[tikz]{standalone}
\usepackage{tikz-cd}
\usetikzlibrary{arrows,positioning}
\tikzset{
  shift left/.style ={commutative diagrams/shift left={#1}},
  shift right/.style={commutative diagrams/shift right={#1}}
}
\begin{document}
\begin{tikzpicture}[
  node distance=1.5cm and 2cm,
  >=latex',
  auto,
  thick,
  service/.style={draw, fill=blue!20},
]
  \node[service] (svc1) {service 1};
  \node[service, right = of svc1] (svc2) {service 2};
  \node[service, below = of svc2] (svc3) {service 3};

  \path[->, shift left=.75ex]
    (svc1) edge node {restarts}   (svc2)
    (svc2) edge node {configures} (svc3)
    (svc3) edge                   (svc2)
    (svc2) edge                   (svc1);
  \end{tikzpicture}
\end{document}

输出

enter image description here

相关内容