我正在绘制一种序列图,但我不想计算每个位置。
我想使用相对坐标。使用命令coodinate
我将第一个坐标 (0.25,14.25) 设置为a
,但我想选择第二个坐标 (0.25,14.75)。
有没有办法做到这一点?
%Actor
\draw[dashed] (0.25,15) -- (0.25,0) node[above=15] {User};
\draw[dashed] (6,15) -- (6,0) node[above=15] {HMI};
\draw[dashed] (12,15) -- (12,0) node[above=15] {Server1};
\draw[dashed] (18,15) -- (18,0) node[above=15] {Server2};
%
%Blocks
\begin{scriptsize}
\draw[line width=5pt] (0.25,14.25) -- (0.25,14.75) node[midway, right] {Test} coordinate (a);
\end{scriptsize}
%
%Arrows
\begin{scope}[>=latex]
\draw[->,black] (a) -- (6,14);
\end{scope}
答案1
您可以使用calc
库来执行此操作(参见 pgf 手册的第 13.5 节坐标计算):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\coordinate (a) at (2,2);
\coordinate (b) at (0,-2);
\node[draw=red] at (a) {a};
\node[draw=red] at (b) {b};
\draw[help lines] (-1,-3) grid (3,3);
\draw ($ (a) + (0,1) $) -- ($ (b) + (0,1) $);
\end{tikzpicture}
\end{document}
答案2
我觉得你有点搞混了。你的coordinate (a)
(空节点)实际上是(0.25,14.75)
,位于路径的末尾。
要为路径的起点和终点设置一个“标记”,您可以执行以下操作:
%Blocks
\begin{scriptsize}
\draw[line width=5pt] (0.25,14.25) coordinate(b) --
(0.25,14.75) node[midway, right] {Test} coordinate (a);
\end{scriptsize}
%
%Arrows
\begin{scope}[>=latex]
\draw[->,black] (a) -- ++(1,0) node {a};
\draw[->,black] (b) -- ++(1,0) node {b};
\end{scope}
你将得到(部分图表):
一般来说,你可以在路径的任何部分使用节点,使用pos
键;如果你添加
\draw[line width=5pt] (0.25,14.25) coordinate(b) --
(0.25,14.75) node[midway, right] {Test}
coordinate (a) coordinate[pos=0.5](c);
和
\draw[->,black] (c) -- ++(2,0) node {c};
你有:
还要注意,midway
键实际上是另一种说法pos=0.5
。
答案3
第一个答案:使用包tikz-uml
,它还提供对序列图的支持。请参阅perso.ensta-paristech.fr/~kielbasi/tikzuml;序列图已记录这里。
第二个答案:如果你想直接使用 tikz 命令自己做,我建议
使用命令来设置常量,例如
\xUser
和\xHmi
来设置时间线的水平位置使用节点作为参与者和动作并命名它们
为节点的参数定义样式。
然后,调整和扩展图表将变得容易。下面是操作方法的示例。
\documentclass[border=3pt]{standalone}
\usepackage{tikz}
\tikzset
{actor/.style={font=\ttfamily},
action/.style 2 args= % first arg is length in mm, second arg is label
{minimum width=3mm,minimum height=#1mm,inner sep=0pt,
draw,fill=blue!30,anchor=north,label={right:\scriptsize#2}
},
message/.style={-stealth,font=\scriptsize\bfseries},
timeline/.style={dashed}
}
\begin{document}
\begin{tikzpicture}[x=1mm,y=1mm]
% horizontal position of actors (in mm)
\newcommand\xUser{0}
\newcommand\xHmi{20}
\newcommand\xSa {40}
\newcommand\xSb {60}
% actors
\node[actor] (user-0) at (\xUser,0) {User};
\node[actor] (hmi-0) at (\xHmi ,0) {HMI};
\node[actor] (s1-0) at (\xSa ,0) {Server1};
\node[actor] (s2-0) at (\xSb ,0) {Server2};
% time lines
\newcommand\yTimeMax{-65}
\draw[timeline] (user-0) -- +(0,\yTimeMax); % example for relative positioning
\draw[timeline] (hmi-0) -- +(0,\yTimeMax);
\draw[timeline] (s1-0) -- +(0,\yTimeMax);
\draw[timeline] (s2-0) -- +(0,\yTimeMax);
% actions (first arg is length in mm, second arg is label)
\node[action={10}{$A_1$}] (user-1) at (\xUser,-10) {};
\node[action={ 5}{$A_2$}] (hmi-1) at (\xHmi ,-20) {};
\node[action={15}{$A_3$}] (s1-1) at (\xSa ,-25) {};
\node[action={10}{$A_4$}] (user-2) at (\xUser,-50) {};
% messages
\draw[message] (user-1.south east) -- node[above]{a} (hmi-1.north west);
\draw[message] (hmi-1.south east) -- node[above]{b} (s1-1.north west);
\draw[message] (s1-1.south west) -- node[above]{c} (user-2.north east);
\end{tikzpicture}
\end{document}