summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/msc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/msc
Initial commit
Diffstat (limited to 'macros/latex/contrib/msc')
-rw-r--r--macros/latex/contrib/msc/COPYRIGHT.txt31
-rw-r--r--macros/latex/contrib/msc/README42
-rw-r--r--macros/latex/contrib/msc/biblio.bib60
-rw-r--r--macros/latex/contrib/msc/maintenance.pdfbin0 -> 61584 bytes
-rw-r--r--macros/latex/contrib/msc/maintenance.tex250
-rw-r--r--macros/latex/contrib/msc/manual.pdfbin0 -> 229228 bytes
-rw-r--r--macros/latex/contrib/msc/manual.tex2841
-rw-r--r--macros/latex/contrib/msc/msc.sty3159
-rw-r--r--macros/latex/contrib/msc/refman.pdfbin0 -> 154934 bytes
-rw-r--r--macros/latex/contrib/msc/refman.tex1547
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
new file mode 100644
index 0000000000..c050ebe05b
--- /dev/null
+++ b/macros/latex/contrib/msc/maintenance.pdf
Binary files differ
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
new file mode 100644
index 0000000000..9cc6c420cf
--- /dev/null
+++ b/macros/latex/contrib/msc/manual.pdf
Binary files differ
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
new file mode 100644
index 0000000000..8423cc8ade
--- /dev/null
+++ b/macros/latex/contrib/msc/refman.pdf
Binary files differ
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}
+