diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/msc |
Initial commit
Diffstat (limited to 'macros/latex/contrib/msc')
-rw-r--r-- | macros/latex/contrib/msc/COPYRIGHT.txt | 31 | ||||
-rw-r--r-- | macros/latex/contrib/msc/README | 42 | ||||
-rw-r--r-- | macros/latex/contrib/msc/biblio.bib | 60 | ||||
-rw-r--r-- | macros/latex/contrib/msc/maintenance.pdf | bin | 0 -> 61584 bytes | |||
-rw-r--r-- | macros/latex/contrib/msc/maintenance.tex | 250 | ||||
-rw-r--r-- | macros/latex/contrib/msc/manual.pdf | bin | 0 -> 229228 bytes | |||
-rw-r--r-- | macros/latex/contrib/msc/manual.tex | 2841 | ||||
-rw-r--r-- | macros/latex/contrib/msc/msc.sty | 3159 | ||||
-rw-r--r-- | macros/latex/contrib/msc/refman.pdf | bin | 0 -> 154934 bytes | |||
-rw-r--r-- | macros/latex/contrib/msc/refman.tex | 1547 |
10 files changed, 7930 insertions, 0 deletions
diff --git a/macros/latex/contrib/msc/COPYRIGHT.txt b/macros/latex/contrib/msc/COPYRIGHT.txt new file mode 100644 index 0000000000..3d7872812d --- /dev/null +++ b/macros/latex/contrib/msc/COPYRIGHT.txt @@ -0,0 +1,31 @@ +%% MSC Macro Package +%% msc.sty +%% June 2, 2008 +%% +%% Copyright 2008 V. Bos, T. van Deursen, and S. Mauw +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is T. van Deursen. +% +% This program consists of the files +% msc.sty +% manual.tex +% manual.pdf +% refman.tex +% refman.pdf +% biblio.bib +% maintenance.tex +% maintenance.pdf +% README +% COPYRIGHT + + diff --git a/macros/latex/contrib/msc/README b/macros/latex/contrib/msc/README new file mode 100644 index 0000000000..5388eceb50 --- /dev/null +++ b/macros/latex/contrib/msc/README @@ -0,0 +1,42 @@ +MSC Macro Package +----------------- +Version 1.16 +June 2, 2008 + +---------------------------------------------------------------------- +Copyright 2008 V. Bos, T. van Deursen, and S. Mauw + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This program consists of the files + msc.sty + manual.tex + manual.pdf + refman.tex + refman.pdf + biblio.bib + maintenance.tex + maintenance.pdf + README + COPYRIGHT + +---------------------------------------------------------------------- + +The MSC macro package is a LaTeX2e package to draw MSC diagrams. See +user manual (manual.pdf) and reference manual (refman.pdf) for more +information. + +Contact address: +Ton van Deursen +Universit\'e du Luxembourg +Facult\'e des Sciences, de la Technologie et de la Communication +6, rue Richard Coudenhove-Kalergi +L-1359 Luxembourg +Email: ton.vandeursen@uni.lu +Updates via: http://satoss.uni.lu/mscpackage/ diff --git a/macros/latex/contrib/msc/biblio.bib b/macros/latex/contrib/msc/biblio.bib new file mode 100644 index 0000000000..9c788fb4e3 --- /dev/null +++ b/macros/latex/contrib/msc/biblio.bib @@ -0,0 +1,60 @@ +@InProceedings{RudolphGrabowskiGraubmann96, + author = {E. Rudolph and P.Graubmann and J. Grabowski}, + title = {Tutorial on Message Sequence Charts {(MSC'96})}, + booktitle = {FORTE}, + year = 1996 +} + +@Booklet{z120, + title = {{ITU-TS} {R}ecommendation {Z.120}: {M}essage {S}equence {C}hart {(MSC)}}, + author = {ITU-TS}, + address = {Geneva}, + year = 1997 +} + +@Book{GSM97, + AUTHOR = {Michel Goossens and Sebastian Rahtz and Frank Mittelbach}, + TITLE = {{T}he {\LaTeX} {G}raphics {C}ompanion}, + PUBLISHER = "Addison-Wesley", + YEAR = 1997 +} + + +@Book{Lam94, + author = {L. Lamport}, + title = {{\LaTeX}---A Document Preparation System---User's Guide and Reference Manual}, + publisher = {Adsison-Wesley}, + year = 1994, + edition = {2nd}, + note = {Updated for {\LaTeXe}} +} + +@Manual{BM02, + title = {A {\LaTeX{}} macro package for Message Sequence + Charts---Reference Manual---Describing {\mscpack} + version~{\mscversion}}, + author = {V. Bos and S. Mauw}, + year = {2002}, + month = {June}, + note = {Included in MSC macro package distribution} +} + +@Manual{BM02a, + title = {A {\LaTeX{}} macro package for Message Sequence + Charts---User Manual---Describing {\mscpack} + version~{\mscversion}}, + author = {V. Bos and S. Mauw}, + year = {2002}, + month = {June}, + note = {Included in MSC macro package distribution} +} + +@Manual{BM02b, + title = {A {\LaTeX{}} macro package for Message Sequence + Charts---Maintenance document---Describing {\mscpack} + version~{\mscversion}}, + author = {V. Bos and S. Mauw}, + year = {2002}, + month = {June}, + note = {Included in MSC macro package distribution} +} diff --git a/macros/latex/contrib/msc/maintenance.pdf b/macros/latex/contrib/msc/maintenance.pdf Binary files differnew file mode 100644 index 0000000000..c050ebe05b --- /dev/null +++ b/macros/latex/contrib/msc/maintenance.pdf diff --git a/macros/latex/contrib/msc/maintenance.tex b/macros/latex/contrib/msc/maintenance.tex new file mode 100644 index 0000000000..3e49133c6e --- /dev/null +++ b/macros/latex/contrib/msc/maintenance.tex @@ -0,0 +1,250 @@ +% file: maintenance.tex +% Copyright 2008 V. Bos, T. van Deursen, and S. Mauw +% This file is part of the MSC Macro Package. +% +\documentclass{article} +\usepackage{a4wide} +\usepackage{msc} + +\title{ + A {\LaTeX{}} macro package for Message Sequence Charts---Maintenance + document +} + + +\author{ + \begin{tabular}{c} + \begin{tabular}{ccc} + Victor Bos & + Ton van Deursen & + Sjouke Mauw \\ + & + \scriptsize Universit\'e du Luxembourg & + \scriptsize Universit\'e du Luxembourg \\[-0.8ex] + \scriptsize \texttt{victor.bos@ssf.fi} & + \scriptsize \texttt{ton.vandeursen@uni.lu} & + \scriptsize \texttt{sjouke.mauw@uni.lu} + \end{tabular}\\ + \end{tabular} +} + +\begin{document} + +\date{\small Version \mscversion, last update \today} + +\maketitle + +\begin{abstract} +\noindent +The MSC macro package facilitates the \LaTeX\ user to easily include +Message Sequence Charts in his texts. This document contains +information which supports the maintenance of the package. +\end{abstract} + +\section{Introduction} +This document contains three lists related to the maintenance of the +MSC macro package. This is a \LaTeX\ package for drawing Message +Sequence Charts. +For additional information consult the following URL: +\verb+http://satoss.uni.lu/mscpackage/+. + +The first list contains an overview of all publicly released versions +of the MSC macro package. The second list contains all known (yet +unresolved) bugs of the MSC macro package. The third list is the wish +list, containing wishes expressed by the users of the package w.r.t. +desired additional functionality. + +\section{Versions} +\begin{itemize} +\item Version 1.16, beta release, 2008/06/02 + +The MSC package used old \verb+PSTricks+-syntax of the \verb+\scalebox+ +command. To prevent mismatches with the \verb+graphicx+ package, this +macro was renamed to \verb+\psscalebox+. + +The \verb+action+ and \verb+condition+ macros are extended with a +starred version, which automatically adjust the size of the rectangle +and hexagon based on the size of the contents. + +Name and address information has been updated. + +\item Version 1.13, beta release, 2002/06/27. + +The label positioning of version 1.12 is reimplemented. In fact, the +implementation of messages is rewritten completely. The same method to +compute the location of labels is used in \verb+\mess+, \verb+create+, +\verb+lost+, and \verb+found+. The new implementation is backward +compatible, meaning that old documents using the MSC Macro Package +will still look the same. + +In addition, the bounding box bug is partly fixed. An \verb+\fbox+ is +drawn around each msc, hmsc, and mscdoc diagram. This enables dvips to +compute the right bounding box. Since the \verb+\fbox+ is drawn in +white, there is no visible result as long as the background is white, +too. A consequence of this bug fix is that the MSC Macro package +requires the \textsf{color} package. Just like the other required +packages, \textsf{pstricks}, \textsf{calc}, and \textsf{ifthen}, this +is a standard \LaTeXe{} package. + +\item Version 1.12, beta release, 2002/06/18. + +In this version, the user has more control over the positioning of +message labels. Implementation not finished yet. + +\item Version 1.11, Public release, 2002/06/06. + +Minor bug fix.\\ The \verb+\stepcounter+ problem that occurred while +using the MSC Macro Package together with overlays (slides) is solved. + +\item Version 1.10a, Public release, 2002/04/11. + +Minor bug fixes.\\ +The email addresses and websites mentioned in the files have been +corrected (if necessary). + +The problem with the german package (german.sty) has been solved. This +bug was found by Christian Kaeunicke. The german package redefines the +meaning of the " symbol in order to type german texts more +efficiently. However, this was not compatible with the msc package +(before version 1.10a), because it uses the " symbol in +(error)-messages. The new version (1.10a) uses the ' symbol instead of +the " symbol. This seems to solve the problem with the german +package. However, there are probably packages assigning special +meaning to the ' symbol and which will therefore not work properly +with the msc package. + +\item Version 1.10, Public release, 2002/04/10. + +Major improvements: support for two new types of diagrams: High-level +MSCs and MSC documents. Additional MSC constructs: fat (double line) +instances, gates, time measurements, comments, instance regions +(activation, suspension, and co-regions), method replies (dashed +message arrows). Left and right overlap of inline expressions and MSC +references in an MSC diagram can be specified separately. + +Reference manual. For a list of (all) commands and lengths, see +reference manual. + +Package now also available at CTAN. + +\item Version 1.4, Public release, 1999/04/23. + +Minor bug fixes.\\ +Additionally supports: Instance creation, MSC references, and inline +expressions.\\ +Extra parameters: +\verb+\referenceoverlap+, \verb+\inlineoverlap+, \verb+\stopwidth+.\\ +Adjustment of default values. There are now three sizes +(large/normal/small) instead of two. The middle size is now default.\\ +New command \verb+\setmscscale+ to scale the complete MSC up/down. + +\item Version 1.3, Public release, 1999/04/10. + +Minor bug fixes. +Additionally supports: Conditions, combined timer symbols, instance +stop.\\ +Extra parameters: +\verb+\conditionheight+, \verb+\conditionoverlap+, \verb+\stopwidth+. +Leveloffset can be specified in \verb+nextlevel+ command. + +\item Version 1.2, Public release, 1999/03/29. + +Minor bug fixes. +Code restructuring. +Additionally supports: Actions.\\ +Extra parameters: +\verb+\actionheight+, \verb+\actionwidth+. + +\item Version 1.1, Public release, 1999/03/24. + +Minor bug fixes. +Additionally supports: timers (singular events), lost and found +messages, generalized ordering. Extra parameters: +\verb+\lostsymbolradius+, \verb+\timerwidth+. The macro +\verb+\setfootcolor+ replaces \verb+\setfootgrayness+, and the macro +\verb+\setmscvalues+ replaces \verb+\resetmsclengths+. +Some default values have been adjusted. + +\item Version 1.0, First public release, 1999/03/16. + +Supports drawing of the following MSC constructs: MSC frame, +instances, messages (including self and env messages), coregions. +Includes some parameters for fine tuning of the drawing. + +\end{itemize} + +\section{Bugs} +The MSC macro package contains numerous bugs (and hidden features). +As of now, these are the only ones that have revealed themselves in public. + +\begin{itemize} + +\item Some starred versions of commands of the MSC Macro package do +not cooperate with the \textsf{amsbsy} package. The problem is that +the latter package redefined the macro \verb+\@ifstar+. This bug was +dicovered by Sjouke Mauw. + +\item The size of msc diagrams is computed incorrectly. After +generating an eps file (dvips -E) from a dvi file containing exactly +one msc diagram, the diagram is clipped incorrectly. This bug was +dicovered by Tim Willemse. + +\item There are \LaTeX{} packages that assign special meaning to some +characters. Consequently, the MSC Macro package might not function properly +with such packages. Since we cannot anticipate on these semantical +changes of symbols, we don't know of a good solution to it. However, +we try to find solutions for these problems if they originated from +packages that are in the standard \LaTeX{} distribution. + +A concrete example was the \textsf{german} package, as pointed out by +Christian Kaeunicke. This package assigns special meaning to the " +symbol. If you issue \verb+\usepackage{german}+ \emph{before} +\verb+\usepackage{msc}+, you will get an error as soon as your first +msc diagram is compiled. As Christian also mentioned, the error does +not occur if the import order of the packages is reversed. + +As of MSC Macro package version 1.10a, this concrete bug with the +\textsf{german} package has been solved and the order between +\textsf{msc} and \textsf{german} is not restricted anymore. + +\item The MSC Macro Package (version $\leq 1.10a$) crashes with the +overlay environment of the slides document class. The bug is due to a +redefinition of the \verb+\refstepcounter+ macro by the slides +documentclass. This bug was discovered by Volker Stolz. He and Markus +Mohnen proposed a solution: increase the counters used by the MSC +macro package manually. In Version~1.11 this solution is +implemented. Thanks Volker and Markus! + +\end{itemize} + +\section{Wishes} +\begin{itemize} + +\item Split MSCs over multiple pages (T. van Deursen, 2008/02/18) + +\item Make the parameters of the MSC Macro package more +consistent. For example, the \verb+\mess+ macro and the +\verb+\measure+ have similar positioning parameters, but they cannot +have the same values. (V. Bos 2002/06/16) + +\item Add a section to the user manual describing how to generate +other formats (like html, PostScript, pdf). (S. Mauw 2002/06/14) + +\item Add to the user manual a figure describing the various HMSC lengths. + (S. Mauw 2002/06/14) + +\item Add automatic resizing of action symbols, as described in one of +the tricks in the reference manual. (S. Mauw 2002/06/14) + +\item Add UML extensions to the MSC Macro package. Describe clearly +which UML diagrams we support.(S. Mauw, 2002/06/13) + +\item A possibility to change the color of instance regions. V. Bos +(2002/04/09). + +\item Add option to messages to determine relative position of +label. (S. Mauw 1999/04/15). + +\end{itemize} + +\end{document} diff --git a/macros/latex/contrib/msc/manual.pdf b/macros/latex/contrib/msc/manual.pdf Binary files differnew file mode 100644 index 0000000000..9cc6c420cf --- /dev/null +++ b/macros/latex/contrib/msc/manual.pdf diff --git a/macros/latex/contrib/msc/manual.tex b/macros/latex/contrib/msc/manual.tex new file mode 100644 index 0000000000..d6025770fe --- /dev/null +++ b/macros/latex/contrib/msc/manual.tex @@ -0,0 +1,2841 @@ +% file: manual.tex +% Copyright 2008 V. Bos, T. van Deursen, and S. Mauw +% This file is part of the MSC Macro Package. +% +\documentclass[12pt,a4paper]{article} +\usepackage{a4wide} +\usepackage{url} +\usepackage{moreverb} +\usepackage{multicol} +\usepackage{msc} + +% we allow a ragged right +\setlength{\rightskip}{0pt plus 0.05\linewidth minus 0pt} + + + + + +\newlength{\rpwidth} +\setlength{\rpwidth}{.5cm} +\newlength{\rpheight} +\setlength{\rpheight}{0.5\levelheight} +\newcommand{\rpN}{% + \psframe(-0.5\rpwidth,-\rpheight)(0.5\rpwidth,0\rpheight)% + \rput[B](0\rpwidth,-0.8\rpheight){\tiny \textsc{n}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpNE}{% + \psframe(-\rpwidth,-\rpheight)(0\rpwidth,0\rpheight)% + \rput[B](-.5\rpwidth,-0.8\rpheight){\tiny \textsc{ne}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpE}{% + \psframe(-\rpwidth,-.5\rpheight)(0\rpwidth,.5\rpheight)% + \rput[B](-.5\rpwidth,-0.3\rpheight){\tiny \textsc{e}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpSE}{% + \psframe(-\rpwidth,0\rpheight)(0\rpwidth,\rpheight)% + \rput[B](-.5\rpwidth,0.2\rpheight){\tiny \textsc{se}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpS}{% + \psframe(-.5\rpwidth,\rpheight)(.5\rpwidth,0\rpheight)% + \rput[t](0\rpwidth,0.8\rpheight){\tiny \textsc{s}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpSW}{% + \psframe(0\rpwidth,0\rpheight)(\rpwidth,\rpheight)% + \rput[B](.5\rpwidth,0.2\rpheight){\tiny \textsc{sw}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpW}{% + \psframe(0\rpwidth,-.5\rpheight)(\rpwidth,.5\rpheight)% + \rput[B](.5\rpwidth,-0.3\rpheight){\tiny \textsc{w}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpNW}{% + \psframe(0\rpwidth,-\rpheight)(\rpwidth,0\rpheight)% + \rput[B](.5\rpwidth,-0.8\rpheight){\tiny \textsc{nw}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} + + + + + +% The following code is taken from the doc package. It defines a global +% macro \bslash that produces a bslash (if present in the current font). +\makeatletter +{\catcode`\|=\z@ \catcode`\\=12 |gdef|bslash{\}} +\makeatother +\newcommand{\cmd}[1]{\texttt{\bslash #1}} + +\newcommand{\acro}[1]{{#1}} + +\newcommand{\MSC}{\acro{MSC}} +\newcommand{\HMSC}{\acro{HMSC}} +\newcommand{\MSCdoc}{\MSC{}doc} +\newcommand{\mscpack}{\MSC{} macro package} + +\newcommand{\env}[1]{\texttt{#1}} +\newcommand{\opt}[1]{[#1]} +\newcommand{\cmdarg}[1]{\{\emph{#1}\}} +\newcommand{\coordarg}[1]{\emph{#1}} +\newcommand{\coordargs}[2]{(\coordarg{#1},\coordarg{#2})} +\newcommand{\lnsvalue}[3]{large/normal/small value #1/#2/#3} + +\newenvironment{defs}{% + \begin{list}{}% + {\setlength{\labelwidth}{0pt}% + \setlength{\labelsep}{1em}% + \setlength{\leftmargin}{1em}% + \setlength{\parsep}{1ex}% + \setlength{\listparindent}{0pt}% + \setlength{\rightmargin}{0pt}% + \renewcommand{\makelabel}[1]{##1}% + \raggedright% + }% + }{% + \end{list}} + + + +\title{ + A \LaTeX\ macro package for Message Sequence Charts\\{\large User Manual} +} + +\author{ + \begin{tabular}{c} + \begin{tabular}{ccc} + Victor Bos & + Ton van Deursen & + Sjouke Mauw \\ + & + \scriptsize Universit\'e du Luxembourg & + \scriptsize Universit\'e du Luxembourg \\[-0.8ex] + \scriptsize \texttt{victor.bos@ssf.fi} & + \scriptsize \texttt{ton.vandeursen@uni.lu} & + \scriptsize \texttt{sjouke.mauw@uni.lu} + \end{tabular}\\ + \end{tabular} +} + +\date{\small Version \mscversion, last update \today\\ + Describing \mscpack{} version \mscversion} + +\begin{document} + + +\maketitle + +\begin{abstract} +\noindent +The \mscpack{} facilitates the \LaTeX\ user to easily include +Message Sequence Charts in his texts. This document describes the +design and use of the \mscpack. +\end{abstract} + +\tableofcontents +\section{New} +\label{new} + +\paragraph{Version~1.16} solves a bug that was due to a change in +syntax of the \verb+scalebox+ macro in the \verb+PSTricks+ package. + +The \verb+action+ and \verb+condition+ macros are extended with a +starred option. The starred version of the macros automatically +adjusts the size of the rectangle and hexagon based on the size of the +contents. + +\paragraph{Version~1.13} has a reimplementation of message commands in MSC +diagrams. The affected commands are: \verb+\create+, \verb+\found+, +\verb+\lost+, \verb+\mess+, and \verb+\order+. The new implementation +provides more control over the placement of message labels. + +The command \verb+\selfmesslabelpos+ has been removed. + +The bounding box bug has been partly solved. Now, a white \verb+\fbox+ +is drawn around every (msc, mscdoc, hmsc) diagram. This makes it +possible for \texttt{dvips -E} to compute the correct bounding box for +the diagrams. Due to the \verb+\fbox+, each diagram is extended with +0.3pt on each side (left, top, right, and bottom). This bugfix fails +if the background is not white. The xdvi program shows the white +\verb+\fbox+ in black with the result that diagrams have two visible +frames. This seems to be a bug of xdvi. + +The lines around comments (\verb+\msccomment+, Section~\ref{comments}) +are changed from gray into black. The reason for this is that the gray +lines became invisible after converting the document to HTML. + +\paragraph{Version~1.12} is a non-public version. It features a preliminary +implementation of message label position control. + +\paragraph{Version~1.11} is a mainly a bugfix of version~1.10a, see~\cite{BM02b}. +The next list shows the new features of version~1.10a compared to +version 1.4. + +\begin{itemize} +\item Support for method replies (dashed message arrows):\cmd{mess*} (Section~\ref{messages}) +\item Fat instances, i.e., double line instances (Section~\ref{instances}) +\item Comments (Section~\ref{comments}) +\item Coregions are now special cases of regions (which includes also +activation and suspension regions). The \cmd{coregionstart} and +\cmd{coregionend} commands are obsolete and the \cmd{coregionbarwidth} +is replaced by \cmd{regionbarwidth}. +\item Gates (Section~\ref{gates}) +\item High-level \MSC{}'s (Section~\ref{hmsc}) +\item \cmd{inlinestart} has additional optional argument to allow for different left and right overlap (Section~\ref{inlines}) +\item \MSCdoc{}s (Section~\ref{mscdoc}) +\item Reference manual~\cite{BM02} +\item \cmd{referencestart} has additional optional argument to allow for different left and right overlap (Section~\ref{references}) +\item Regions: generalization of coregions supporting activations, suspension, and coregions (Section~\ref{regions}) +\item Time measurements (Section~\ref{measurements}) +\end{itemize} + + +\section{Introduction} +\label{introduction} + +The \MSC{} language is a visual language for the description of the +interaction between different components of a system. +This language is standardized by the ITU (International +Telecommunication Union) in Recommendation Z.120~\cite{z120}. An +introductory text on \MSC{} can be found +in~\cite{RudolphGrabowskiGraubmann96}. \MSC{}s have a +wide application domain, ranging from requirements specification to +testing and documentation. +An example of a Message Sequence Chart is in Figure~\ref{quick}. + +In order to support easy drawing of \MSC{}s in \LaTeX\ documents, we have +developed the \mscpack. The current version of the \mscpack{} +supports the following \MSC{} constructs: \MSC{} frame, instances (both +single line width and double line width), messages (including +self-messages and messages to the environment), actions, singular and +combined timer events (set, timeout, reset, set-timeout, set-stop), +lost and found messages, generalized order, conditions, coregions, +activation regions, suspension regions, gates, instance creation, +instance stop, time measurements, references, and inline +expressions. In addition, there is support for \HMSC{}'s (high-level +\MSC{}s) and \MSCdoc{}s. + +In this manual we explain the design and the use of the \mscpack. For +a complete overview of all features, we refer to the reference +manual~\cite{BM02}, which is included in the distribution under the +name \verb+refman.ps+. Another way to learn how to use the \mscpack{} +is to have a look at the \LaTeX{} source code of the manual and the +source code of the reference manual. They are included in the +distribution under the names \verb+manual.tex+ and \verb+refman.tex+, +respectively. The \MSC{} constructs are simply introduced as +syntactic constructs. This paper is not meant to describe their use or +meaning. + +We list the backgrounds of the package and some design decisions in +Section~\ref{background}. +Section~\ref{install} contains notes on installing the +package. Section~\ref{quickstart} contains an example of using the +package. It allows the impatient reader to quickly start using the +package. The details of using the package are explained in +Section~\ref{use}. In Section~\ref{parameters} the parameters are +explained which determine detailed layout of the various symbols. +A large but meaningless example is given in +Section~\ref{example}. + + +\section{Background and motivation} +\label{background} +Several commercial and non-commercial tools are available, which +support drawing or generating Message Sequence Charts. However, these +tools are in general not freely available and often not flexible +enough to satisfy all user's wishes with respect to the layout and +graphical appearance of an \MSC{}. +Therefore, people often use general drawing tools, such as {\em xfig} +to draw \MSC{}s. However flexible this approach is, it takes quite some +effort to produce nice \MSC{} drawings in a tool which is not dedicated +to \MSC{}s. Furthermore, when drawing a number of \MSC{}s it requires some +preciseness in order to obtain a consistent set of \MSC{}s. + +For these reasons, we have started the design of a set of +\LaTeX\ macros which support the drawing of \MSC{}s. In this way, an \MSC{} can be +represented in \LaTeX\ in a textual format and compiled into +e.g.\ PostScript. + +We aimed at satisfying the following requirements and design +decisions. +\begin{itemize} +\item +The package should follow the ITU standard with respect to shape and +placement of the symbols. (The current version supports +the \MSC2000 standard.) +\item +Static and dynamic semantics are not considered. The user is allowed +to violate all semantical restrictions and draw inconsistent \MSC{}s. +The package only supports elementary syntactical requirements. +\item +The package should offer functionality at the right level of +abstraction. Rather than supplying coordinates of pixels, the +user should be able to express the placement of symbols in terms of +{\em levels}. +Nevertheless, the textual representation of \MSC{}s as defined by the ITU +standard has a level of abstraction which is too high for our purposes. +It lacks information about the actual positioning of the \MSC{} symbols, +while we think that in our package this should be under user control. +\item +There should be only minimal automatic restructuring and layout of the +\MSC{} (e.g.\ the relative positioning of two messages should be as +defined by the user, even if the messages are not causally ordered). +\item +The user can customize the appearance of the \MSC{}s by manipulating +an appropriate set of parameters. +\end{itemize} + +\section{Installation, copyright and system requirements} +\label{install} + +The \mscpack{} is still under development. The authors +appreciate any comments and suggestions for improvements. The most +recent version of the package can be downloaded from +\url{http://satoss.uni.lu/mscpackage/}. + + +The \mscpack{} has a \emph{LaTeX Project Public License} +(LPPL), see~\url{http://www.latex-project.org/lppl.txt}: +{\small +\verbatiminput{COPYRIGHT} +} As such, it is free of charge and can be freely +distributed. Furthermore, it is allowed to make modifications to the +package, provided that modified versions get different names. The +authors accept no liability with respect to the functioning of the +package. + +The \mscpack{} runs with \LaTeXe. It has been tested with \LaTeXe\ +version dated 1998/06/01 using \TeX\ version 3.14159. The following +additional packages are required: \textsf{pstricks}, \textsf{calc}, +\textsf{ifthen}, and \textsf{color}. These packages are in general +part of the standard \LaTeXe\ distribution. These additional packages +can be obtained from the {\em ctan} database for \LaTeX\, e.g.\ via +the following URL: \url{http://www.tex.ac.uk/}. The \textsf{pstricks} +package is described in~\cite[Chapter~4]{GSM97}. The generated output +can only be previewed with recent previewing software (e.g.\ xdvi +version 20c). It may be needed to update all \LaTeX\ related software +to a more recent version in order to smoothly work with the \mscpack. + +The \mscpack{} can be installed easily. Just put the file +\verb+msc.sty+ in a directory which is searched by \LaTeX{} for style +files. The set of directories actually searched depends on the \TeX\ +installation, but often the {\em current directory} is included. UNIX +users may have to set the environment variable \texttt{\$TEXINPUTS} to +an appropriate value. For more details on this topic consult +documentation of your \TeX\ installation. + +%The following text is currently not applicable -sm +% +%A problem may occur when using more packages than the \MSC{} macro +%package in your \LaTeX\ document. This happens, e.g.\ when using the +%{\em epsfig} package. These problems are due to the combination of +%several packages which are required (but not provided) by the \MSC{} +%macro package. The solution is to change the order of the +%\verb+usepackage+ clauses. + +\section{Quick start} +\label{quickstart} +The \mscpack{} is easy to use. +Below is an example of the use of the package and +Figure~\ref{quick} shows the generated \MSC{}. + +{\small +\begin{verbatim} +\documentclass{article} +\usepackage{msc} +\begin{document} + +\begin{msc}{Example} + +\declinst{usr}{User}{} +\declinst{m1}{Machine 1}{control} +\declinst{m2}{Machine 2}{drill} +\declinst{m3}{Machine 3}{test} + +\mess{startm1}{usr}{m1} +\nextlevel +\mess{startm2}{m1}{m2} +\nextlevel +\mess{continue}{m2}{m3} +\mess{log}{m1}{envleft} +\nextlevel +\mess{output}{m3}{usr}[2] +\nextlevel +\mess{free}{m1}{usr} +\nextlevel + +\end{msc} + +\end{document} + +\end{verbatim} +} + +\begin{figure}[htb] +\begin{center} + +\begin{msc}{Example} + +\declinst{usr}{User}{} +\declinst{m1}{Machine 1}{control} +\declinst{m2}{Machine 2}{drill} +\declinst{m3}{Machine 3}{test} + +\mess{startm1}{usr}{m1} +\nextlevel +\mess{startm2}{m1}{m2} +\nextlevel +\mess{continue}{m2}{m3} +\mess{log}{m1}{envleft} +\nextlevel +\mess{output}{m3}{usr}[2] +\nextlevel +\mess{free}{m1}{usr} +\nextlevel + +\end{msc} + +\end{center} +\caption{The generated \MSC{}} +\label{quick} +\end{figure} + +The \mscpack{} is activated by the clause +\verb+\usepackage{msc}+. +This package contains, among others, a +definition of the environment \verb+msc+. +This environment is used to draw \MSC{}s. The \MSC{} definition is surrounded by +the clauses \verb+\begin{msc}{Example}+ and \verb+\end{msc}+. The name of +the \MSC{}, {\tt Example}, is displayed in the upper-left corner of the +\MSC{}. + +The next four lines define the \emph{instances}: +\verb+\declinst{m1}{Machine 1}{control}+ defines an instance with +\emph{nickname} \verb+m1+ and a description consisting of two parts, +namely, \verb+Machine 1+ and \verb+control+. The nickname is used in +all subsequent references to this instance. The first part of the +description is drawn above the rectangular instance head symbol, and +the second part of the description is drawn inside the instance head +symbol. + +The following lines contain the definitions of the messages. Every +message has a source and a destination instance. The clause +\verb+\mess{startm1}{usr}{m1}+ defines a message with name {\tt +startm1}, which goes from instance {\tt usr} to instance {\tt m1}. + +In order to control the vertical placement of the messages, the \MSC{} is +divided into levels. At every level, any number of messages may start. +The vertical position of the end point of a message is determined +by the optional fourth argument of the message definition, as in the +clause \verb+\mess{output}{m2}{user}[2]+. +This argument is the vertical offset (in number of levels) between the +start point of the message (i.e.\ the current level) and its end point. +If the value is 0 the message is drawn horizontally. A negative offset +means that the arrow has an upward slope. + +The clause \verb+\nextlevel+ is used to advance to the next level. + +\section{Use of the \mscpack} +\label{use} + +\subsection{The \MSC{} frame} +\label{mscframe} +The \verb+msc+ environment is used for making \MSC{} definitions. Thus, such a +definition looks as follows. + +\begin{verbatim} +\begin{msc}[headerpos]{mscname} +...definition of the MSC... +\end{msc} +\end{verbatim} + +This draws the frame and the header of the \MSC{}. +The argument \verb+mscname+ is the name of the \MSC{}. +The header of an \MSC{} is formed from the keyword \verb+msc+, followed +by the \verb+mscname+. Positioning of this header is controlled by +the optional argument \verb+headerpos+. This argument can have values +\verb+l+ (for a left aligned header), \verb+c+ (for a centered header) +and \verb+r+ (for a right aligned header). +The default value of \verb+headerpos+ is \verb+l+. + +The size of the \MSC{} frame is determined vertically by the number of levels +occurring in the \MSC{} (see Section~\ref{levels}) and horizontally by +the number of instances (see Section~\ref{instances}). + +The parameter \verb+\topnamedist+ controls the distance between the +top of the \MSC{} frame and the header (see Section~\ref{parameters}). +The parameter \verb+\leftnamedist+ controls the distance between the +left of the \MSC{} frame and the header if the \verb+headerpos+ is +\verb+l+ and it controls the distance between the right of the \MSC{} +frame and the header if \verb+headerpos+ is \verb+r+ (see +Section~\ref{parameters}). + +\subsection{Levels} +\label{levels} +An \MSC{} is vertically divided in {\em levels}. All events in an \MSC{} are +attached to a certain level, or stretch out over several levels. +Any number of events can be drawn at a certain level. +An event will always be drawn (or started) at the current level, unless a level +offset is specified (see e.g.\ the \verb+\mess+ command in +Section~\ref{messages}). The level offset is an integer number, which +denotes at which level, relative to the current level, an event should +be drawn. +Drawing starts at level 0. +The following command is used to advance to the next level. +\begin{verbatim} +\nextlevel[leveloffset] +\end{verbatim} + +The \verb+leveloffset+ is an integer value which denotes the number of +levels to advance. By default, the value of \verb+leveloffset+ is 1, +which means drawing continues at the next level. Setting +\verb+leveloffset+ to a negative value may result in unexpected +drawings, however, see the \emph{Tricks} section in the reference +manual~\cite{BM02}. + +There are three parameters which control the size of the levels (see +Section~\ref{parameters}). These are \verb+\firstlevelheight+ (the +distance between the instance start symbol and the first level), +\verb+\levelheight+ (the distance between two consecutive levels), and +\verb+\lastlevelheight+ (the distance between the last level and the +instance end symbol). Figure~\ref{parametersfig} on +page~\pageref{parametersfig} shows all lengths of the \mscpack. + +\subsection{Instances} +\label{instances} +All instances have to be declared before they can be used. An instance +consists of an instance head symbol with an associated name, an +instance axis and an instance end symbol. Normal instances have a +single line axis. Fat instances have a double line axis. The order of +the instance declarations determines the order in which the instances +occur in the drawing. + +An instance is declared with the following command. + +\begin{verbatim} +\declinst(*){nickname}{instancenameabove}{instancenamewithin} +\end{verbatim} + +The starred version produces a fat instance. +The \verb+nickname+ is used for referring to this instance in the rest of the +\MSC{} definition. +The \verb+instancenameabove+ is put above the instance head symbol. +The \verb+instancenamewithin+ is put inside the instance head symbol. + +Several parameters allow the user to customize the shape and +positioning of instances (see Section~\ref{parameters}). These are +\verb+\topheaddist+ (the distance between the top of the \MSC{} and the +instance head symbol), \verb+\instheadheight+ (the height of the +instance head symbol), \verb+\instfootheight+ (the height of the +instance foot symbol), \verb+\bottomfootdist+ (the distance between +the instance foot symbol and the bottom of the \MSC{} frame), +\verb+\instwidth+ (the width of the instance head and foot symbols), +\verb+\instdist+ (the distance between two instance axes), +\verb+\envinstdist+ (the distance between the edge of the \MSC{} and the +first/last instance axis), and \verb+\labeldist+ (the distance between +the instance head symbol and the part of the instance name drawn above +the head symbol). The command \verb+\setfootcolor{color}+ sets the +fill color of the footer symbol. Valid color values are, e.g., +\texttt{black} (default), \texttt{white}, and \texttt{gray}. + +The following \MSC{} shows the declaration of an \MSC{} with three +instances. The first and the last are normal instances (one line axis) +whereas the second is a fat instance (double line axis). The second +line, \verb+\setmscvalues{small}+, indicates that the small drawing +style should be used (see Section~\ref{parameters}). + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}[l]{instances} +\setmscvalues{small} + +\declinst{i}{above}{within} +\declinst*{j}{}{j} +\declinst{k}{k}{} + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\small +\begin{verbatim} +\begin{msc}{instances} +\setmscvalues{small} + +\declinst{i}{above}{within} +\declinst*{j}{}{j} +\declinst{k}{k}{} + +\end{msc} +\end{verbatim} +} +\end{minipage} + + +\subsection{Messages} +\label{messages} +A message is denoted by an arrow from the sending instance to the +receiving instance. The instances are referred to by their nicknames. +A message is defined with the following command. + +\begin{verbatim} +\mess(*)[pos]{name}[labelpos]{sender}[placement]{receiver}[leveloffset] +\end{verbatim} +The \verb+name+ of the message may be any string. The \mscpack{} +processes the \verb+name+ argument in LR-mode, +see~\cite[page~36]{Lam94}. This means that the string will consist of +one line. To generate multi-line message names, use the standard +\cmd{parbox} command, see the \emph{Tricks} section in the reference +manual~\cite{BM02}. By default, the name of a message label is drawn +above the center of the arrow, but the optional parameters \verb+pos+, +\verb+labelpos+, and \verb+placement+ influence the actual location, +as described below. The arrow starts at the current level at the +sending instance. The arrow ends at the current level plus the +\verb+leveloffset+, at the receiving instance. The \verb+leveloffset+ +is an optional integer argument with default value 0. The +\verb+sender+ and \verb+receiver+ should be the nicknames of declared +instances. + +In case the sending and the receiving instance are the same, the +message is a \emph{self message}. A self message is drawn as a +polyline connecting the instance axis to itself. + +The starred version of the command, \verb+\mess*+, produces the same +result as \verb+\mess+, except that the arrow is drawn with a dashed +line. This can be used to draw a {\em method reply} (see~\cite{z120}). + +As mentioned above, placement of the message and its label is +controlled by the optional parameters \verb+pos+, \verb+labelpos+, and +\verb+placement+. In case of a self message, \verb+pos+ denotes the +position of the arrow with respect to the instance axis. Valid values +are \verb+l+ (left) and \verb+r+ (right). The default value is +\verb+l+. In case of a non-self message, the \verb+pos+ parameter is +ignored. + +Whereas the \verb+pos+ parameter defines the position of the arrow +symbol with respect to the instance axis, the \verb+labelpos+ +parameter defines the position of the message label with +respect to the message arrow. In case of a self message, valid values +for \verb+labelpos+ are \verb+l+ (left) and~\verb+r+ (right). The +default value is equal to the, possibly user defined, value of the +\verb+pos+ parameter. In case of a non-self message, valid values for +\verb+labelpos+ are \verb+t+ (on top) and~\verb+b+ (below). The +default value is~\verb+t+. + +Finally, the \verb+placement+ parameter defines the relative distance +of the message label to the beginning of the message. Valid values are +real numbers in the closed interval $[0,1]$. The default value +is~$0.5$. While drawing a message, the \mscpack{} computes the +coordinates of the message label using \verb+placement+ and the length +and coordinates of the arrow. It then computes a \emph{reference +point} for the message label and places it on the coordinates just +computed. Figures \ref{fig:refpoints} (page~\pageref{fig:refpoints}) +and~\ref{fig:refpoints:B} (page~\pageref{fig:refpoints:B}) +schematically show the reference points for message labels. In the +first figure, the labels are located at the default position. In the +second figure, all labels are shifted along the arrow by setting +$\verb+placement+ = 0.9$. The \verb+\lost+ and \verb+\found+ commands +(Section~\ref{lostfound}) and the \verb+\create+ +(Section~\ref{createstop}) command use the same method to determine +reference points and message label locations. Note that the boxes with +the location of the reference points are not generated by the \LaTeX{} +code given in Figures \ref{fig:refpoints} and~\ref{fig:refpoints:B}; +we enriched the \LaTeX{} code with some extra \textsf{pstricks} code +(see \LaTeX{} source code of this document). + +In addition to label position control, there are three ways to control +the shape of messages (see Section~\ref{parameters}). These are: +\verb+\selfmesswidth+ (a parameter to specify the width of the +polyline used for drawing self-messages), \verb+\labeldist+ (a +parameter to specify the distance between the label of a message and +the message arrow), and \verb+\messarrowscale{size}+ (a command to set +the size of the arrow head of a message). \verb+size+ should be +positive real number. + +Messages to or from the environment (i.e.\ the left or the right side +of the \MSC{} frame) can be +specified by setting the sender or the receiver argument to one of the values +\verb+envleft+ or \verb+envright+. (Note: Since instances and +environments are treated equally in the implementation, at every position +where the nickname of an instance is required, also +\verb+envleft+ and \verb+envright+ are allowed.) + +The following \MSC{} shows an example of the use of messages. +In this sample \MSC{} and the following \MSC{}s in this section we will +not list the complete textual representations of the \MSC{}s. For brevity +we omit the environment call and the declarations of the instances. +Note the final \verb+\nextlevel+ command which is needed +to make the instance axis long enough to receive message +\verb+a+. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{messages} +\setmscvalues{small} +\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} + +\mess{a}{j}{i}[3] +\mess{self}{i}{i} +\nextlevel +\mess*{b}{j}{k} +\mess[b]{c}{k}{envright} +\nextlevel +\mess{d}{k}[.6]{i} +\nextlevel + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\small +\begin{verbatim} +\mess{a}{j}{i}[3] +\mess{self}{i}{i} +\nextlevel +\mess*{b}{j}{k} +\mess[b]{c}{k}{envright} +\nextlevel +\mess{d}{k}[.6]{i} +\nextlevel +\end{verbatim} +} +\end{minipage} + +\begin{figure}[htb] +\begin{minipage}{\linewidth} +\setmscvalues{small} +\begin{multicols}{2} +\begin{msc}{Label reference points} +\declinst{m0}{I0}{} +\declinst{m1}{I1}{} +\declinst{m2}{I2}{} +\nextlevel + +\mess{\rpS}{m0}{m1} +\nextlevel +\mess{\rpN}[b]{m1}{m2} +\nextlevel[2] + +\mess{\rpS}{m1}{m0} +\nextlevel +\mess{\rpN}[b]{m2}{m1} +\nextlevel[2] + +\mess{\rpE}{m0}{m0}[2] +\mess[r]{\rpW}{m2}{m2}[2] +\nextlevel[4] +\mess{\rpW}[r]{m0}{m0}[2] +\mess[r]{\rpE}[l]{m2}{m2}[2] +\nextlevel[6] + +\mess{\rpE}{m0}{m0}[-2] +\mess[r]{\rpW}{m2}{m2}[-2] +\nextlevel[4] +\mess{\rpW}[r]{m0}{m0}[-2] +\mess[r]{\rpE}[l]{m2}{m2}[-2] +\nextlevel[2] + +\mess{\rpSW}{m0}{m1}[2] +\mess{\rpNE}[b]{m1}{m2}[2] +\nextlevel[6] + +\mess{\rpSW}{m1}{m0}[-2] +\mess{\rpNE}[b]{m2}{m1}[-2] +\nextlevel[2] + +\mess{\rpSE}{m1}{m0}[2] +\mess{\rpNW}[b]{m2}{m1}[2] +\nextlevel[6] + +\mess{\rpSE}{m0}{m1}[-2] +\mess{\rpNW}[b]{m1}{m2}[-2] +\nextlevel[2] +\end{msc} +\bigskip + +\scriptsize +\begin{verbatim} +\begin{msc}{Label reference points} +\declinst{m0}{I0}{} +\declinst{m1}{I1}{} +\declinst{m2}{I2}{} +\nextlevel + +\mess{S}{m0}{m1} +\nextlevel +\mess{N}[b]{m1}{m2} +\nextlevel[2] + +\mess{S}{m1}{m0} +\nextlevel +\mess{N}[b]{m2}{m1} +\nextlevel[2] + +\mess{E}{m0}{m0}[2] +\mess[r]{W}{m2}{m2}[2] +\nextlevel[4] +\mess{W}[r]{m0}{m0}[2] +\mess[r]{E}[l]{m2}{m2}[2] +\nextlevel[6] + +\mess{E}{m0}{m0}[-2] +\mess[r]{W}{m2}{m2}[-2] +\nextlevel[4] +\mess{W}[r]{m0}{m0}[-2] +\mess[r]{E}[l]{m2}{m2}[-2] +\nextlevel[2] + +\mess{SW}{m0}{m1}[2] +\mess{NE}[b]{m1}{m2}[2] +\nextlevel[6] + +\mess{SW}{m1}{m0}[-2] +\mess{NE}[b]{m2}{m1}[-2] +\nextlevel[2] + +\mess{SE}{m1}{m0}[2] +\mess{NW}[b]{m2}{m1}[2] +\nextlevel[6] + +\mess{SE}{m0}{m1}[-2] +\mess{NW}[b]{m1}{m2}[-2] +\nextlevel[2] +\end{msc} +\end{verbatim} +\end{multicols} +\end{minipage} +\caption{Reference points of message labels} +\label{fig:refpoints} +\end{figure} + + +\begin{figure}[htb] +\begin{minipage}{\linewidth} +\setmscvalues{small} +\begin{multicols}{2} +\begin{msc}{Label reference points (2)} +\declinst{m0}{I0}{} +\declinst{m1}{I1}{} +\declinst{m2}{I2}{} +\nextlevel + +\mess{\rpS}{m0}[.9]{m1} +\nextlevel +\mess{\rpN}[b]{m1}[.9]{m2} +\nextlevel[2] + +\mess{\rpS}{m1}[.9]{m0} +\nextlevel +\mess{\rpN}[b]{m2}{m1} +\nextlevel[2] + +\mess{\rpE}{m0}[.9]{m0}[2] +\mess[r]{\rpW}{m2}[.9]{m2}[2] +\nextlevel[4] +\mess{\rpW}[r]{m0}[.9]{m0}[2] +\mess[r]{\rpE}[l]{m2}[.9]{m2}[2] +\nextlevel[6] + +\mess{\rpE}{m0}[.9]{m0}[-2] +\mess[r]{\rpW}{m2}[.9]{m2}[-2] +\nextlevel[4] +\mess{\rpW}[r]{m0}[.9]{m0}[-2] +\mess[r]{\rpE}[l]{m2}[.9]{m2}[-2] +\nextlevel[2] + +\mess{\rpSW}{m0}[.9]{m1}[2] +\mess{\rpNE}[b]{m1}[.9]{m2}[2] +\nextlevel[6] + +\mess{\rpSW}{m1}[.9]{m0}[-2] +\mess{\rpNE}[b]{m2}[.9]{m1}[-2] +\nextlevel[2] + +\mess{\rpSE}{m1}[.9]{m0}[2] +\mess{\rpNW}[b]{m2}[.9]{m1}[2] +\nextlevel[6] + +\mess{\rpSE}{m0}[.9]{m1}[-2] +\mess{\rpNW}[b]{m1}[.9]{m2}[-2] +\nextlevel[2] +\end{msc} +\bigskip + +\scriptsize +\begin{verbatim} +\begin{msc}{Label reference points (2)} +\declinst{m0}{I0}{} +\declinst{m1}{I1}{} +\declinst{m2}{I2}{} +\nextlevel + +\mess{S}{m0}[.9]{m1} +\nextlevel +\mess{N}[b]{m1}[.9]{m2} +\nextlevel[2] + +\mess{S}{m1}[.9]{m0} +\nextlevel +\mess{N}[b]{m2}{m1} +\nextlevel[2] + +\mess{E}{m0}[.9]{m0}[2] +\mess[r]{W}{m2}[.9]{m2}[2] +\nextlevel[4] +\mess{W}[r]{m0}[.9]{m0}[2] +\mess[r]{E}[l]{m2}[.9]{m2}[2] +\nextlevel[6] + +\mess{E}{m0}[.9]{m0}[-2] +\mess[r]{W}{m2}[.9]{m2}[-2] +\nextlevel[4] +\mess{W}[r]{m0}[.9]{m0}[-2] +\mess[r]{E}[l]{m2}[.9]{m2}[-2] +\nextlevel[2] + +\mess{SW}{m0}[.9]{m1}[2] +\mess{NE}[b]{m1}[.9]{m2}[2] +\nextlevel[6] + +\mess{SW}{m1}[.9]{m0}[-2] +\mess{NE}[b]{m2}[.9]{m1}[-2] +\nextlevel[2] + +\mess{SE}{m1}[.9]{m0}[2] +\mess{NW}[b]{m2}[.9]{m1}[2] +\nextlevel[6] + +\mess{SE}{m0}[.9]{m1}[-2] +\mess{NW}[b]{m1}[.9]{m2}[-2] +\nextlevel[2] +\end{msc} +\end{verbatim} +\end{multicols} +\end{minipage} +\caption{Reference points of shifted message labels} +\label{fig:refpoints:B} +\end{figure} + + +\subsection{Comments} +\label{comments} + +Comments are additional texts to clarify (events on) an instance. The +following command can be used to add comments to an \MSC{} diagram. + +\begin{verbatim} +\msccomment[position]{text}{instname} +\end{verbatim} + +The \verb|instname| parameter defines the instance to which the +comment is attached. The text of the comment is specified by the +\verb|text| parameter and is processed in LR-mode. The \verb|position| +parameter defines the horizontal position of the comment relative to +its instance. Valid values of \verb|position| are \verb|l| (left), +\verb|r| (right), or any \LaTeX{} length. Its default value +is~\verb|l|. If the value of \verb|position| is \verb|l| +(or~\verb|r|), the comment will be placed \verb|\msccommentdist| units +to the left (or right) of the \verb|instname| instance. If +\verb|position| is a \LaTeX{} length, the comment will be placed +\verb|position| units from the \verb|instname| instance. A negative +length puts the comment to the left and a positive length puts the +comment to the right of the instance. + +The following diagram shows how to use comments. In this diagram, the +distance between the frame and the instances (\verb|\envinstdist|) is +doubled in order to fit the comments inside the frame. + +\medskip +\begin{minipage}[c]{0.4\linewidth} +\setmscvalues{small} +\begin{msc}{comments} +\setlength{\envinstdist}{2\envinstdist} +\declinst{i}{}{i} +\declinst{j}{}{j} +\mess{a}{i}{j}[2] +\msccomment{start}{i} +\nextlevel[2] +\msccomment[r]{end}{j} +\nextlevel +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.54\linewidth} +{\small +\begin{verbatim} +\setlength{\envinstdist}{2\envinstdist} +\declinst{i}{}{i} +\declinst{j}{}{j} +\mess{a}{i}{j}[2] +\msccomment{start}{i} +\nextlevel[2] +\msccomment[r]{end}{j} +\nextlevel +\end{verbatim} +} +\end{minipage} + + + + +\subsection{Actions} +\label{actions} +An instance can perform an action, which is denoted by a rectangle. + +\begin{verbatim} +\action(*){name}{instance} +\end{verbatim} + +The action is attached at the current level to the \verb+instance+. +The \verb+name+ is centered inside the action symbol and is processed +in LR-mode. + +The following parameters determine the detailed drawing of the action +symbol (see Section~\ref{parameters}): +\verb+\actionwidth+ (the width of the action symbol), and +\verb+\actionheight+ (the height of the action symbol). + +The starred version of the command, \verb+\action*+, produces the same +result as \verb+\action+, except that the height and width of the +action symbol are adjusted to fit the contents of the rectangle. + +The next example shows that after an action often a multiple level +increment is needed to obtain nice pictures. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{action} +\setmscvalues{small} +%\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\declinst{j}{}{j} + +\mess{a}{j}{i} +\nextlevel +\action{doit}{i} +\nextlevel[2] +\mess{b}{i}{j} + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\small +\begin{verbatim} +\mess{a}{j}{i} +\nextlevel +\action{doit}{i} +\nextlevel[2] +\mess{b}{i}{j} +\end{verbatim} +} +\end{minipage} + + +\subsection{Timers} +\label{timers} +There are five commands to draw timer events. +\begin{verbatim} +\settimer[placement]{name}{instance} +\timeout[placement]{name}{instance} +\stoptimer[placement]{name}{instance} +\settimeout[placement]{name}{instance}[offset] +\setstoptimer[placement]{name}{instance}[offset] +\end{verbatim} + +Setting of a timer is drawn as a line connecting the \verb+instance+ +to the {\em hour glass} symbol. The \verb+name+ is put near this +symbol. A time-out is represented by an arrow from an +{\em hour glass} symbol to the \verb+instance+. Stopping a timer is +drawn as a line connecting the \verb+instance+ with the timer stop +symbol (denoted by a cross). +The command \verb+\settimeout+ is a combination of the setting of a +timer and a time out. The \verb+offset+ denotes the number of levels +between the two events. The default value for \verb+offset+ is 2. +Likewise, \verb+\setstoptimer+ is a combination +of the setting of a timer and stopping a timer. + +The optional argument \verb+placement+ can have values +\verb+l+ (meaning that the timer is drawn left of the instance axis) +and \verb+r+ (meaning that the timer is drawn right of the instance +axis). By default it is drawn at the left side of the instance. + +Several parameters can be used to control the detailed layout of timer +symbols (see Section~\ref{parameters}): +\verb+\timerwidth+ (the width of the hour glass and time out symbols), +\verb+\selfmesswidth+ (the length of the arm between the symbol +and the instance axis), and +\verb+\labeldist+ (the distance between the name and the timersymbol). +Furthermore, the size of the arrow head can be controlled with the +command \verb+\messarrowscale{size}+. + +The various timer symbols are shown in the following example. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{timers} +\setmscvalues{small} +\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} + +\settimer{T,50}{j} +\setstoptimer[r]{V}{k}[6] +\nextlevel[2] +\timeout{T}{j} +\settimeout{U}{i} +\nextlevel[2] +\settimer[r]{T,20}{j} +\nextlevel[2] +\stoptimer[r]{T}{j} + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\small +\begin{verbatim} +\settimer{T,50}{j} +\setstoptimer[r]{V}{k}[6] +\nextlevel[2] +\timeout{T}{j} +\settimeout{U}{i} +\nextlevel[2] +\settimer[r]{T,20}{j} +\nextlevel[2] +\stoptimer[r]{T}{j} +\end{verbatim} +} +\end{minipage} + +\subsection{Time measurements} +\label{measurements} +There are several commands to add time measurements to an \MSC{}. + +\begin{verbatim} +\mscmark[placement]{name}{instance} +\measure(*)[placement]{name}{instance1}{instance2}[offset] +\measurestart(*)[placement]{name}{instance}{gate} +\measureend(*)[placement]{name}{instance}{gate} +\end{verbatim} + +An absolute time stamp is attached to an event on an \verb+instance+ +with the command +\verb+mscmark+. The \verb+name+ is the text attached to the mark symbol, +which is a dashed polyline. +The position of the mark symbol relative to the marked event is +determined by the \verb+placement+. +(\verb+tl+ means top-left, \verb+tr+ means top-right, \verb+bl+ means +bottom-left, and \verb+br+ means bottom-right). + +A \verb+\measure+ connects two events from \verb+instance1+ and +\verb+instance2+. The first event is at the current level. The second +event is \verb+offset+ levels lower than the first event. The +\verb+name+ is attached to the measure symbol. The measure symbol can +be placed at the left or at the right of \verb+instance1+. This is +controlled by the optional argument \verb+placement+, which can have +values \verb+l+ and \verb+r+. + +In case the two events are far apart, the measure may be split in two +parts. The first part is drawn with the \verb+\measurestart+ command +and the second part with the \verb+\measureend+ command. The points +where these two parts should be connected are drawn by a small circle, +to which the text \verb+gate+ is attached. + +There are two equivalent forms of the measurement symbol. The first +form, where the arrow heads are at the inside of the measured +interval, is the default form. The second form, where the arrow heads +are at the outside of the measured interval, is obtained by the +commands \verb+\measure*+, \verb+\measurestart*+, and +\verb+\measureend*+. + + +Several parameters can be used to control the detailed layout of the +time measurement symbols (see Section~\ref{parameters}): +\verb+\labeldist+ (a parameter to specify the distance between the +label of a measurement and the measurement symbol), +\verb+\messarrowscale{size}+ (a command to set the size of the arrow +head), +\verb+\selfmesswidth+ (specifies the width of the measurement +symbols). + +The following example illustrates marks and measurements in an \MSC{}. In +order to include the marks inside the frame of the diagram, the +distance between the frame and the instances (called +\verb+\envinstdist+) is increased (before the instances are declared). + +\medskip + +\begin{minipage}[c]{0.5\linewidth} +\begin{msc}{Time measurements} +\setmscvalues{small} +\setlength{\envinstdist} + {2\envinstdist} + +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} + +\mess{m1}{i}{j}[1] +\mscmark{t=0.0}{i} +\measure{0.6}{i}{j}[4] +\nextlevel +\mscmark[tr]{t=0.3}{j} +\nextlevel[3] +\mess{m2}{j}{k} +\measurestart*[r]{0.2}{k}{g} +\nextlevel[6] +\mess{m3}{k}{i} +\mscmark[bl]{t=1.0}{i} +\measureend*[r]{0.2}{k}{g} +\nextlevel +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.44\linewidth} +{\small +\begin{verbatim} +\setlength{\envinstdist} + {2\envinstdist} +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} +\mess{m1}{i}{j}[1] +\mscmark{t=0.0}{i} +\measure{0.6}{i}{j}[4] +\nextlevel +\mscmark[tr]{t=0.3}{j} +\nextlevel[3] +\mess{m2}{j}{k} +\measurestart*[r]{0.2}{k}{g} +\nextlevel[6] +\mess{m3}{k}{i} +\mscmark[bl]{t=1.0}{i} +\measureend*[r]{0.2}{k}{g} +\nextlevel +\end{verbatim} +} +\end{minipage} + + +\subsection{Lost and found messages} +\label{lostfound} +A lost message is denoted by an arrow starting at an instance and +ending at a filled circle. A found message is denoted by an arrow +starting at an open circle and ending at an instance. + +The following commands are used to define lost and found messages. +\begin{verbatim} +\lost[pos]{name}[labelpos]{gate}{instance}[placement] +\found[pos]{name}[labelpos]{gate}{instance}[placement] +\end{verbatim} + +The argument \verb+instance+ determines the instance to which the +arrow is attached. The \verb+name+ of the message is put above the +message arrow. The \verb+gate+ is a text associated to the circle. +The optional arguments \verb+pos+, \verb+labelpos+, and +\verb+placement+ have the same function as in the \verb+\mess+ command +(Section~\ref{messages}). That is, \verb+pos+ controls the placement +of the lost or or found message with respect to the instance +axis. Valid values are \verb+l+ (left) and~\verb+r+ (right). The +default value is~\verb+l+. The optional parameters \verb+labelpos+ +and \verb+placement+ control the placement of \verb+name+ with respect +to the message arrow. Valid values for \verb+labelpos+ are \verb+t+ +(on top) and~\verb+b+ (below). The default value is~\verb+t+. Valid +values for \verb+placement+ are real numbers in the closed interval +$[0,1]$ and denote the relative distance of the message label +\verb+name+ to the beginning of the arrow. The default value for +\verb+placement+ is~$0.5$. + +Several parameters can be used to control the detailed layout of lost +and found messages (see Section~\ref{parameters}): +\verb+\lostsymbolradius+ (the radius of the circle), +\verb+\selfmesswidth+ (the length of the arrow), and +\verb+\labeldist+ (the distance between the name and the arrow). +Furthermore, the size of the arrow head can be controlled with the +command \verb+\messarrowscale{size}+. + +The following example shows a found and a lost message. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{lost and found} +\setmscvalues{small} +\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\declinst{j}{}{j} + +\found{m}{g}{i} +\nextlevel +\mess{p}{i}{j} +\nextlevel +\lost[r]{n}{}{j} + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\small +\begin{verbatim} +\found{m}{g}{i} +\nextlevel +\mess{p}{i}{j} +\nextlevel +\lost[r]{n}{}{j} +\end{verbatim} +} +\end{minipage} + + + +\subsection{Conditions} +\label{conditions} +A condition is denoted by a hexagon. It is used to express that the +system has entered a certain state. A condition relates to a number of +instances. All conditions which take part in the condition are covered +by the condition symbol. The other instances are drawn through the +condition symbol. +The following command is used to draw a condition. + +\begin{verbatim} +\condition{text}{instancelist} +\end{verbatim} + +The \verb+text+ is placed in the center of the condition. The +\verb+instancelist+ expresses which instances take part in the +condition. It is a list of nicknames of instances, separated by +commas. Take care not to add extra white space around the nicknames, +since this is considered part of the nickname in \LaTeX. +The order in which the instances are listed is immaterial. + +There are two parameters which control the shape of the condition +symbol (see Section~\ref{parameters}): +\verb+\conditionheight+ (the height of the condition symbol), and +\verb+\conditionoverlap+ (the width of the part of the condition +symbol which extends over the rightmost/leftmost contained instance +axis). + +The starred version of the command, \verb+\condition*+, produces the same +result as \verb+\condition+, except that the height and width of the +condition symbol are adjusted to fit the contents of the hexagon. + +The following example contains some conditions. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{conditions} +\setmscvalues{small} +\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} + +\condition{some condition}{i,k} +\nextlevel[3] +\mess{m}{i}{j} +\action{a}{k} +\nextlevel +\condition{C}{i} +\nextlevel[2] +\condition{A, B, C}{i,j,k} +\nextlevel[2] + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\small +\begin{verbatim} +\condition{some condition}{i,k} +\nextlevel[3] +\mess{m}{i}{j} +\action{a}{k} +\nextlevel +\condition{C}{i} +\nextlevel[2] +\condition{A, B, C}{i,j,k} +\nextlevel[2] +\end{verbatim} +} +\end{minipage} + +\subsection{Generalized ordering} +\label{ordering} +A generalized order is treated much like a regular message (see +Section~\ref{messages}). There +are three differences: a generalized order is drawn with a +dotted line, it has no label, and the arrow head is in the middle of +the line. A generalized order is defined with the following command. +\begin{verbatim} +\order[pos]{sender}{receiver}[leveloffset] +\end{verbatim} +The \verb+sender+ and \verb+receiver+ are the nicknames of the +instances which are connected by the generalized ordering symbol. +At the \verb+receiver+ instance, the generalized ordering symbol ends +at the current level plus the \verb+leveloffset+. The +\verb+leveloffset+ is an optional integer value, with default 0. + +In case \verb+sender+ and \verb+receiver+ denote the same instance, +the order is a \emph{self order}. The placement of the order arrow of +a self order is controlled by the optional argument \verb+pos+. It +can have values \verb+l+ (meaning that the ordering symbol is drawn +left of the instance axis) and \verb+r+ (meaning that the ordering +symbol is drawn right of the instance axis). By default it is drawn at +the left side of the instance. For non-self orders, the \verb+pos+ +argument is ignored. + +Additionally, there are two ways to control the shape +of the generalized ordering symbol (see Section~\ref{parameters}). +These are: +\verb+\selfmesswidth+ (a parameter to specify the width of the polyline used for +drawing orderings on a single instance axis). +and +\verb+\messarrowscale{size}+ (a command to set the size of the arrow +head in the ordering symbol). + +Orderings to or from the environment (i.e.\ the left or the right side +of the \MSC{} frame) can be +specified by setting the sender or the receiver argument to the value +\verb+envleft+ or \verb+envright+. + +An example of a generalized order is given in the following diagram. + + + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{generalized order} +\setmscvalues{normal} +\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\declinst{j}{}{j} + +\mess{m}{envleft}{i} +\order{i}{j}[1] +\nextlevel +\mess{k}{j}{envright} +\nextlevel +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\small +\begin{verbatim} +\mess{m}{envleft}{i} +\order{i}{j}[1] +\nextlevel +\mess{k}{j}{envright} +\end{verbatim} +} +\end{minipage} + + +\subsection{Instance regions} +\label{regions} +A part of the instance axis can be drawn in a different style. Such a +part is called an {\em instance region}. The following +regions are supported: +{\em coregion} (the instance axis is dashed, which means that the order of the +attached instances is immaterial), +{\em suspension region} (a small rectangle with dashed left and right +sides, which denotes that the instance is suspended), +{\em activation region} (a small filled rectangle, which denotes that +the instance has control). + +The following commands are used to draw an instance region. + +\begin{verbatim} +\regionstart{type}{instname} +\regionend{instname} +\end{verbatim} + +If the \verb+\regionstart+ command is used the instance axis of +\verb+instname+ is drawn in the shape determined by \verb+type+, +starting from the current level. The type can have values +\verb+coregion+, \verb+suspension+, and \verb+activation+. + +The shape of an instance region can be controlled with the following +parameters (see Section~\ref{parameters}): +\verb+\regionbarwidth+ (the width of the coregion start and end +symbol), +\verb+\instwidth+ (the width of the fat instance rectangle), +\verb+\regionwidth+ (the width of the activation and suspension rectangle). + +In the following example, several instance regions are demonstrated. +Notice the relative order of \verb|\mess|, \verb|\regionstart|, and +\verb|\regionend| commands. Interchanging lines +\verb|\regionstart{activation}{i}| and \verb|\mess{q}{j}{i}| makes the +arrow head of the~`q' message partly invisible. Also note that the +second activation region on~$i$ ends with a method reply +(which is produced by the command \cmd{mess*}). + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{regions} +\setmscvalues{small} +\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} + +\regionstart{activation}{i} +\nextlevel[3] +\regionend{i} +\mess{m}{i}{j} +\nextlevel +\regionstart{coregion}{j} +\nextlevel +\regionstart{suspension}{k} +\mess{p}{j}{k} +\nextlevel +\regionstart{activation}{i} +\mess{q}{j}{i} +\nextlevel +\regionend{j} +\nextlevel[3] +\regionend{i} +\mess*{r}{i}{j} +\nextlevel +\mess{s}{j}{k} +\regionend{k} +\nextlevel +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\scriptsize +\begin{verbatim} +\regionstart{activation}{i} +\nextlevel[3] +\regionend{i} +\mess{m}{i}{j} +\nextlevel +\regionstart{coregion}{j} +\nextlevel +\regionstart{suspension}{k} +\mess{p}{j}{k} +\nextlevel +\regionstart{activation}{i} +\mess{q}{j}{i} +\nextlevel +\regionend{j} +\nextlevel[3] +\regionend{i} +\mess*{r}{i}{j} +\nextlevel +\mess{s}{j}{k} +\regionend{k} +\nextlevel +\end{verbatim} +} +\end{minipage} + +In some situations, the gray-colored activation regions can hide +message-labels. \emph{Level back-up} can help in these situations, see +the \emph{Tricks} section in the reference manual~\cite{BM02}. + +\subsection{Instance creation and instance stop} +\label{createstop} +The \MSC{} language offers constructs for dynamic instance creation and +instance destruction. +An instance can dynamically create another instance by issuing a +create command. An instance creation is drawn as a dashed message +arrow. At the side of the arrow head, the instance head symbol for the +created instance is drawn. +An instance end symbol does not denote the end of the specified +process, but merely the end of its current description. Therefore, a +different symbol is needed which denotes that an instance stops before +the end of the \MSC{} in which it is contained. +The instance stop symbol is a cross. + +The following commands are used for instance creation and instance +stop. + +\begin{verbatim} +\dummyinst{createdinst} +\create{name} + [labelpos] + {creator} + [placement] + {createdinst} + {instancenameabove} + {instancenamewithin} +\stop{instance} +\end{verbatim} + +In order to reserve space for an instance which will be created +dynamically, the command \verb+dummyinst+ must be used. This command +is mixed with the declarations of normal instances (see the +\verb+declinst+ command, Section~\ref{instances}). +The argument \verb+createdinst+ is the nickname of the instance that +will be created later. + +An instance can be created with the \verb+\create+ command. +This command results in a dashed horizontal message arrow labeled with +\verb+name+. The arrow starts at the current level at the instance +with nickname \verb+creator+ and ends at the current level at the +instance head of the instance with nickname \verb+createdinst+. This +instance must have been declared first with the \verb+dummyinst+ +command. +The name of the created instance consists of two parts. The part +called \verb+instancenameabove+ is placed above the instance head and the +\verb+instancenamewithin+ is centered within the instance head. + +As with normal messages, placement of the message label is controlled +by the optional parameters \verb+labelpos+ and \verb+placement+. That +is, \verb+labelpos+ denotes the relative position of the message label +with respect to the message arrow. Valid values are \verb+t+ (on top) +and \verb+b+ (below). The default value is \verb+t+. The optional +parameter \verb+placement+ denotes the relative distance of the +message label with respect to the beginning of the arrow. Valid values +are real numbers in the closed interval $[0,1]$. The default value +is~$0.5$. See Figure~\ref{fig:refpoints} +(page~\pageref{fig:refpoints}) and its description in +Section~\ref{messages} for more information on the placement of +message labels. + +An instance is stopped with the \verb+\stop+ command. +The \verb+instance+ is the nickname of the stopped instance. The +instance axis is not drawn any further below the level at which the +\verb+\stop+ command is issued. Also, the instance foot symbol is not +drawn. + +The size of the stop symbol is determined by the parameter +\verb+\stopwidth+ (see Section~\ref{parameters}). +The following parameters apply to the instance head symbol: +\verb+\instheadheight+ (the height of the instance head symbol), +\verb+\instwidth+ (the width of the instance head symbol), +and +\verb+\labeldist+ (the distance between the instance head symbol and +the part of the instance name drawn above the head symbol). + +Take care not to specify any events on an instance which has not yet +been created or which has already +been stopped. This may lead to unexpected drawings. +However, it is possible to create an instance after it has stopped, +as showed in the next example. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{dynamic instances} +\setmscvalues{small} +\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\dummyinst{j} +\declinst{k}{}{k} + +\mess{p}{i}{k} +\nextlevel[3] +\create{kick}{k}{j}{}{j} +\nextlevel +\stop{k} +\nextlevel +\mess{ok}{j}{i} +\nextlevel +\stop{j} +\nextlevel[2] +\create{start}[b]{i}[.75]{k}{}{again} +\nextlevel[2] + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\small +\begin{verbatim} +\declinst{i}{}{i} +\dummyinst{j} +\declinst{k}{}{k} + +\mess{p}{i}{k} +\nextlevel[3] +\create{kick}{k}{j}{}{j} +\nextlevel +\stop{k} +\nextlevel +\mess{ok}{j}{i} +\nextlevel +\stop{j} +\nextlevel[2] +\create{start}[b]{i}[.75]{k}{}{again} +\nextlevel[2] +\end{verbatim} +} +\end{minipage} + +\subsection{\MSC{} references} +\label{references} +Within an \MSC{} a reference to other \MSC{}s can be included. Such a +reference is drawn as a rectangle with rounded corners, covering part +of the \MSC{}. The following commands are used to draw \MSC{} references. + +\begin{verbatim} +\referencestart[lo][ro]{nickname}{text}{leftinstance}{rightinstance} +\referenceend{nickname} +\end{verbatim} + +The reference symbol starts at the level where the +\verb+\referencestart+ command is used, and ends at the level where +the corresponding \verb+\referenceend+ command occurs. These commands +correspond if they have the same \verb+nickname+. The \verb+text+ is +placed in the center of the reference symbol. The reference covers all +instances from \verb+leftinstance+ to \verb+rightinstance+. The +distance between the left (right) edge of the reference symbol and the +leftmost (rightmost) covered instance axis is defined by the optional +overlap value \verb+lo+. The default value for \verb+lo+ in large/normal/small +\MSC{}s is 1.5/1/0.75 (see Section~\ref{parameters} for selecting +large, normal or small drawing mode). If the second optional value +\verb+ro+ is present too, the optional value \verb+lo+ defines the left +overlap and the optional value \verb+ro+ defines the right overlap. + +The left and right edge of the reference symbol are +\verb+nicknameleft+ and \verb+nicknameright+, where \verb+nickname+ is +the nickname of the \MSC{} reference as defined in the +\verb+\referencestart+ command. +These names can be used at every place where the nickname of an +instance is required, e.g.\ as the sender or receiver of a message. +This is shown in the following example. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{references} +\setmscvalues{small} +\setlength{\topheaddist}{0.8cm} + +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} + +\mess{a}{j}{k} +\nextlevel +\referencestart{r}{a reference}{i}{j} +\nextlevel +\mess{b}{rright}{k} +\nextlevel +\referenceend{r} +\nextlevel +\referencestart{p}{another reference}{i}{k} +\nextlevel +\mess{c}{envright}{pright} +\nextlevel[3] +\referenceend{p} + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.55\linewidth} +{\small +\begin{verbatim} +\mess{a}{j}{k} +\nextlevel +\referencestart{r}{a reference}{i}{j} +\nextlevel +\mess{b}{rright}{k} +\nextlevel +\referenceend{r} +\nextlevel +\referencestart{p}{another reference}{i}{k} +\nextlevel +\mess{c}{envright}{pright} +\nextlevel[3] +\referenceend{p} +\end{verbatim} +} +\end{minipage} + +\subsection{Inline expressions} +\label{inlines} +An inline expression is a part of an \MSC{} on which an operation is +defined. A rectangle surrounds the part of the \MSC{} containing the +operands. The operands are separated by horizontal dashed lines. +The operator is placed in the upper left corner of the inline +expression symbol. +The following commands are used to draw inline expressions. + +\begin{verbatim} +\inlinestart[lo][ro]{nickname}{operator}{leftinstance}{rightinstance} +\inlineseparator{nickname} +\inlineend(*){nickname} +\end{verbatim} + +The inline expression starts at the level where the \verb+\inlinestart+ +command occurs. The inline expression spans over the instances from +\verb+leftinstance+ to \verb+rightinstance+. The \verb+operand+ is +placed in the upper left corner of the rectangle. At every level where +a corresponding \verb+\inlineseparator+ command occurs, a dashed line +is drawn. The inline expression ends at the level where the +\verb+\inlineend+ command occurs. The \verb+nickname+ is used to match +corresponding commands. +The command \verb+\inlineend*+ does the same as the command +\verb+\inlineend+, except that the bottom line of the rectangle is +dashed. This is used to indicate that the operand is optional. + +The left and right edge of the inline expression symbol are named +\verb+nicknameleft+ and \verb+nicknameright+, where \verb+nickname+ is +the nickname of the inline expression as defined in the +\verb+\inlinestart+ command. +These names can be used at every place where the nickname of an +instance is required, e.g.\ as the sender or receiver of a message. + +The distance between the left (right) edge of the inline expression +symbol and +the leftmost (rightmost) included instance axis is defined by +the optional overlap value \verb+lo+. The default value for +large/normal/small \MSC{}s is +1.5/1/0.75 (see Section~\ref{parameters} for selecting large, normal or small +drawing mode). +If the second optional value +\verb+ro+ is present too, the optional value \verb+lo+ defines the left +overlap and the optional value \verb+ro+ defines the right overlap. +These options make it possible to easily draw nested inline expressions +as in the following example. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{inline expressions} +\setmscvalues{small} +\setlength{\topheaddist}{0.8cm} + + +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} + + +\inlinestart{exp1}{par}{i}{k} +\nextlevel +\mess{a}{k}{j} +\nextlevel +\inlinestart[0.6cm]{exp2}{alt}{i}{j} +\nextlevel[2] +\mess{b}{j}{i} +\nextlevel +\inlineseparator{exp2} +\nextlevel +\mess{c}{j}{i} +\nextlevel +\inlineend{exp2} +\nextlevel +\inlineseparator{exp1} +\nextlevel +\mess{d}{j}{k} +\nextlevel +\inlineend{exp1} +\nextlevel +\inlinestart{exp3}{opt}{i}{j} +\nextlevel +\mess{e}{envright}{exp3right} +\mess{e}{exp3right}{j} +\nextlevel +\mess{f}{j}{i} +\nextlevel +\inlineend*{exp3} + + +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\scriptsize +\begin{verbatim} +\inlinestart{exp1}{par}{i}{k} +\nextlevel +\mess{a}{k}{j} +\nextlevel +\inlinestart[0.6cm]{exp2}{alt}{i}{j} +\nextlevel[2] +\mess{b}{j}{i} +\nextlevel +\inlineseparator{exp2} +\nextlevel +\mess{c}{j}{i} +\nextlevel +\inlineend{exp2} +\nextlevel +\inlineseparator{exp1} +\nextlevel +\mess{d}{j}{k} +\nextlevel +\inlineend{exp1} +\nextlevel +\inlinestart{exp3}{opt}{i}{j} +\nextlevel +\mess{e}{envright}{exp3right} +\mess{e}{exp3right}{j} +\nextlevel +\mess{f}{j}{i} +\nextlevel +\inlineend*{exp3} +\end{verbatim} +} +\end{minipage} + +\subsection{Gates} +\label{gates} + +A gate determines a connection point for messages. + +The following command can be used to draw gates. + +\begin{verbatim} +\gate(*)[hpos][vpos]{gatename}{instname} +\end{verbatim} + +The unstarred version produces a normal (invisible) gate. The starred +version produces a visible gate (a small dot). The gate is drawn at the +current level at the instance \verb+instname+ (which can also be the +left and right edge of e.g.\ an \MSC{} reference). The +\verb+gatename+ is attached to the gate. The positioning of the +\verb+gatename+ relative to the gate is determined by the values of +\verb+hpos+ (horizontal position) and \verb+vpos+ (vertical position). +Possible values for \verb+hpos+ are \verb+l+ (left, default) and +\verb+right+ (right). Possible values for \verb+vpos+ are \verb+t+ +(top, default), \verb+c+ (center), and \verb+b+ (bottom). + +There are several parameters to control the size and shape of the +gate symbol (see Section~\ref{parameters}). These are +\verb+\gatesymbolradius+ (sets the radius of the gate symbol), +\verb+\labeldist+ (the vertical distance between the gate name and +the gate). + +The next example shows a number of gates. + +\medskip + +\begin{minipage}[c]{0.4\linewidth} +\begin{msc}{gates} +\setmscvalues{small} + +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} +\referencestart{r}{ref}{i}{j} +\nextlevel +\gate{$g$}{rright} +\mess{b}{rright}{envright} +\gate[r][c]{$h$}{envright} +\nextlevel +\nextlevel +\mess{c}{rright}{k} +\gate*[l][b]{$h'$}{rright} +\nextlevel[2] +\referenceend{r} +\end{msc} +\end{minipage} +% +\begin{minipage}[c]{0.5\linewidth} +{\footnotesize +\begin{verbatim} +\declinst{i}{}{i} +\declinst{j}{}{j} +\declinst{k}{}{k} +\referencestart{r}{ref}{i}{j} +\nextlevel +\gate{$g$}{rright} +\mess{b}{rright}{envright} +\gate[r][c]{$h$}{envright} +\nextlevel +\nextlevel +\mess{c}{rright}{k} +\gate*[l][b]{$h'$}{rright} +\nextlevel[2] +\referenceend{r} +\end{verbatim} +} +\end{minipage} + + +\subsection{High-level \MSC{}s} +\label{hmsc} +A High-level \MSC{} (\HMSC{}) is a drawing which defines the relation between +a number of \MSC{}s. It is composed of a start symbol (an upside down +triangle), a number of end symbols (represented by triangles), a +number of \MSC{} references (these are rectangles with rounded corners), +a number of conditions (hexagons) and possibly several connection +points (circles). These symbols are connected by arrows. + +The following commands can be used to draw \HMSC{}s. + +\begin{verbatim} +\begin{hmsc}[headerpos]{hmscname}(llx,lly)(urx,ury) +\end{hmsc} +\hmscstartsymbol{nickname}(x,y) +\hmscendsymbol{nickname}(x,y) +\hmscreference{nickname}{text}(x,y) +\hmsccondition{nickname}{text}(x,y) +\hmscconnection{nickname}(x,y) +\arrow{from-nickname}[coord-list]{to-nickname} +\end{verbatim} + +In order to draw \HMSC{}s, a new environment is defined, which is called +\verb+hmsc+. The command to begin this environment has several +arguments. The argument \verb+headerpos+ is optional. It controls +positioning of the header of the \HMSC{}. This argument can have values +\verb+l+ (for a left aligned header), \verb+c+ (for a centered header) +and \verb+r+ (for a right aligned header). The header of an \HMSC{} is +formed from the keyword \verb+msc+, followed by the +\verb+hmscname+. The size of the \HMSC{} frame is determined by the +coordinates of the lower-left corner, \verb+(llx,lly)+, and the +coordinates of the upper-right corner, \verb+(urx,ury)+. + +The \HMSC{} grid is not drawn, but used to control the positioning of the +\HMSC{} symbols (\verb+startsymbol+, \verb+endsymbol+, \verb+reference+, +\verb+condition+, and \verb+connection+). +The center of each symbol is drawn on the grid point +with coordinates \verb+{x,y}+. Each symbol also has a \verb+nickname+ +for later reference. + +\HMSC{} symbols can be connected by means of the \verb+arrow+ command. +This draws an arrow from the symbol with nickname \verb+from-nickname+ +to the symbol with nickname \verb+to-nickname+. The optional argument +\verb+coord-list+ can be used if the line connecting the source and +the destination should not be straight. The \verb+coord-list+ has +the following syntax: \verb+(x1,y1)(x2,y2)...(xk,yk)+. This means +that the connecting line goes through the points with coordinates +(x1,y1), (x2,y2), \ldots, (xk,yk). + +Arrows always leave the start symbol at the bottom. They enter the end symbol +at the top. +Arrows start and end either at the middle of the top or at the middle +of the bottom of a reference and condition symbol. The incoming +(outgoing) direction of the arrow determines whether it will start +(end) at the top or at the bottom. + +There are several parameters to control the size and shape of the +symbols (see Section~\ref{parameters}). These are +\verb+\hmscconditionheight+ (the height of the condition symbol), +\verb+\hmscconditionwidth+ (the width of the condition symbol, +excluding the left and right angular parts), +\verb+\hmscreferenceheight+ (the height of the reference symbol), +\verb+\hmscreferencewidth+ (the width of the reference symbol), +\verb+\messarrowscale{size}+ (a command to set the size of the arrow +head of a connection line); +\verb+setconnectiontype(type)+ (set the shape of the polyline +connection the symbols; \verb+type+ can be \verb+straight+, +\verb+rounded+, and \verb+curved+), +\verb+\startsymbolwidth+ (the width of the start and end symbol), +\verb+\topnamedist+ (sets the distance between the top of the \HMSC{} frame +and the \HMSC{} header). + +An example of an \HMSC{} is in the following diagram. Notice that the +width and height of reference symbols are changed locally (i.e., +between \verb+{+ and \verb+}+ braces) just before the big +reference~\verb+b+ is defined. + +\medskip + +\noindent +\begin{minipage}[c]{0.375\linewidth} + +\begin{hmsc}{High level}(-3,0)(3,12) +\hmscstartsymbol{s}(0,10) +\hmscreference{a}{A}(0,9) +\hmscconnection{c}(0,7.5) +{ +\setlength{\hmscreferencewidth}{2cm} +\setlength{\hmscreferenceheight}{3\baselineskip} +\hmscreference{b}{\parbox{1.9cm} + {\centering + this is a big + hmsc reference} + }(0,6) +} +\hmsccondition{t}{Again}(1,4.25) +\hmsccondition{ok}{Ok}(0,3.5) +\hmsccondition{q}{\textit{Break}}(-2,3.5) +\hmscendsymbol{e1}(-2,2) +\hmscreference{do}{Do it!}(0,2) +\hmscendsymbol{e2}(0,1) + +\arrow{s}{a} +\arrow{a}{c} +\arrow{c}{b} +\arrow{c}[(-2,7.5)]{q} +\arrow{b}{q} +\arrow{q}{e1} +\arrow{b}{ok} +\arrow{ok}{do} +\arrow{do}{e2} +\arrow{b}{t} +\arrow{t}[(1,3.5)(2.5,3.5)(2.5,7.5)]{c} +\end{hmsc} +\end{minipage}\hfill +\begin{minipage}[c]{0.6\linewidth} +{\footnotesize +\begin{verbatim} +\begin{hmsc}{High level}(-3,0)(3,12) +\hmscstartsymbol{s}(0,10) +\hmscreference{a}{A}(0,9) +\hmscconnection{c}(0,7.5) +{\setlength{\hmscreferencewidth}{2cm} + \setlength{\hmscreferenceheight} + {3\baselineskip} + \hmscreference{b}{\parbox{1.9cm} + {\centering this is a big hmsc reference} + }(0,6)} +\hmsccondition{t}{Again}(1,4.5) +\hmsccondition{ok}{Ok}(0,3.5) +\hmsccondition{q}{\textit{Break}}(-2,3.5) +\hmscendsymbol{e1}(-2,2) +\hmscreference{do}{Do it!}(0,2) +\hmscendsymbol{e2}(0,1) +\arrow{s}{a} +\arrow{a}{c} +\arrow{c}{b} +\arrow{c}[(-2,7.5)]{q} +\arrow{b}{q} +\arrow{q}{e1} +\arrow{b}{ok} +\arrow{ok}{do} +\arrow{do}{e2} +\arrow{b}{t} +\arrow{t}[(1,3.5)(2.5,3.5)(2.5,7.5)]{c} +\end{hmsc} +\end{verbatim} +} +\end{minipage} + + +\subsection{\MSC{} documents} +\label{mscdoc} +An \MSCdoc{} is a drawing which contains various declarations +of objects used in the \MSC{} description. For drawing \MSCdoc{}s +he following commands are provided. + +\begin{verbatim} +\begin{mscdoc}[headerpos]{mscdocname}{text}(llx,lly)(urx,ury) +\end{mscdoc} +\reference{text}(x,y) +\separator{y} +\end{verbatim} + +As for \MSC{} and \HMSC{}, a new environment is defined, which is named +\verb+mscdoc+. The command to begin an \MSCdoc{} has several +arguments. The argument \verb+headerpos+ is optional. It controls +positioning of the header of the \MSCdoc{}. +This argument can have values +\verb+l+ (for a left aligned header), \verb+c+ (for a centered header) +and \verb+r+ (for a right aligned header). +The header of an \MSCdoc{} is formed from the keyword \verb+mscdocument+, +followed by the \verb+mscdocname+. +The \verb+text+ is placed left-aligned below the \MSCdoc{} header. +The size of the \MSCdoc{} frame is determined by +coordinates of the lower-left corner, \verb+(llx,lly)+, and the +coordinates of the upper-right corner, \verb+(urx,ury)+. + +The \MSCdoc{} grid is not drawn, but used to control the positioning of the +\MSC{} references. +The center of such a reference is drawn on the grid point +with coordinates \verb+{x,y}+. + +The \verb+separator+ command draws a dashed horizontal line. The \MSC{} +references above the separator are the exported, while the ones below +the separator are local. + +There are several parameters to control the size and shape of the +symbols (see Section~\ref{parameters}). +\verb+\mscdocreferenceheight+ (the height of the reference symbol), +\verb+\mscdocreferencewidth+ (the width of the reference symbol), +\verb+\topnamedist+ (sets the distance between the top of the \MSCdoc{} +frame and the \MSCdoc{} header). + +An example of an \MSCdoc{} is in the following diagram. Notice that +the size of references in an \MSCdoc{} had to be changed for the last +reference. + +\medskip + + +\begin{minipage}{0.4\linewidth} +\begin{mscdoc}{My declarations}% + (0,0)(6,8) +\reference{a}(1,6) +\reference{b}(3,6) +\reference{c}(1,4) +\reference{d}(3,4) +\separator{3} +\setlength{\mscdocreferencewidth}{4.5\mscunit} +\setlength{\mscdocreferenceheight}{2\baselineskip} +\reference{% + \parbox{4\mscunit}% + {\raggedright This is a + two-line reference}} + (3,1.5) +\end{mscdoc} +\end{minipage} +% +\begin{minipage}{0.5\linewidth} +{\small +\begin{verbatim} +\begin{mscdoc}{My declarations}% + (0,0)(6,8) +\reference{a}(1,6) +\reference{b}(3,6) +\reference{c}(1,4) +\reference{d}(3,4) +\separator{3} +\setlength{\mscdocreferencewidth} + {4.5\mscunit} +\setlength{\mscdocreferenceheight} + {2\baselineskip} +\reference{% + \parbox{4\mscunit}% + {\raggedright This is a + two-line reference}} + (3,1.5) +\end{mscdoc} +\end{verbatim} +} +\end{minipage} + + + +\section{Style parameters} +\label{parameters} + +By means of a collection of parameters, the graphical appearance of +an \MSC{} can be fine tuned to the user's taste. +The general parameters +are displayed in Figure~\ref{parametersfig} on page~\pageref{parametersfig}. + +%======================== +\begin{figure}[htb] +\vspace{2ex} %Needed to get enough white space before the top label of + %the figure. + +\newcommand{\printlength}[1]{\mbox{\footnotesize\ttfamily \char`\\#1}} +\begin{center} +\setmscvalues{normal} +\begin{msc}{Lengths} +\psset{linewidth=.4pt,dotsep=1pt} +\newlength{\lta} +\newlength{\ltb} +% \topnamedist +\psline[linestyle=dotted](1.5cm,-\topnamedist)(2.5cm,-\topnamedist) +\psline[arrowscale=1.3]{->}(2.5cm,.2cm)(2.5cm,0cm) +\setlength{\lta}{\topnamedist+.2cm} +\psline[arrowscale=1.3]{->}(2.5cm,-\lta)(2.5cm,-\topnamedist) +\rput[tl](2.5cm,.4cm){\printlength{topnamedist}} + +% \leftnamedist +\setlength{\lta}{\leftnamedist+10pt} +\setlength{\ltb}{\topnamedist} +\psline[linestyle=dotted,arrowscale=1.0]{->}(-10pt,-\ltb)(0,-\ltb) +\psline[linestyle=dotted,arrowscale=1.0]{->}(\lta,-\ltb)(\leftnamedist,-\ltb) +\psline[linestyle=dotted](\leftnamedist,10pt)(\leftnamedist,-\baselineskip) +\rput[br](-10pt,-\ltb){\printlength{leftnamedist}} + +% \topheaddist +\setlength{\lta}{\envinstdist+\instdist-.5\instwidth} +\psline[arrowscale=1.3,linestyle=dotted]{<->}(\lta,0cm)(\lta,-\topheaddist) +\rput[l](\lta,-.5\topheaddist){ \printlength{topheaddist}} + +% \bottomfootdist +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\lastlevelheight+\instfootheight+\levelheight*12} +\setlength{\lta}{\envinstdist+2\instdist-.5\instwidth} +\rput[tl](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(0,-\bottomfootdist)} +\setlength{\ltb}{\ltb+.5\bottomfootdist} +\rput[l](\lta,-\ltb){\printlength{bottomfootdist}} + +% \instheadheight +\setlength{\lta}{\envinstdist+2\instdist+.5\instwidth+.2cm} +\setlength{\ltb}{\topheaddist} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(0,-\instheadheight)} +\setlength{\ltb}{\ltb+.5\instheadheight} +\rput[l](\lta,-\ltb){\printlength{instheadheight}} + +% \firstlevelheight +\setlength{\lta}{\envinstdist+\instdist+.2cm} +\setlength{\ltb}{\topheaddist+\instheadheight} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,-\firstlevelheight)} +\setlength{\ltb}{\ltb+.5\firstlevelheight} +\rput[l](\lta,-\ltb){\printlength{firstlevelheight}} + +% \levelheight +\setlength{\lta}{\envinstdist+\instdist+.2cm} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(0,-\levelheight)} +\setlength{\ltb}{\ltb+.5\levelheight} +\rput[l](\lta,-\ltb){\printlength{levelheight}} + +% \actionheight +\setlength{\lta}{\envinstdist+2\instdist+0.5\actionwidth+.2cm} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*7} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(0,-\actionheight)} +\setlength{\ltb}{\ltb+.7\actionheight} +\rput[bl](\lta,-\ltb){\printlength{actionheight}} + +% \actionwidth +\setlength{\lta}{\envinstdist+2\instdist-0.5\actionwidth} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*7-.2cm} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\actionwidth,0)} +\setlength{\lta}{\lta+.5\actionwidth} +\setlength{\ltb}{\ltb-.1cm} +\rput[bl](\lta,-\ltb){\rule{0pt}{2ex}\printlength{actionwidth}} + +% \conditionheight +\setlength{\lta}{\envinstdist+2\instdist+\conditionoverlap+0.8\conditionheight} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*10} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(0,-\conditionheight)} +\setlength{\ltb}{\ltb+.7\conditionheight} +\rput[bl](\lta,-\ltb){\printlength{conditionheight}} + +% \inlineoverlap +\setlength{\lta}{\envinstdist} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*5-.2cm} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\inlineoverlap,0)} +%\setlength{\lta}{\lta+\inlineoverlap} +\setlength{\ltb}{\ltb-.1cm} +\rput[bl](\lta,-\ltb){\rule{0pt}{2ex}\printlength{inlineoverlap}} + +% \referenceoverlap +\setlength{\lta}{\envinstdist} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*7-.2cm} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\referenceoverlap,0)} +%\setlength{\lta}{\lta+\referenceoverlap} +\setlength{\ltb}{\ltb-.1cm} +\rput[bl](\lta,-\ltb){\rule{0pt}{2ex}\printlength{referenceoverlap}} + +% \conditionoverlap +\setlength{\lta}{\envinstdist+2\instdist} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*10-.2cm} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\conditionoverlap,0)} +%\setlength{\lta}{\lta+\conditionoverlap} +\setlength{\ltb}{\ltb-.1cm} +\rput[bl](\lta,-\ltb){\rule{0pt}{2ex}\printlength{conditionoverlap}} + +% \lastlevelheight +\setlength{\lta}{\envinstdist+2\instdist+.2cm} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*12} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(0,-\lastlevelheight)} +%\setlength{\ltb}{\ltb+.5\lastlevelheight} +\rput[bl](\lta,-\ltb){\printlength{lastlevelheight}} + +% \instfootheight +\setlength{\lta}{\envinstdist+2\instdist+.5\instwidth+.1cm} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*12+\lastlevelheight} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3]{->}(0,.3cm)(0,0)} +\setlength{\ltb}{\ltb+\instfootheight} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3]{->}(0,-.3cm)(0,0)} +\rput[tl](\lta,-\ltb){ \printlength{instfootheight}} + +% \selfmesswidth +\setlength{\lta}{\envinstdist-\selfmesswidth} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*2-.2cm} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\selfmesswidth,0)} +%\setlength{\lta}{\lta+\selfmesswidth} +\rput[r](\lta,-\ltb){\printlength{selfmesswidth}} + +% \regionbarwidth +\setlength{\lta}{\envinstdist+2\instdist-.5\regionbarwidth} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*2-.2cm} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\regionbarwidth,0)} +\setlength{\lta}{\lta+\regionbarwidth} +\rput[l](\lta,-\ltb){\printlength{regionbarwidth}} + +% \instwidth +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\lastlevelheight+\instfootheight+\levelheight*12+.2cm} +\setlength{\lta}{\envinstdist-0.5\instwidth} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\instwidth,0)} +\rput[tl](\lta,-\ltb){\rule{0pt}{2ex}\printlength{instwidth}} + +% \instdist +\setlength{\lta}{\envinstdist} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+2.5\levelheight} +\rput[l](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\instdist,0)} +\setlength{\lta}{\lta+.5\instdist} +\setlength{\ltb}{\ltb-.1cm} +\rput[b](\lta,-\ltb){\printlength{instdist}} + +% \envinstwidth +\setlength{\lta}{0cm} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+.5\levelheight} +\rput[l](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\envinstdist,0)} +\rput[tl](\lta,-\ltb){ \printlength{envinstdist}} + + +% \labeldist +\setlength{\lta}{\envinstdist-.5\instwidth} +\setlength{\ltb}{\topheaddist-\labeldist} +\rput[l](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted](-.2cm,0)(.5cm,0)} +\rput[b](\lta,-\ltb){\psline[arrowscale=1.3]{->}(-.1cm,.3cm)(-.1cm,0)} +\setlength{\ltb}{\topheaddist} +\rput[l](\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted](-.2cm,0)(.5cm,0)} +\rput[b](\lta,-\ltb){\psline[arrowscale=1.3]{->}(-.1cm,-.3cm)(-.1cm,0)} +\rput[tr](\lta,-\ltb){\printlength{labeldist} } + +% \timerwidth +\setlength{\lta}{\envinstdist-\selfmesswidth-0.5\timerwidth} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*4+.4cm} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\timerwidth,0)} +%\setlength{\lta}{\lta+\selfmesswidth} +\rput[r](\lta,-\ltb){\printlength{timerwidth}} + +% \stopwidth +\setlength{\lta}{\envinstdist+\instdist-0.5\stopwidth} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*4+0.5\stopwidth+.1cm} +\rput(\lta,-\ltb){\psline[arrowscale=1.3,linestyle=dotted]{<->}(0,0)(\stopwidth,0)} +\setlength{\lta}{\lta+\stopwidth} +\rput[l](\lta,-\ltb){\printlength{stopwidth}} + +% \lostsymbolradius +\setlength{\lta}{\envinstdist+2\instdist+\selfmesswidth+2\lostsymbolradius+0.1cm} +\setlength{\ltb}{\topheaddist+\instheadheight+\firstlevelheight+\levelheight*4} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3]{->}(0,.3cm)(0,0)} +\setlength{\ltb}{\ltb+\lostsymbolradius} +\rput[t](\lta,-\ltb){\psline[arrowscale=1.3]{->}(0,-.3cm)(0,0)} +\rput[tl](\lta,-\ltb){ \printlength{lostsymbolradius}} + +\psset{linewidth=.8pt,dotsep=3pt} + +\declinst{m1}{aname}{iname} +\declinst{st}{}{} +\declinst{m2}{}{} + +\mess{msg1}{m1}{st} +\nextlevel +\mess{msg2}{m1}{st} +\nextlevel +\mess{self}{m1}{m1} +\coregionstart{m2} +\nextlevel +\coregionend{m2} +\nextlevel +\lost[r]{x}{}{m2} +\stop{st} +\settimer{T}{m1} +\nextlevel +\inlinestart{alt}{alt}{m1}{m1} +\nextlevel[2] +\inlineend{alt} +\action{a}{m2} +\nextlevel +\referencestart{ref}{reference}{m1}{m1} +\nextlevel +\referenceend{ref} +\nextlevel +\condition{cond1}{m1,m2} +\nextlevel +\nextlevel +\mess{msg3}{m2}{m1} +\end{msc} +\end{center} + + +\caption{User controllable parameters} +\label{parametersfig} +\end{figure} + +The value of a parameter can be changed using standard +\LaTeX\ commands, e.g. +\begin{verbatim} +\setlength{\levelheight}{1cm} +\end{verbatim} + +The following list describes all parameters. +The default values for drawing \MSC{}s at large, normal and small size are +included. See the command \verb+\setmscvalues{size}+ below for +restoring the parameters to their original values. + +%======================== +\begin{defs} + +\item[\cmd{actionheight}] +Height of action symbols.\\ +(\lnsvalue{0.75}{0.6}{0.5} cm.) + +\item[\cmd{actionwidth}] +Width of action symbol.\\ +(\lnsvalue{1.25}{1.25}{1.2} cm.) + +\item[\cmd{bottomfootdist}] +Distance between bottom of foot symbol and frame.\\ +(\lnsvalue{1.0}{0.7}{0.5} cm.) + +\item[\cmd{commentdist}] +Distance between a comment and its instance.\\ +(\lnsvalue{0.5}{0.5}{0.5} cm.) + +\item[\cmd{conditionheight}] +Height of condition symbols.\\ +(\lnsvalue{0.75}{0.6}{0.5} cm.) + +\item[\cmd{conditionoverlap}] +Overlap of condition symbol.\\ +(\lnsvalue{0.6}{0.5}{0.4} cm.) + +\item[\cmd{envinstdist}] +Distance between environments and nearest instance line.\\ +(\lnsvalue{2.5}{2.0}{1.2} cm.) + +\item[\cmd{firstlevelheight}] Height of level just below head +symbols. Should not be changed inside the \MSC{} environment.\\ +(\lnsvalue{0.75}{0.6}{0.4} cm.) + +\item[\cmd{hmscconditionheight}] +Height of \HMSC{} condition symbol.\\ +(\lnsvalue{0.375}{0.3}{0.25} cm.) + +\item[\cmd{hmscconditionwidth}] +Width of \HMSC{} condition symbol.\\ +(\lnsvalue{1.0}{0.8}{0.7} cm.) + +\item[\cmd{hmscconnectionradius}] +Radius of \HMSC{} connection symbol.\\ +(\lnsvalue{0.06}{0.05}{0.04} cm.) + +\item[\cmd{hmscreferenceheight}] +Height of \HMSC{} reference symbol.\\ +(\lnsvalue{0.375}{0.3}{0.25} cm.) + +\item[\cmd{hmscreferencewidth}] +Width of \HMSC{} reference symbol.\\ +(\lnsvalue{1.0}{0.8}{0.7} cm.) + +\item[\cmd{hmscstartsymbolwidth}] +Width of \HMSC{} start symbol.\\ +(\lnsvalue{0.75}{0.6}{0.3} cm.) + +\item[\cmd{inlineoverlap}] +Overlap of inline symbol.\\ +(\lnsvalue{1.5}{1.0}{0.75} cm.) + +\item[\cmd{instbarwidth}] +Default width of vertical instance bars (applies to fat instances only).\\ +(\lnsvalue{0.0}{0.0}{0.0} cm.) + +\item[\cmd{instdist}] +Distance between instance axes.\\ +(\lnsvalue{3.0}{2.2}{1.5} cm.) + +\item[\cmd{instfootheight}] Height of foot symbols. Should not be +changed inside the \MSC{} environment.\\ +(\lnsvalue{0.25}{0.2}{0.15} cm.) + +\item[\cmd{instheadheight}] Height of head symbols. Should not be +changed inside the \MSC{} environment.\\ +(\lnsvalue{0.6}{0.55}{0.5} cm.) + +\item[\cmd{instwidth}] +Width of header and foot symbols.\\ +(\lnsvalue{1.75}{1.6}{1.2} cm.) + +\item[\cmd{labeldist}] +Distance between labels and the symbols to which they belong (for instance, message labels and arrows).\\ +(\lnsvalue{1.0}{1.0}{1.0} ex.) + +\item[\cmd{lastlevelheight}] Height of level just above foot +symbols. Should not be changed inside the \MSC{} environment.\\ +(\lnsvalue{0.5}{0.4}{0.3} cm.) + +\item[\cmd{leftnamedist}] Distance between left of the frame and +(left of) \MSC, \HMSC, or \MSCdoc{} title.\\ +(\lnsvalue{0.3}{0.2}{0.1} cm.) + +\item[\cmd{levelheight}] +Height of a level.\\ +(\lnsvalue{0.75}{0.5}{0.4} cm.) + +\item[\cmd{lostsymbolradius}] +Radius of the lost and found symbols.\\ +(\lnsvalue{0.15}{0.12}{0.08} cm.) + +\item[\cmd{markdist}] +Horizontal distance from a mark to its instance.\\ +(\lnsvalue{1.0}{1.0}{1.0} cm.) + +\item[\cmd{measuredist}] +Horizontal distance from a measure to its (closest) instance.\\ +(\lnsvalue{1.0}{1.0}{1.0} cm.) + +\item[\cmd{measuresymbolwidth}] +Width of a measure symbol.\\ +(\lnsvalue{0.75}{0.6}{0.4} cm.) + +\item[\cmd{mscdocreferenceheight}] +Height of reference symbol in an \MSCdoc.\\ +(\lnsvalue{0.375}{0.3}{0.25} cm.) + +\item[\cmd{mscdocreferencewidth}] +Width of reference symbol in an \MSCdoc.\\ +(\lnsvalue{1.0}{0.8}{0.7} cm.) + +\item[\cmd{referenceoverlap}] +Overlap of reference symbol.\\ +(\lnsvalue{1.5}{1.0}{0.75} cm.) + +\item[\cmd{regionbarwidth}] +Width of region bars.\\ +(\lnsvalue{0.5}{0.4}{0.2} cm.) + +\item[\cmd{selfmesswidth}] +Length of horizontal arms of self messages.\\ +(\lnsvalue{0.75}{0.6}{0.4} cm.) + +\item[\cmd{stopwidth}] +Width of the stop symbol.\\ +(\lnsvalue{0.6}{0.5}{0.3} cm.) + +\item[\cmd{timerwidth}] +Width of the \emph{timer} symbols.\\ +(\lnsvalue{0.4}{0.3}{0.2} cm.) + +\item[\cmd{topheaddist}] +Distance between top of head symbols and frame.\\ +(\lnsvalue{1.5}{1.3}{1.2} cm.) + +\item[\cmd{topnamedist}] Distance between top of the frame and +(top of) \MSC, \HMSC, or \MSCdoc{} title.\\ +(\lnsvalue{0.3}{0.2}{0.2} cm.) + +\end{defs} + +In addition there are several commands which allow the user to adjust +the \MSC{} drawing to his own taste. + +\begin{defs} + +\item[\cmd{messarrowscale}\{\emph{scalefactor}\}] Sets the scale +factor (a positive real number) of message arrow +heads. (\lnsvalue{2}{1.5}{1.2}) + +\item[\cmd{setmscscale}\{\emph{scalefactor}\}] Sets the scale factor +of the \MSC{} environment to \emph{scalefactor}. the scale factor is +supposed to be a real number. Scaling is done when the \MSC{} +environment ends (\verb|\end{msc}|). The default of \emph{scalefactor} +is~1. A more consistent way for +varying the size of the \MSC{} can be obtained by using the +\verb+\setmesvalues+ command as described below. +(default value 1.) + +\item[\cmd{psset}\{\texttt{linewidth=D}\}] This command sets the width +of all lines in \MSC{}s, \HMSC{}s, and \MSCdoc{}s to length \verb+D+. If +this command is issued outside the msc environment, then the value is +set for the complete document. If it is used directly after the start +of the msc environment it only holds for this \MSC{}.\\ +(large/normal/small value 0.8/0.7/0.6 pt.) + +\item[\cmd{setfootcolor}\{\emph{color}\}] Sets the color of the foot +symbols of \MSC{} instances. Possible values are \emph{black}, +\emph{white}, \emph{gray}, or \emph{lightgray}. For more color values, +see the documentation of the \LaTeXe{} \textsf{color} package. + +\end{defs} + +The following command can be used to set the above mentioned +style parameters to suitable values. + +\begin{defs} +\item[\cmd{setmscvalues}\{\emph{size}\}] Sets all parameters of the \mscpack{} to + predefined values. Valid values for \emph{size} are: +\verb|small|, \verb|normal|, and \verb|large|. +(The default value of \verb+size+ is \verb+normal+. +This can be used for drawings with at maximum six instances on a +sheet of A4 paper. +For sizes \verb+large+ and \verb+small+, a maximum of four and nine +instances respectively fit on a sheet of A4 paper.) +\end{defs} + +Caution has to be taken when changing the value of a parameter within +the \MSC{} definition. The following parameters can be changed within an +\MSC{} definition without unexpected side effects: + +\begin{flushleft} +\verb+\actionheight+, +\verb+\actionwidth+, +\verb+\bottomfootdist+, +\verb+\conditionheight+, +\verb+\conditionoverlap+, +\verb+\inlineoverlap+, +\verb+\instfootheight+, +\verb+\instwidth+ (however, this may cause different sizes of +corresponding instance header and footer symbols), +\verb+\labeldist+, +\verb+\lastlevelheight+, +\verb+\levelheight+, +\verb+\lostsymbolradius+, +\verb+\referenceoverlap+, +\verb+\regionbarwidth+, +\verb+\selfmesswidth+, +\verb+\stopwidth+, +\verb+\timerwidth+, and +\verb+\topnamedist+. +\end{flushleft} + + +In addition to the parameters specific to the \mscpack, +standard \LaTeX\ commands can be used to change the type style and +other details. +For example, if the command \verb+\sffamily+ is included directly after +the start of the msc environment, the text in the \MSC{} +is drawn using a {\sf sans serif} font. Likewise, the text size can be +changed by inserting, e.g., the command \verb+\small+. +The \verb+\raisebox+ and \verb+\parbox+ commands +can also be used to position and format names. + + +\section{Example} +\label{example} +Figure~\ref{ex} on page~\pageref{ex} shows the \MSC{} defined in the +following \LaTeX\ fragment. + +{\small +\begin{verbatim} +\begin{msc}{Example} +\declinst{usr}{The user}{User} +\declinst{m1}{Control}{M1} +\dummyinst{m2} +\declinst{m3}{Another Machine}{M3} + +\create{start}{m1}{m2}{Processing}{M2} +\mess{msg 0}{envleft}{usr} +\mess{msg 1}{envright}{m2}[1] +\nextlevel + +\mess{msg 2}{usr}{m1} +\order{m1}{m2}[4] +\action{a}{m3} + +\nextlevel +\found{msg x}{}{usr} +\nextlevel + +\mess{msg 3}{usr}{m2}[-1] +\coregionstart{m1} +\settimeout{S}{m3}[2] +\nextlevel + + +\mess{msg 4}{m1}{usr} +\coregionstart{m2} +\settimer[r]{T}{m3} +\nextlevel + +\mess[r]{msg 5}{m2}{m2}[3] +\mess{msg 6}{usr}{usr}[2] +\nextlevel + +\mess{msg 7}{m2}{usr} +\timeout[r]{T}{m3} +\nextlevel + +\coregionend{m2} +\nextlevel + +\coregionend{m1} +\stoptimer[r]{T'}{m3} +\nextlevel + +\lost[r]{msg y}{Mach 1}{usr} +\mess{msg 8}{m1}{envright} +\nextlevel + +\condition{condition 1}{usr,m2} +\setstoptimer[r]{U}{m3} +\nextlevel[2] +\stop{usr} + +\end{msc} +\end{verbatim} +} + +\begin{figure}[htb] +\begin{center} +\begin{msc}{Example} +\declinst{usr}{The user}{User} +\declinst{m1}{Control}{M1} +\dummyinst{m2} +\declinst{m3}{Another Machine}{M3} + +\create{start}{m1}{m2}{Processing}{M2} +\mess{msg 0}{envleft}{usr} +\mess{msg 1}{envright}{m2}[1] +\nextlevel + +\mess{msg 2}{usr}{m1} +\order{m1}{m2}[4] +\action{a}{m3} + +\nextlevel +\found{msg x}{}{usr} +\nextlevel + +\mess{msg 3}{usr}{m2}[-1] +\coregionstart{m1} +\settimeout{S}{m3}[2] +\nextlevel + + +\mess{msg 4}{m1}{usr} +\coregionstart{m2} +\settimer[r]{T}{m3} +\nextlevel + +\mess[r]{msg 5}{m2}{m2}[3] +\mess{msg 6}{usr}{usr}[2] +\nextlevel + +\mess{msg 7}{m2}{usr} +\timeout[r]{T}{m3} +\nextlevel + +\coregionend{m2} +\nextlevel + +\coregionend{m1} +\stoptimer[r]{T'}{m3} +\nextlevel + +\lost[r]{msg y}{Mach 1}{usr} +\mess{msg 8}{m1}{envright} +\nextlevel + +\condition{condition 1}{usr,m2} +\setstoptimer[r]{U}{m3} +\nextlevel[2] +\stop{usr} + +\end{msc} + +\caption{A menagerie of \MSC{} symbols} +\label{ex} +\end{center} +\end{figure} + + +\section{Acknowledgments} +Thanks are due to the following people for providing us with useful +input: Peter Peters, Michel Reniers. + +\bibliographystyle{plain} +\bibliography{biblio} + +\end{document} diff --git a/macros/latex/contrib/msc/msc.sty b/macros/latex/contrib/msc/msc.sty new file mode 100644 index 0000000000..944e133ed9 --- /dev/null +++ b/macros/latex/contrib/msc/msc.sty @@ -0,0 +1,3159 @@ +%% MSC Macro Package +%% msc.sty +%% June 2, 2008 +%% +%% Copyright 2008 V. Bos, T. van Deursen, and S. Mauw +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is T. van Deursen. +% +% This program consists of the files +% msc.sty +% manual.tex +% manual.pdf +% refman.tex +% refman.pdf +% biblio.bib +% maintenance.tex +% maintenance.pdf +% README +% COPYRIGHT +% + +% Contact address: +% Ton van Deursen +% Universit\'e du Luxembourg +% Facult\'e des Sciences, de la Technologie et de la Communication +% 6, rue Richard Coudenhove-Kalergi +% L-1359 Luxembourg +% Email: ton.vandeursen@uni.lu +% Updates via: http://satoss.uni.lu/mscpackage/ +% + +\def\mscdate{2008/06/02}% update this whenever this file changes +\def\mscversion{1.16}% update this whenever a new version is ready +\NeedsTeXFormat{LaTeX2e}% +\ProvidesPackage{msc}[\mscdate, v\mscversion] +\typeout{msc version \mscversion. (\mscdate)} +\RequirePackage{color,pstricks,calc,ifthen} +% +% mscunit: the unit of msc lengths +\def\mscunit{cm}% +\def\setmscunit#1{\gdef\mscunit{#1}} +% +% +% +% msc lengths +% First the customizable lengths: + +\newlength{\actionheight}% height of action symbols +\newlength{\actionwidth}% width of action symbol +\newlength{\bottomfootdist}% distance between bottom of foot symbol and frame +\newlength{\msccommentdist}% distance of comment to its instance +\newlength{\conditionheight}% height of condition symbols +\newlength{\conditionoverlap}% overlap of condition symbol +\newlength{\envinstdist}% distance between environments and nearest instance line +\newlength{\firstlevelheight}% height of level just below head symbols +\newlength{\hmscconditionheight}% height of hmsc condition symbol +\newlength{\hmscconditionwidth}% width of hmsc condition symbol +\newlength{\hmscconnectionradius}% radius of hmsc connection symbols +\newlength{\hmscreferenceheight}% height of hmsc reference symbol +\newlength{\hmscreferencewidth}% width of hmsc reference symbol +\newlength{\hmscstartsymbolwidth}% width of hmsc start symbol +\newlength{\inlineoverlap}% overlap of inline symbol +\newlength{\instbarwidth}% default width of vertical instance bars +\newlength{\instdist}% distance between (vertical) instance lines +\newlength{\instfootheight}% height of foot symbols +\newlength{\instheadheight}% height of head symbols +\newlength{\instwidth}% width of header and foot symbols +\newlength{\labeldist}% distance between labels and message lines or head symbol boxes +\newlength{\lastlevelheight}% height of level just above foot symbols +\newlength{\leftnamedist}% distance between left of frame and (top of) msc title +\newlength{\levelheight}% height of a level +\newlength{\lostsymbolradius}% radius of the lost and found symbols +\newlength{\markdist}% distance between mark and its instance +\newlength{\measuredist}% user definable length for horizontal measure distance +\newlength{\measuresymbolwidth}% width of measure symbols +\newlength{\mscdocreferenceheight}% minimal height of mscdoc reference +\newlength{\mscdocreferencewidth}% minimal width of mscdoc reference +\newlength{\referenceoverlap}% overlap of reference symbol +\newlength{\regionbarwidth}% width of region bars +\newlength{\selfmesswidth}% length of horizontal arms of self messages +\newlength{\stopwidth}% width of the stop symbol +\newlength{\timerwidth}% width of the timer symbols +\newlength{\topheaddist}% distance between top of head symbols and frame +\newlength{\topnamedist}% distance between top of frame and (top of) msc title + +% +% Now the internal lengths +\newlength{\tmp@X} +\newlength{\tmp@Y} +\newlength{\tmp@Xa} +\newlength{\tmp@Ya} +\newlength{\tmp@Xb} +\newlength{\tmp@Yb} +\newlength{\tmp@Xc} +\newlength{\tmp@Yc} +\newlength{\tmp@Xd} +\newlength{\tmp@Yd} +\newlength{\msc@currentheight} +\newlength{\msc@currentwidth} +\newlength{\msc@totalwidth} +\newlength{\msc@totalheight} +\newlength{\msc@commentdist}% distance of comment to its instance +% +% +\newcommand{\msc@incrcounter}[1]{\addtocounter{#1}{1}}% +% +% internal box +\newsavebox{\tmp@box} +% +% some internal offsets +\def\msc@leveloffset{0}% +\def\mscscalefactor{1}% +\newcommand{\setmscscale}[1]{\def\mscscalefactor{#1}}% +% +% Command to change the footer color (legal values are black, gray, +% lightgray, and white) +\def\setfootcolor#1{\def\msc@footcolor{#1}} +% +% And some internal counters +\newcounter{mscinstcnt} +\newcounter{tmpcnt} +% +% \messlabelpos defines the position of message labels. +% The default value is "l" (left) other value(s) are "r" (right) +\def\timerpos{l} +% +% \msc@timerpos is the internal variant of \timerpos +% This internal variant is used by the actual drawing commands for self messages +\def\msc@timerpos{l} +% +% \msc@settimerpos sets the internal \mes@timerpos +\def\msc@settimerpos#1{ + \ifthenelse{\not\(\equal{#1}{l} \or \equal{#1}{r}\)}{% + \msc@unknowntimerposerr{#1}}{% else + \def\msc@timerpos{#1}% + }% +} +% +% \dummyinst{#1} (\dummyinst*{#1}) declares a dummy msc-instance and does not +% draws its head symbol nor its instance axis until an instance create/start is +% encountered. The starred version declares a fat instance. +% #1: nickname that can be used in \mess -like commands +% +\def\dummyinst{\@ifstar{\msc@dummyinststar}{\msc@dummyinstnostar}} +\def\msc@dummyinstnostar#1{% + \msc@makedummyinst{\the\instbarwidth}{#1}% +} +\def\msc@dummyinststar#1{% + \msc@makedummyinst{\the\instwidth}{#1}% +} +\def\msc@makedummyinst#1#2{% + \@ifundefined{mscinst#2}{% + \ifthenelse{\value{mscinstcnt}=2}{% Aha: this is the first msc instance, so, add the + \addtolength{\msc@currentwidth}{\envinstdist}% left \envinstdist to \msc@currentwidth + }{%not the first instance , so add the instdist to the \mec@currentwidth + \addtolength{\msc@currentwidth}{\instdist}% + }% and update x-pos of right environment + \setlength{\tmp@X}{\msc@currentwidth+\envinstdist}% + \msc@setinstxpos{envright}{\the\tmp@X}% + % make an instance with empty inside name and empty above name: + \msc@declinst{#2}{\relax}{\relax}{#1}% + % make y-pos undefined, to make sure that no instance line will be drawn + \msc@setinstypos{#2}{undefined}% --added sm + }{% else: nickname #2 already defined! + \msc@nicknamedefinederr{#2}% + }% +} +% +% \declinst[*] declares a new msc-instance and draws its head symbol +% the starred versions makes a fat instance. +% #1: nickname that can be used in \mess +% #2: name of the instance (above instance head symbol) +% #3: name of the instance (inside instance head symbol) +% +% +\def\declinst{\@ifstar{\msc@declinststar}{\msc@declinstnostar}} +% +% Some commands are defined as well (INSTNR is the arabic +% representation of the instance number): +% \instabname#1: `above name' of instance with nickname #1 +% \instinname#1: `inside name' of instance with nickname #1 +% \instnicknameINSTNR: returns the nickname of instance INSTNR +% \instxposINSTNR: returns the x-position of instance with nickname #1 +% \instyposINSTNR: returns the last y-position of instance with nickname #1 +% \instlinestyle#1: the line style (dashed or solid) of instance with nickname #1 +\def\msc@declinstnostar#1#2#3{% user command to declare instances + \msc@dummyinstnostar{#1}% + %\inststart{#1}{#2}{#3}% + % define above name and inside name + \expandafter\def\csname instabname#1\endcsname{#2}% `above name' + \expandafter\def\csname instinname#1\endcsname{#3}% `inside name' + % draw the instance header symbol + \msc@drawinstanceheadsymbol{#1}{\the\topheaddist}% + % redefine the instance's y position + \setlength{\tmp@Y}{\topheaddist+\instheadheight}% + \msc@setinstypos{#1}{\the\tmp@Y}% +} +% +\def\msc@declinststar#1#2#3{% user command to declare instances + \msc@dummyinststar{#1}% + % define above name and inside name + \expandafter\def\csname instabname#1\endcsname{#2}% `above name' + \expandafter\def\csname instinname#1\endcsname{#3}% `inside name' + % draw the instance header symbol + \msc@drawinstanceheadsymbol{#1}{\the\topheaddist}% + % redefine the instance's y position + \setlength{\tmp@Y}{\topheaddist+\instheadheight}% + \msc@setinstypos{#1}{\the\tmp@Y}% +} +% +% \msc@declinst: internal command to declare instances. +% Some commands are defined as well (INSTNR is the arabic +% representation of the instance number): +% \instabnameINSTNR: returns the instance above name of #1 +% \instnicknameINSTNR: returns the nickname of instance #1 +% \instxposINSTNR: returns the x-position of instance with nickname #1 +% \instyposINSTNR: returns the last y-position of instance with nickname #1 +% \instlinestyle#1: the line style (dashed or solid) of instance with nickname #1 +% \instregionstyle#1: the region style (normal, coregion, suspension, or activation) +\def\msc@declinst#1#2#3#4{% internal command to declare instances + \@ifundefined{mscinst#1}{% + \@namedef{mscinst#1}{\relax}% + \expandafter\def\csname instabname#1\endcsname{#2}% `above name' + \expandafter\def\csname instinname#1\endcsname{#3}% `inside name' + \expandafter\def\csname instbarwidth#1\endcsname{#4}% width of the vertical instance bar + % the x position of an instance, \instxpos#1, is stored as a string, not as + % a TeX-length, since that would use up too much of TeX limited number of + % length-registers. + % However, this means we first have to calculate the x-pos, and then + % assign the string representation of the result to \instxpos#1: + \setlength{\tmp@X}{\msc@currentwidth}% + \expandafter\edef\csname instxpos#1\endcsname{\the\tmp@X}% + \ifthenelse{\lengthtest{\instbarwidth < #4}}% + {% + \expandafter\def\csname instisfat#1\endcsname{true}% + \setlength{\tmp@Xa}{#4}% + \addtolength{\tmp@X}{-.5\tmp@Xa}% + \expandafter\edef\csname instlxpos#1\endcsname{\the\tmp@X}% + \addtolength{\tmp@X}{\tmp@Xa}% + \expandafter\edef\csname instrxpos#1\endcsname{\the\tmp@X}% + }% + {% + \expandafter\def\csname instisfat#1\endcsname{false}% + \expandafter\edef\csname instlxpos#1\endcsname{\the\tmp@X}% + \expandafter\edef\csname instrxpos#1\endcsname{\the\tmp@X}% + }% + \expandafter\def\csname instnickname\arabic{mscinstcnt}\endcsname{#1}% + \setlength{\tmp@Y}{\msc@currentheight}% + \expandafter\edef\csname instypos#1\endcsname{\the\tmp@Y}% + \expandafter\def\csname instlinestyle#1\endcsname{solid}% + \expandafter\def\csname instfootcolor#1\endcsname{\msc@footcolor}% + \expandafter\def\csname instregionstyle#1\endcsname{normal}% + \msc@incrcounter{mscinstcnt}% + }{% else, #1 already defined + \msc@nicknamedefinederr{#1}% + }% +} +% +% \msc@instnickname gets the nickname of msc instance with number #1 +% (This macro is used in \msc@drawinstancelevels) +\def\msc@instnickname#1{% + \csname instnickname\arabic{#1}\endcsname% +} +% \msc@instabname gets the above name of instance #1 +\def\msc@instabname#1{% + \csname instabname#1\endcsname% +} +% \msc@instinname gets the inside name of instance #1 +\def\msc@instinname#1{% + \csname instinname#1\endcsname% +} +% +% \msc@instxpos gets the x position (i.e., horizontal position) of the +% msc instance with nickname #1. +\def\msc@instxpos#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\csname instxpos#1\endcsname}% +} +% +% +\def\msc@instlxpos#1{ + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\csname instlxpos#1\endcsname}% +} +% +\def\msc@instrxpos#1{ + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\csname instrxpos#1\endcsname}% +} +% +% \msc@setinstxpos sets the (l/r) x position of instance with nickname #1 to +% the string #2 +\def\msc@setinstxpos#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\edef\csname instxpos#1\endcsname{#2}% + \expandafter\edef\csname instlxpos#1\endcsname{#2}% + \expandafter\edef\csname instrxpos#1\endcsname{#2}% + }% +} +% +\def\msc@setinstlxpos#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\edef\csname instlxpos#1\endcsname{#2}% + }% +} +% +\def\msc@setinstrxpos#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\edef\csname instrxpos#1\endcsname{#2}% + }% +} +% +% \msc@instypos gets the last y position (i.e., vertical position) of the +% msc instance with nickname #1. +\def\msc@instypos#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \csname instypos#1\endcsname}% +} +% +% \msc@setinstypos sets the last y position of instance with nickname #1 to +% the string #2 +\def\msc@setinstypos#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\edef\csname instypos#1\endcsname{#2}% + }% +} +% +% Change \instlinestyle command of msc instance with nickname #1 into #2 +% #2 should be one of: solid, dashed, or dotted +\def\msc@setinstlinestyle#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \ifthenelse{\not\(\equal{#2}{solid} \or + \equal{#2}{dashed} \or + \equal{#2}{dotted}\)}{% unknown linestyle + \msc@unknownlinestyleerr{#2}}{% + \expandafter\def\csname instlinestyle#1\endcsname{#2}% + }% + }% +} +% +% \msc@instlinestyle returns the linestyle of instance with nickname #1 +\def\msc@instlinestyle#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \csname instlinestyle#1\endcsname}% +} +% +% Change the foot color for instance with nickname #1 into #2 +\def\msc@setinstfootcolor#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\def\csname instfootcolor#1\endcsname{#2}% + }% +} +% +% \msc@instfootcolor returns the color of the footer of instance with nicknam #1 +\def\msc@instfootcolor#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \csname instfootcolor#1\endcsname}% +} +% +% Change \instregionstyle command of msc instance with nickname #1 into #2 +% #2 should be one of: normal, coregion, suspension, or activation +\def\msc@setinstregionstyle#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \ifthenelse{\not\(\equal{#2}{normal} \or + \equal{#2}{coregion} \or + \equal{#2}{suspension} \or + \equal{#2}{activation}\)} + {% unknown region style + \msc@unknownregionstyleerr{#2} + }{% + \expandafter\def\csname instregionstyle#1\endcsname{#2}% + }% + \ifthenelse{\equal{#2}{suspension} \or \equal{#2}{activation}} + {% + \ifthenelse{\equal{\msc@instisfat{#1}}{true}} + {\relax} + {% + \setlength{\tmp@X}{\msc@instxpos{#1}}% + \setlength{\tmp@Xa}{\regionbarwidth}% + \addtolength{\tmp@X}{-.5\tmp@Xa}% + \msc@setinstlxpos{#1}{\the\tmp@X}% + \addtolength{\tmp@X}{\tmp@Xa}% + \msc@setinstrxpos{#1}{\the\tmp@X}% + } + }{% new region style is normal or coregion + \ifthenelse{\equal{\msc@instisfat{#1}}{true}}% + {\relax}% + {\msc@setinstbarwidth{#1}{\instbarwidth}% + \msc@setinstlxpos{#1}{\msc@instxpos{#1}}% + \msc@setinstrxpos{#1}{\msc@instxpos{#1}}% + }% + }% + }% +} +% +% \msc@instregionstyle returns the region style of instance with nickname #1 +\def\msc@instregionstyle#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \csname instregionstyle#1\endcsname}% +} +% +% \msc@instbarwidth returns the width of the bar of instance with nickname #1 +\def\msc@instbarwidth#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \csname instbarwidth#1\endcsname}% +} +% +% \msc@setinstbarwidth sets the width of the bar of instance with nickname #1 +% to the string #2 +\def\msc@setinstbarwidth#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \expandafter\edef\csname instbarwidth#1\endcsname{#2}% + \ifthenelse{\lengthtest{\instbarwidth < #2}}% + {\expandafter\def\csname instisfat#1\endcsname{true}}% + {\expandafter\def\csname instisfat#1\endcsname{false}}% + }% +} +% +%\msc@isfateinst returns one of the strings `true' of `false', indicating if +% the instance with nickname #1 is a fat instance. +\def\msc@instisfat#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \csname instisfat#1\endcsname}% +} +% +% +% \changeinstbarwidth changes the instance width of instance with nickname #1 to +% the length #2 +\def\changeinstbarwidth#1#2{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}% + {% else, #1 is defined + \msc@drawinstanceline{#1}% + \setlength{\tmp@X}{\msc@instxpos{#1}}% + \setlength{\tmp@Y}{\msc@currentheight}% + \msc@setinstypos{#1}{\the\tmp@Y}% + \setlength{\tmp@Xb}{#2}% + \ifthenelse{\lengthtest{\tmp@Xb > \instbarwidth}}% + {% + \setlength{\tmp@Xb}{0.5\tmp@Xb}% + \addtolength{\tmp@Xb}{\tmp@X}}% + {% + \setlength{\tmp@Xb}{\tmp@X}}% + \ifthenelse{\equal{true}{\msc@instisfat{#1}}} + {% + \setlength{\tmp@Xa}{\msc@instbarwidth{#1}}% + \setlength{\tmp@Xa}{0.5\tmp@Xa}% + \addtolength{\tmp@Xa}{\tmp@X}% + }{% + \setlength{\tmp@Xa}{\tmp@X}% + }% + \psline(\tmp@Xa,-\tmp@Y)(\tmp@Xb,-\tmp@Y)% + \setlength{\tmp@Xb}{#2}% + \ifthenelse{\lengthtest{\tmp@Xb > \instbarwidth}}% + {% + \setlength{\tmp@Xb}{-0.5\tmp@Xb}% + \addtolength{\tmp@Xb}{\tmp@X}}% + {% + \setlength{\tmp@Xb}{\tmp@X}}% + \ifthenelse{\equal{true}{\msc@instisfat{#1}}} + {% + \setlength{\tmp@Xa}{\msc@instbarwidth{#1}}% + \setlength{\tmp@Xa}{-0.5\tmp@Xa}% + \addtolength{\tmp@Xa}{\tmp@X}% + }{% + \setlength{\tmp@Xa}{\tmp@X}% + }% + \psline(\tmp@Xa,-\tmp@Y)(\tmp@Xb,-\tmp@Y)% + \msc@setinstbarwidth{#1}{#2}% + }% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DUMMY INSTANCES (start and stop) +% +% Start a dummy inst +% +% \inststart{#1}{#2}{#3} +% #1: nickname of stared instance +% #2: name of the instance (above instance head symbol) +% #3: name of the instance (inside instance head symbol) +% +\def\inststart#1#2#3{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + % set the above and inside names + \expandafter\def\csname instabname#1\endcsname{#2}% `above name' + \expandafter\def\csname instinname#1\endcsname{#3}% `inside name' + % draw the instance header symbol + \msc@drawinstanceheadsymbol{#1}{\the\msc@currentheight}% + % redefine the instance's y position + \setlength{\tmp@Y}{\msc@currentheight+\instheadheight}% + \msc@setinstypos{#1}{\the\tmp@Y}% + } +} +% +% \inststop{#1} +% #1: nick name of instance +% +% Draws the footer of #1 at current level. +\def\inststop#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \addtolength{\msc@currentheight}{\lastlevelheight} + \msc@drawinstanceline{#1}% + \setlength{\tmp@Y}{\msc@currentheight}% + \msc@drawinstancefootsymbol{#1}{\the\tmp@Y}% + \addtolength{\msc@currentheight}{-\lastlevelheight} + \msc@setinstypos{#1}{undefined} + } +} +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +% +% CREATE +% +% \create creates a new msc-instance and draws its head symbol +% #1: text above creation message +% #2: nickname of creating instance +% #3: nickname of created instance +% #4: name of the instance (above instance head symbol) +% #5: name of the instance (inside instance head symbol) +% +% Some commands are defined as well (INSTNR is the arabic +% representation of the instance number): +% \instabname#3: `above name' of instance with nickname #3 +% \instinname#3: `inside name' of instance with nickname #3 +% \instlinestyle#3: the line style (dashed or solid) of instance with nickname #3 +\newcommand{\create}{% + \@ifstar% + {\def\mess@style{mess}\def\mess@linsestyle{dashed}\create@A}{\def\mess@style{mess}\def\mess@linestyle{solid}\create@A}% +}% +\newcommand{\create@A}[1]{% + \def\mess@labeltext{#1}% + \create@B% +} +\newcommand{\create@B}[2][t]{% + \def\mess@labelposition{#1}% + \def\mess@sender{#2}% + \create@C% +} +\newcommand{\create@C}[4][0.5]{% + \def\mess@labelplacement{#1}% + \def\mess@receiver{#2}% + \def\mess@leveloffset{0}% + \def\mess@instanceoffset{0.5\instwidth}% +% + \expandafter\@ifundefined{mscinst\mess@sender}{% + \msc@instundefinederr{\mess@sender}}{% else, \mess@sender is defined + \expandafter\@ifundefined{mscinst\mess@receiver}{% + \msc@instundefinederr{\mess@receiver}}{% else, \mess@receiver is defined + \expandafter\def\csname instabname\mess@receiver\endcsname{#3}% `above name' + \expandafter\def\csname instinname\mess@receiver\endcsname{#4}% `inside name' + % draw the instance header symbol + \setlength{\tmp@X}{\msc@instxpos{\mess@receiver}}% x-center head box + \setlength{\tmp@Y}{\msc@currentheight}% y-center head box + \setlength{\tmp@Xa}{-0.5\instwidth+\tmp@X}% x-upperleft head box + \setlength{\tmp@Ya}{\msc@currentheight-0.5\instheadheight}% + \setlength{\tmp@Xb}{\tmp@Xa+\instwidth}% x-lowerright head box + \setlength{\tmp@Yb}{\tmp@Ya+\instheadheight}% y-lowerright head box + \psframe[dimen=middle](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + \rput[B](\tmp@X,-\tmp@Ya){\raisebox{\labeldist}{\makebox[0pt][c]{#3}}}% + \rput[B](\tmp@X,-\tmp@Y){\raisebox{-.5ex}{\makebox[0pt][c]{#4}}}% + % redefine the instance's y position + \setlength{\tmp@Y}{\msc@currentheight+0.5\instheadheight}% + \msc@setinstypos{\mess@receiver}{\the\tmp@Y}% + % draw creation arrow + \msc@drawarrow% + }% + }% +} +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% INLINE EXPRESSIONS (inlines) +% +% +% \inlineestart creates an inline expression at the current level +% [#1]: left overlap +% [#2]: right overlap +% #3: nickname of the inline +% #4: text of the inline +% #5: first instance of the inline +% #6: final instance of the inline +\newcommand{\inlinestart}[1][\inlineoverlap]{% + \def\msc@leftoverlap{#1}\msc@inlinecont% +} +\newcommand{\msc@inlinecont}[5][\msc@leftoverlap]{\msc@declinline{\msc@leftoverlap}{#1}{#2}{#3}{#4}{#5}}% +% +% \inlineend draws and ends the inline expression with nickname #1 +% +\newcommand{\inlineend}{% + \@ifstar{\msc@inlineends}{\msc@inlineend}} +% +% \inlineseparator draws a ``separator'' (horizontal dashed line) through +% inline expression with nickname #1 +\newcommand{\inlineseparator}[1]{% + \expandafter\@ifundefined{mscinl#1}{% + \msc@inlundefinederr{#1}}{% else, #1 is defined + \setlength{\tmp@Y}{\msc@currentheight}% + \psline[linestyle=dashed](\msc@inlulx{#1},-\tmp@Y)(\msc@inllrx{#1},-\tmp@Y)% + }% +} +% +% internal commands to implement the inline expressions: +% #1: left overlap +% #2: right overlap +% #3: nickname of the inline +% #4: text of the inline +% #5: first instance of the inline +% #6: final instance of the inline +% +\def\msc@declinline#1#2#3#4#5#6{% + \@ifundefined{mscinl#3}{% + \@ifundefined{mscinst#5}{% #5 is not an instance nickname + \msc@instundefinederr{#5}}{% + \@ifundefined{mscinst#6}{% #6 is not an instance nickname + \msc@instundefinederr{#6}}{% + \ifthenelse{\lengthtest{\msc@instxpos{#5}>\msc@instxpos{#6}}}{% + \msc@inlfirstlasterror{#3}{#5}{#6}}{% + \@namedef{mscinl#3}{\relax}% + \expandafter\def\csname inltext#3\endcsname{\raisebox{\depth}[\totalheight][0pt]{#4}}% + \ifthenelse{\equal{true}{\msc@instisfat{#5}}}% + {% + \setlength{\tmp@X}{\msc@instlxpos{#5}-#1}% + }% + {% + \setlength{\tmp@X}{\msc@instxpos{#5}-#1}% + }% + \expandafter\edef\csname inlulx#3\endcsname{\the\tmp@X}% + \expandafter\edef\csname inluly#3\endcsname{\the\msc@currentheight}% + \ifthenelse{\equal{true}{\msc@instisfat{#6}}}% + {% + \setlength{\tmp@X}{\msc@instrxpos{#6}+#2}% + }% + {% + \setlength{\tmp@X}{\msc@instxpos{#6}+#2}% + }% + \expandafter\edef\csname inllrx#3\endcsname{\the\tmp@X}% + \expandafter\edef\csname inllry#3\endcsname{undefined}% + % two additional instances are defined + \msc@declinst{#3left}{\relax}{\relax}{\the\instbarwidth}% left of inline + \msc@setinstxpos{#3left}{\msc@inlulx{#3}}% + \msc@setinstlxpos{#3left}{\msc@inlulx{#3}}% + \msc@setinstrxpos{#3left}{\msc@inlulx{#3}}% + \msc@setinstypos{#3left}{undefined}% no instance line drawing + \msc@declinst{#3right}{\relax}{\relax}{\the\instbarwidth}% left of inline + \msc@setinstxpos{#3right}{\msc@inllrx{#3}}% + \msc@setinstlxpos{#3right}{\msc@inllrx{#3}}% + \msc@setinstrxpos{#3right}{\msc@inllrx{#3}}% + \msc@setinstypos{#3right}{undefined}% no instance line drawing + }% + }% + }% + }{% nickname #3 already defined + \msc@nicknamedefinederr{#3}% + }% +} +% +% \msc@inlulx gets the upper-left x-position of inline with nickname #1. +\def\msc@inlulx#1{% + \expandafter\@ifundefined{mscinl#1}{% + \msc@inlundefinederr{#1}}{% else, #1 is defined + \csname inlulx#1\endcsname% + }% +} +% +% \msc@inluly gets the upper-left y-position of inline with nickname #1. +\def\msc@inluly#1{% + \expandafter\@ifundefined{mscinl#1}{% + \msc@inlundefinederr{#1}}{% else, #1 is defined + \csname inluly#1\endcsname% + }% +} +% +% \msc@inllrx gets the lower-right x-position of inline with nickname #1. +\def\msc@inllrx#1{% + \expandafter\@ifundefined{mscinl#1}{% + \msc@inlundefinederr{#1}}{% else, #1 is defined + \csname inllrx#1\endcsname% + }% +} +% +% \msc@inllry gets the lower-right y-position of inline with nickname #1. +\def\msc@inllry#1{% + \expandafter\@ifundefined{mscinl#1}{% + \msc@inlundefinederr{#1}}{% else, #1 is defined + \csname inllry#1\endcsname% + }% +} +% +% \msc@inltext gets the text of inline with nickname #1 +\def\msc@inltext#1{% + \expandafter\@ifundefined{mscinl#1}{% + \msc@inlundefinederr{#1}}{% else, #1 is defined + \csname inltext#1\endcsname% + }% +} +% +% \msc@inlineend completes the inline with nickname #1 +% (the bottom line is solid) +\def\msc@inlineend#1{% + \expandafter\@ifundefined{mscinl#1}{% + \msc@inlundefinederr{#1}}{% else, #1 is defined + \expandafter\edef\csname inllry#1\endcsname{\the\msc@currentheight}% + \setlength{\tmp@Xa}{\msc@inlulx{#1}}% + \setlength{\tmp@Ya}{\msc@inluly{#1}}% + \setlength{\tmp@Xb}{\msc@inllrx{#1}}% + \setlength{\tmp@Yb}{\msc@inllry{#1}}% +%% Debug info: +% \typeout{(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)}% + \psframe[dimen=middle](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + \settowidth{\tmp@X}{\msc@inltext{#1}}% + \setlength{\tmp@X}{1.1\tmp@X+\labeldist}% + \settoheight{\tmp@Y}{\msc@inltext{#1}}% + \setlength{\tmp@Y}{1.1\tmp@Y+\labeldist}% + \setlength{\tmp@Xb}{\tmp@X+\labeldist}% + \setlength{\tmp@Yb}{\tmp@Y+\labeldist}% + \rput(\tmp@Xa,-\tmp@Ya){% + \rput[tl](\labeldist,-\labeldist){\msc@inltext{#1}}% + \psline(0,-\tmp@Yb)(\tmp@X,-\tmp@Yb)(\tmp@Xb,-\tmp@Y)(\tmp@Xb,0)% + }% + }% +} +% +% \msc@inlineends completes the inline with nickname #1 +% (the bottom line is dashed) +\def\msc@inlineends#1{% + \expandafter\@ifundefined{mscinl#1}{% + \msc@inlundefinederr{#1}}{% else, #1 is defined + \expandafter\edef\csname inllry#1\endcsname{\the\msc@currentheight}% + \setlength{\tmp@Xa}{\msc@inlulx{#1}}% + \setlength{\tmp@Ya}{\msc@inluly{#1}}% + \setlength{\tmp@Xb}{\msc@inllrx{#1}}% + \setlength{\tmp@Yb}{\msc@inllry{#1}}% +%% Debug info: +% \typeout{(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)}% + % first the solid part of the inline expression: + \psline(\tmp@Xa,-\tmp@Yb)(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + % then the dashed bottom line: + \psline[linestyle=dashed](\tmp@Xa,-\tmp@Yb)(\tmp@Xb,-\tmp@Yb) + \settowidth{\tmp@X}{\msc@inltext{#1}}% + \setlength{\tmp@X}{1.1\tmp@X+\labeldist}% + \settoheight{\tmp@Y}{\msc@inltext{#1}}% + \setlength{\tmp@Y}{1.1\tmp@Y+\labeldist}% + \setlength{\tmp@Xb}{\tmp@X+\labeldist}% + \setlength{\tmp@Yb}{\tmp@Y+\labeldist}% + \rput(\tmp@Xa,-\tmp@Ya){% + \rput[tl](\labeldist,-\labeldist){\msc@inltext{#1}}% + \psline(0,-\tmp@Yb)(\tmp@X,-\tmp@Yb)(\tmp@Xb,-\tmp@Y)(\tmp@Xb,0)% + }% + }% +} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% REFERENCES +% +% +% \referencestart creates an msc reference at the current level +% [#1] : left overlap +% [#2] : right overlap +% #3: nickname of the reference +% #4: text of the reference +% #5: first instance of the reference +% #6: final instance of the reference +\newcommand{\referencestart}[1][\referenceoverlap]{% + \def\msc@leftoverlap{#1}\msc@referencecont% +} +\newcommand{\msc@referencecont}[5][\referenceoverlap]{% + \msc@declreference{\msc@leftoverlap}{#1}{#2}{#3}{#4}{#5}% + \setcounter{tmpcnt}{0}% + \msc@reffindfirst{#2}{\msc@drawtorefaux}% +} +% +% \referenceend draws and ends the reference with nickname #1 +\newcommand{\referenceend}[1]{% + \msc@drawreference{#1}% + \setcounter{tmpcnt}{0}% + \setlength{\tmp@Y}{\msc@currentheight}% + \msc@reffindfirst{#1}{\msc@refresetypos{\the\tmp@Y}}% +} +% +% internal commands to implement references: +% #1: left overlap +% #2: right overlap +% #3: nickname of the reference +% #4: text of the reference +% #5: first instance of the reference +% #6: final instance of the reference +% +\def\msc@declreference#1#2#3#4#5#6{% + \@ifundefined{mscref#3}{% + \@ifundefined{mscinst#5}{% #5 is not an instance nickname + \msc@instundefinederr{#5}}{% + \@ifundefined{mscinst#6}{% #6 is not an instance nickname + \msc@instundefinederr{#6}}{% + \ifthenelse{\lengthtest{\msc@instxpos{#5}>\msc@instxpos{#6}}}{% + \msc@reffirstlasterror{#3}{#5}{#6}}{% + \@namedef{mscref#3}{\relax}% + \expandafter\def\csname reftext#3\endcsname{#4}% + \ifthenelse{\equal{true}{\msc@instisfat{#5}}}% + {% + \setlength{\tmp@X}{\msc@instlxpos{#5}-#1}% + }% + {% + \setlength{\tmp@X}{\msc@instxpos{#5}-#1}% + }% + \expandafter\edef\csname refulx#3\endcsname{\the\tmp@X}% + \expandafter\edef\csname refuly#3\endcsname{\the\msc@currentheight}% + \ifthenelse{\equal{true}{\msc@instisfat{#6}}}% + {% + \setlength{\tmp@X}{\msc@instrxpos{#6}+#2}% + }% + {% + \setlength{\tmp@X}{\msc@instxpos{#6}+#2}% + }% + \expandafter\edef\csname reflrx#3\endcsname{\the\tmp@X}% + \expandafter\edef\csname reflry#3\endcsname{undefined}% + \expandafter\def\csname reffirst#3\endcsname{#5}% + \expandafter\def\csname reffinal#3\endcsname{#6}% + % two additional instances are defined + \msc@declinst{#3left}{\relax}{\relax}{\the\instbarwidth}% left of reference + \msc@setinstxpos{#3left}{\msc@refulx{#3}}% + \msc@setinstlxpos{#3left}{\msc@refulx{#3}}% + \msc@setinstrxpos{#3left}{\msc@refulx{#3}}% + \msc@setinstypos{#3left}{undefined}% no instance line drawing + \msc@declinst{#3right}{\relax}{\relax}{\the\instbarwidth}% left of reference + \msc@setinstxpos{#3right}{\msc@reflrx{#3}}% + \msc@setinstlxpos{#3right}{\msc@reflrx{#3}}% + \msc@setinstrxpos{#3right}{\msc@reflrx{#3}}% + \msc@setinstypos{#3right}{undefined}% no instance line drawing + }% + }% + }% + }{% nickname #3 already defined + \msc@nicknamedefinederr{#3}% + }% +} +% +% \msc@refulx gets the upper-left x-position of reference with nickname #1. +\def\msc@refulx#1{% + \expandafter\@ifundefined{mscref#1}{% + \msc@refundefinederr{#1}}{% else, #1 is defined + \csname refulx#1\endcsname% + }% +} +% +% \msc@refuly gets the upper-left y-position of reference with nickname #1. +\def\msc@refuly#1{% + \expandafter\@ifundefined{mscref#1}{% + \msc@refundefinederr{#1}}{% else, #1 is defined + \csname refuly#1\endcsname% + }% +} +% +% \msc@reflrx gets the lower-right x-position of reference with nickname #1. +\def\msc@reflrx#1{% + \expandafter\@ifundefined{mscref#1}{% + \msc@refundefinederr{#1}}{% else, #1 is defined + \csname reflrx#1\endcsname% + }% +} +% +% \msc@reflry gets the lower-right y-position of reference with nickname #1. +\def\msc@reflry#1{% + \expandafter\@ifundefined{mscref#1}{% + \msc@refundefinederr{#1}}{% else, #1 is defined + \csname reflry#1\endcsname% + }% +} +% +% \msc@reftext gets the text of reference with nickname #1 +\def\msc@reftext#1{% + \expandafter\@ifundefined{mscref#1}{% + \msc@refundefinederr{#1}}{% else, #1 is defined + \csname reftext#1\endcsname% + }% +} +% +% \msc@reftext gets the nickname of the first instance of the reference with nickname #1 +\def\msc@reffirst#1{% + \expandafter\@ifundefined{mscref#1}{% + \msc@refundefinederr{#1}}{% else, #1 is defined + \csname reffirst#1\endcsname% + }% +} +% +% \msc@reftext gets the nickname of the final instance of the reference with nickname #1 +\def\msc@reffinal#1{% + \expandafter\@ifundefined{mscref#1}{% + \msc@refundefinederr{#1}}{% else, #1 is defined + \csname reffinal#1\endcsname% + }% +} +% +% \msc@drawreference completes the reference with nickname #1 +\def\msc@drawreference#1{% + \expandafter\@ifundefined{mscref#1}{% + \msc@refundefinederr{#1}}{% else, #1 is defined + \expandafter\edef\csname reflry#1\endcsname{\the\msc@currentheight}% + \setlength{\tmp@Xa}{\msc@refulx{#1}}% + \setlength{\tmp@Ya}{\msc@refuly{#1}}% + \setlength{\tmp@Xb}{\msc@reflrx{#1}}% + \setlength{\tmp@Yb}{\msc@reflry{#1}}% +%% Debug info: +% \typeout{(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)}% + \psframe[dimen=middle,framearc=0.25](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% note: rounded corners + \setlength{\tmp@X}{\tmp@Xb-\tmp@Xa}% + \setlength{\tmp@Y}{\tmp@Yb-\tmp@Ya}% + \rput(\tmp@Xa,-\tmp@Ya){% + \rput[B](.5\tmp@X,-.5\tmp@Y){\raisebox{-.5ex}{\makebox[0pt][c]{\msc@reftext{#1}}}}% + }% + }% +} +% +\def\msc@reffindfirst#1#2{% + \ifthenelse{\value{tmpcnt} < \value{mscinstcnt}}{% +% Debug info: +% \typeout{(drawtoref) checking \msc@instnickname{tmpcnt}}% + \ifthenelse{\equal{\msc@instnickname{tmpcnt}}{\msc@reffirst{#1}}}{% first instance found +% Debug info: +% \typeout{first found: \msc@instnickname{tmpcnt}}% + #2{#1}}{% else, keep on looking + \msc@incrcounter{tmpcnt}% + \msc@reffindfirst{#1}{#2}}}{% done ! all instances checked + }% +} +% +\def\msc@drawtorefaux#1{% + \ifthenelse{\value{tmpcnt} < \value{mscinstcnt}}{% +% Debug info: +% \typeout{(drawtorefaux) checking \msc@instnickname{tmpcnt}}% + \msc@drawinstanceline{\msc@instnickname{tmpcnt}}% + \msc@setinstypos{\msc@instnickname{tmpcnt}}{undefined}% + \ifthenelse{\equal{\msc@instnickname{tmpcnt}}{\msc@reffinal{#1}}}{% final instance found +% Debug info: +% \typeout{final found: \msc@instnickname{tmpcnt}}% + }{% else, non-final + \msc@incrcounter{tmpcnt}% + \msc@drawtorefaux{#1}}% + }{% done ! all instances checked + }% +} +% +\def\msc@refresetypos#1#2{% + \ifthenelse{\value{tmpcnt} < \value{mscinstcnt}}{% +% Debug info: +% \typeout{(drawtorefaux) checking \msc@instnickname{tmpcnt}} + \msc@setinstypos{\msc@instnickname{tmpcnt}}{#1}% + \ifthenelse{\equal{\msc@instnickname{tmpcnt}}{\msc@reffinal{#2}}}{% final instance found +% Debug info: +% \typeout{final found: \msc@instnickname{tmpcnt}}% + }{% else, non-final + \msc@incrcounter{tmpcnt}% + \msc@refresetypos{#1}{#2}}% + }{% done ! all instances checked + }% +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CO-REGIONS +% +% \coregionstart starts a coregion on instance #1 (nickname) in the current level. +\def\coregionstart#1{\regionstart{coregion}{#1}} +% \coregionend ends a coregion on instance #1 (nickname) in the current level. +\def\coregionend#1{\regionend{#1}}% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% REGIONS (normal, coregion, suspension, and activation) +% +% +% \regionstart{#1}{#2} +% starts a region +% #1: region style: normal, coregion, suspension, or activation +% #2: nickname: nick name of the instance +\def\regionstart#1#2{% + \expandafter\@ifundefined{mscinst#2}{% + \msc@instundefinederr{#2}}{% else, #2 is defined + \msc@drawinstanceline{#2}% + \msc@setinstregionstyle{#2}{#1}% + \msc@drawregionstart{#2}% + }% +} +% +% \regionend{#1} +% ends the region of instance with nickname #1 +\def\regionend#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \msc@drawinstanceline{#1}% + \msc@drawregionend{#1}% + \msc@setinstregionstyle{#1}{normal}% + }% +} +% +% +\def\msc@drawregionstart#1{% + \setlength{\tmp@Y}{\msc@currentheight}% + \ifthenelse{\equal{\msc@instisfat{#1}}{true}} + {% + \setlength{\tmp@Xa}{\msc@instlxpos{#1}}% + \setlength{\tmp@Xb}{\msc@instrxpos{#1}}% + \psline(\tmp@Xa,-\tmp@Y)(\tmp@Xb,-\tmp@Y)% + } + {% + \setlength{\tmp@Xa}{-.5\regionbarwidth+\msc@instxpos{#1}}% + \setlength{\tmp@Xb}{.5\regionbarwidth+\msc@instxpos{#1}}% + \psline(\tmp@Xa,-\tmp@Y)(\tmp@Xb,-\tmp@Y)% + } + \msc@setinstypos{#1}{\the\tmp@Y}% +} +% +% +\def\msc@drawregionend#1{% + \setlength{\tmp@Y}{\msc@currentheight}% + \ifthenelse{\equal{\msc@instisfat{#1}}{true}} + {% + \setlength{\tmp@Xa}{\msc@instlxpos{#1}}% + \setlength{\tmp@Xb}{\msc@instrxpos{#1}}% + \psline(\tmp@Xa,-\tmp@Y)(\tmp@Xb,-\tmp@Y)% + } + {\setlength{\tmp@Xa}{-.5\regionbarwidth+\msc@instxpos{#1}}% + \setlength{\tmp@Xb}{.5\regionbarwidth+\msc@instxpos{#1}}% + \psline(\tmp@Xa,-\tmp@Y)(\tmp@Xb,-\tmp@Y)% + } + \msc@setinstypos{#1}{\the\tmp@Y}% +} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MESSAGE ARROWS +% +% \messarrowscale sets the arrow scale +\def\messarrowscale#1{\psset{arrowscale=#1}} +% +% \msc@setleveloffset sets the internal level offset +\def\msc@setleveloffset#1{% + \def\msc@leveloffset{#1}% +} + +% \mess has one optional argument to define the position of +% the label of a self message. +\newcommand{\mess}{% + \@ifstar% + {\def\mess@style{mess}\def\mess@linestyle{dashed}\mess@A}{\def\mess@style{mess}\def\mess@linestyle{solid}\mess@A}% +}% +% +\newcommand{\mess@A}[2][l]{% + \def\selfmess@position{#1}% + \def\mess@labeltext{#2}% + \mess@B% +}% +\newcommand{\mess@B}[2][\ifx\mess@sender\mess@receiver \selfmess@position\else t\fi]{% + \def\mess@labelposition{#1}% + \def\mess@sender{#2}% + \mess@C% +} +\newcommand{\mess@C}[2][0.5]{% + \def\mess@labelplacement{#1}% + \def\mess@receiver{#2}% + \mess@D% +} +\newcommand{\mess@D}[1][\ifx\mess@sender\mess@receiver 1\else 0\fi]{% + \edef\mess@leveloffset{#1}% + \mess@E% +} +\newcommand{\mess@E}[1][0\mscunit]{% + \edef\mess@instanceoffset{#1}% + \msc@drawarrow% +} +\newcommand{\msc@drawarrow}{% + \expandafter\@ifundefined{mscinst\mess@sender}{% + \msc@instundefinederr{\mess@sender}}{% else, sender is defined + \expandafter\@ifundefined{mscinst\mess@receiver}{% + \msc@instundefinederr{\mess@receiver}}{% else, receiver is defined + \ifx\mess@sender\mess@receiver\msc@drawselfarrow\else\msc@drawnonselfarrow\fi% + }% + }% +} +\newcommand{\msc@drawselfarrow}{% + \ifthenelse{\equal{\selfmess@position}{l} \or% + \equal{\selfmess@position}{r}% + }{% + \ifthenelse{\equal{\selfmess@position}{l}}% + {% + \setlength{\tmp@Xa}{\msc@instlxpos{\mess@sender} - \selfmesswidth}% + \setlength{\tmp@Xb}{\tmp@Xa}% + }{% ELSE + \setlength{\tmp@Xa}{\msc@instrxpos{\mess@sender} + \selfmesswidth}% + \setlength{\tmp@Xb}{\tmp@Xa}% + }% + \setlength{\tmp@Ya}{\msc@currentheight}% + \setlength{\tmp@Yb}{\msc@currentheight + (\levelheight * \mess@leveloffset)}% + \msc@computelabelcoords% + \msc@computelabelspec% + \rput[\msc@labelrefpoint](\tmp@X,-\tmp@Y){\msc@labelbox{\mess@labeltext}}% + \ifthenelse{\equal{\selfmess@position}{l}}% + {% + \setlength{\tmp@Xa}{\msc@instlxpos{\mess@sender}}% + \setlength{\tmp@Xc}{\msc@instlxpos{\mess@sender} - \mess@instanceoffset}% + }{% ELSE + \setlength{\tmp@Xa}{\msc@instrxpos{\mess@sender}}% + \setlength{\tmp@Xc}{\msc@instrxpos{\mess@sender} + \mess@instanceoffset}% + }% + \ifthenelse{\equal{\mess@style}{mess}}% + {% THEN message arrow + \psline[linestyle=\mess@linestyle]{->}% + (\tmp@Xa,-\tmp@Ya)% + (\tmp@Xb,-\tmp@Ya)% + (\tmp@Xb,-\tmp@Yb)% + (\tmp@Xc,-\tmp@Yb)% + }{% ELSE order arrow + \setlength{\tmp@Yd}{.5\tmp@Yb + .5\tmp@Ya}% + \psline[linestyle=\mess@linestyle]{->}% + (\tmp@Xa,-\tmp@Ya)% + (\tmp@Xb,-\tmp@Ya)% + (\tmp@Xb,-\tmp@Yd)% + \psline[linestyle=\mess@linestyle]% + (\tmp@Xb,-\tmp@Yd)% + (\tmp@Xb,-\tmp@Yb)% + (\tmp@Xc,-\tmp@Yb)% + }% + }{% ELSE + \msc@illegalselfmesspositionerr{\selfmess@position}% + }% +} +\newcommand{\msc@drawnonselfarrow}{% + \ifthenelse{\lengthtest{\msc@instxpos{\mess@sender} < \msc@instxpos{\mess@receiver}}}% + {\setlength{\tmp@Xa}{\msc@instrxpos{\mess@sender}}% + \setlength{\tmp@Xb}{\msc@instlxpos{\mess@receiver}}% + \addtolength{\tmp@Xb}{-\mess@instanceoffset}}% + {\setlength{\tmp@Xa}{\msc@instlxpos{\mess@sender}}% + \setlength{\tmp@Xb}{\msc@instrxpos{\mess@receiver}}% + \addtolength{\tmp@Xb}{\mess@instanceoffset}}% + \setlength{\tmp@Ya}{\msc@currentheight}% + \setlength{\tmp@Yb}{\msc@currentheight + (\levelheight * \mess@leveloffset)}% + \msc@computelabelcoords% + \msc@computelabelspec% + \ifthenelse{\equal{\mess@style}{mess}}% + {% THEN message arrow + \psline[linestyle=\mess@linestyle]{->}% + (\tmp@Xa,-\tmp@Ya)% + (\tmp@Xb,-\tmp@Yb)% + }{%ELSE order arrow + \setlength{\tmp@Xd}{.5\tmp@Xb + .5\tmp@Xa}% + \setlength{\tmp@Yd}{.5\tmp@Yb + .5\tmp@Ya}% + \psline[linestyle=\mess@linestyle]{->}% + (\tmp@Xa,-\tmp@Ya)% + (\tmp@Xd,-\tmp@Yd)% + \psline[linestyle=\mess@linestyle]% + (\tmp@Xd,-\tmp@Yd)% + (\tmp@Xb,-\tmp@Yb)% + }% + \rput[\msc@labelrefpoint](\tmp@X,-\tmp@Y){\msc@labelbox{\mess@labeltext}}% +}% + +\newcommand{\msc@computelabelcoords}{% + \ifthenelse{%\equal{t}{t}% + \(\equal{\mess@sender}{\mess@receiver} \and \(\equal{\mess@labelposition}{l} \or% + \equal{\mess@labelposition}{r}\)% + \)% + \or% + \(\not\(\equal{\mess@sender}{\mess@receiver}\) \and \(\equal{\mess@labelposition}{t} \or% + \equal{\mess@labelposition}{b}\)% + \)% + }{% THEN + \ifthenelse{\lengthtest{\tmp@Xa<\tmp@Xb}}% + {% THEN + \ifthenelse{\lengthtest{\tmp@Ya<\tmp@Yb}}% + {% THEN + \setlength{\tmp@X}{\tmp@Xa + (\tmp@Xb - \tmp@Xa)*\real{\mess@labelplacement}}% + \setlength{\tmp@Y}{\tmp@Ya + (\tmp@Yb - \tmp@Ya)*\real{\mess@labelplacement}}% + }{% ELSE + \setlength{\tmp@X}{\tmp@Xa + (\tmp@Xb - \tmp@Xa)*\real{\mess@labelplacement}}% + \setlength{\tmp@Y}{\tmp@Yb + (\tmp@Ya - \tmp@Yb) + (\tmp@Yb - \tmp@Ya)*\real{\mess@labelplacement}}% + }% + }{% ELSE + \ifthenelse{\lengthtest{\tmp@Xa>\tmp@Xb}}% + {% THEN + \ifthenelse{\lengthtest{\tmp@Ya<\tmp@Yb}}% + {% THEN + \setlength{\tmp@X}{\tmp@Xb + (\tmp@Xa - \tmp@Xb) + (\tmp@Xb - \tmp@Xa)*\real{\mess@labelplacement}}% + \setlength{\tmp@Y}{\tmp@Ya + (\tmp@Yb - \tmp@Ya)*\real{\mess@labelplacement}}% + }{% ELSE + \setlength{\tmp@X}{\tmp@Xb + (\tmp@Xa - \tmp@Xb) + (\tmp@Xb - \tmp@Xa)*\real{\mess@labelplacement}}% + \setlength{\tmp@Y}{\tmp@Yb + (\tmp@Ya - \tmp@Yb) + (\tmp@Yb - \tmp@Ya)*\real{\mess@labelplacement}}% + }% + }{% ELSE \tmpXa = \tmp@Xb (self message) + \setlength{\tmp@X}{\tmp@Xa}% + \ifthenelse{\lengthtest{\tmp@Ya<\tmp@Yb}}% + {% + \setlength{\tmp@Y}{\tmp@Ya + (\tmp@Yb - \tmp@Ya)*\real{\mess@labelplacement}}% + }{% + \setlength{\tmp@Y}{\tmp@Yb + (\tmp@Ya - \tmp@Yb) + (\tmp@Yb - \tmp@Ya)*\real{\mess@labelplacement}}}% + }% + }% + }{% ELSE + \msc@illegalmesslabelpositionerr{\mess@labelposition}% + } +} + +\newcommand{\msc@computelabelspec}{% + \ifthenelse{\lengthtest{\tmp@Xa < \tmp@Xb}}% + {% THEN W->E + \ifthenelse{\lengthtest{\tmp@Ya < \tmp@Yb}}% + {% THEN NW->SE + \ifthenelse{\equal{\mess@labelposition}{t}}% + {\def\msc@labelrefpoint{Bl} + \addtolength{\tmp@X}{\labeldist}% + \addtolength{\tmp@Y}{-\labeldist}% + }% + {\def\msc@labelrefpoint{tr} + \addtolength{\tmp@X}{-\labeldist}% + \addtolength{\tmp@Y}{\labeldist}% + }% + }{% ELSE + \ifthenelse{\lengthtest{\tmp@Ya > \tmp@Yb}}% + {% THEN SW -> NE + \ifthenelse{\equal{\mess@labelposition}{t}}% + {\def\msc@labelrefpoint{Br} + \addtolength{\tmp@X}{-\labeldist}% + \addtolength{\tmp@Y}{-\labeldist}% + }% + {\def\msc@labelrefpoint{tl} + \addtolength{\tmp@X}{\labeldist}% + \addtolength{\tmp@Y}{\labeldist}% + }% + }{% ELSE W->E + \ifthenelse{\equal{\mess@labelposition}{t}}% + {\def\msc@labelrefpoint{B} + \addtolength{\tmp@X}{0\labeldist}% + \addtolength{\tmp@Y}{-\labeldist}% + }% + {\def\msc@labelrefpoint{t} + \addtolength{\tmp@X}{0\labeldist}% + \addtolength{\tmp@Y}{\labeldist}% + }% + }% + }% + }{% ELSE + \ifthenelse{\lengthtest{\tmp@Xa > \tmp@Xb}}% + {% THEN E -> W + \ifthenelse{\lengthtest{\tmp@Ya < \tmp@Yb}}% + {% THEN NE -> SW + \ifthenelse{\equal{\mess@labelposition}{t}}% + {\def\msc@labelrefpoint{Br} + \addtolength{\tmp@X}{-\labeldist}% + \addtolength{\tmp@Y}{-\labeldist}% + }% + {\def\msc@labelrefpoint{tl} + \addtolength{\tmp@X}{\labeldist}% + \addtolength{\tmp@Y}{\labeldist}% + }% + }{% ELSE + \ifthenelse{\lengthtest{\tmp@Ya > \tmp@Yb}}% + {% THEN SE -> NW + \ifthenelse{\equal{\mess@labelposition}{t}}% + {\def\msc@labelrefpoint{Bl} + \addtolength{\tmp@X}{\labeldist}% + \addtolength{\tmp@Y}{-\labeldist}% + }% + {\def\msc@labelrefpoint{tr} + \addtolength{\tmp@X}{-\labeldist}% + \addtolength{\tmp@Y}{\labeldist}% + }% + }{% ELSE E -> W + \ifthenelse{\equal{\mess@labelposition}{t}}% + {\def\msc@labelrefpoint{B} + \addtolength{\tmp@X}{0\labeldist}% + \addtolength{\tmp@Y}{-\labeldist}% + }% + {\def\msc@labelrefpoint{t} + \addtolength{\tmp@X}{0\labeldist}% + \addtolength{\tmp@Y}{\labeldist}% + }% + } + } + }{% ELSE \tmp@Xa = \tmp@Xb (self message) + \ifthenelse{\equal{\mess@labelposition}{l}}% + {\def\msc@labelrefpoint{r} + \addtolength{\tmp@X}{-\labeldist}% + \addtolength{\tmp@Y}{0\labeldist}% + }% + {\def\msc@labelrefpoint{l} + \addtolength{\tmp@X}{\labeldist}% + \addtolength{\tmp@Y}{0\labeldist}% + }% + }% + }% +}% +\newcommand{\msc@labelbox}[1]{{#1}}% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Genralized orders +% \order[pos]{sender}{receiver}[leveloffset][instanceoffset] +% +\newcommand{\order}[3][l]{% + \def\mess@style{order}% + \def\mess@linestyle{dashed}% + \def\selfmess@position{#1}% + \def\mess@labelposition{\ifx\mess@sender\mess@receiver l\else t\fi}% + \def\mess@labeltext{\relax}% + \def\mess@labelplacement{0.5}% + \def\mess@sender{#2}% + \def\mess@receiver{#3}% + \order@B% +} +\newcommand{\order@B}[1][\ifx\mess@sender\mess@receiver 1\else 0\fi]{% + \edef\mess@leveloffset{#1}% + \order@C% +} +\newcommand{\order@C}[1][0pt]{% + \def\mess@instanceoffset{#1}% + \msc@drawarrow% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% LOST and FOUND messages +% +% \lost[pos]{label}[labelpos]{gate}{sender}[placement] +% \found[pos]{label}[labelpos]{gate}{sender}[placement] +\newcommand{\lost}[1][l]{% + \def\lostfound@position{#1}% + %\def\msc@arrowdirection{->}% + \def\lostfound@type{lost}% + \def\msc@circlefillstyle{black}% + \lostfound@B% +} +\newcommand{\found}[1][l]{% + \def\lostfound@position{#1}% + %\def\msc@arrowdirection{<-}% + \def\lostfound@type{found}% + \def\msc@circlefillstyle{white}% + \lostfound@B% +} +\newcommand{\lostfound@B}[1]{% + \def\mess@style{mess}% + \def\mess@labeltext{#1}% + \lostfound@C% +} +\newcommand{\lostfound@C}[3][t]{% + \def\mess@labelposition{#1}% + \def\mess@gate{#2}% + \def\mess@sender{#3}% + \lostfound@D% +} +\newcommand{\lostfound@D}[1][0.5]{% + \def\mess@labelplacement{#1}% + \@lostfound% +} +% +% \@lostfound draws lost and found messages +\def\@lostfound{% + \expandafter\@ifundefined{mscinst\mess@sender}{% + \msc@instundefinederr{\mess@sender}}{% else, \mess@sender is defined + %\setlength{\tmp@Xa}{\msc@instxpos{\mess@sender}}% + \setlength{\tmp@Ya}{\msc@currentheight}% + \ifthenelse{\equal{\lostfound@position}{l}} + {% THEN put lost/found message left + \ifthenelse{\equal{\lostfound@type}{lost}}% + {% THEN + \setlength{\tmp@Xa}% start of arrow + {\msc@instlxpos{\mess@sender}}% + \setlength{\tmp@Xb}% end of arrow + {\tmp@Xa-\selfmesswidth}% + \setlength{\tmp@X}% label position + {\tmp@Xb + (\tmp@Xa - \tmp@Xb) * \real{\mess@labelplacement}}% + \setlength{\tmp@Xc}% circle position + {\tmp@Xb-\lostsymbolradius}% + }{% ELSE + \setlength{\tmp@Xb}% end of arrow + {\msc@instlxpos{\mess@sender}}% + \setlength{\tmp@Xa}% start of arrow + {\tmp@Xb-\selfmesswidth}% + \setlength{\tmp@X}% label position + {\tmp@Xa + (\tmp@Xb - \tmp@Xa) * \real{\mess@labelplacement}}% + \setlength{\tmp@Xc}% circle position + {\tmp@Xa-\lostsymbolradius}% + }% + \setlength{\tmp@Xd}% gate position + {\tmp@Xc-\lostsymbolradius-\labeldist}% + \def\msc@gaterefpoint{r}% + }{% ELSE, lost/found message right + \ifthenelse{\equal{\lostfound@type}{lost}}% + {% THEN + \setlength{\tmp@Xa}% start of arrow + {\msc@instrxpos{\mess@sender}}% + \setlength{\tmp@Xb}% end of arrow + {\tmp@Xa+\selfmesswidth}% + \setlength{\tmp@X}% label position + {\tmp@Xa + (\tmp@Xb - \tmp@Xa) * \real{\mess@labelplacement}}% + \setlength{\tmp@Xc}% circle position + {\tmp@Xb+\lostsymbolradius}% + }{% ELSE + \setlength{\tmp@Xb}% end of arrow + {\msc@instrxpos{\mess@sender}}% + \setlength{\tmp@Xa}% start of arrow + {\tmp@Xb+\selfmesswidth}% + \setlength{\tmp@X}% label position + {\tmp@Xb + (\tmp@Xa - \tmp@Xb) * \real{\mess@labelplacement}}% + \setlength{\tmp@Xc}% circle position + {\tmp@Xa+\lostsymbolradius}% + }% + \setlength{\tmp@Xd}% gate position + {\tmp@Xc+\lostsymbolradius+\labeldist}% + \def\msc@gaterefpoint{l}% + }% + \psline{->}(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya)% + \ifthenelse{\equal{\mess@labelposition}{t}}% + {% THEN + \setlength{\tmp@Y}{\tmp@Ya-\lostsymbolradius-\labeldist}% + \def\msc@labelrefpoint{B}% + }{% ELSE + \ifthenelse{\equal{\mess@labelposition}{b}}% + {% THEN + \setlength{\tmp@Y}{\tmp@Ya+\lostsymbolradius+\labeldist}% + \def\msc@labelrefpoint{t}% + }{% ELSE + \msc@illegallostfoundlabelpositionerr{\mess@labelposition}% + }% + }% + \rput[\msc@labelrefpoint](\tmp@X,-\tmp@Y){\mess@labeltext}% + \edef\msc@scratch{\msc@circlefillstyle}% + \pscircle[fillstyle=solid,fillcolor=\msc@scratch]% + (\tmp@Xc,-\tmp@Ya){\lostsymbolradius} + \rput[\msc@gaterefpoint](\tmp@Xd,-\tmp@Ya){\mess@gate}% + }% +} +% +% +% \settimer has one optional argument to define the position of +% the label of a self message. +\newcommand{\settimer}[1][l]{% + \msc@settimerpos{#1}% + \@timer{set}% +} +% +% +% \timeout has one optional argument to define the position of +% the label of a self message. +\newcommand{\timeout}[1][l]{% + \msc@settimerpos{#1}% + \@timer{timeout}% +} +% +% +% \stoptimer has one optional argument to define the position of +% the label of a self message. +\newcommand{\stoptimer}[1][l]{% + \msc@settimerpos{#1}% + \@timer{stop}% +} +% +% +% \settimeout has one optional argument to define the position of +% the label of a self message. +\newcommand{\settimeout}[1][l]{% + \msc@settimerpos{#1}% + \@timerdispatcher{settimeout}% +} +% +% +% \setstoptimer has one optional argument to define the position of +% the label of a self message. +\newcommand{\setstoptimer}[1][l]{% + \msc@settimerpos{#1}% + \@timerdispatcher{setstoptimer}% +} +\def\@timerdispatcher#1#2#3{% + \@ifnextchar[{\@oargtimerdispatcher{#1}{#2}{#3}}{\@nooargtimerdispatcher{#1}{#2}{#3}}} +% +\def\@oargtimerdispatcher#1#2#3[#4]{% + \msc@setleveloffset{#4}% + \@timer{#1}{#2}{#3}% +} +% +\def\@nooargtimerdispatcher#1#2#3{% + \msc@setleveloffset{2}% default level-offset value for combined timers + \@timer{#1}{#2}{#3}% +} +% +% +% \@timer draws timers +% #1: type of the timer (set/timeout/stop) +% #2: label +% #3: nickname of the instance +\def\@timer#1#2#3{% + \expandafter\@ifundefined{mscinst#3}{% + \msc@instundefinederr{#3}}{% else, #3 is defined + \setlength{\tmp@Xa}{\msc@instxpos{#3}}% + \setlength{\tmp@Ya}{\msc@currentheight}% + \ifthenelse{\equal{\msc@timerpos}{l}}{% point left of axis + \ifthenelse{\equal{\msc@instisfat{#3}}{true}}{% + \setlength{\tmp@Xa}{\msc@instlxpos{#3}}% + }{% + \relax% + }% + \setlength{\tmp@Xb}{\tmp@Xa-\selfmesswidth}% + }{ % else point right of axis + \ifthenelse{\equal{\msc@instisfat{#3}}{true}}{% + \setlength{\tmp@Xa}{\msc@instrxpos{#3}}% + }{% + \relax% + }% + \setlength{\tmp@Xb}{\tmp@Xa+\selfmesswidth}% + }% + \ifthenelse{\equal{#1}{timeout}}{% draw an arrow + \psline{<-}(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya)% + }{ % else draw a line without arrow head + \psline(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya)% + }% + \setlength{\tmp@X}{\tmp@Xb}% This looks clumsy - sm + \setlength{\tmp@Y}{\tmp@Ya}% + \msc@drawtimer{#1}{\tmp@X}{\tmp@Y}{\msc@timerpos}{#2}% + \ifthenelse{\equal{#1}{settimeout}}{% draw second part of settimeout + \setlength{\tmp@Ya}{\tmp@Y+\levelheight*\msc@leveloffset}% + \setlength{\tmp@Y}{\tmp@Y+0.75\timerwidth}% + \setlength{\tmp@Xa}{\msc@instxpos{#3}}% + \ifthenelse{\equal{\msc@timerpos}{l}}{% point left of axis + \ifthenelse{\equal{\msc@instisfat{#3}}{true}}{% + \setlength{\tmp@Xa}{\msc@instlxpos{#3}}% + }{% + \relax% + }% + }{ % else point right of axis + \ifthenelse{\equal{\msc@instisfat{#3}}{true}}{% + \setlength{\tmp@Xa}{\msc@instrxpos{#3}}% + }{% + \relax% + }% + } + \psline{->}(\tmp@X,-\tmp@Y)(\tmp@X,-\tmp@Ya)(\tmp@Xa,-\tmp@Ya)% + }{ % else not settimeout + \ifthenelse{\equal{#1}{setstoptimer}}{% draw second part of setstoptimer + \setlength{\tmp@Ya}{\tmp@Y+\levelheight*\msc@leveloffset}% + \setlength{\tmp@Y}{\tmp@Y+0.75\timerwidth}% + \setlength{\tmp@Xb}{\msc@instxpos{#3}}% + \ifthenelse{\equal{\msc@instisfat{#3}}{true}}{% + \ifthenelse{\equal{\msc@timerpos}{l}}{% point left of axis + \setlength{\tmp@Xb}{\msc@instlxpos{#3}}% + }{% point right of axis + \setlength{\tmp@Xb}{\msc@instrxpos{#3}}% + }% + }{% not a fat instance + \relax% + } + \psline(\tmp@X,-\tmp@Y)(\tmp@X,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya)% + \setlength{\tmp@Y}{\tmp@Ya}% + \msc@drawtimer{stop}{\tmp@X}{\tmp@Y}{\msc@timerpos}{}% + }{ % else no second part needed + }% + }% + }% +} +% +% \msc@drawtimer draws the timer symbols +% #1: type of the timer (set/timeout/stop) +% #2: x-coordinate of center of timer +% #3: y-coordinate of center of timer +% #4: place text left (l) or right (r) +% #5: text added to the timer +\def\msc@drawtimer#1#2#3#4#5{% + \setlength{\tmp@Xa}{#2-0.5\timerwidth}% + \setlength{\tmp@Xb}{#2+0.5\timerwidth}% + \ifthenelse{\equal{#1}{stop}}{% draw reset symbol + \setlength{\tmp@Ya}{-#3+0.5\timerwidth}% + \setlength{\tmp@Yb}{-#3-0.5\timerwidth}% + \psline(\tmp@Xa,\tmp@Ya)(\tmp@Xb,\tmp@Yb)% + \psline(\tmp@Xb,\tmp@Ya)(\tmp@Xa,\tmp@Yb)% + }{% else draw set/timeout symbol + \setlength{\tmp@Ya}{-#3+0.75\timerwidth}% + \setlength{\tmp@Yb}{-#3-0.75\timerwidth}% + \psline(\tmp@Xa,\tmp@Ya)(\tmp@Xb,\tmp@Yb)% + (\tmp@Xa,\tmp@Yb)(\tmp@Xb,\tmp@Ya)(\tmp@Xa,\tmp@Ya)% + }% + \ifthenelse{\equal{#4}{l}}{% place label left + \setlength{\tmp@Xa}{#2-\labeldist-0.3ex}% + \setlength{\tmp@Ya}{-#3-0.5ex}% + \rput[B](\tmp@Xa,\tmp@Ya){\makebox[0pt][r]{#5}} + }{% else place label right + \setlength{\tmp@Xa}{#2+\labeldist+0.3ex}% + \setlength{\tmp@Ya}{-#3-0.5ex}% + \rput[B](\tmp@Xa,\tmp@Ya){\makebox[0pt][l]{#5}}% + }% +} +% +% +% \msc@drawinstancehead draws the head of the instance +% #1: nickname of the instance +\def\msc@drawinstancehead#1{% + \setlength{\tmp@Y}{\msc@currentheight}% + \msc@drawinstanceheadsymbol{#1}{\the\tmp@Y}% +} +% +% \msc@drawinstanceheadsymbol draw the head symbol of instance #1 at y-pos #2 +\def\msc@drawinstanceheadsymbol#1#2{% + \setlength{\tmp@X}{\msc@instxpos{#1}}% x-center head box + \setlength{\tmp@Y}{#2 + 0.5\instheadheight}% center of head symbol + \setlength{\tmp@Xa}{-0.5\instwidth+\tmp@X}% x-upperleft head box + \setlength{\tmp@Ya}{#2}% y-upperleft head box + \setlength{\tmp@Xb}{\tmp@Xa+\instwidth}% x-lowerright head box + \setlength{\tmp@Yb}{#2 + \instheadheight}% y-lowerright head box + \ifthenelse{\equal{\msc@insthead}{yes}}{% + \psframe[dimen=middle,linestyle=\msc@instlinestyle{#1}](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + }{% else, no head symbol drawing% + } + \rput[B](\tmp@X,-\tmp@Ya){\raisebox{\labeldist}{\makebox[0pt][c]{\msc@instabname{#1}}}}% + \rput[B](\tmp@X,-\tmp@Y){\raisebox{-.5ex}{\makebox[0pt][c]{\msc@instinname{#1}}}}% +} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\def\msc@drawinstanceline#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + \ifthenelse{\equal{\msc@instypos{#1}}{undefined}}{% y-pos undefined: no line needed + }{% else + \setlength{\tmp@Ya}{\msc@instypos{#1}}% + \setlength{\tmp@Yb}{\msc@currentheight}% + \ifthenelse{\equal{true}{\msc@instisfat{#1}}}% + {% fat instance + \setlength{\tmp@Xa}{\msc@instlxpos{#1}}% + \setlength{\tmp@Xb}{\msc@instrxpos{#1}}% + \ifthenelse{\equal{\msc@instregionstyle{#1}}{coregion}} + {% + \psline[linestyle=dashed](\tmp@Xa,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb)% + \psline[linestyle=dashed](\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + } + {\ifthenelse{\equal{\msc@instregionstyle{#1}}{suspension}} + {% + \psline[linestyle=dashed,dash=7pt 7pt](\tmp@Xa,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb)% + \psline[linestyle=dashed,dash=7pt 7pt](\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + } + {\ifthenelse{\equal{\msc@instregionstyle{#1}}{activation}} + {% + \psframe[dimen=middle,fillstyle=solid,fillcolor=lightgray](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb) + \psline[linestyle=solid](\tmp@Xa,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb)% + \psline[linestyle=solid](\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + } + {% normal region: + \psline[linestyle=solid](\tmp@Xa,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb)% + \psline[linestyle=solid](\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + } + } + } + } + {% normal instance (not fat) + \setlength{\tmp@X}{\msc@instxpos{#1}}% + \ifthenelse{\equal{\msc@instregionstyle{#1}}{coregion}} + {% + \psline[linestyle=dashed](\tmp@X,-\tmp@Ya)(\tmp@X,-\tmp@Yb)% + } + {\ifthenelse{\equal{\msc@instregionstyle{#1}}{suspension}} + {% + \setlength{\tmp@X}{\regionbarwidth} + \setlength{\tmp@Xa}{\msc@instxpos{#1} - 0.5\tmp@X}% + \setlength{\tmp@Xb}{\msc@instxpos{#1} + 0.5\tmp@X}% + \psline[linestyle=dashed,dash=7pt 7pt](\tmp@Xa,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb)% + \psline[linestyle=dashed,dash=7pt 7pt](\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + } + {\ifthenelse{\equal{\msc@instregionstyle{#1}}{activation}} + {% + \setlength{\tmp@X}{\regionbarwidth} + \setlength{\tmp@Xa}{\msc@instxpos{#1} - 0.5\tmp@X}% + \setlength{\tmp@Xb}{\msc@instxpos{#1} + 0.5\tmp@X}% + \psframe[dimen=middle,fillstyle=solid,fillcolor=lightgray](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb) + \psline[linestyle=solid](\tmp@Xa,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb)% + \psline[linestyle=solid](\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + } + {% normal region + \psline[linestyle=\msc@instlinestyle{#1}](\tmp@X,-\tmp@Ya)(\tmp@X,-\tmp@Yb)% + } + } + } + }% + }% + }% +}% +% +% \msc@drawinstancefoot draws the last level and foot of the instance +% #1: nickname of the instance +\def\msc@drawinstancefoot#1{% + \setlength{\tmp@Y}{\msc@currentheight}% + \msc@drawinstancefootsymbol{#1}{\the\tmp@Y}% +} +% +% \msc@drawinstancefootsymbol draws a footer symbol for instance #1 at y-pos #2. +\def\msc@drawinstancefootsymbol#1#2{% + \setlength{\tmp@Xa}{-0.5\instwidth+\msc@instxpos{#1}}% + \setlength{\tmp@Ya}{\msc@currentheight}% + \setlength{\tmp@Xb}{\tmp@Xa+\instwidth}% + \setlength{\tmp@Yb}{#2 + \instfootheight}% + \ifthenelse{\equal{\msc@instfoot}{yes}}{ + \edef\msc@scratch{\msc@instfootcolor{#1}}% + \psframe[dimen=middle,fillstyle=solid,fillcolor=\msc@scratch,linestyle=\msc@instlinestyle{#1}](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + }{% else, no foot symbol drawing% + } +} +% +% \nextlevel incresaes \msc@currentheight by #1 * \levelheight +% (optional) #1: a nonnegative integer number (defaults to 1) +% +\newcommand{\nextlevel}[1][1]{% + \addtolength{\msc@currentheight}{#1\levelheight}% +} +% +\def\msc@drawinstancefooters{% + \ifthenelse{\value{tmpcnt} < \value{mscinstcnt}}{% + % Only draw the instancefoot if the instypos is defined (not ``undefined'') + % This signals a previous instance stop. + \ifthenelse{\equal{\msc@instypos{\msc@instnickname{tmpcnt}}}{undefined}}{\relax}{% + \msc@drawinstanceline{\msc@instnickname{tmpcnt}}% + \msc@drawinstancefoot{\msc@instnickname{tmpcnt}}% + }% + \msc@incrcounter{tmpcnt}% + \msc@drawinstancefooters}{% else nothing + }% +}% +% +% \action puts an action symbol on the instance with nickname #2. +% The action symbol will be placed on the current level and the text #1 +% is centered inside the action symbol. The starred version adjusts the width +% and height of the action symbol +\def\action{\@ifstar{\msc@actionstar}{\msc@actionnostar}} + +\def\msc@actionstar#1#2{ + \setlength{\tmp@Xc}{\actionwidth}% + \setlength{\tmp@Yc}{\actionheight}% + \savebox{\tmp@box}{#1} + \setlength{\actionwidth}{\wd\tmp@box + 2\labeldist} + \setlength{\actionheight}{\ht\tmp@box + \dp\tmp@box +2\labeldist} + \msc@actionnostar{\usebox{\tmp@box}}{#2}% + \setlength{\actionwidth}{\tmp@Xc}% + \setlength{\actionheight}{\tmp@Yc}% +} + +\def\msc@actionnostar#1#2{% + \expandafter\@ifundefined{mscinst#2}{% + \msc@instundefinederr{#2}}{% else, #2 is defined + % first, draw the instance line as far as possible + \msc@drawinstanceline{#2}% + % then, draw the action symbol + % if #2's bar width is greater than the action width, the width of this + % action will be the instnce bar width. + \ifthenelse{\lengthtest{\msc@instbarwidth{#2}<\actionwidth}}% + {\setlength{\tmp@X}{\actionwidth}}% + {\setlength{\tmp@X}{\msc@instbarwidth{#2}}}% + \setlength{\tmp@Xa}{\msc@instxpos{#2}-0.5\tmp@X}% + \setlength{\tmp@Xb}{\tmp@Xa+\tmp@X}% + \setlength{\tmp@Ya}{\msc@currentheight}% + \setlength{\tmp@Yb}{\tmp@Ya+\actionheight}% + \psframe[dimen=middle](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + \setlength{\tmp@X}{\msc@instxpos{#2}}% + \setlength{\tmp@Y}{\tmp@Ya+0.5\actionheight}% + \rput[B](\tmp@X,-\tmp@Y){\raisebox{-.5ex}{\makebox[0pt][c]{#1}}}% + % redefine the instance's y position + \setlength{\tmp@Y}{\msc@currentheight+\actionheight}% + \msc@setinstypos{#2}{\the\tmp@Y}% + }% +} + +% +% \stop ends the instance with nickname #1. +\def\stop#1{% + \expandafter\@ifundefined{mscinst#1}{% + \msc@instundefinederr{#1}}{% else, #1 is defined + % first, draw the instance line as far as possible + \msc@drawinstanceline{#1}% + \setlength{\tmp@Yb}{\msc@currentheight}% + % close the instance axis if it is a fat instance + \ifthenelse{\equal{true}{\msc@instisfat{#1}}}% + {% + \setlength{\tmp@Xa}{\msc@instlxpos{#1}}% + \setlength{\tmp@Xb}{\msc@instrxpos{#1}}% + \psline(\tmp@Xa,-\tmp@Yb)(\tmp@Xb,-\tmp@Yb)% + }% + {% else it is not fat + }% + % then, draw the stop symbol + \setlength{\tmp@X}{\msc@instxpos{#1}}% + \setlength{\tmp@Xa}{\tmp@X-0.5\stopwidth}% + \setlength{\tmp@Xb}{\tmp@X+0.5\stopwidth}% + \setlength{\tmp@Ya}{\tmp@Yb+0.5\stopwidth}% + \setlength{\tmp@Yb}{\tmp@Yb-0.5\stopwidth}% + \psline(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb)% + \psline(\tmp@Xb,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb)% + % redefine the instance's y position + % ``undefined'' means that the instance axis will not be drawn any further + \msc@setinstypos{#1}{undefined}% + }% +} +% +% +% \condition puts a condition symbol over the given instances. The +% starred version adjusts the width and the height of the condition symbol. +% #1: name to be put inside the condition symbol +% #2: comma-separated list of instance nicknames, such that: +% - The first instance nickname is supposed to be the leftmost +% instance of the condition +% - The last instance nickname is supposed to be the rightmost +% instance of the condition +\def\condition{\@ifstar{\msc@conditionstar}{\msc@conditionnostar}} + +\def\msc@conditionstar#1#2{ +% \message{(msc: conditionheight: \msc@conditionheight, actionheight: \msc@actionheight)} + \setlength{\tmp@Xd}{\conditionoverlap}% + \setlength{\tmp@Yd}{\conditionheight}% + \savebox{\tmp@box}{#1} + \setlength{\conditionoverlap}{.5\wd\tmp@box + \labeldist} + \setlength{\conditionheight}{\ht\tmp@box + \dp\tmp@box + 2\labeldist} + \msc@conditionnostar{\usebox{\tmp@box}}{#2} +% \settowidth{\conditionoverlap}{#1}% +% \setlength{\conditionoverlap}{.5\conditionoverlap} +% \settoheight{\conditionheight}{\rule{0pt}{\tmp@Yd-1ex} #1}% +% \addtolength{\conditionheight}{1ex} +% \msc@conditionnostar{#1}{#2}% + \setlength{\conditionoverlap}{\tmp@Xd}% + \setlength{\conditionheight}{\tmp@Yd}% +} + +\def\msc@conditionnostar#1#2{ + \def\msc@conditiontext{#1}% + \def\msc@firstconditioninst{undefined}% + \def\msc@lastconditioninst{undefined}% + \msc@condition{#2}% +% debugging info: +% \message{(msc: condition: \msc@firstconditioninst...\msc@lastconditioninst)}% + \ifthenelse{\equal{\msc@instisfat{\msc@firstconditioninst}}{true}}{% + \setlength{\tmp@Xa}{\msc@instlxpos{\msc@firstconditioninst}-\conditionoverlap}% + }{% + \setlength{\tmp@Xa}{\msc@instxpos{\msc@firstconditioninst}-\conditionoverlap}% + }% + \setlength{\tmp@Ya}{\msc@currentheight}% + \ifthenelse{\equal{\msc@instisfat{\msc@lastconditioninst}}{true}}{% + \setlength{\tmp@Xb}{\msc@instrxpos{\msc@lastconditioninst}+\conditionoverlap}% + }{% + \setlength{\tmp@Xb}{\msc@instxpos{\msc@lastconditioninst}+\conditionoverlap}% + }% + \setlength{\tmp@Yb}{\tmp@Ya+\conditionheight}% + \msc@drawcondition{#1}{\tmp@Xa}{\tmp@Ya}{\tmp@Xb}{\tmp@Yb}% +} +% +\def\msc@condition#1{% + \@for\msccondition@rg:=#1\do{% + \expandafter\@ifundefined{mscinst\msccondition@rg}{% + \msc@instundefinederr{\msccondition@rg}}{% else, \msccondition@rg is defined +% debugging info: +% \message{(msc: condition instance "\msccondition@rg")}% + \ifthenelse{\equal{\msc@firstconditioninst}{undefined}}{% + \edef\msc@firstconditioninst{\msccondition@rg}% + }{\ifthenelse{\lengthtest{\msc@instxpos{\msc@firstconditioninst} > \msc@instxpos{\msccondition@rg}}}{% + \edef\msc@firstconditioninst{\msccondition@rg}}{}% + }% + \ifthenelse{\equal{\msc@lastconditioninst}{undefined}}{% + \edef\msc@lastconditioninst{\msccondition@rg}% + }{\ifthenelse{\lengthtest{\msc@instxpos{\msc@lastconditioninst} < \msc@instxpos{\msccondition@rg}}}{% + \edef\msc@lastconditioninst{\msccondition@rg}}{}% + } + % now, draw the instance line as far as possible + \msc@drawinstanceline{\msccondition@rg}% + % \setlength{\tmp@X}{\msc@instxpos{\msccondition@rg}}% + % \setlength{\tmp@Ya}{\msc@instypos{\msccondition@rg}}% + % \setlength{\tmp@Yb}{\msc@currentheight+\msc@headoffset}% + % \psline[linestyle=\msc@instlinestyle{\msccondition@rg}](\tmp@X,-\tmp@Ya)(\tmp@X,-\tmp@Yb)% + % and redefine the instance's y position + \setlength{\tmp@Y}{\msc@currentheight+\conditionheight}% + \msc@setinstypos{\msccondition@rg}{\the\tmp@Y}% + }% + }% +} +% +% \msc@drawcondition draw the condition symbol +% #1: condition-text +\def\msc@drawcondition#1#2#3#4#5{% + \setlength{\tmp@Xc}{#4+ .6#5 - .6#3}% + \setlength{\tmp@Yc}{.5#3 + .5#5}% + \psline(#2,-#3)(#4,-#3)(\tmp@Xc,-\tmp@Yc)(#4,-#5)% + \setlength{\tmp@Xc}{#2- .6#5 + .6#3}% + \psline(#4,-#5)(#2,-#5)(\tmp@Xc,-\tmp@Yc)(#2,-#3)% + \setlength{\tmp@Xc}{.5#2 + .5#4}% + \setlength{\tmp@Yc}{.5#3 + .5#5}% + \rput[B](\tmp@Xc,-\tmp@Yc){\raisebox{-.5ex}{\makebox[0pt][c]{#1}}}% +} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GATES +% \gate[hpos][vpos]{text}{nickname}[h-offset] +% \gate*[hpos][vpos]{text}{nickname}[h-offset] +% (starred version puts a dot at the position of the gate on the instance line) +% +% hpos: optional horizontal position argument l(eft) or r(ight). default: l +% vpos: optional vertical position argument t(op), c(enter) or b(ottom). default: t +% text: text to be placed at the gate +% nickname: nickname of the instance to which the gate belongs +% +\def\gate{\@ifstar{\def\msc@gatestar{defined}\msc@gateh}{\def\msc@gatestar{undefined}\msc@gateh}} +\newcommand{\msc@gateh}[1][l]{% + \def\msc@gatehpos{#1}% + \msc@gatev% +} +% +\newcommand{\msc@gatev}[3][t]{% + \msc@gate{#1}{#2}{#3}% +} +% +\def\msc@gate#1#2#3{% + \expandafter\@ifundefined{mscinst#3}{% + \msc@instundefinederr{#3}}{% else, #3 is defined + \ifthenelse{\equal{\msc@instisfat{#3}}{true}} + {\ifthenelse{\equal{\msc@gatehpos}{l}} + {\setlength{\tmp@X}{\msc@instlxpos{#3}}} + {\setlength{\tmp@X}{\msc@instrxpos{#3}}} + }% + {\setlength{\tmp@X}{\msc@instxpos{#3}}} + \ifthenelse{\equal{\msc@gatestar}{defined}}{% + \setlength{\tmp@Y}{\msc@currentheight}% + \pscircle[fillstyle=solid,fillcolor=black](\tmp@X,-\tmp@Y){.5mm}}{}% + \ifthenelse{\equal{t}{#1}}{ + \setlength{\tmp@Y}{\msc@currentheight - \labeldist}% + \def\msc@gatetext{{#2}}% + }{% + \ifthenelse{\equal{c}{#1}}{% + \setlength{\tmp@Y}{\msc@currentheight}% + \def\msc@gatetext{\raisebox{-.5\totalheight}{#2}}% + }{% + \setlength{\tmp@Y}{\msc@currentheight + \labeldist}% + \def\msc@gatetext{\raisebox{-\totalheight}{#2}}% + }}% + \ifthenelse{\equal{l}{\msc@gatehpos}}{% + \addtolength{\tmp@X}{-\labeldist}% + \rput[B](\tmp@X,-\tmp@Y){\makebox[0pt][r]{\msc@gatetext}}}% + {% + \addtolength{\tmp@X}{\labeldist}% + \rput[B](\tmp@X,-\tmp@Y){\makebox[0pt][l]{\msc@gatetext}}% + }% + } +} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MSC COMMENTS +% +% +% \msccomment[#1]{#2}{#3} +% #1: position l/r or a distance +% #2: text +% #3: instance nick name +\newcommand{\msccomment}[3][l]{% + \expandafter\@ifundefined{mscinst#3}{% + \msc@instundefinederr{#3}} + {% else, #3 is defined + \ifthenelse{\equal{#1}{l}}% + {\setlength{\msc@commentdist}{-\msccommentdist}}% + {\ifthenelse{\equal{#1}{r}}% + {\setlength{\msc@commentdist}{\msccommentdist}}% + {\setlength{\msc@commentdist}{#1}}% + } + \savebox{\tmp@box}{\raisebox{\depth}[\totalheight][0pt]{#2}}% + \setlength{\tmp@Y}{\msc@currentheight}% + \setlength{\tmp@Ya}{\tmp@Y + .5\ht\tmp@box}% + \addtolength{\tmp@Ya}{\labeldist}% + \setlength{\tmp@Yb}{\tmp@Y - .5\ht\tmp@box}% + \addtolength{\tmp@Yb}{-\labeldist}% +% \message{( a: \the\tmp@Ya, b: \the\tmp@Yb)} + \ifthenelse{\lengthtest{\msc@commentdist < 0pt}}% + {% comment left from instance #3 + \setlength{\tmp@X}{\msc@instlxpos{#3}} + \setlength{\tmp@Xa}{\tmp@X + \msc@commentdist} + \psline(\tmp@X,-\tmp@Y)(\tmp@Xa,-\tmp@Y) + \psline(\tmp@Xa,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb) + \setlength{\tmp@Xb}{\wd\tmp@box} + \setlength{\tmp@Xb}{\tmp@Xa - \tmp@Xb} + \addtolength{\tmp@Xb}{-\labeldist} + \psline(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya) + \psline(\tmp@Xa,-\tmp@Yb)(\tmp@Xb,-\tmp@Yb) + \addtolength{\tmp@Xa}{-\labeldist} + \rput[r](\tmp@Xa,-\tmp@Y){#2}% + }% + {% comment right from instance #3 + \setlength{\tmp@X}{\msc@instrxpos{#3}} + \setlength{\tmp@Xa}{\tmp@X + \msc@commentdist} + \psline(\tmp@X,-\tmp@Y)(\tmp@Xa,-\tmp@Y) + \psline(\tmp@Xa,-\tmp@Ya)(\tmp@Xa,-\tmp@Yb) + \setlength{\tmp@Xb}{\wd\tmp@box} + \setlength{\tmp@Xb}{\tmp@Xa + \tmp@Xb} + \addtolength{\tmp@Xb}{\labeldist} + \psline(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya) + \psline(\tmp@Xa,-\tmp@Yb)(\tmp@Xb,-\tmp@Yb) + \addtolength{\tmp@Xa}{\labeldist} + \rput[l](\tmp@Xa,-\tmp@Y){\usebox{\tmp@box}} + }% + }% +} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MSC MARKS +% +% \mark[#1]{#2}{#3} +% #1: placement: tl,bl,tr,br +% #2: text +% #3: instance nick name +% +\newcommand{\mscmark}[3][tl]{% + \expandafter\@ifundefined{mscinst#3}{% + \msc@instundefinederr{#3}} + {% else, #3 is defined + \savebox{\tmp@box}{\raisebox{\depth}[\totalheight][0pt]{#2}} + \ifthenelse{\equal{#1}{tl}} + {%tl: + \setlength{\tmp@X}{\msc@instlxpos{#3}} + \setlength{\tmp@Xa}{\tmp@X - \markdist} + \setlength{\tmp@Xb}{\tmp@Xa - \wd\tmp@box - 2\labeldist} + \setlength{\tmp@Y}{\msc@currentheight} + \setlength{\tmp@Ya}{\msc@currentheight - .5\markdist} + \psline[linestyle=dashed](\tmp@X,-\tmp@Y)(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya) + \setlength{\tmp@Xb}{\tmp@Xa - \labeldist - .5\wd\tmp@box} + \addtolength{\tmp@Ya}{-\labeldist} + \rput[b](\tmp@Xb,-\tmp@Ya){\usebox{\tmp@box}} + }{ + \ifthenelse{\equal{#1}{bl}} + {%bl: + \setlength{\tmp@X}{\msc@instlxpos{#3}} + \setlength{\tmp@Xa}{\tmp@X - \markdist} + \setlength{\tmp@Xb}{\tmp@Xa - \wd\tmp@box - 2\labeldist} + \setlength{\tmp@Y}{\msc@currentheight} + \setlength{\tmp@Ya}{\msc@currentheight + .5\markdist} + \psline[linestyle=dashed](\tmp@X,-\tmp@Y)(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya) + \setlength{\tmp@Xb}{\tmp@Xa - \labeldist - .5\wd\tmp@box} + \addtolength{\tmp@Ya}{-\labeldist} + \rput[b](\tmp@Xb,-\tmp@Ya){\usebox{\tmp@box}} + }{ + \ifthenelse{\equal{#1}{tr}} + {%tr: + \setlength{\tmp@X}{\msc@instrxpos{#3}} + \setlength{\tmp@Xa}{\tmp@X + \markdist} + \setlength{\tmp@Xb}{\tmp@Xa + \wd\tmp@box + 2\labeldist} + \setlength{\tmp@Y}{\msc@currentheight} + \setlength{\tmp@Ya}{\msc@currentheight - .5\markdist} + \psline[linestyle=dashed](\tmp@X,-\tmp@Y)(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya) + \setlength{\tmp@Xb}{\tmp@Xa + \labeldist + .5\wd\tmp@box} + \addtolength{\tmp@Ya}{-\labeldist} + \rput[b](\tmp@Xb,-\tmp@Ya){\usebox{\tmp@box}} + }{ + \ifthenelse{\equal{#1}{br}} + {%br: + \setlength{\tmp@X}{\msc@instrxpos{#3}} + \setlength{\tmp@Xa}{\tmp@X + \markdist} + \setlength{\tmp@Xb}{\tmp@Xa + \wd\tmp@box + 2\labeldist} + \setlength{\tmp@Y}{\msc@currentheight} + \setlength{\tmp@Ya}{\msc@currentheight + .5\markdist} + \psline[linestyle=dashed](\tmp@X,-\tmp@Y)(\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya) + \setlength{\tmp@Xb}{\tmp@Xa + \labeldist + .5\wd\tmp@box} + \addtolength{\tmp@Ya}{-\labeldist} + \rput[b](\tmp@Xb,-\tmp@Ya){\usebox{\tmp@box}} + }{ + \msc@illegalmarkplacement{#1} + }}}}} +} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MSC MEASURES +% +% +\newlength{\msc@measuredist}% internal length for horizontal measure distance +% \measure[*][#1]{#2}{#3}{#4}[#5] +% *: the starred version puts the top measure mark above and the bottom measure mark +% below the measure position. +% #1: placement: l (left) r (right), or distance (negative or positive) to closest of #3 or #4 +% #2: name +% #3: instance nick name +% #4: instance nick name +% #5: (vertical) offset +\newcommand{\measure}{% + \@ifstar{\def\msc@innermeasure{false}\msc@measureargs} + {\def\msc@innermeasure{true}\msc@measureargs}% +} +% +\newcommand{\msc@measureargs}[4][l]{% + \def\msc@i{#1}% + \def\msc@ii{#2}% + \def\msc@iii{#3}% + \def\msc@iv{#4}% + \msc@measureoffset% +} + +\newcommand{\msc@measureoffset}[1][1]{% + \def\msc@mscv{#1}% + \msc@measure{\msc@i}{\msc@ii}{\msc@iii}{\msc@iv}{\msc@mscv} +} + +\newcommand{\msc@measure}[5]{% + \ifthenelse{\equal{#1}{l}} + {\setlength{\msc@measuredist}{-\measuredist}} + {\ifthenelse{\equal{#1}{r}} + {\setlength{\msc@measuredist}{\measuredist}} + {\setlength{\msc@measuredist}{#1}}} + % + \setlength{\tmp@Ya}{\msc@currentheight} + \setlength{\tmp@Yb}{\tmp@Ya + #5\levelheight} + \setlength{\tmp@Y}{.5\tmp@Ya + .5\tmp@Yb} + \ifthenelse{\lengthtest{\msc@instxpos{#3} < \msc@instxpos{#4}}} + {% + \ifthenelse{\lengthtest{\msc@measuredist < 0pt}} + {% left from instances + \setlength{\tmp@Xa}{\msc@instlxpos{#3}} + \setlength{\tmp@Xb}{\msc@instlxpos{#4}} + \setlength{\tmp@X}{\tmp@Xa + \msc@measuredist} + } + {% right from instances + \setlength{\tmp@Xa}{\msc@instrxpos{#3}} + \setlength{\tmp@Xb}{\msc@instrxpos{#4}} + \setlength{\tmp@X}{\tmp@Xb + \msc@measuredist} + } + } + {% + \ifthenelse{\lengthtest{\msc@measuredist < 0pt}} + {% left from instances + \setlength{\tmp@Xa}{\msc@instlxpos{#3}} + \setlength{\tmp@Xb}{\msc@instlxpos{#4}} + \setlength{\tmp@X}{\tmp@Xb + \msc@measuredist} + } + {% right from instances + \setlength{\tmp@Xa}{\msc@instrxpos{#3}} + \setlength{\tmp@Xb}{\msc@instrxpos{#4}} + \setlength{\tmp@X}{\tmp@Xa + \msc@measuredist} + } + } + \psline[linestyle=dashed](\tmp@Xa,-\tmp@Ya)(\tmp@X,-\tmp@Ya)(\tmp@X,-\tmp@Yb)(\tmp@Xb,-\tmp@Yb) + \ifthenelse{\lengthtest{\msc@measuredist < 0pt}} + {% left from instances + \addtolength{\tmp@X}{-\labeldist} + \rput[r](\tmp@X,-\tmp@Y){\raisebox{\depth}[\totalheight][0pt]{#2}} + \addtolength{\tmp@X}{\labeldist} + } + {% right from instances + \addtolength{\tmp@X}{\labeldist} + \rput[l](\tmp@X,-\tmp@Y){\raisebox{\depth}[\totalheight][0pt]{#2}} + \addtolength{\tmp@X}{-\labeldist} + } + \ifthenelse{\equal{\msc@innermeasure}{true}} + {% + \msc@measuresymbolup{\tmp@X}{\tmp@Ya} + \msc@measuresymboldown{\tmp@X}{\tmp@Yb} + } + {% + \msc@measuresymboldown{\tmp@X}{\tmp@Ya} + \msc@measuresymbolup{\tmp@X}{\tmp@Yb} + } +} +% +% +% \measurestart[*][#1]{#2}{#3}{#4} +% *: unstarred/starred version draws downward/upward triangle +% #1: placement: l (left) r (right), or distance (negative or positive) to #3 +% #2: name +% #3: instance nick name +% #4: gate name +\newcommand{\measurestart}{% + \@ifstar{\def\msc@innermeasure{false}\msc@measurestartargs} + {\def\msc@innermeasure{true}\msc@measurestartargs} +} +% +% +\newcommand{\msc@measurestartargs}[4][l]{% + \def\msc@i{#1}% + \def\msc@ii{#2}% + \def\msc@iii{#3}% + \def\msc@iv{#4}% + \msc@measurestartoffset% +} + +\newcommand{\msc@measurestartoffset}[1][2]{% + \msc@measurestart{\msc@i}{\msc@ii}{\msc@iii}{\msc@iv}{#1}% +} +% +\newcommand{\msc@measurestart}[5]{% + \ifthenelse{\equal{#1}{l}} + {\setlength{\msc@measuredist}{-\measuredist}} + {\ifthenelse{\equal{#1}{r}} + {\setlength{\msc@measuredist}{\measuredist}} + {\setlength{\msc@measuredist}{#1}}} + \setlength{\tmp@Ya}{\msc@currentheight} + \ifthenelse{\lengthtest{\msc@measuredist < 0pt}} + {% left from instance + \setlength{\tmp@Xa}{\msc@instlxpos{#3}} + \setlength{\tmp@Xb}{\tmp@Xa + \msc@measuredist} + \setlength{\tmp@Yb}{\tmp@Ya + #5\levelheight} + \setlength{\tmp@X}{\tmp@Xb - \labeldist - 0.5\measuresymbolwidth} + \setlength{\tmp@Y}{.5\tmp@Ya + .5\tmp@Yb} + \rput[r](\tmp@X,-\tmp@Y){\raisebox{\depth}[\totalheight][0pt]{#2}} + \setlength{\tmp@Y}{\tmp@Yb + \labeldist} + \rput[r](\tmp@X,-\tmp@Yb){\raisebox{\depth}[\totalheight][0pt]{#4}} + } + {% right from instance + \setlength{\tmp@Xa}{\msc@instrxpos{#3}} + \setlength{\tmp@Xb}{\tmp@Xa + \msc@measuredist} + \setlength{\tmp@Yb}{\tmp@Ya + #5\levelheight} + \setlength{\tmp@X}{\tmp@Xb + \labeldist + 0.5\measuresymbolwidth} + \setlength{\tmp@Y}{.5\tmp@Ya + .5\tmp@Yb} + \rput[l](\tmp@X,-\tmp@Y){\raisebox{\depth}[\totalheight][0pt]{#2}} + \setlength{\tmp@Y}{\tmp@Yb + \labeldist} + \rput[l](\tmp@X,-\tmp@Yb){\raisebox{\depth}[\totalheight][0pt]{#4}} + } + \psline[linestyle=dashed](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb) + \ifthenelse{\equal{\msc@innermeasure}{true}} + {\msc@measuresymbolup{\tmp@Xb}{\tmp@Ya}} + {\msc@measuresymboldown{\tmp@Xb}{\tmp@Ya}} + \rput(\tmp@Xb,-\tmp@Yb){\pscircle[fillcolor=white,fillstyle=solid](0,0){.5\measuresymbolwidth}} + } +% +% \measureend[*][#1]{#2}{#3}{#4} +% *: unstarred/starred version draws upward/downward triangle +% #1: placement: l (left) r (right), or distance (negative or positive) to #3 +% #2: name +% #3: instance nick name +% #4: gate name +\newcommand{\measureend}{% + \@ifstar{\def\msc@innermeasure{false}\msc@measureendargs}% + {\def\msc@innermeasure{true}\msc@measureendargs}% +} +% +\newcommand{\msc@measureendargs}[4][l]{% + \def\msc@i{#1}% + \def\msc@ii{#2}% + \def\msc@iii{#3}% + \def\msc@iv{#4}% + \msc@measureendoffset% +} +% +\newcommand{\msc@measureendoffset}[1][2]{% + \msc@measureend{\msc@i}{\msc@ii}{\msc@iii}{\msc@iv}{#1}% +} +% +\newcommand{\msc@measureend}[5]{% + \ifthenelse{\equal{#1}{l}} + {\setlength{\msc@measuredist}{-\measuredist}} + {\ifthenelse{\equal{#1}{r}} + {\setlength{\msc@measuredist}{\measuredist}} + {\setlength{\msc@measuredist}{#1}}} + \setlength{\tmp@Ya}{\msc@currentheight} + \ifthenelse{\lengthtest{\msc@measuredist < 0pt}} + {% left from instance + \setlength{\tmp@Xa}{\msc@instlxpos{#3}} + \setlength{\tmp@Xb}{\tmp@Xa + \msc@measuredist} + \setlength{\tmp@Yb}{\tmp@Ya - #5\levelheight} + \setlength{\tmp@X}{\tmp@Xb - \labeldist - 0.5\measuresymbolwidth} + \setlength{\tmp@Y}{.5\tmp@Ya + .5\tmp@Yb} + \rput[r](\tmp@X,-\tmp@Y){\raisebox{\depth}[\totalheight][0pt]{#2}} + \setlength{\tmp@Y}{\tmp@Yb - \labeldist} + \rput[r](\tmp@X,-\tmp@Yb){\raisebox{\depth}[\totalheight][0pt]{#4}} + } + {% right from instance + \setlength{\tmp@Xa}{\msc@instrxpos{#3}} + \setlength{\tmp@Xb}{\tmp@Xa + \msc@measuredist} + \setlength{\tmp@Yb}{\tmp@Ya - #5\levelheight} + \setlength{\tmp@X}{\tmp@Xb + \labeldist + 0.5\measuresymbolwidth} + \setlength{\tmp@Y}{.5\tmp@Ya + .5\tmp@Yb} + \rput[l](\tmp@X,-\tmp@Y){\raisebox{\depth}[\totalheight][0pt]{#2}} + \setlength{\tmp@Y}{\tmp@Yb - \labeldist} + \rput[l](\tmp@X,-\tmp@Yb){\raisebox{\depth}[\totalheight][0pt]{#4}} + } + \psline[linestyle=dashed](\tmp@Xa,-\tmp@Ya)(\tmp@Xb,-\tmp@Ya)(\tmp@Xb,-\tmp@Yb) + \ifthenelse{\equal{\msc@innermeasure}{true}} + {\msc@measuresymboldown{\tmp@Xb}{\tmp@Ya}} + {\msc@measuresymbolup{\tmp@Xb}{\tmp@Ya}} + \rput(\tmp@Xb,-\tmp@Yb){\pscircle[fillcolor=white,fillstyle=solid](0,0){.5\measuresymbolwidth}} + } +% +% measure symbols +% +\def\msc@measuresymbolup#1#2{% + % sin(pi/3) =~ 0.866025403784 + % draw an upward triangle with 60-degree (pi/3) angles and base at (#1,#2) + \rput[t](#1,-#2){% + \begin{pspicture}(-1,0)(1,0.866025403784\measuresymbolwidth)% + \pstriangle[dimen=middle,fillcolor=white,fillstyle=solid](\measuresymbolwidth,0.866025403784\measuresymbolwidth)% + \end{pspicture}% + } +} +% +\def\msc@measuresymboldown#1#2{% + % sin(pi/3) =~ 0.866025403784 + % draw a downward triangle with 60-degree (pi/3) angles and base at (#1,#2) + \rput[b](#1,-#2){% + \begin{pspicture}(-1,0)(1,-0.866025403784\measuresymbolwidth)% + \pstriangle[dimen=middle,fillcolor=white,fillstyle=solid](\measuresymbolwidth,-0.866025403784\measuresymbolwidth)% + \end{pspicture}% + } +} + +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \drawmscframe draws a frame of the right size around the msc +% This command also set the value of \msc@totalsizebox +\def\msc@drawframe{% + \ifthenelse{\equal{\msc@frame}{yes}}{% + \psframe[dimen=middle](0,0)(\msc@currentwidth,-\msc@currentheight)% + }{% no frame drawing + }% +} +% +% \msckeyword is the keyword representation of msc +\def\msckeyword{msc} +\def\msckeywordstyle#1{\textbf{#1}} +% +% This keyword can be changed by the \setmsckeyword command (or by \renewcommand{\msckeyword}{...}): +\newcommand{\setmsckeyword}[1]{\def\msckeyword{#1}} +\newcommand{\setmsckeywordstyle}[1]{\def\msckeywordstyle{#1}}% +% +% Commands to switch internal options that control the drawing of header and footer symbols +\newcommand{\drawinsthead}[1]{\def\msc@insthead{#1}}% +\drawinsthead{yes}% +\newcommand{\drawinstfoot}[1]{\def\msc@instfoot{#1}}% +\drawinstfoot{yes}% +% A similar command to control drawing of the msc-frame +\newcommand{\drawframe}[1]{\def\msc@frame{#1}}% +\drawframe{yes}% +% +% +\def\msc@grid{no}% +\newcommand{\showgrid}{\def\msc@grid{yes}} +\newcommand{\nogrid}{\def\msc@grid{no}} + + +\def\msc@settitle{% +\MSC@settitle{msc}% + {0\mscunit}% + {-\msc@totalheight}% + {\msc@totalwidth}% + {0\mscunit}% + {\msc@titlejustification}% + {\msckeywordstyle{\msckeyword}{} \msc@title}% +} + +% +% \msc@title stores the title given in \begin{msc}{title} +\def\msc@title{}% +% +% \msc@titlejustification says how the title should be justified +% Justification is relative to the total width of the msc +% l: left (default) +% c: centered +% r: right +% +\newsavebox{\mscbox}% +% +% the msc-environment +\newenvironment{msc}[2][l]{% +\message{(\msckeyword: '#2'}% +\def\msc@titlejustification{#1}% +\def\msc@title{#2}% +\setcounter{mscinstcnt}{0}% +\setlength{\msc@currentheight}{\topheaddist}% +\addtolength{\msc@currentheight}{\instheadheight}% +\addtolength{\msc@currentheight}{\firstlevelheight}% +\setlength{\msc@currentwidth}{0pt}% +% define the artificial left and right environment instances +\msc@declinst{envleft}{}{}{\the\instbarwidth}% +\msc@setinstxpos{envleft}{0pt}% +\msc@declinst{envright}{}{}{\the\instbarwidth}% +\msc@setinstxpos{envright}{\envinstdist}% +\begin{lrbox}{\mscbox}% +\begin{pspicture}(0,0)% we draw the msc in a picture of size 0x0 +\psset{dash=4pt 4pt}% sets the hashed linestyle style +}{% + \addtolength{\msc@currentheight}{\lastlevelheight}% + \setcounter{tmpcnt}{2}% + \msc@drawinstancefooters% +% If there is at least one instance, the current width is +% set to the xpos of the NEXT msc instance. There is at least one instance, +% if mscinstcnt >= 2. So, in that case, we have to +% substract one \instdist from the current width. +% +%\ifthenelse{\value{mscinstcnt}<2}{% no user defined instances, so, relax +% \relax% +%}{% mscinstcnt >= 2 +% \addtolength{\msc@currentwidth}{-\instdist}% +%}% +% Now we compute the final current width: one extra \envinstdist: +\setlength{\msc@currentwidth}{\msc@instxpos{envright}}% +\addtolength{\msc@currentheight}{\instfootheight+\bottomfootdist}% +\msc@drawframe% +\global\msc@totalwidth=\msc@currentwidth% +\global\msc@totalheight=\msc@currentheight% +\ifthenelse{\equal{\msc@grid}{yes}}{% + \psgrid[subgriddiv=1,griddots=10](0,0)(0,0)(\msc@currentwidth,-\msc@currentheight)% +}{\relax}% +\msc@settitle% +\end{pspicture}% +% Debug info: +%\typeout{msc size: \the\msc@totalwidth x\the\msc@totalheight}% +\end{lrbox}% +% the \mscbox now contains a box of 0x0, however the actual width and +% height are stored in \msc@total{width,height}. We use these lengths +% to adjust the width and height of the \mscbox +\wd\mscbox=\msc@totalwidth% +\ht\mscbox=\msc@totalheight% +\dp\mscbox=0pt% +% Now the \mscbox can be scaled (by \mscscalefactor) and `printed': +{% DEBUG: use this \fbox stuf to check the bounding box + \setlength{\fboxrule}{0.01pt}% + \setlength{\fboxsep}{1pt}% + \color{white}\mbox{% + \psscalebox{\mscscalefactor}{\raisebox{\msc@totalheight}[\msc@totalheight][0pt]{\usebox{\mscbox}}}% + }% +}% +\message{)}% +}% +% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\MSC@settitle}[7]{% + % #1: diagram type (msc, mscdoc, hmsc) + % #2: llx + % #3: lly + % #4: urx + % #5: ury + % #6: justification (l, c, r) + % #7: typeset title + \setlength{\tmp@X}{#4 - #2 - 2\leftnamedist}% + \ifthenelse{\equal{#6}{l}}% + {% + \def\MSC@dosettitle{\parbox[t]{\tmp@X}{\raggedright #7}}% + }% + {\ifthenelse{\equal{#6}{c}}% + {% + \def\MSC@dosettitle{\parbox[t]{\tmp@X}{\centering #7}}% + }% + {\ifthenelse{\equal{#6}{r}}% + {% + \def\MSC@dosettitle{\parbox[t]{\tmp@X}{\raggedleft #7}}% + }% + {\msc@illegaltitleplacement{#6}}% + }% + }% + \setlength{\tmp@Y}{#5 - \topnamedist}% + \setlength{\tmp@Xb}{#2 + \leftnamedist}% + \rput[tl](\tmp@Xb,\tmp@Y){\MSC@dosettitle}% +} + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% MSC documents +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \mscdockeyword is the keyword representation of msc +\def\mscdockeyword{mscdoc} +\def\mscdockeywordstyle#1{\textbf{#1}} +% +% This keyword can be changed by the \setmscdockeyword command (or by \renewcommand{\mscdockeyword}{...}): +\newcommand{\setmscdockeyword}[1]{\def\mscdockeyword{#1}} +\newcommand{\setmscdockeywordstyle}[1]{\def\mscdockeywordstyle{#1}}% + +\newcommand{\mscdoc@settitle}{% + \MSC@settitle{mscdoc}% + {\mscdoc@llx}% + {\mscdoc@lly}% + {\mscdoc@urx}% + {\mscdoc@ury}% + {\mscdoc@titlejustification}% + {\mscdockeywordstyle{\mscdockeyword}{} \mscdoc@title}% +} + +\newenvironment{mscdoc}[2][l]% +{% + \message{( \mscdockeyword: '#2'}% + \def\mscdoc@titlejustification{#1}% + \def\mscdoc@title{#2}% + \def\reference##1(##2,##3){% + \setlength{\tmp@X}{\mscdocreferencewidth}% + \setlength{\tmp@Y}{\mscdocreferenceheight}% + \def\txt{\vbox to \tmp@Y{\vss\hbox to \tmp@X{\hss{}##1\hss}\vss}}% + \rput(##2\mscunit,##3\mscunit){\psframebox[% + framearc=0.25,% + framesep=0pt,% + border=0pt% + ]{\txt}}}% + \def\separator##1{% + \psline[linestyle=dashed](\mscdoc@llx,##1)(\mscdoc@urx,##1) + }% + \def\mscdoc@sizespec(##1,##2)(##3,##4)% + {% + \def\mscdoc@llx{##1\mscunit}% + \def\mscdoc@lly{##2\mscunit}% + \def\mscdoc@urx{##3\mscunit}% + \def\mscdoc@ury{##4\mscunit}% +\begin{lrbox}{\mscbox}% + \begin{pspicture}(\mscdoc@llx,\mscdoc@lly)(\mscdoc@urx,\mscdoc@ury)% + \ifthenelse{\equal{\msc@grid}{yes}}{% + \psgrid[subgriddiv=1,griddots=10](\mscdoc@llx,\mscdoc@lly)(\mscdoc@urx,\mscdoc@ury)% + }{\relax}% + \ifthenelse{\equal{\msc@frame}{yes}}{% + \psframe(\mscdoc@llx,\mscdoc@lly)(\mscdoc@urx,\mscdoc@ury)% + }{\relax}% + \mscdoc@settitle% + }% + \mscdoc@sizespec% +}% +{% + \end{pspicture}% +\end{lrbox}% +{% DEBUG: use this \fbox stuf to check the bounding box + \setlength{\fboxrule}{0.01pt}% + \setlength{\fboxsep}{1pt}% + \color{white}\fbox{% + \usebox{\mscbox}% + }% +}% + \message{)}% +} + +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% HMSC +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\RequirePackage{pst-node} + + +\newcommand{\hmsckeyword}{hmsc} +\newcommand{\hmsckeywordstyle}[1]{\textbf{#1}} + +% This keyword can be changed by the \sethmsckeyword command (or by \renewcommand{\hmsckeyword}{...}): +\newcommand{\sethmsckeyword}[1]{\def\hmsckeyword{#1}} +\newcommand{\sethmsckeywordstyle}[1]{\def\hmsckeywordstyle{#1}}% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newif\if@ncsegline + + +% +% User command to draw a segmented line between two nodes (buggy). +% +% NOTE: this implementation is not complete yet. The optional arrows argument +% only makes sense for forward arrows (and even then in a limited way). +% usage: \ncsegline[settings]{arrows}{#1}[(x0,y0)...(xn,xy)]{#2} +% settings (optional): pstricks settings for lines +% arrows(optional): pstricks-style arrow defintions +% #1: start node +% (x0,y0)...(xn,yn) (optional): sequence of intermediate points +% #2: end node +\def\ncsegline{% + \@ifstar{\def\@nclinecommand{\ncline*}\@ncseglinei}{\def\@nclinecommand{\ncline}\@ncseglinei}% +} + +\def\ncseglinecheck@arrow#1#2{% + \ncseglinecheck@@arrow#2-\@nil + \if@ncsegline% +% \message{(arrow: `#2')}% + \edef\@ncseglinearrow{{#2}}% + \def\next{#1}% + \else% +% \message{(no arrow `#2')}% + \edef\@ncseglinearrow{{-}}% + \def\next{#1{#2}}% + \fi% + \next% +} + +\def\ncseglinecheck@@arrow#1-#2\@nil{% +\ifx\@nil#2\@nil\@ncseglinefalse\else\@ncseglinetrue\fi} + +\def\@ncseglinei{% + \@ifnextchar[{\@ncseglineReadSettings}{\def\@nclinesettings{[]}\ncseglinecheck@arrow{\@ncseglineii}}%] +} + +\def\@ncseglineReadSettings[#1]{% + \def\@nclinesettings{[#1]}% + \ncseglinecheck@arrow{\@ncseglineii}% +} + +\def\@ncseglineii#1{% + \def\@ncsegargA{#1}% + \@ifnextchar[{\@ncseglineiii}{\@ncseglineiv}% +} + +\def\@ncseglineiii[#1]#2{% + \@ncseglineA#1(\relax,\relax)% + \def\@ncsegargB{#2}% + \@ncseglinedraw% +} + +\def\@ncseglineiv#1{% + \def\@ncsegargB{#1}% + \@ncseglinedraw% +} + +\def\@ncseglinedraw{% + \edef\@ncseglineattrs{\@nclinesettings\@ncseglinearrow}% + \expandafter\@nclinecommand\@ncseglineattrs{\@ncsegargA}{\@ncsegargB}% +} + +\def\@ncseglineA(#1,#2){% + \ifx#1\relax% + \def\next{\relax}% + \else% +% \message{(line seg)}% + \pnode(#1,#2){#1#2}% + \expandafter\@nclinecommand\@nclinesettings{-}{\@ncsegargA}{#1#2}% + \edef\@ncsegargA{#1#2}% + \def\next{\@ncseglineA}% + \fi + \next% +} + +% User command to draw hmsc start symbols +% usage: \hmscstartsymbol{#1}(#2,#3) +% #1: nickname +% #2: x-coordinate +% #3: y-coordinate +% +% +% sin(pi/3) =~ 0.866025403784 +% +\def\hmscstartsymbol#1(#2,#3){% + %\message{(hmsc start symbol: #1)}% + \setlength{\tmp@Xa}{#2\mscunit}% + \setlength{\tmp@Ya}{#3\mscunit}% + \setlength{\tmp@Xb}{\tmp@Xa}\addtolength{\tmp@Xb}{-.5\hmscstartsymbolwidth}% + \setlength{\tmp@Xc}{\tmp@Xa}\addtolength{\tmp@Xc}{.5\hmscstartsymbolwidth}% + \setlength{\tmp@Yb}{\tmp@Ya}\addtolength{\tmp@Yb}{0.866025403784\hmscstartsymbolwidth}% + \pspolygon(\tmp@Xa,\tmp@Ya)(\tmp@Xb,\tmp@Yb)(\tmp@Xc,\tmp@Yb)% + \pnode(#2,#3){#1}% +} + + +% User command to draw hmsc end symbols +% usage: \hmscendsymbol{#1}(#2,#3) +% #1: nickname +% #2: x-coordinate +% #3: y-coordinate +% +% +% sin(pi/3) =~ 0.866025403784 +% +\def\hmscendsymbol#1(#2,#3){% + %\message{(hmsc end symbol: #1)}% + \setlength{\tmp@Xa}{#2\mscunit}% + \setlength{\tmp@Ya}{#3\mscunit}% + \setlength{\tmp@Xb}{\tmp@Xa}\addtolength{\tmp@Xb}{-.5\hmscstartsymbolwidth}% + \setlength{\tmp@Xc}{\tmp@Xa}\addtolength{\tmp@Xc}{.5\hmscstartsymbolwidth}% + \setlength{\tmp@Yb}{\tmp@Ya}\addtolength{\tmp@Yb}{-0.866025403784\hmscstartsymbolwidth}% + \pspolygon(\tmp@Xa,\tmp@Ya)(\tmp@Xb,\tmp@Yb)(\tmp@Xc,\tmp@Yb)% + \pnode(#2,#3){#1}% +} + +% User command to draw a hmsc condition +% usage: \hmsccondition{#1}{#2}(#3,#4) +% #1: nickname +% #2: text +% #3: x-coordinate +% #4: y-coordinate +\def\hmsccondition#1#2(#3,#4){% + \setlength{\tmp@X}{.5\hmscconditionwidth}% + \setlength{\tmp@Y}{.5\hmscconditionheight}% + \setlength{\tmp@Xa}{\tmp@X}\addtolength{\tmp@Xa}{.6\tmp@Y}% + \rput(#3\mscunit,#4\mscunit){% + \pspolygon(-\tmp@X,\tmp@Y)% + (\tmp@X,\tmp@Y)% + (\tmp@Xa,0)% + (\tmp@X,-\tmp@Y)% + (-\tmp@X,-\tmp@Y)% + (-\tmp@Xa,0)}% + \setlength{\tmp@X}{\hmscconditionwidth}% + \setlength{\tmp@Y}{\hmscconditionheight}% + \def\ctxt{\vbox to \tmp@Y{\vss\hbox to \tmp@X{\hss{}#2\hss}\vss}}% + \rput(#3\mscunit,#4\mscunit){\rnode{#1}{\psframebox[% + linestyle=none,% + linewidth=0pt,% + framesep=0pt,% + border=0pt% + ]{\ctxt}}}% +} + +% User command to draw a hmsc reference +% usage: \hmscreference{#1}{#2}(#3,#4) +% #1: nickname +% #2: text +% #3: x-coordinate +% #4: y-coordinate +\def\hmscreference#1#2(#3,#4){% + \setlength{\tmp@X}{\hmscreferencewidth}% + \setlength{\tmp@Y}{\hmscreferenceheight}% + \def\rtxt{\vbox to \tmp@Y{\vss\hbox to \tmp@X{\hss{}#2\hss}\vss}}% + \rput(#3\mscunit,#4\mscunit){\rnode{#1}{\psframebox[% + framearc=0.25,% + framesep=0pt,% + border=0pt% + ]{\rtxt}}}% +} + +% User command to draw hmsc connections +% usage: \hmscconnection{#1}(#2,#3) +% #1: nickname +% #2: x-coordinate +% #3: y-coordinate +\def\hmscconnection#1(#2,#3){% + \rput(#2,#3){\circlenode[framesep=0pt]{#1}{\rule{0pt}{2\hmscconnectionradius}}}% +} + + + +% User command to draw arrows between hmsc-objects +% Usage: \arrow{#1}[(x0,y0)...(xn,yn)]{#2} +% #1: start hmsc object +% (x0,y0)...(xn,yn) (optional): sequence of intermediate points +% #2: end hmsc object +\newcommand{\arrow}{ + \ncsegline{->}% +} + + + +% User environment to draw hmsc's +% Usage: \begin{hmsc}{#1}(llx,lly((urx,ury)...\end{hmsc} +% + + +\def\hmsc@settitle{% + \MSC@settitle{hmsc}% + {\hmsc@llx}% + {\hmsc@lly}% + {\hmsc@urx}% + {\hmsc@ury}% + {\hmsc@titlejustification}% + {\hmsckeywordstyle{\hmsckeyword}{} \hmsc@title}% +% \setlength{\tmp@X}{\hmsc@llx + \leftnamedist}% +% \setlength{\tmp@Y}{\hmsc@ury - \topnamedist}% +% \rput[tl](\tmp@X,\tmp@Y){% +% \hmsckeywordstyle{\hmsckeyword}{} \hmsc@title% +% }% +} + +\newenvironment{hmsc}[2][l] + {\message{( \hmsckeyword: '#2'}% + \def\hmsc@titlejustification{#1}% + \def\hmsc@title{#2}% + \hmsc@startenv}% + {%\setlength{\tmp@X}{\hmsc@llx}\addtolength{\tmp@X}{\leftnamedist}% + %\setlength{\tmp@Y}{\hmsc@ury}\addtolength{\tmp@Y}{-\topnamedist}% + %\rput[tl](\tmp@X,\tmp@Y){\raisebox{\depth}[\totalheight][0pt]{\hmsckeywordstyle{\hmsckeyword} \hmsc@name}}% + \hmsc@settitle% + \ifthenelse{\equal{\msc@frame}{yes}}{% + \psframe(\hmsc@llx,\hmsc@lly)(\hmsc@urx,\hmsc@ury)% + }{\relax}% + \end{pspicture}% +\end{lrbox}% +{% DEBUG: use this \fbox stuf to check the bounding box + \setlength{\fboxrule}{0.01pt}% + \setlength{\fboxsep}{1pt}% + \color{white}\fbox{% + \usebox{\mscbox}% + }% +}% + \message{)}}% +\def\hmsc@startenv(#1,#2)(#3,#4){% + \newcommand{\hmsc@llx}{#1\mscunit}% + \newcommand{\hmsc@lly}{#2\mscunit}% + \newcommand{\hmsc@urx}{#3\mscunit}% + \newcommand{\hmsc@ury}{#4\mscunit}% +\begin{lrbox}{\mscbox}% + \begin{pspicture}(\hmsc@llx,\hmsc@lly)(\hmsc@urx,\hmsc@ury)% + \ifthenelse{\equal{\msc@grid}{yes}}{% + \psgrid[subgriddiv=1,griddots=10](\hmsc@llx,\hmsc@lly)(\hmsc@urx,\hmsc@ury)% + }{\relax}% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Initialisation of the msc package +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \set@mscvalueslarge +\def\set@mscvalueslarge{% + \psset{linewidth=0.8pt} + % the lengths + \setlength{\actionheight}{0.75\mscunit} + \setlength{\actionwidth}{1.25\mscunit} + \setlength{\bottomfootdist}{1\mscunit} + \setlength{\msccommentdist}{1.5\mscunit} + \setlength{\conditionheight}{0.75\mscunit} + \setlength{\conditionoverlap}{0.6\mscunit} + \setlength{\envinstdist}{2.5\mscunit} + \setlength{\firstlevelheight}{0.75\mscunit} + \setlength{\hmscconditionheight}{0.8\mscunit} + \setlength{\hmscconditionwidth}{1.6\mscunit} + \setlength{\hmscconnectionradius}{0.06\mscunit} + \setlength{\hmscreferenceheight}{0.8\mscunit} + \setlength{\hmscreferencewidth}{1.6\mscunit} + \setlength{\hmscstartsymbolwidth}{0.85\mscunit} + \setlength{\inlineoverlap}{1.5\mscunit} + \setlength{\instbarwidth}{0pt} + \setlength{\instdist}{3\mscunit} + \setlength{\instfootheight}{0.25\mscunit} + \setlength{\instheadheight}{.6\mscunit} + \setlength{\instwidth}{1.75\mscunit} + \setlength{\labeldist}{1ex} + \setlength{\lastlevelheight}{0.5\mscunit} + \setlength{\leftnamedist}{0.3\mscunit} + \setlength{\levelheight}{.75\mscunit} + \setlength{\lostsymbolradius}{.15\mscunit} + \setlength{\markdist}{1\mscunit} + \setlength{\measuredist}{0.75\mscunit} + \setlength{\measuresymbolwidth}{.15\mscunit} + \setlength{\mscdocreferenceheight}{0.8\mscunit} + \setlength{\mscdocreferencewidth}{1.6\mscunit} + \setlength{\referenceoverlap}{1.5\mscunit} + \setlength{\regionbarwidth}{.5\mscunit} + \setlength{\selfmesswidth}{.75\mscunit} + \setlength{\stopwidth}{0.6\mscunit} + \setlength{\timerwidth}{0.4\mscunit} + \setlength{\topheaddist}{1.5\mscunit} + \setlength{\topnamedist}{.3\mscunit} + % some numeric parameters + \messarrowscale{2} +} +% +% +% \set@mscvaluesnormal +\def\set@mscvaluesnormal{% + \psset{linewidth=0.7pt} + % switch to a smaller font + \small% + % the lengths + \setlength{\actionheight}{0.6\mscunit} + \setlength{\actionwidth}{1.25\mscunit} + \setlength{\bottomfootdist}{0.7\mscunit} + \setlength{\msccommentdist}{1.1\mscunit} + \setlength{\conditionheight}{0.6\mscunit} + \setlength{\conditionoverlap}{0.5\mscunit} + \setlength{\envinstdist}{2\mscunit} + \setlength{\firstlevelheight}{0.6\mscunit} + \setlength{\hmscconditionheight}{0.7\mscunit} + \setlength{\hmscconditionwidth}{1.4\mscunit} + \setlength{\hmscconnectionradius}{0.05\mscunit} + \setlength{\hmscreferenceheight}{0.7\mscunit} + \setlength{\hmscreferencewidth}{1.4\mscunit} + \setlength{\hmscstartsymbolwidth}{0.7\mscunit} + \setlength{\inlineoverlap}{1\mscunit} + \setlength{\instbarwidth}{0pt} + \setlength{\instdist}{2.2\mscunit} + \setlength{\instfootheight}{0.2\mscunit} + \setlength{\instheadheight}{.55\mscunit} + \setlength{\instwidth}{1.6\mscunit} + \setlength{\labeldist}{1ex} + \setlength{\lastlevelheight}{0.4\mscunit} + \setlength{\leftnamedist}{0.2\mscunit} + \setlength{\levelheight}{.5\mscunit} + \setlength{\lostsymbolradius}{.12\mscunit} + \setlength{\markdist}{1\mscunit} + \setlength{\measuredist}{0.6\mscunit} + \setlength{\measuresymbolwidth}{.2\mscunit} + \setlength{\mscdocreferenceheight}{0.7\mscunit} + \setlength{\mscdocreferencewidth}{1.4\mscunit} + \setlength{\referenceoverlap}{1\mscunit} + \setlength{\regionbarwidth}{.4\mscunit} + \setlength{\selfmesswidth}{.6\mscunit} + \setlength{\stopwidth}{0.5\mscunit} + \setlength{\timerwidth}{0.3\mscunit} + \setlength{\topheaddist}{1.3\mscunit} + \setlength{\topnamedist}{.2\mscunit} + % some numeric parameters + \messarrowscale{1.5} +} +% +% \set@mscvaluessmall +\def\set@mscvaluessmall{% + \psset{linewidth=0.6pt} + % switch to a smaller font + \small% + % the lengths + \setlength{\actionheight}{0.5\mscunit} + \setlength{\actionwidth}{1.2\mscunit} + \setlength{\bottomfootdist}{0.5\mscunit} + \setlength{\msccommentdist}{0.75\mscunit} + \setlength{\conditionheight}{0.5\mscunit} + \setlength{\conditionoverlap}{0.4\mscunit} + \setlength{\envinstdist}{1.2\mscunit} + \setlength{\firstlevelheight}{0.4\mscunit} + \setlength{\hmscconditionheight}{0.6\mscunit} + \setlength{\hmscconditionwidth}{1.2\mscunit} + \setlength{\hmscconnectionradius}{0.04\mscunit} + \setlength{\hmscreferenceheight}{0.6\mscunit} + \setlength{\hmscreferencewidth}{1.2\mscunit} + \setlength{\hmscstartsymbolwidth}{0.4\mscunit} + \setlength{\inlineoverlap}{.75\mscunit} + \setlength{\instbarwidth}{0pt} + \setlength{\instdist}{1.5\mscunit} + \setlength{\instfootheight}{0.15\mscunit} + \setlength{\instheadheight}{0.5\mscunit} + \setlength{\instwidth}{1.2\mscunit} + \setlength{\labeldist}{0.8ex} + \setlength{\lastlevelheight}{0.3\mscunit} + \setlength{\leftnamedist}{0.1\mscunit} + \setlength{\levelheight}{0.4\mscunit} + \setlength{\lostsymbolradius}{.08\mscunit} + \setlength{\markdist}{1\mscunit} + \setlength{\measuredist}{0.4\mscunit} + \setlength{\measuresymbolwidth}{.25\mscunit} + \setlength{\mscdocreferenceheight}{0.6\mscunit} + \setlength{\mscdocreferencewidth}{1.2\mscunit} + \setlength{\referenceoverlap}{.75\mscunit} + \setlength{\regionbarwidth}{.2\mscunit} + \setlength{\selfmesswidth}{.4\mscunit} + \setlength{\stopwidth}{0.3\mscunit} + \setlength{\timerwidth}{0.2\mscunit} + \setlength{\topheaddist}{1.2\mscunit} + \setlength{\topnamedist}{.1\mscunit} + % some numeric parameters + \messarrowscale{1.2} +} +% \setmscvalues assigns compatible values to all msc-parameters +% Currently, three sets of values are supported: large, normal +% and small. +\def\setmscvalues#1{% + \ifthenelse{\equal{#1}{large}}{% + \set@mscvalueslarge}{% + \ifthenelse{\equal{#1}{normal}}{% + \set@mscvaluesnormal}{% + \ifthenelse{\equal{#1}{small}}{% + \set@mscvaluessmall}{% + \ifthenelse{\equal{#1}{measure}}{% + \set@mscvaluesmeasure}{% + \msc@unknownmscvalueserr{#1}}}}}% +} +% +% initialisation of the msc-parameters +\setmscvalues{normal} +\setfootcolor{black} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Error and help messages +% We use the standard LaTeX2e facilities to generate error and help +% messages (for more info, see file lterror.dtx of LaTeX2e distribution). +% +% +% nickname already defined +\gdef\msc@nicknamedefinederr#1{% + \PackageError{msc}{% error message + nickname #1 already defined}{% help text + You tried to use the nickname '#1' for a new\MessageBreak + msc object (instance, reference, inline expression, etc.),\MessageBreak + but the nickname is already assigned to another msc object.\MessageBreak + press <enter> to continue (the new msc object will be ignored).}% +} +% +% no such msc instance error +\gdef\msc@instundefinederr#1{% + \PackageError{msc}{% error message + undefined msc instance: #1}{% help text + You used '#1' as an msc instance nickname, but\MessageBreak + there is no msc instance with that nickname.}% +} +% +% unknown linestyle error +\gdef\msc@unknownlinestyleerr#1{% + \PackageError{msc}{% error message + unknown linestyle: #1}{% help text + Known msc linestyles are "solid", "dashed", and "dotted".\MessageBreak + You used '#1'.}% +} +% +% unknown region style error +\gdef\msc@unknownregionstyleerr#1{% + \PackageError{msc}{% error message + unknown region style: #1}{% help text + Known msc region styles are "normal", "coregion", "suspension", and "activation".\MessageBreak + You used '#1'.}% +} +% +% unknown self message label position error +\gdef\msc@unknownselfmessposerr#1{% + \PackageError{msc}{% error message + unknown position for self message: #1}{% help text + Known positions are "l" (left), "r" (right).\MessageBreak + You used '#1'.}% +} +% +% unknown self message label position error +\gdef\msc@unknowntimerposerr#1{% + \PackageError{msc}{% error message + unknown timer position: #1}{% help text + Known timer positions are "l" (left), "r" (right).\MessageBreak + You used '#1'.}% +} +% +% unknown self message label position error +\gdef\msc@unknownmscvalueserr#1{% + \PackageError{msc}{% error message + unknown set of msc-values: #1}{% help text + Known sets of msc-values are "normal" and "small".\MessageBreak + You used '#1'.}% +} +% +% no such msc reference error +\gdef\msc@refundefinederr#1{% + \PackageError{msc}{% error message + undefined reference: #1}{% help text + You used '#1' as a reference nickname, but\MessageBreak + there is no reference with that nickname.}% +} +% +% no such msc inline error +\gdef\msc@inlundefinederr#1{% + \PackageError{msc}{% error message + undefined inline expression: #1}{% help text + You used '#1' as a inline expression nickname, but\MessageBreak + there is no inline expression with that nickname.}% +} +% +% inline first right from last error +\gdef\msc@inlfirstlasterror#1#2#3{% + \PackageError{msc}{% error message + first instance right from final instance\MessageBreak in inline expression #1}{% help text + In the definition of inline expression '#1', you probably switched\MessageBreak + the first msc instance, '#2', and the final msc instance, '#3',\MessageBreak + since the first is located right from the final.}% +} +% +% reference first rightt from last error +\gdef\msc@reffirstlasterror#1#2#3{% + \PackageError{msc}{% error message + first instance right from final instance\MessageBreak in reference #1}{% help text + In the definition of msc reference '#1', you probably switched\MessageBreak + the first msc instance, '#2', and the final msc instance, '#3',\MessageBreak + since the first is located right from the final.}% +} +% +\gdef\msc@illegalmarkplacement#1{% + \PackageError{msc}{% + illegal mark placement specifier: #1}{% help text + The four mark placement specifiers are:\MessageBreak + tl (top-left)\MessageBreak + bl (bottom-left)\MessageBreak + tr (top-right)\MessageBreak + br (bottom-right)} +} +\gdef\msc@illegalmesslabelpositionerr#1{% + \PackageError{msc}{% + illegal label position specifier: #1}{% help text + Valid label position specifiers are:\MessageBreak + t (top)\MessageBreak + b (bottom)} +} +\gdef\msc@illegalselfmesspositionerr#1{% + \PackageError{msc}{% + illegal label position: #1}{% help text + Valid label positions are:\MessageBreak + t (top)\MessageBreak + b (bottom)\MessageBreak + l (left)\MessageBreak + r (right)} +} +\gdef\msc@illegallostfoundlabelpositionerr#1{% + \PackageError{msc}{% + in lost/found message: illegal label position: #1}{% help text + Valid label position are:\MessageBreak + t (top)\MessageBreak + b (bottom)} +} +%################################################################################ +% +\gdef\msc@illegaltitleplacement#1{% + \PackageError{msc}{% + illegal title placement specifier: #1}{% help text + Valid title placement specifiers are:\MessageBreak + l (left)\MessageBreak + c (center)\MessageBreak + r (right)} +} +%################################################################################ +\gdef\hmsc@nicknamedefinederr#1{% + \PackageError{msc}{% error message + nickname #1 already defined}{% help text + You tried to use the nickname '#1' for a new\MessageBreak + hmsc object (startsymbol, endsymbol, reference, etc.),\MessageBreak + but the nickname is already assigned to another hmsc object.\MessageBreak + press <enter> to continue (the new hmsc object will be ignored).}% +} +% no such msc hmsc object error +\gdef\hmsc@objectundefinederr#1{% + \PackageError{msc}{% error message + undefined hmsc object: #1}{% help text + You used '#1' as an hmsc object nickname, but\MessageBreak + there is no hmsc object with that nickname.}% +}% +% hmsc unknown connection type +\gdef\hmsc@unknownconnectiontypeerror#1{% + \PackageError{msc}{% error message + Unknown HMSC connection type: #1}{% help text + Known HMSC connection types are straight, rounded, and curved.}% +} +% +% hmsc missing y coordinate in arrow specification +\gdef\hmsc@missingycoord#1#2{% + \PackageError{msc}{% error message + Missing Y coordinate in arrow specification. You typed:\MessageBreak + [#2]\MessageBreak + which is parsed as the incomplete list of points:\MessageBreak + #1\MessageBreak + Remove the final X coordinate or add an Y coordinate}{% + The points specifying an HMSC arrow should be given as a comma separated\MessageBreak + list of X, Y coordinates. Furthermore, each X coordinate should\MessageBreak + be followed by a Y coordinate.}% +} +% remarks +% +% Issuing pstricks drawing-commands inside a TeX-group in a pspicture environment +% can result in ill-positioned objects. +% +% messages from/to the right environment should be defined after the last +% instance is declared with \declinst + diff --git a/macros/latex/contrib/msc/refman.pdf b/macros/latex/contrib/msc/refman.pdf Binary files differnew file mode 100644 index 0000000000..8423cc8ade --- /dev/null +++ b/macros/latex/contrib/msc/refman.pdf diff --git a/macros/latex/contrib/msc/refman.tex b/macros/latex/contrib/msc/refman.tex new file mode 100644 index 0000000000..84d6038163 --- /dev/null +++ b/macros/latex/contrib/msc/refman.tex @@ -0,0 +1,1547 @@ +% file: refman.tex +% Copyright 2008 V. Bos, T. van Deursen, and S. Mauw +% This file is part of the MSC Macro Package. +% +\documentclass[a4paper]{article} +\usepackage{a4wide} + +\usepackage{multicol} +\usepackage{msc} + +\newlength{\rpwidth} +\setlength{\rpwidth}{.5cm} +\newlength{\rpheight} +\setlength{\rpheight}{0.5\levelheight} +\newcommand{\rpN}{% + \psframe(-0.5\rpwidth,-\rpheight)(0.5\rpwidth,0\rpheight)% + \rput[B](0\rpwidth,-0.8\rpheight){\footnotesize \textsc{n}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpNE}{% + \psframe(-\rpwidth,-\rpheight)(0\rpwidth,0\rpheight)% + \rput[B](-.5\rpwidth,-0.8\rpheight){\footnotesize \textsc{ne}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpE}{% + \psframe(-\rpwidth,-.5\rpheight)(0\rpwidth,.5\rpheight)% + \rput[B](-.5\rpwidth,-0.3\rpheight){\footnotesize \textsc{e}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpSE}{% + \psframe(-\rpwidth,0\rpheight)(0\rpwidth,\rpheight)% + \rput[B](-.5\rpwidth,0.2\rpheight){\footnotesize \textsc{se}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpS}{% + \psframe(-.5\rpwidth,\rpheight)(.5\rpwidth,0\rpheight)% + \rput[t](0\rpwidth,0.8\rpheight){\footnotesize \textsc{s}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpSW}{% + \psframe(0\rpwidth,0\rpheight)(\rpwidth,\rpheight)% + \rput[B](.5\rpwidth,0.2\rpheight){\footnotesize \textsc{sw}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpW}{% + \psframe(0\rpwidth,-.5\rpheight)(\rpwidth,.5\rpheight)% + \rput[B](.5\rpwidth,-0.3\rpheight){\footnotesize \textsc{w}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} +\newcommand{\rpNW}{% + \psframe(0\rpwidth,-\rpheight)(\rpwidth,0\rpheight)% + \rput[B](.5\rpwidth,-0.8\rpheight){\footnotesize \textsc{nw}}% + \pscircle[fillstyle=solid,fillcolor=black](0\rpwidth,0\rpheight){.5\labeldist}% +} + + + +% The following code is taken from the doc package. It defines a global +% macro \bslash that produces a bslash (if present in the current font). +\makeatletter +{\catcode`\|=\z@ \catcode`\\=12 |gdef|bslash{\}} +\makeatother +\newcommand{\cmd}[1]{\texttt{\bslash #1}} + +\usepackage{url} +\newcommand{\acro}[1]{{\scshape\lowercase{#1}}} + +\newcommand\MSC{\acro{MSC}} +\newcommand\HMSC{\acro{HMSC}} +\newcommand{\MSCdoc}{\MSC{}doc} +\newcommand{\mscpack}{\MSC{} macro package} + +\newcommand{\env}[1]{\texttt{#1}} +\newcommand{\opt}[1]{[#1]} +\newcommand{\cmdarg}[1]{\{\emph{#1}\}} +\newcommand{\coordarg}[1]{\emph{#1}} +\newcommand{\coordargs}[2]{(\coordarg{#1},\coordarg{#2})} +\newcommand{\lnsvalue}[3]{large/normal/small value #1/#2/#3} + +\newenvironment{defs}{% + \begin{list}{}% + {\setlength{\labelwidth}{0pt}% + \setlength{\labelsep}{1em}% + \setlength{\leftmargin}{1em}% + \setlength{\parsep}{1ex}% + \setlength{\listparindent}{0pt}% + \setlength{\rightmargin}{0pt}% + \renewcommand{\makelabel}[1]{##1}% + \raggedright% + }% + }{% + \end{list}} + +\title{ + A \LaTeX\ macro package for Message Sequence Charts\\{\large Reference Manual} +} + +\author{ + \begin{tabular}{c} + \begin{tabular}{ccc} + Victor Bos & + Ton van Deursen & + Sjouke Mauw \\ + & + \scriptsize Universit\'e du Luxembourg & + \scriptsize Universit\'e du Luxembourg \\[-0.8ex] + \scriptsize \texttt{vbos@abo.fi} & + \scriptsize \texttt{ton.vandeursen@uni.lu} & + \scriptsize \texttt{sjouke.mauw@uni.lu} + \end{tabular}\\ + \end{tabular} +} + +\date{\small Version \mscversion, last update \today\\ + Describing \mscpack{} version \mscversion} + + + +\begin{document} +\maketitle + +\tableofcontents + +\section{Introduction} + +The \mscpack{} was developed to draw (actually, to write) +\emph{Message Sequence Charts} (\MSC{}s) with \LaTeX. The current +version supports most of the \MSC{} language standardized +in~\cite{z120}. The manual~\cite{BM02a} describes how to use the +\mscpack{} and is illustrated with numerous examples. This reference manual +briefly describes the main concepts of the package and it provides +lists of all available environments and commands. In addition, it +lists both the user-definable lengths and the internal lengths that +are used by the package to compute the layout of \MSC{}s. +\section{Concepts} + +The \mscpack{} offers three different kinds +of diagrams: + +\begin{itemize} +\item \MSC{} diagrams (normal \MSC{}s) +\item \HMSC{} diagrams (high level \MSC{}s) +\item \MSCdoc{} diagrams (\MSC{} documents) +\end{itemize} +For each of these diagrams, the package provides a \LaTeX{} +environment. Figure~\ref{fig:types:of:diagrams} shows an example of +each diagram. The source code for these diagrams is given in +Figure~\ref{fig:sources}. Depending on the environment, different +\mscpack{} commands can be used. Furthermore, since each environment +is implemented as a \texttt{pspicture} (see \textsf{pstricks} +documentation), it is possible to use \textsf{pstricks} commands +inside the \MSC{} environments. + +\begin{figure} +\begin{center} +\setmscvalues{small} +\begin{tabular}{ccc} +\begin{msc}% + {Example 1}% +\declinst{i}{$i$}{} +\declinst{j}{$j$}{} +\nextlevel +\mess{a}{i}{j} +\nextlevel[2] +\mess{b}{j}{i} +\nextlevel +\end{msc}% +% +& +\begin{hmsc}% + {Example 2}% + (0,0)(4,4.65) +\hmscstartsymbol{S}(2,3.75) +\hmscconnection{c}(2,3.25) +\hmscreference{R1}{A}(2,2.5) +\hmsccondition{C}{?}(2,1.5) +\hmscendsymbol{E}(1.5,0.5) +\arrow{S}{c} +\arrow{c}{R1} +\arrow{R1}{C} +\arrow{C} + [(2.5,1)(3,1)(3,3.25)] + {c} +\arrow{C}[(1.5,1)]{E} +\end{hmsc}% +& +\begin{mscdoc}% + {Example 3}% + (0,0)(4,4.65) +\reference{A}(1,3.0) +\reference{B}(3,3.0 ) +\separator{2.0} +\reference{C}(2,1.0) +\end{mscdoc}% +\\ +(a) \MSC{} diagram & +(b) \HMSC{} diagram & +(c) \MSCdoc{} diagram +\end{tabular} +\end{center} + +\caption{Examples of different diagrams} +\label{fig:types:of:diagrams} +\end{figure} + +\begin{figure}[htb] +\hrulefill +\begin{center} +\begin{minipage}[t]{0.3\linewidth} +\small +\begin{verbatim} +\begin{msc}% + {Example 1} +\declinst{i}{$i$}{} +\declinst{j}{$j$}{} +\nextlevel +\mess{a}{i}{j} +\nextlevel[2] +\mess{b}{j}{i} +\nextlevel +\end{msc} +\end{verbatim} +\end{minipage} +\hfil +\begin{minipage}[t]{0.3\linewidth} +\small +\begin{verbatim} +\begin{hmsc}% + {Example 2}% + (0,0)(4,4.65) +\hmscstartsymbol{S}(2,3.75) +\hmscconnection{c}(2,3.25) +\hmscreference{R1}{A}(2,2.5) +\hmsccondition{C}{?}(2,1.5) +\hmscendsymbol{E}(1.5,0.5) +\arrow{S}{c} +\arrow{c}{R1} +\arrow{R1}{C} +\arrow{C} + [(2.5,1)(3,1)(3,3.25)] + {c} +\arrow{C}[(1.5,1)]{E} +\end{hmsc} +\end{verbatim} +\end{minipage} +\hfil +\begin{minipage}[t]{0.3\linewidth} +\small +\begin{verbatim} +\begin{mscdoc}% + {Example 3}% + (0,0)(4,4.65) +\reference{A}(1,3.0) +\reference{B}(3,3.0 ) +\separator{2.0} +\reference{C}(2,1.0) +\end{mscdoc} +\end{verbatim} +\end{minipage} +\end{center} +\hrulefill +\caption{Source code for diagrams of Figure~\ref{fig:types:of:diagrams}} +\label{fig:sources} +\end{figure} + + +The \MSC{} environment provides most functionality of the package. The +following concepts should help in understanding the user-commands of +this environment. + + +\begin{defs} +\item[\emph{current height}] The \emph{current height} of an \MSC{} is a +length that indicates the y-postion relative to the top of the msc +frame. The \MSC{} drawing commands use this y-position to draw msc +symbols, e.g., instance heads, messages, actions, and instance +feet. The internal length \verb|\msc@currentheight| is the current +height. This variables is changed whenever the command +\verb|\nextlevel| is invoked. + +\item[\emph{current width}] The \emph{current width} of an \MSC{} is the +distance from the left side of the \MSC{} frame to the right side of the +\MSC{} frame. As such, it depends on the lengths \verb|\envinstdist| and +\verb|\instdist| as well as on the number of instances. The internal +length \verb|\msc@currentwidth| is the current width. During +construction of an msc, that is, in between \verb|\begin{msc}| and +\verb|\end{msc}|, \verb|\msc@currentwidth| is equal to +$\verb|\envinstdist| + (n \times \verb|instdist|)$, provided that~$n$ is +the number of instances defined so far (see \verb|\mscinstcnt| in the +section \emph{Internal counters} below) and the length +\verb|\instdist| is not changed between instances. At the end of an +\MSC{} construction, an additional \verb|\envinstdist| is added to +\verb|\msc@currentwidth|. The \verb|\msc@currentwidth| determines the +x-position of new \MSC{} instances. + +\item[\emph{level}] A level is a horizontal layer in an \MSC{} which is +used to construct msc's in a top-down fashion. Each level is +\verb|\levelheight| units high and spans the complete width of the +msc. The first level starts at $\verb|\topheaddist| + +\verb|\instheadheight| + \verb|\firstlevelheight|$ units below the top +of the \MSC{} frame. The \verb|\nextlevel| commands advances the \MSC{} to +the next (lower) level. + +\item[\emph{\MSC{} instance}] The main building blocks of MSC diagrams +are \emph{instances}. Instances are represented by vertical +bars. \emph{Fat} instances are represented by two vertical +lines. Usually, an instance has both a head symbol and a foot symbol. +In the \mscpack, each \MSC{} instance has a \emph{nickname} by which +the instance is identified. In the \mscpack{} there are special +instances: + +\begin{itemize} + +\item The left environment (nickname \verb|envleft|). + +\item The right environment (nickname \verb|envright|). + +\item The left side of an inline expression. If the nickname of the +inline expression is \verb|nm|, the nickname of the left side is +\verb|nmleft|. + +\item The right side of an inline expression. If the nickname of the +inline expression is \verb|nm|, the nickname of the left side is +\verb|nmright|. + +\item The left side of an reference expression. If the nickname of the +reference expression is \verb|nm|, the nickname of the left side is +\verb|nmleft|. + +\item The right side of an reference expression. If the nickname of the +reference expression is \verb|nm|, the nickname of the left side is +\verb|nmright|. + +\item A \emph{dummy} instance is an instance that is invisible; it +reserves space needed to draw an instance. It is useful to create +(see \verb|create| command) instances with create-messages. + +\end{itemize} + +\item[\emph{nickname}] A nickname is a unique identification of an +\emph{instance}. + +\item[\emph{message label reference points}] In order to place a +message label somewhere near the message arrow, the \mscpack{} +computes a \emph{reference point} for each message label. This is a +location on the bounding box of the label such that the distance +between the arrow and the reference point is minimized. Figures +\ref{fig:refpoints} (page~\pageref{fig:refpoints}) +and~\ref{fig:refpoints:B} (page~\pageref{fig:refpoints:B}) show the +location of reference points for all possible locations of message +labels. Note that the boxes with the location of the reference points +are not generated by the \LaTeX{} code given in these figures; we +enriched the \LaTeX{} code with some extra \textsf{pstricks} code (see +\LaTeX{} source code of this document). + +\end{defs} + +\begin{figure}[!htb] +\begin{minipage}{\linewidth} +\setmscvalues{small} +\begin{multicols}{2} +\begin{msc}{Label reference points} +\declinst{m0}{I0}{} +\declinst{m1}{I1}{} +\declinst{m2}{I2}{} +\nextlevel + +\mess{\rpS}{m0}{m1} +\nextlevel +\mess{\rpN}[b]{m1}{m2} +\nextlevel[2] + +\mess{\rpS}{m1}{m0} +\nextlevel +\mess{\rpN}[b]{m2}{m1} +\nextlevel[2] + +\mess{\rpE}{m0}{m0}[2] +\mess[r]{\rpW}{m2}{m2}[2] +\nextlevel[4] +\mess{\rpW}[r]{m0}{m0}[2] +\mess[r]{\rpE}[l]{m2}{m2}[2] +\nextlevel[6] + +\mess{\rpE}{m0}{m0}[-2] +\mess[r]{\rpW}{m2}{m2}[-2] +\nextlevel[4] +\mess{\rpW}[r]{m0}{m0}[-2] +\mess[r]{\rpE}[l]{m2}{m2}[-2] +\nextlevel[2] + +\mess{\rpSW}{m0}{m1}[2] +\mess{\rpNE}[b]{m1}{m2}[2] +\nextlevel[6] + +\mess{\rpSW}{m1}{m0}[-2] +\mess{\rpNE}[b]{m2}{m1}[-2] +\nextlevel[2] + +\mess{\rpSE}{m1}{m0}[2] +\mess{\rpNW}[b]{m2}{m1}[2] +\nextlevel[6] + +\mess{\rpSE}{m0}{m1}[-2] +\mess{\rpNW}[b]{m1}{m2}[-2] +\nextlevel[2] +\end{msc} +\bigskip + +\footnotesize +\begin{verbatim} +\begin{msc}{Label reference points} +\declinst{m0}{I0}{} +\declinst{m1}{I1}{} +\declinst{m2}{I2}{} +\nextlevel + +\mess{S}{m0}{m1} +\nextlevel +\mess{N}[b]{m1}{m2} +\nextlevel[2] + +\mess{S}{m1}{m0} +\nextlevel +\mess{N}[b]{m2}{m1} +\nextlevel[2] + +\mess{E}{m0}{m0}[2] +\mess[r]{W}{m2}{m2}[2] +\nextlevel[4] +\mess{W}[r]{m0}{m0}[2] +\mess[r]{E}[l]{m2}{m2}[2] +\nextlevel[6] + +\mess{E}{m0}{m0}[-2] +\mess[r]{W}{m2}{m2}[-2] +\nextlevel[4] +\mess{W}[r]{m0}{m0}[-2] +\mess[r]{E}[l]{m2}{m2}[-2] +\nextlevel[2] + +\mess{SW}{m0}{m1}[2] +\mess{NE}[b]{m1}{m2}[2] +\nextlevel[6] + +\mess{SW}{m1}{m0}[-2] +\mess{NE}[b]{m2}{m1}[-2] +\nextlevel[2] + +\mess{SE}{m1}{m0}[2] +\mess{NW}[b]{m2}{m1}[2] +\nextlevel[6] + +\mess{SE}{m0}{m1}[-2] +\mess{NW}[b]{m1}{m2}[-2] +\nextlevel[2] +\end{msc} +\end{verbatim} +\end{multicols} +\end{minipage} +\caption{Reference points of message labels} +\label{fig:refpoints} +\end{figure} + + +\begin{figure}[!htb] +\begin{minipage}{\linewidth} +\setmscvalues{small} +\begin{multicols}{2} +\begin{msc}{Label reference points (2)} +\declinst{m0}{I0}{} +\declinst{m1}{I1}{} +\declinst{m2}{I2}{} +\nextlevel + +\mess{\rpS}{m0}[.9]{m1} +\nextlevel +\mess{\rpN}[b]{m1}[.9]{m2} +\nextlevel[2] + +\mess{\rpS}{m1}[.9]{m0} +\nextlevel +\mess{\rpN}[b]{m2}{m1} +\nextlevel[2] + +\mess{\rpE}{m0}[.9]{m0}[2] +\mess[r]{\rpW}{m2}[.9]{m2}[2] +\nextlevel[4] +\mess{\rpW}[r]{m0}[.9]{m0}[2] +\mess[r]{\rpE}[l]{m2}[.9]{m2}[2] +\nextlevel[6] + +\mess{\rpE}{m0}[.9]{m0}[-2] +\mess[r]{\rpW}{m2}[.9]{m2}[-2] +\nextlevel[4] +\mess{\rpW}[r]{m0}[.9]{m0}[-2] +\mess[r]{\rpE}[l]{m2}[.9]{m2}[-2] +\nextlevel[2] + +\mess{\rpSW}{m0}[.9]{m1}[2] +\mess{\rpNE}[b]{m1}[.9]{m2}[2] +\nextlevel[6] + +\mess{\rpSW}{m1}[.9]{m0}[-2] +\mess{\rpNE}[b]{m2}[.9]{m1}[-2] +\nextlevel[2] + +\mess{\rpSE}{m1}[.9]{m0}[2] +\mess{\rpNW}[b]{m2}[.9]{m1}[2] +\nextlevel[6] + +\mess{\rpSE}{m0}[.9]{m1}[-2] +\mess{\rpNW}[b]{m1}[.9]{m2}[-2] +\nextlevel[2] +\end{msc} +\bigskip + +\footnotesize +\begin{verbatim} +\begin{msc}{Label reference points (2)} +\declinst{m0}{I0}{} +\declinst{m1}{I1}{} +\declinst{m2}{I2}{} +\nextlevel + +\mess{S}{m0}[.9]{m1} +\nextlevel +\mess{N}[b]{m1}[.9]{m2} +\nextlevel[2] + +\mess{S}{m1}[.9]{m0} +\nextlevel +\mess{N}[b]{m2}{m1} +\nextlevel[2] + +\mess{E}{m0}[.9]{m0}[2] +\mess[r]{W}{m2}[.9]{m2}[2] +\nextlevel[4] +\mess{W}[r]{m0}[.9]{m0}[2] +\mess[r]{E}[l]{m2}[.9]{m2}[2] +\nextlevel[6] + +\mess{E}{m0}[.9]{m0}[-2] +\mess[r]{W}{m2}[.9]{m2}[-2] +\nextlevel[4] +\mess{W}[r]{m0}[.9]{m0}[-2] +\mess[r]{E}[l]{m2}[.9]{m2}[-2] +\nextlevel[2] + +\mess{SW}{m0}[.9]{m1}[2] +\mess{NE}[b]{m1}[.9]{m2}[2] +\nextlevel[6] + +\mess{SW}{m1}[.9]{m0}[-2] +\mess{NE}[b]{m2}[.9]{m1}[-2] +\nextlevel[2] + +\mess{SE}{m1}[.9]{m0}[2] +\mess{NW}[b]{m2}[.9]{m1}[2] +\nextlevel[6] + +\mess{SE}{m0}[.9]{m1}[-2] +\mess{NW}[b]{m1}[.9]{m2}[-2] +\nextlevel[2] +\end{msc} +\end{verbatim} +\end{multicols} +\end{minipage} +\caption{Reference points of shifted message labels} +\label{fig:refpoints:B} +\end{figure} + + +\section{Environments} + +\begin{defs} + +\item[\cmd{begin}\texttt{\{msc\}}\opt{titlepos}\{\emph{title}\}\texttt{...\cmd{end}\{msc\}}] +The environment to draw msc's. The parameter \emph{title} defines the +title of the msc. The optional parameter \emph{titlepos} defines the +position of the title relative to the frame of the msc. Valid +positions are \verb|l|~(left), \verb|c|~(center), and +\verb|r|~(right). The default position is~\verb|l|. + +\item[\cmd{begin}\texttt{\{hmsc\}}\opt{titlepos}\{\emph{title}\}\texttt{...\cmd{end}\{hmsc\}}\coordargs{llx}{lly}\coordargs{urx}{ury}] +The environment to draw \HMSC's. The parameter \emph{title} defines the +title of the \HMSC. The optional parameter \emph{titlepos} defines the +position of the title relative to the frame of the \HMSC. Valid +positions are \verb|l|~(left), \verb|c|~(center), and +\verb|r|~(right). The default position is~\verb|l|. The size of the +\HMSC{} is determined by two pairs of coordinates. The coordinates +\coordargs{llx}{lly} define the lower left corner of the \HMSC. The +coordinates \coordargs{urx}{ury} define the upper right corner of the +\HMSC. + +\item[\cmd{begin}\texttt{\{mscdoc\}}\opt{titlepos}\{\emph{title}\}\texttt{...\cmd{end}\{mscdoc\}}\coordargs{llx}{lly}\coordargs{urx}{ury}] +The environment to draw \MSCdoc{} documents. The parameter +\emph{title} defines the title of the \MSCdoc{} document. The optional +parameter \emph{titlepos} defines the position of the title relative +to the frame of the \MSCdoc{} document. Valid positions are \verb|l|~(left), +\verb|c|~(center), and \verb|r|~(right). The default position +is~\verb|l|. The size of the \MSCdoc{} is determined by two pairs of +coordinates. The coordinates \coordargs{llx}{lly} define the lower +left corner of the \MSCdoc. The coordinates \coordargs{urx}{ury} +define the upper right corner of the \MSCdoc. + + +\end{defs} + + +\section{Commands} + +\begin{defs} + +\item[\cmd{action(*)}\{\emph{txt}\}\{\emph{nm}\}] Draws an \emph{action} +symbol on the instance with nickname \emph{nm}. The parameter \emph{txt} +defines the name of the action. The size of the action symbol is +controlled by the \verb|\actionheight| and \verb|\actionwidth| +lengths. The starred version adjusts the height and width of the +action symbol to the size of the contents. + +\item[\cmd{arrow}\cmdarg{nm0}\opt{\coordargs{xpos${}_1$}{ypos${}_1$}$\ldots$\coordargs{xpos${}_n$}{ypos${}_n$}}\cmdarg{nm1}] +Draws an arrow in an \HMSC{} diagram. The arrow starts at the symbol +with nickname~\emph{nm0} and ends at the symbol with +nickname~\emph{nm1}. The optional parameter +\coordargs{xpos${}_1$}{ypos${}_1$}$\ldots$\coordargs{xpos${}_n$}{ypos${}_n$} +is a list of intermediate points the arrow should pass through. + +\item[\cmd{changeinstbarwidth}\{\emph{nm}\}\{\emph{wd}\}] Changes the +bar width of instance \emph{nm} to \emph{wd}. The parameter \emph{wd} +should be a valid \LaTeX{} length. + +\item[\cmd{msccomment}\opt{\emph{pos}}\{\emph{txt}\}\{\emph{nm}\}] Puts a +comment at instance \emph{nm}. The parameter \emph{txt} is the +comment. The optional parameter \emph{pos} defines the horizontal +position of the comment relative to instance \emph{nm}. Valid +positions are \verb|l|~(left), \verb|r|~(right), and all valid +lengths. If the position is \verb|l| or~\verb|r|, the comment will be +put at \verb|\msccommentdist| units to the left or right, respectively, from +the instance axis. If \emph{pos} is a length, the comment will be put +\emph{pos} units from the instance axis. A negative \emph{pos} puts the +comment to the left and a positive \emph{pos} puts it to the right of +the instance axis. + +\item[\cmd{condition(*)}\{\emph{txt}\}\{\emph{instancelist}\}] Draws a +\emph{condition} symbol on the instances occurring in +\emph{instancelist}. The parameter \emph{txt} defines the text to be +placed in the \emph{condition} symbol. The parameter +\emph{instancelist} is a comma separated list of instance +nicknames. Note that there should be no white space between the commas +and the nicknames; only if a nickname contains white space is a white +space allowed in \emph{instancelist}. The starred version adjusts the +height and width of the condition symbol to the size of the contents. + +\item[\cmd{coregionend}\{\emph{nm}\}] Ends the co-region on the instance +\emph{nm}. This command is obsolete (see \verb|\regionend|). + +\item[\cmd{coregionstart}\{\emph{nm}\}] Starts a co-region on the instance +\emph{nm}. This command is obsolete (see \verb|\regionstart|). + +\item[\cmd{create}\{\emph{msg}\}\opt{\emph{labelpos}}\{\emph{creator}\}\opt{\emph{placement}}\{\emph{nm}\}\{\emph{na}\}\{\emph{in}\}] +Instance with nickname \emph{creator} sends a create message with +label \emph{msg} to instance \emph{nm}. Instance \emph{nm} should be a +dummy (invisible) instance at the time of the create message, see +\cmd{dummyinst}. The head symbol of \emph{nm} is drawn at +\verb|\msc@currentheight|. The parameter \emph{an} (above name) is put +above the head symbol. The parameter \emph{in} (inside name) is put +inside the head symbol. \emph{nm}'s y-position is set to +\verb|\msc@currentheight| $+$ \verb|\instheadheight|. The optional +parameter \emph{labelpos} defines the position of the message label. Valid +values are \verb|t| and~\verb|b|, denoting a label position on top of +the arrow and a label position below the arrow, respectively. The +optional parameter \emph{placement} defines the relative position of +the message label along the message arrow. Valid values are real +numbers in the closed interval $[0,1]$, where~$0$ corresponds to the +beginning of the arrow and~$1$ corresponds to the end of the +arrow. The default value is~$0.5$. + +\item[\cmd{declinst(*)}\{\emph{nm}\}\{\emph{an}\}\{\emph{in}\}] +Defines an instance with nickname \emph{nm}. The starred version +makes a \emph{fat instance}. The x-position is \verb|\instdist| to the +right of \verb|\msc@currentwidth|. The head symbol of the instance is +drawn at \verb|\msc@currentheight|. The parameter \emph{an} (above +name) is put above the head symbol. The parameter \emph{in} (inside +name) is put inside the head symbol. The +instance y-position is set to \verb|\msc@currentheight| $+$ \verb|\instheadheight|. + + +\item[\cmd{drawframe}\{\emph{str}\}] A command to turn on/off the +drawing of the frame around msc's, hmsc's, and mscdoc's. If \emph{str} +is `yes', the frame will be drawn, otherwise the frame will not be +drawn. + +\item[\cmd{drawinstfoot}\{\emph{str}\}] A command to turn on/off +drawing of instance foot symbols. If \emph{str} is `yes', the foot +symbols will be drawn, otherwise they will not be drawn. + +\item[\cmd{drawinsthead}\{\emph{str}\}] A command to turn on/off +drawing of instance head symbols. If \emph{str} is `yes', the head +symbols will be drawn, otherwise they will not be drawn. + +\item[\cmd{dummyinst(*)}\{\emph{nm}\}] Defines a \emph{dummy instance} +with nickname \emph{nm}. The starred version makes a \emph{fat +instance}. The x-position is \verb|\instdist| to the right of +\verb|\msc@currentwidth|. No head symbol is drawn. The +instance y-position is undefined. + +\item[\cmd{found}\opt{\emph{pos}}\{\emph{label}\}\opt{\emph{labelpos}}\{\emph{gate}\}\{\emph{nm}\}\opt{\emph{placement}}] +Draws a \emph{found message} to instance \emph{nm}. The \emph{label} +parameter defines the message name. The \emph{gate} parameter defines +the gate name. The optional parameter \emph{pos} defines the position +of the message relative to instance \emph{nm}. Valid positions are +\verb|l| (left) and \verb|r| (right). The default position is +\verb|l|. The optional parameter \emph{labelpos} defines the position +of the message label with respect to the arrow. Valid values are +\verb+t+ (on top) and \verb+b+ (below). The default value is \verb+t+. +The optional parameter \emph{placement} defines the relative position +of the message label along the message arrow. Valid values are real +numbers in the closed interval $[0,1]$, where~$0$ corresponds to the +beginning of the arrow and~$1$ corresponds to the end of the +arrow. The default value is~$0.5$. The length of the arrow is +determined by \verb+\selfmesswidth+. + +\item[\cmd{gate(*)}\opt{\emph{hpos}}\opt{\emph{vpos}}\{\emph{txt}\}\{\emph{nm}\}] +Draws a gate at instance \emph{nm}. The parameter \emph{txt} defines +the name of the gate. The starred version produces a visible gate by +drawing a black circle at instance \emph{nm}. The unstarred version +produces an invisible gate. The position of the parameter \emph{txt} +is controlled by the optional parameters \emph{hpos} and \emph{vpos}: +\emph{hpos} defines the horizontal position relative to instance +\emph{nm} and \emph{vpos} defines the vertical position relative to +the current height (\verb|\msc@currentheight|). Valid horizontal +positions are \verb|l|~(left) and \verb|r|~(right). The default +horizontal position is~\verb|l|. Valid vertical positions are +\verb|t|~(top), \verb|c|~(center), and \verb|b|~(bottom). The default +vertical is~\verb|t|. + +\item[\cmd{hmsccondition}\cmdarg{nm}\cmdarg{txt}\coordargs{xpos}{ypos}] +Draws an \HMSC{} condition symbol with nickname \emph{nm} at position +\coordargs{xpos}{ypos}. The \emph{txt} parameter is placed inside the +condition symbol. + +\item[\cmd{hmscconnection(*)}\cmdarg{nm}\coordargs{xpos}{ypos}] Draws +an \HMSC{} connection symbol with nickname \emph{nm} at position +\coordargs{xpos}{ypos}. The unstarred version produces an invisible +connection symbol. The starred version produces a visible connection +symbol (i.e., a small circle). + +\item[\cmd{hmscendsymol}\cmdarg{nm}\coordargs{xpos}{ypos}] Draws an +\HMSC{} end symbol with nickname \emph{nm} at position +\coordargs{xpos}{ypos}. + +\item[\cmd{hmsckeyword}] The \HMSC{} keyword. The default value is `hmsc'. + +\item[\cmd{hmsckeywordstyle}\{\emph{kw}\}] A one-parameter command to +typeset the \HMSC{} keyword. The command can expect \verb|\hmsckeyword| to +be the value of \emph{kw}. The default `value' is \verb|\textbf|. + +\item[\cmd{hmscreference}\cmdarg{nm}\cmdarg{txt}\coordargs{xpos}{ypos}] +Draws an \HMSC{} reference symbol with nickname \emph{nm} at position +\coordargs{xpos}{ypos}. The \emph{txt} parameter is placed inside the +condition symbol. + +\item[\cmd{hmscstartsymbol}\cmdarg{nm}\coordargs{xpos}{ypos}] +\HMSC{} start symbol with nickname \emph{nm} at position +\coordargs{xpos}{ypos}. + +\item[\cmd{inlineend(*)}\{\emph{nm}\}] Ends the matching inline +expression (matching means equal nicknames). The unstarred version +draws a solid line to close the inline expression. The starred version +draws a dashed line to close the inline expression. + +\item[\cmd{inlineseparator}\{\emph{nm}\}] Draws an inline separator +line at the inline expression with nickname \emph{nm}. The separator +is drawn at \verb|\msc@currentheight|. + +\item[\cmd{inlinestart}\opt{\emph{lo}}\opt{\emph{ro}}\{\emph{nm}\}\{\emph{txt}\}\{\emph{fi}\}\{\emph{li}\}] +Defines an \emph{inline expression} with nickname \emph{nm}. The +inline expression is started at \verb|\msc@currentheight| and +continues until the level where a matching \cmd{inlineend} command is +found (matching means equal nicknames). The \emph{txt} parameter +defines the text of the inline expression. The first instance of the +inline expression is \emph{fi}. The last instance of the inline +expression is \emph{li}. The optional parameter \emph{lo} defines the +left and right overlap of the inline expression. If the second +optional parameter, \emph{ro}, is present, \emph{lo} defines the left +and \emph{ro} defines the right overlap. + +\item[\cmd{inststart}\{\emph{nm}\}\{\emph{an}\}\{\emph{in}\}] Starts +instance with nickname \emph{nm}. Instance \emph{nm} should be a dummy +(invisible) instance at the time of the \cmd{inststart} command, see +\cmd{dummyinst}. The head symbol is drawn at +\verb|\msc@currentheight|. The parameter \emph{an} (above name) is put +above the head symbol. The parameter \emph{in} (inside name) is put +inside the head symbol. The instance y-position is set to +\verb|\msc@currentheight| $+$ \verb|\instheadheight|. + +\item[\cmd{inststop}\{\emph{nm}\}] Stops instance with nickname +\emph{nm}. The foot symbol is drawn at \verb|\msc@currentheight|. The +instance y-position is undefined after this command. + +\item[\cmd{lost}\opt{\emph{pos}}\{\emph{label}\}\opt{\emph{labelpos}}\{\emph{gate}\}\{\emph{nm}\}\opt{\emph{placement}}] +Draws a \emph{lost message} from instance \emph{nm}. The \emph{label} +parameter defines the message name. The \emph{gate} parameter defines +the gate name. The optional parameter \emph{pos} defines the position +of the message relative to instance \emph{nm}. Valid positions are +\verb|l| (left) and \verb|r| (right). The default position is +\verb|l|. The optional parameter \emph{labelpos} defines the position +of the message label with respect to the arrow. Valid values are +\verb+t+ (on top) and \verb+b+ (below). The default value is \verb+t+. +The optional parameter \emph{placement} defines the relative position +of the message label along the message arrow. Valid values are real +numbers in the closed interval $[0,1]$, where~$0$ corresponds to the +beginning of the arrow and~$1$ corresponds to the end of the +arrow. The default value is~$0.5$. The length of the arrow is +determined by \verb+\selfmesswidth+. + +\item[\cmd{measure(*)}\opt{\emph{pos}}\{\emph{txt}\}\{\emph{nm1}\}\{\emph{nm2}\}\opt{\emph{offset}}] +Puts a \emph{measure} at instances \emph{nm1} and \emph{nm2}. The +parameter \emph{txt} defines the label of the measure. The starred +version puts the triangular measure symbols outside the measure; the +unstarred version puts the triangular measure symbols inside the +measure. The optional \emph{pos} parameter defines the horizontal +position of the measure relative to instances \emph{nm1} +and~\emph{nm2}. Valid positions are \verb|l|~(left), \verb|r|~(right), +and all valid lengths. If the position is \verb|l| or~\verb|r|, the +measure will be put at \verb|\measuredist| units to the left or right, +respectively, from the closest instance axis. If \emph{pos} is a +length, the measure will be put \emph{pos} units from the closest +instance axis. A negative \emph{pos} puts the measure to the left and +a positive \emph{pos} puts it to the right of the instances. The +optional parameter \emph{offset} defines the number of levels the +measure should extend vertically. The default value for \emph{offset} +is~1. + + +\item[\cmd{measureend(*)}\opt{\emph{pos}}\{\emph{txt}\}\{\emph{nm}\}\{\emph{gate}\}] +Puts a \emph{measure end} symbol at instance \emph{nm}. The starred +version puts the triangular measure symbol outside the measure; the +unstarred version puts the triangular measure symbol inside the +measure. The \emph{txt} parameter defines the label of the +measure. The \emph{gate} parameter defines the name of the gate of the +measure end symbol. The optional \emph{pos} parameter defines the +horizontal position of the measure relative to the +\emph{nm} instance. Valid positions are \verb|l|~(left), \verb|r|~(right), and +all valid lengths. If the position is \verb|l| or~\verb|r|, the +measure will be put at \verb|\measuredist| units to the left or right, +respectively, from the instance axis. If \emph{pos} is a length, the +measure will be put \emph{pos} units from the instance axis. A +negative \emph{pos} puts the measure to the left and a positive +\emph{pos} puts it to the right of the instance. + +\item[\cmd{measurestart(*)}\opt{\emph{pos}}\{\emph{txt}\}\{\emph{nm}\}\{\emph{gate}\}] +Puts a \emph{measure start} symbol at instance \emph{nm}.The starred +version puts the triangular measure symbol outside the measure; the +unstarred version puts the triangular measure symbol inside the +measure. The \emph{txt} parameter defines the label of the +measure. The \emph{gate} parameter defines the name of the gate of the +measure start symbol. The optional parameter \emph{pos} defines the +horizontal position of the measure relative to instance +\emph{nm}. Valid positions are \verb|l|~(left), \verb|r|~(right), and +all valid lengths. If the position is \verb|l| or~\verb|r|, the +measure will be put at \verb|\measuredist| units to the left or right, +respectively, from the instance axis. If \emph{pos} is a length, the +measure will be put \emph{pos} units from the instance axis. A +negative \emph{pos} puts the measure to the left and a positive +\emph{pos} puts it to the right of the instance. + +\item[\cmd{mess(*)}\opt{\emph{pos}}\{\emph{label}\}\opt{\emph{labelpos}}\{\emph{sender}\}\opt{\emph{placement}}\{\emph{receiver}\}\opt{\emph{offset}}] +Draws a message from \emph{sender} instance to \emph{receiver} +instance. The starred version draws a dashed line arrow, instead of a +solid arrow. This can be used to distinguish method calls from method +replies. The \emph{sender} and \emph{receiver} may be the same +instance, in which case the message is a \emph{self message}. The +parameter \emph{label} defines the message name. The message starting +y-position is \verb|\msc@currentheight| and the ending y-position of +the message is defined by \verb|\msc@currentheight| $+$ +$(\textit{offset}\ \times $ \verb|\levelheight|$)$. The optional +parameter \emph{pos} defines the position of self messages with +respect to the instance axis. Valid values are \verb+l+ (left) and +\verb+r+ (right). The default value is \verb+l+. The optional +parameter \emph{labelpos} defines the position of the message +label. In case of a self message, valid values are \verb|l| and +\verb|r|, denoting a label position left from the arrow and right from +the arrow, respectively. For self-messages the default value of +\verb+labelpos+ is the value of \verb+pos+. In case of a non-self +message, valid values are \verb|t| (default) and \verb|b|, denoting a +label position on top of the message arrow and below the message +arrow, respectively. The optional parameter \emph{placement} defines +the relative position of the message label along the message +arrow. Valid values are real numbers in the closed interval $[0,1]$, +where~$0$ corresponds to the beginning of the arrow and~$1$ +corresponds to the end of the arrow. The default value is~$0.5$. The +default value of the optional parameter \emph{offset} is~0 for normal +messages and~1 for self messages. + +\item[\cmd{messarrowscale}\{\emph{scalefactor}\}] Sets the scale +factor (a real number) of message arrow heads. The default value +is~1.5 + +\item[\cmd{mscdate}] The date of the \mscpack. + + +\item[\cmd{mscdockeyword}] The \MSCdoc{} keyword. The default value is `mscdoc'. + +\item[\cmd{mscdockeywordstyle}\{\emph{kw}\}] A one-parameter command to +typeset the mscdoc keyword. The command can expect \verb|\mscdockeyword| to +be the value of \emph{kw}. The default `value' is \verb|\textbf|. + + + +\item[\cmd{msckeyword}] The \MSC{} keyword. The default value is `msc'. + +\item[\cmd{msckeywordstyle}\{\emph{kw}\}] A one-parameter command to +typeset the \MSC{} keyword. The command can expect \verb|\msckeyword| to +be the value of \emph{kw}. The default `value' is \verb|\textbf|. + +\item[\cmd{mscmark}\opt{\emph{pos}}\{\emph{txt}\}\{\emph{nm}\}] Puts a +mark at instance \emph{nm}. The parameter \emph{txt} is the name of +the mark. The optional parameter \emph{pos} defines the horizontal and +vertical position of the mark relative to instance \emph{nm} and the +current height \verb|\msc@currentheight|. Valid positions are +\verb|tl|~(top-left), \verb|tr|~(top-right), \verb|bl|~(bottom-left), +and \verb|br|~(bottom-right). The default position is \verb|tl|. The +horizontal distance between the mark and the instance is defined by +\verb+\markdist+. + +\item[\cmd{mscunit}] A string denoting the (default) unit of all +lengths used by the \mscpack. Valid values are \emph{cm}, +\emph{em}, \emph{ex}, \emph{in}, \emph{mm}, \emph{pt}, etc. The +default value is~\emph{cm}. + +\item[\cmd{setmscunit}\{\emph{unit}\}] Changes the value of +\cmd{mscunit} into \emph{unit}. Valid values for \emph{unit} are +\emph{cm}, \emph{em}, \emph{ex}, \emph{in}, \emph{mm}, \emph{pt}, etc. + +\item[\cmd{mscversion}] The version number of the \mscpack. + +\item[\cmd{nextlevel}\opt{\emph{offset}}] Increases the number of +levels by the value of the optional parameter \emph{offset}. The +default value of \emph{offset} is~1. Increasing the level number means +that \verb|\msc@currentheight| is increased by $\textit{offset} \times +\verb|\levelheight|$. The first time this macro is used, the actual +increase of \verb|\msc@currentheight| is $\verb|\firstlevelheight| + +((\textit{offset} - 1) \times \verb|\levelheight|)$. Negative values +of \emph{offset} back up a number of levels. There are situations +where this is useful, see Section~\ref{sec:tricks}. + +\item[\cmd{nogrid}] Turns off grid drawing in \MSC, \HMSC, and +\MSCdoc{} diagrams. This command should not be used inside an \MSC, +\HMSC, or \MSCdoc{} evironment. + +\item[\cmd{order}\opt{\emph{pos}}\{\emph{sender}\}\{\emph{receiver}\}\opt{\emph{offset}}] +Draws an \emph{order line} from the \emph{sender} instance to the +\emph{receiver} instance. The \emph{sender} and \emph{receiver} may be +the same instance, in which case the order is a \emph{self-order}. The +order starting y-position is \verb|\msc@currentheight| and the ending +y-position of the order is defined by \verb|\msc@currentheight| $+$ +$(\textit{offset}\ \times $ \verb|\levelheight|$)$. In case of a +self-order, the optional parameter \emph{pos} defines the position of +the order relative to the \emph{sender} instance. Valid positions are +\verb|l| (left) and \verb|r| (right). The default position is +\verb|l|. In case of a non-self-order, the \emph{pos} parameter is +ignored. The default value of the optional parameter \emph{offset} +is~0 for normal orders and~1 for self orders. + +\item[\cmd{reference}\cmdarg{txt}\coordargs{xpos}{ypos}] Draws an +\MSCdoc{} reference symbol. The \emph{txt} parameter defines the text to +be placed inside the \MSCdoc{} reference symbol. The coordinates +\coordargs{xpos}{ypos} define the position of the reference symbol. + +\item[\cmd{referenceend}\{\emph{nm}\}] Ends the reference expression with +nickname \emph{nm}. + +\item[\cmd{referencestart}\opt{\emph{lo}}\opt{\emph{ro}}\{\emph{nm}\}\{\emph{txt}\}\{\emph{fi}\}\{\emph{li}\}] +Defines a \emph{reference expression} with nickname \emph{nm}. The +reference expression is started at \verb|\msc@currentheight| and +continues until the level where a matching \verb|\referenceend| command +is found. The \emph{txt} parameter defines the text of the reference +expression. The first instance of the reference expression is +\emph{fi}. The last instance of the reference expression is +\emph{li}. The optional parameter \emph{lo} defines the left and right +overlap of the reference expression. If the second optional parameter, +\emph{ro}, is present, \emph{lo} defines the left and \emph{ro} +defines the right overlap. + +\item[\cmd{regionend}\{\emph{nm}\}] Ends the current region on +instance \emph{nm}. The region style of the instance \emph{nm} is +reset to \emph{normal} again. Note: this command makes +\verb|\coregionend| obsolete. + +\item[\cmd{regionstart}\{\emph{rstyle}\}\{\emph{nm}\}] Starts a region +on the instance \emph{nm}. The style of the region is defined by the +\emph{rstyle} parameter. Valid region styles are \emph{coregion}, +\emph{suspension}, \emph{activation}, and \emph{normal}. Note: this +command makes \verb|\coregionstart| obsolete. + +\item[\cmd{separator}\cmdarg{ypos}] Draws a separator in an \MSCdoc{} +diagram. The \coordarg{ypos} parameter defines the vertical position of the +separator in the \MSCdoc{} diagram. + +\item[\cmd{setfootcolor}\{\emph{color}\}] Sets the color of the foot symbols of +\MSC{} instances. Possible values are \emph{black}, \emph{white}, +\emph{gray}, or \emph{lightgray}. For more color values, see the +documentation of the \LaTeXe{} \textsf{color} package. + +\item[\cmd{sethmsckeyword}\{\emph{kw}\}] Sets the \HMSC{} keyword to +\emph{kw}. For this command to be effective, it should be used outside +the \HMSC{} environment. + +\item[\cmd{sethmsckeywordstyle}\{\emph{kwstylemacro}\}] Redefines the +\verb|\hmsckeywordstyle| macro to the macro \emph{kwstylemacro}. This +should be a 1-argument macro, like the standard \LaTeX{} +\cmd{textbf} and \cmd{textit} commands. For this command to be effective, it +should be used outside the \HMSC{} environment. + +\item[\cmd{setmscdockeyword}\{\emph{kw}\}] Sets the \MSCdoc{} keyword to +\emph{kw}. For this command to be effective, it should be used outside +the \MSCdoc{} environment. + +\item[\cmd{setmscdockeywordstyle}\{\emph{kwstylemacro}\}] Redefines the +\verb|\mscdockeywordstyle| macro to the macro \emph{kwstylemacro}. This +should be a 1-argument macro, like the standard \LaTeX{} +\cmd{textbf} and \cmd{textit} commands. For this command to be effective, it +should be used outside the \MSCdoc{} environment. + + +\item[\cmd{setmsckeyword}\{\emph{kw}\}] Sets the \MSC{} keyword to +\emph{kw}. For this command to be effective, it should be used outside +the \MSC{} environment. + +\item[\cmd{setmsckeywordstyle}\{\emph{kwstylemacro}\}] Redefines the +\verb|\msckeywordstyle| macro to the macro \emph{kwstylemacro}. This +should be a 1-argument macro, like the standard \LaTeX{} +\cmd{textbf} and \cmd{textit} commands. For this command to be effective, it +should be used outside the \MSC{} environment. + +\item[\cmd{setmscscale}\{\emph{scalefactor}\}] Sets the scale factor +of the \MSC{} environment to \emph{scalefactor}. the scale factor is +supposed to be a real number. Scaling is done when the \MSC{} +environment ends (\verb|\end{msc}|). The default of \emph{scalefactor} +is~1. + + +\item[\cmd{setmscvalues}\{\emph{size}\}] Sets the msc-lengths to one +of the predefined \emph{sizes}. Valid values for \emph{size} are: +\verb|small|, \verb|normal|, and \verb|large|. + +\item[\cmd{setstoptimer}\opt{\emph{pos}}\{\emph{label}\}\{\emph{nm}\}\opt{\emph{offset}}] +Draws both a \emph{timer} and a \emph{stop timer} symbol on the +instance \emph{nm}. The parameter \emph{label} defines the name of +the timer. The optional parameter \emph{pos} defines the position of +the \emph{timer} relative to the \emph{nm} instance. Valid positions +are \verb|l| (left) and \verb|r| (right). The default position +is~\verb|l|. The horizontal distance between the timer symbol and the +instance axis is defined by \verb+selfmesswidth+. + +\item[\cmd{settimeout}\opt{\emph{pos}}\{\emph{label}\}\{\emph{nm}\}\opt{\emph{offset}}] +Draws a \emph{timer} symbol on the instance \emph{nm} and connects the +\emph{timer} symbol and the instance with an arrow. The parameter +\emph{label} defines the name of the \emph{timer}. The optional +parameter \emph{pos} defines the position of the \emph{timer} relative +to the \emph{nm} instance. Valid positions are \verb|l| (left) and +\verb|r| (right). The default position is~\verb|l|. The optional +parameter \emph{offset} defines the number of levels between the +\emph{timer} symbol and the point where the arrow meets the \emph{nm} +instance. The default \emph{offset} is~2. The horizontal distance +between the timer symbol and the instance axis is defined by +\verb+selfmesswidth+. + +\item[\cmd{settimer}\opt{\emph{pos}}\{\emph{label}\}\{\emph{nm}\}] +Draws a \emph{timer} symbol on the instance \emph{nm}. The parameter +\emph{label} defines the name of the timer. The optional parameter +\emph{pos} defines the position of the \emph{timer} relative to the +\emph{nm} instance. Valid positions are \verb|l| (left) and \verb|r| +(right). The default position is~\verb|l|. The horizontal distance +between the timer symbol and the instance axis is defined by +\verb+selfmesswidth+. + +\item[\cmd{showgrid}] Turns on grid-drawing in \MSC, \MSCdoc, and \HMSC{} +diagrams. This is useful to determine the values of the user definable +lengths or if normal \textsf{pstricks} commands should be included in +the diagram. (Note that the vertical axis of the \MSC{} grid has no positive +labels.) This command should not be used inside an \MSC, +\HMSC, or \MSCdoc{} evironment. + +\item[\cmd{stop}\{\emph{nm}\}] Stops the instance with nickname +\emph{nm}. The instance line of \emph{nm} is drawn from its y-position +to the current y-position of the \MSC{} (\verb|\msc@curentheight|). At +the current height, a \emph{stop} symbol is drawn. + +\item[\cmd{stoptimer}\opt{\emph{pos}}\{\emph{label}\}\{\emph{nm}\}] +Draws a \emph{stop timer} symbol on the instance \emph{nm}. The +parameter \emph{label} defines the name of the timer. The optional +parameter \emph{pos} defines the position of the \emph{timer} relative +to the \emph{nm} instance. Valid positions are \verb|l| (left) and +\verb|r| (right). The default position is~\verb|l|. The horizontal +distance between the timer symbol and the instance axis is defined by +\verb+selfmesswidth+. + +\item[\cmd{timeout}\opt{\emph{pos}}\{\emph{label}\}\{\emph{nm}\}] +Draws a \emph{timer} symbol on the instance \emph{nm} and connects the +symbol and the instance with an arrow. The parameter \emph{label} +defines the name of the timeout. The optional parameter \emph{pos} +defines the position of the \emph{timer} symbol relative to the +\emph{nm} instance. Valid positions are \verb|l| (left) and \verb|r| +(right). The default position is~\verb|l|. The horizontal distance +between the timer symbol and the instance axis is defined by +\verb+selfmesswidth+. + +\end{defs} + + +\section{User definable lengths} + +This section lists the user-definable lengths of the \mscpack. For +each length, the default values for large, normal, and small diagrams +are given. The appearance of \MSC, \HMSC, and \MSCdoc{} diagrams can be +changed by adjusting these lengths. Use the normal \cmd{setlength} +command to change these lengths. + +\begin{defs} + +\item[\cmd{actionheight}] +Height of action symbols.\\ +(\lnsvalue{0.75}{0.6}{0.5} cm.) + +\item[\cmd{actionwidth}] +Width of action symbol.\\ +(\lnsvalue{1.25}{1.25}{1.2} cm.) + +\item[\cmd{bottomfootdist}] +Distance between bottom of foot symbol and frame.\\ +(\lnsvalue{1.0}{0.7}{0.5} cm.) + +\item[\cmd{commentdist}] +Distance between a comment and its instance.\\ +(\lnsvalue{0.5}{0.5}{0.5} cm.) + +\item[\cmd{conditionheight}] +Height of condition symbols.\\ +(\lnsvalue{0.75}{0.6}{0.5} cm.) + +\item[\cmd{conditionoverlap}] +Overlap of condition symbol.\\ +(\lnsvalue{0.6}{0.5}{0.4} cm.) + +\item[\cmd{envinstdist}] +Distance between environments and nearest instance line.\\ +(\lnsvalue{2.5}{2.0}{1.2} cm.) + +\item[\cmd{firstlevelheight}] Height of level just below head +symbols. Should not be changed inside the \MSC{} environment.\\ +(\lnsvalue{0.75}{0.6}{0.4} cm.) + +\item[\cmd{hmscconditionheight}] +Height of \HMSC{} condition symbol.\\ +(\lnsvalue{0.375}{0.3}{0.25} cm.) + +\item[\cmd{hmscconditionwidth}] +Width of \HMSC{} condition symbol.\\ +(\lnsvalue{1.0}{0.8}{0.7} cm.) + +\item[\cmd{hmscconnectionradius}] +Radius of \HMSC{} connection symbol.\\ +(\lnsvalue{0.06}{0.05}{0.04} cm.) + +\item[\cmd{hmscreferenceheight}] +Height of \HMSC{} reference symbol.\\ +(\lnsvalue{0.8}{0.7}{0.6} cm.) + +\item[\cmd{hmscreferencewidth}] +Width of \HMSC{} reference symbol.\\ +(\lnsvalue{1.6}{1.4}{1.2} cm.) + +\item[\cmd{hmscstartsymbolwidth}] +Width of \HMSC{} start symbol.\\ +(\lnsvalue{0.85}{0.7}{0.4} cm.) + +\item[\cmd{inlineoverlap}] +Overlap of inline symbol.\\ +(\lnsvalue{1.5}{1.0}{0.75} cm.) + +\item[\cmd{instbarwidth}] +Default width of vertical instance bars (applies to fat instances only).\\ +(\lnsvalue{0.0}{0.0}{0.0} cm.) + +\item[\cmd{instdist}] +Distance between instance axes.\\ +(\lnsvalue{3.0}{2.2}{1.5} cm.) + +\item[\cmd{instfootheight}] Height of foot symbols. Should not be +changed inside the \MSC{} environment.\\ +(\lnsvalue{0.25}{0.2}{0.15} cm.) + +\item[\cmd{instheadheight}] Height of head symbols. Should not be +changed inside the \MSC{} environment.\\ +(\lnsvalue{0.6}{0.55}{0.5} cm.) + +\item[\cmd{instwidth}] +Width of header and foot symbols.\\ +(\lnsvalue{1.75}{1.6}{1.2} cm.) + +\item[\cmd{labeldist}] +Distance between labels and the symbols to which they belong (for instance, message labels and arrows).\\ +(\lnsvalue{1.0}{1.0}{1.0} ex.) + +\item[\cmd{lastlevelheight}] Height of level just above foot +symbols. Should not be changed inside the \MSC{} environment.\\ +(\lnsvalue{0.5}{0.4}{0.3} cm.) + +\item[\cmd{leftnamedist}] Distance between left of the frame and +(left of) \MSC, \HMSC, or \MSCdoc{} title.\\ +(\lnsvalue{0.3}{0.2}{0.1} cm.) + +\item[\cmd{levelheight}] +Height of a level.\\ +(\lnsvalue{0.75}{0.5}{0.4} cm.) + +\item[\cmd{lostsymbolradius}] +Radius of the lost and found symbols.\\ +(\lnsvalue{0.15}{0.12}{0.08} cm.) + +\item[\cmd{markdist}] +Horizontal distance from a mark to its instance.\\ +(\lnsvalue{1.0}{1.0}{1.0} cm.) + +\item[\cmd{measuredist}] +Horizontal distance from a measure to its (closest) instance.\\ +(\lnsvalue{1.0}{1.0}{1.0} cm.) + +\item[\cmd{measuresymbolwidth}] +Width of a measure symbol.\\ +(\lnsvalue{0.75}{0.6}{0.4} cm.) + +\item[\cmd{mscdocreferenceheight}] +Height of reference symbol in an \MSCdoc.\\ +(\lnsvalue{0.8}{0.7}{0.6} cm.) + +\item[\cmd{mscdocreferencewidth}] +Width of reference symbol in an \MSCdoc.\\ +(\lnsvalue{1.6}{1.4}{1.2} cm.) + +\item[\cmd{referenceoverlap}] +Overlap of reference symbol.\\ +(\lnsvalue{1.5}{1.0}{0.75} cm.) + +\item[\cmd{regionbarwidth}] +Width of region bars.\\ +(\lnsvalue{0.5}{0.4}{0.2} cm.) + +\item[\cmd{selfmesswidth}] Length of horizontal arms of self-messages, +self-orders, lost messages and found messages as well as horizontal +distance between instance axis and timer symbols.\\ +(\lnsvalue{0.75}{0.6}{0.4} cm.) + +\item[\cmd{stopwidth}] +Width of the stop symbol.\\ +(\lnsvalue{0.6}{0.5}{0.3} cm.) + +\item[\cmd{timerwidth}] +Width of the \emph{timer} symbols.\\ +(\lnsvalue{0.4}{0.3}{0.2} cm.) + +\item[\cmd{topheaddist}] +Distance between top of head symbols and frame.\\ +(\lnsvalue{1.5}{1.3}{1.2} cm.) + +\item[\cmd{topnamedist}] Distance between top of the frame and +(top of) \MSC, \HMSC, or \MSCdoc{} title.\\ +(\lnsvalue{0.3}{0.2}{0.2} cm.) + +\end{defs} + + +\section{lnternal lengths} + +The \mscpack{} uses some scratch lengths to perform +calculations. Below, these scratch lengths are listed. + +\begin{defs} +\item[\cmd{msc@commentdist}] Internal length to compute distance +between comments and instances. (This length should be removed in the +future.) + +\item[\cmd{msc@currentheight}] +The current height of the current \MSC{} environment. + +\item[\cmd{msc@currentwidth}] +The current width of the current \MSC{} environment. + +\item[\cmd{msc@totalheight}] +The final height of the current \MSC{} environment. + +\item[\cmd{msc@totalwidth}] +The final width of the current \MSC{} environment. + +\item[\cmd{tmp@X}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Xa}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Xb}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Xc}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Xd}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Y}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Ya}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Yb}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Yc}] +Scratch length for intermediate computations. + +\item[\cmd{tmp@Yd}] +Scratch length for intermediate computations. + +\end{defs} + +\section{Internal boxes} + +\begin{defs} + +\item[\cmd{mscbox}] +The box that contains the current \MSC{} just before it is put on paper. + +\item[\cmd{tmp@box}] +Scratch box for intermediate computations +\end{defs} + + +\section{Internal counters} + +\begin{defs} +\item[\cmd{mscinstcnt}] The \MSC{} instance counter. This counter is +increased each time an instance is created. + +\item[\cmd{tmpcnt}] Scratch counter for intermediate computations. + +\end{defs} + +\section{Limitations} + +\begin{enumerate} + +\item The frames in an MSC do not automatically scale with the text +inside the frame. However, the size of the frames can be set manually. + +\item Start and end points of messages are computed at the current +level. This can give ill-looking effects if the width of the bar of an +instance changes after the message is drawn, e.g., if an activation +region starts or ends after the message is drawn. + +\item Messages that cause the start of a region should be drawn after +the \verb|\regionstart| command, but in the same level. + +\item Messages that denote the end of a region should be +drawn before the \verb|\regionend| command. + +\item Activation regions make crossing messages partly invisible. A +solution for this problem is to first draw the instance foot symbols +at the right level (using \verb|\inststop{i}|), then back up the total +number of levels of the MSC (using \verb|\nextlevel[-n]|), and then +drawing the messages. + + +\item Documents using the \mscpack{} cannot be compiled with +\emph{pdflatex}. The reason for this is that \textsf{pstricks} is not +supported by \emph{pdflatex}. + +\item The source code of the \mscpack{} is only marginally +documented. Therefore, changes/improvements by others are unlikely. + +\end{enumerate} + +\section{Tricks} +\label{sec:tricks} + +In this section we describe some tricks to use the \mscpack{} +efficiently. + +\paragraph{Multi-line text arguments} +Many graphical objects in \MSC{} diagrams have text labels. In general, +the commands to draw these objects put the text arguments on one +line. If the text should consist of multiple lines, the \LaTeX{} +\cmd{parbox} command can be used. For instance, to generate a message +with a two-line label, write: + +\verb|\mess{\parbox{1cm}{two\\lines}}{s}{r}| + + +\paragraph{Specifying lengths} +The \mscpack{} imports the \textsf{calc} package in order to have a +more natural syntax for arithmetical expressions. Consequently, if a +command expects a \LaTeX{} length argument, it is possible to use the +expression syntax offered by \textsf{calc}. + +For example, consider the \MSC{} of +Figure~\ref{fig:specifying:lengths}. To make sure the comment for +instance~$j$ appears 1ex to the right of the \MSC{} frame, the value +of the optional \emph{pos} parameter of the \cmd{comment} command +should be +\[ \cmd{instdist} + \cmd{envinstdist} + 1\textrm{ex}. \] + +To express this in normal \LaTeX, one should write something like +\begin{verbatim} +\newlength{\l} +\setlength{\l}{\instdist} +\addtolength{\l}{\envinstdist} +\addtolength{\l}{1ex} +\msccomment[\l]{Comment for $j$}{j} +\end{verbatim} +inside the \MSC{} code. However, using \textsf{calc}'s expression +syntax, it is also possible to write +\begin{verbatim} + +\msccomment[\instdist + \envinstdist + 1ex]{Comment for $j$}{j} +\end{verbatim} +The complete code for the diagram of +Figure~\ref{fig:specifying:lengths} is given below. Since the +\textsf{calc} package is included in the standard \LaTeX{} +distribution, there should be no compatibility problems. +\begin{figure}[htb] +\begin{center} +\begin{msc}{Specifying lengths} +\declinst{i}{$i$}{} +\declinst{j}{$j$}{} +\declinst{k}{$k$}{} + +\nextlevel +\msccomment[\instdist + \envinstdist + 1ex]{Comment for $j$}{j} +\nextlevel[2] +\end{msc} + +\caption{Specifying lengths} +\label{fig:specifying:lengths} +\end{center} +\end{figure} + +{\small +\begin{verbatim} +\begin{msc}{Specifying lengths} +\declinst{i}{$i$}{} +\declinst{j}{$j$}{} +\declinst{k}{$k$}{} + +\nextlevel +\msccomment[\instdist + \envinstdist + 1ex]{Comment for $j$}{j} +\nextlevel[2] +\end{msc} +\end{verbatim} +} + +\paragraph{Level backup} +It is possible to back-up several levels: just use a negative value in +the \cmd{nextlevel} command. This \emph{feature} can be useful to draw +messages over regions instead of regions over messages. Compare the +diagrams of Figure~\ref{fig:level:backup}. The code for these diagrams +is given below. + +\begin{figure}[htb] +\begin{center} +\setmscvalues{small} +\begin{tabular}{cc} +\begin{msc}{Invisible message label} +\declinst{i}{$i$}{} +\declinst{j}{$j$}{} +\declinst{k}{$k$}{} + +\regionstart{activation}{j} +\nextlevel +\mess{Message a}{i}[0.25]{k}[2] +\nextlevel[2] +\regionend{j} +\nextlevel +\end{msc} + +& + +\begin{msc}{Level backup makes it visible} +\declinst{i}{$i$}{} +\declinst{j}{$j$}{} +\declinst{k}{$k$}{} + +\regionstart{activation}{j} +\nextlevel[3] +\regionend{j} +\nextlevel[-2]% backing up +\mess{Message a}{i}[0.25]{k}[2] +\nextlevel[2]% fast forward +\nextlevel +\end{msc} +\end{tabular} + +\caption{Level back-up} +\label{fig:level:backup} +\end{center} + +\end{figure} + +{\small +\begin{verbatim} +\begin{msc}{Invisible message label} +\declinst{i}{$i$}{} +\declinst{j}{$j$}{} +\declinst{k}{$k$}{} + +\regionstart{activation}{j} +\nextlevel +\mess{Message a}{i}[0.25]{k}[2] +\nextlevel[2] +\regionend{j} +\nextlevel +\end{msc} + + +\begin{msc}{Level backup makes it visible} +\declinst{i}{$i$}{} +\declinst{j}{$j$}{} +\declinst{k}{$k$}{} + +\regionstart{activation}{j} +\nextlevel[3] +\regionend{j} +\nextlevel[-2]% backing up +\mess{Message a}{i}[0.25]{k}[2] +\nextlevel[2]% fast forward +\nextlevel +\end{msc} +\end{verbatim} +} + +\bibliographystyle{plain} +\bibliography{biblio} + +\end{document} + |