协议消息图

协议消息图

我想要绘制一个信令协议消息交换,像下面的图一样。

在此处输入图片描述

我尝试用包 pgf-umlsd 画图,90% 能实现方案,代码如下:

\documentclass{article}
\usepackage[margin=12mm]{geometry}
\usepackage{hyperref}
\usepackage[underline=true]{pgf-umlsd}
\usepackage{listings}
\usepackage{color}
\definecolor{listinggray}{gray}{0.92}
\lstset{ %
   language=[LaTeX]TeX,
   breaklines=true,
   frame=single,
   basicstyle=\footnotesize\ttfamily,
   backgroundcolor=\color{listinggray},
   keywordstyle=\color{blue}
}

\begin{document}

\begin{sequencediagram}
\newinst{ue}{UE}
\newinst[3]{nodeb}{Node B}
\newinst[3]{rnc}{RNC}
\mess{ue}{RRC Connection Request}{rnc}
\mess{rnc}{Radio Link Setup Request}{nodeb}
\mess{nodeb}{Radio Link Setup Response}{rnc}
\mess{rnc}{Establish Request}{nodeb}
\mess{nodeb}{Establish Confirm}{rnc}
\mess{rnc}{RRC Connection Setup}{ue}
\mess{nodeb}{Synchronization Indication}{rnc}
\mess{ue}{RRC Connection Setup Complete}{rnc}
\end{sequencediagram}

\end{document}

使用该包,我无法在消息“RRC 连接设置”和“同步指示”之间输入标有“L1 同步”的矩形。

您能否建议一个比所示图表更具可定制性的替代方案?

答案1

您无需离开 pgf-umlsd 即可完成您的图表:

图表

为此,您只需要了解有关 pgf-umlsd 的一些信息:

  • \postlevel增加了下一条消息的时间“单位”,因此它可以在“RRC 连接设置”和“同步指示”之间留出一个间隙,以插入矩形。

  • pgf-umlsd 为每条消息定义了一对命名节点,稍后您可以使用它们来绘制与这些节点相关的内容。它们被称为(<message label> from)(<message label> to),其中<message label>是写在消息上方的文本。

您可以使用这些命名节点来指定阴影矩形的角。我使用calc库来执行此操作。

因此,在您的例子中,要在所需点绘制矩形,您必须找到哪些消息靠近矩形的角。我们发现左上角靠近消息“RRC 连接设置”的结尾,右下角靠近消息“同步指示”的开头,因此矩形的角是:

(RRC Connection Setup to) rectangle (Synchronization Indication from)

但是这些会产生一个离消息太近的矩形,所以我们必须稍微移动 y 坐标以将其与每条消息分开。我使用以下表达式将其与每条消息分开 0.3 个单位:

($(RRC Connection Setup to)+(0,-.3)$) rectangle ($(Synchronization Indication from) +(0,.3)$)

如果您想要矩形跨越其他列,则必须找到哪些消息结尾靠近所需的矩形角。例如,要获得从“Node B”到“RNC”的矩形,您可以使用:

 ($(RR Connection Setup from)+(0,-.3)$) rectangle ($(Synchronization Indication from) +(0,.5)$)

等等

\documentclass{article}
\usepackage[margin=12mm]{geometry}
\usepackage{hyperref}
\usepackage[underline=true]{pgf-umlsd}
\usetikzlibrary{calc}
\begin{document}

\begin{sequencediagram}
\newinst{ue}{UE}
\newinst[3]{nodeb}{Node B}
\newinst[3]{rnc}{RNC}
\mess{ue}{RRC Connection Request}{rnc}
\mess{rnc}{Radio Link Setup Request}{nodeb}
\mess{nodeb}{Radio Link Setup Response}{rnc}
\mess{rnc}{Establish Request}{nodeb}
\mess{nodeb}{Establish Confirm}{rnc}
\mess{rnc}{RRC Connection Setup}{ue}
\postlevel
\mess{nodeb}{Synchronization Indication}{rnc}
\filldraw[fill=black!30] ($(RRC Connection Setup to)+(0,-.3)$) rectangle ($(Synchronization Indication from) +(0,.3)$)
  node[midway] {L1 Synchronization};
\mess{ue}{RRC Connection Setup Complete}{rnc}
\end{sequencediagram}

\end{document}

答案2

答案3

实际上,您可以使用 pgf-umlsd 并根据需要更改任何样式:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows,shadows,calc}
\usepackage{pgf-umlsd}

\begin{document}

\begin{sequencediagram}
\tikzstyle{inststyle}=[rectangle,anchor=west,minimum
    height=0.8cm, minimum width=1.6cm, fill=white]
\tikzstyle{dotted}=[line width=2pt,red!50]
\newinst{ue}{UE}
\newinst[3]{nodeb}{Node B}
\newinst[3]{rnc}{RNC}
\mess{ue}{RRC Connection Request}{rnc}
\mess{rnc}{Radio Link Setup Request}{nodeb}
\mess{nodeb}{Radio Link Setup Response}{rnc}
\mess{rnc}{Establish Request}{nodeb}
\mess{nodeb}{Establish Confirm}{rnc}
\mess{rnc}{RRC Connection Setup}{ue}
\postlevel
\mess{nodeb}{Synchronization Indication}{rnc}
\filldraw[fill=black!30] ($(RRC Connection Setup to)+(0,-.3)$) rectangle ($(Synchronization Indication from) +(0,.3)$)
  node[midway] {L1 Synchronization};
\mess{ue}{RRC Connection Setup Complete}{rnc}
\end{sequencediagram}

\end{document}

输出如下:

在此处输入图片描述

相关内容