如果这是重复的,我很抱歉,但我很难找到一个优雅的解决方案。我有一个“有用”但感觉不稳定的东西。
我正在用 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}
答案2
使用tikz-cd
的shift right
和shift 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}