我想要绘制一个信令协议消息交换,像下面的图一样。
我尝试用包 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}
输出如下: