![更新:解决评论中的问题](https://linux22.com/image/264618/%E6%9B%B4%E6%96%B0%EF%BC%9A%E8%A7%A3%E5%86%B3%E8%AF%84%E8%AE%BA%E4%B8%AD%E7%9A%84%E9%97%AE%E9%A2%98.png)
\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}
如果我想在所有消息上方绘制一个矩形,从第一个节点到结束节点,在节点和第一个消息 RRC 连接请求之间;或者在底部从第一个节点到结束节点绘制一个大矩形,在最后一条消息 RRC 连接设置完成下方,都像图片“L1 同步”中的矩形一样,我该怎么做?
答案1
这与另一个问题pgf-umlsd
,即使用赋予节点from
和每条消息的名称to
,并进行少量计算以调整矩形角的位置。
在这种情况下,困难的部分是在背景中绘制该矩形,但是一旦您知道pgf-umlsd
还定义了一个名为的背景层,它就很容易了umlsd@background
。
\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}
\begin{pgfonlayer}{umlsd@background}
\fill[red!30, rounded corners]
($(RRC Connection Request from)+(-1ex,1.5em)$) rectangle ($(RRC Connection Setup Complete to)+(1ex, -1.5ex)$);
\end{pgfonlayer}
\end{sequencediagram}
\end{document}
更新:解决评论中的问题
机制和语法始终相同。要绘制一个矩形任何点,您需要提供矩形两个对角的坐标。由于矩形总是从消息的一个极端延伸到消息的另一个极端,因此pgf-umlsd
每次使用时,您都可以使用为您定义的特殊名称\mess
。这些节点的名称是第二个参数\mess
(消息文本)加上单词from
或to
,分别表示消息的起点和终点。
找到这些坐标后,您需要稍微移动它们。例如,标有“L1 同步”的矩形并非正好位于“RRC 连接设置”的末尾,而是位于其下方。您可以使用特殊语法将量(用于水平位移)和(用于垂直位移)($(coordinate name)+(x,y)$)
添加到给定的。因此,“L1 同步”矩形的一个角位于。x
y
(coordinate name)
($(RRC Connection Setup to)+(0,-.3)$)
使用相同的想法,顶部的第一个矩形将是:
($(RRC Connection Request from)+(0,6mm)$) rectangle ($(RRC Connection Request to)+(0,12mm)$)
是6em
,并将12m
数量添加到y
,这将产生一个高度为 6mm 的矩形。您必须通过反复试验来找到这些数量。
底部的矩形将是(请注意,它的高度也是 6 毫米):
($(RRC Connection Setup Complete from)+(0,-2mm)$) rectangle ($(RRC Connection Setup Complete to)+(0,-8mm)$)
唯一需要解决的细节是,图中必须有空间来容纳该矩形,以便它不会与其他消息重叠。您可以使用命令\postlevel
在适当的点“打开”垂直间隙。在您的例子中,这些点将位于第一个点之前\mess
和最后一个点之后。
这是完整的代码:
\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}
\postlevel % Open space for top rectangle
\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}
\postlevel % Open space for bottom rectangle
% Top rectangle
\filldraw[fill=black!30] ($(RRC Connection Request from)+(0,6mm)$) rectangle ($(RRC Connection Request to)+(0,12mm)$);
% Bottom rectangle
\filldraw[fill=black!30] ($(RRC Connection Setup Complete from)+(0,-2mm)$) rectangle ($(RRC Connection Setup Complete to)+(0,-8mm)$);
\end{sequencediagram}
\end{document}
结果是:
如果您希望这些灰色矩形不与垂直虚线重叠,则可以使用此答案第一部分中显示的技术(针对粉红色矩形)在背景中绘制它们。我认为上述解释足以将任何其他矩形放在任何其他所需点之间。