% -- csp.sty version 2 -------------------------------------------------

% usual common sense conditions apply - see for example the LaTeX
% public license - try to avoid editing this file; if you do edit it,
% change the filename; comments, complaints, and suggestions to
%
%   Jim.Davies@comlab.ox.ac.uk
%
% but all gratitude and appreciation to Mike Spivey.

% This might be seen as a prototype; the functionality is there, but
% the implementation and documentation leave something to be
% desired---if anyone who _really_ knows what they are doing
% w.r.t. 2e internals wants to suggest revisions, then please do.

% -- csp.sty -----------------------------------------------------------

\def\fileversion{2.0}
\def\filedate{01/05/07}

\NeedsTeXFormat{LaTeX2e}

\ProvidesPackage{csp}[{\filedate\space\fileversion\space csp package}]

% -- options -----------------------------------------------------------

\newif\if@cm@ \@cm@false
\newif\if@lucida@ \@lucida@false
\newif\if@times@ \@times@false
\newif\if@color@ \@color@false
\newif\if@zed@ \@zed@false
\newif\if@csp@ \@csp@false
\newif\if@nolines@ \@nolines@false

\DeclareOption{cm}{\@cm@true\@lucida@false\@times@false}
\DeclareOption{lucida}{\@cm@false\@lucida@true\@times@false}
\DeclareOption{times}{\@cm@false\@lucida@false\@times@true}
\DeclareOption{color}{\@color@true}
\DeclareOption{zed}{\@zed@true}
\DeclareOption{csp}{\@csp@true}
\DeclareOption{nolines}{\@nolines@true}

\ExecuteOptions{cm} \ProcessOptions

\@ifpackageloaded{zed}{\relax}{%
  \RequirePackageWithOptions{zed}}

% -- color -------------------------------------------------------------

\if@color@
  \@ifpackageloaded{color}{\relax}{%
    \RequirePackage[dvipsnames,usenames]{color}}
  \definecolor{CSPBoxColor}{cmyk}{1,0,1,0}% Green
  \definecolor{MetaColor}{cmyk}{0,0.61,0.87,0}% Orange
  \definecolor{CSPColor}{cmyk}{0.50,1,0,0}% Plum
  \else
  \@ifpackageloaded{color}{\relax}{\def\color#1{\relax}}
\fi

% -- symbols -----------------------------------------------------------

\if@cm@
  \let\Box\undefined
  \DeclareMathSymbol\tick{\mathord}{AMSa}{"58}
  \DeclareSymbolFont{lasy}{U}{lasy}{m}{n}
  \DeclareMathSymbol{\Box}{\mathord}{lasy}{"32}
  \def\lchan@sym{{\{}\mkern-3.5mu{|}}
  \def\rchan@sym{{|}\mkern-3.5mu{\}}}
  \def\lseq@sym{\langle}
  \def\rseq@sym{\rangle}
  \def\lren@sym{[}
  \def\rren@sym{]}
  \def\llink@sym{\langle\mkern-4mu\langle}
  \def\rlink@sym{\rangle\mkern-4mu\rangle}
  \let\then@sym\rightarrow
  \let\parallel@sym\parallel
  \let\cpar@sym\mid
  \def\guard@sym{\&}
  \let\becomes@sym\leftarrow
  \let\linksto@sym\leftrightarrow
  \let\extchoice@sym\Box
  \let\intchoice@sym\sqcap
  \let\interrupt@sym\triangle
  \let\timeout@sym\triangleright
  \def\lpar@sym{{|}\mkern -2mu{[}\mkern-1mu}
  \def\rpar@sym{\mkern-1mu{]}\mkern -2mu{|}}
  \def\interleave@sym{{|}\mkern-2mu{|}\mkern-2mu{|}}
  \let\circ@sym=\circ
  \let\hide@sym\backslash
  \def \ldbrack{{[}\mkern-3mu{[}}
  \def \rdbrack{{]}\mkern-3mu{]}}
\fi

\if@times@
  \let\bar@sym=\mid
  \let\hide@sym=\backslash
  \DeclareMathSymbol{[}{\mathopen}{symbols}{84}
  \DeclareMathSymbol{]}{\mathclose}{symbols}{85}
  \let\tick=\surd
  \def\lchan@sym{{\{}\mkern-4mu{|}}
  \def\rchan@sym{{|}\mkern-4mu{\}}}
  \def\lseq@sym{\langle}
  \def\rseq@sym{\rangle}
  \def\lren@sym{[}
  \def\rren@sym{]}
  \def\llink@sym{\langle\mkern-4mu\langle}
  \def\rlink@sym{\rangle\mkern-4mu\rangle}
  \def\then@sym{\simple@enlarge{\rightarrow}}
  \def\parallel@sym{\bar@sym\bar@sym}
  \def\guard@sym{\&}
  \def\becomes@sym{\simple@enlarge{\leftarrow}}
  \def\linksto@sym{\simple@enlarge{\leftrightarrow}}
  \def\extchoice@sym{%
    \setbox0=\hbox{$\sqcap$}\rlap{\hbox to \wd0{\hss\vrule width 0.5em
        height 0.1ex\hss}}\box0}
  \let\intchoice@sym\sqcap
  \let\interrupt@sym\triangle
  \let\timeout@sym\triangleright
  \let\cpar@sym\bar@sym
  \def\lpar@sym{{\bar@sym}\mkern -2mu{[}\mkern-1mu}
  \def\rpar@sym{\mkern-1mu{]}\mkern -2mu{\bar@sym}}
  \def\interleave@sym{\bar@sym\bar@sym\bar@sym}
  \let\circ@sym=\circ
  \def \ldbrack{{[}\mkern-3mu{[}}
  \def \rdbrack{{]}\mkern-3mu{]}}
\fi

\if@lucida@
  \DeclareMathSymbol{\tick}{0}{arrows}{"AC}
  \DeclareSymbolFont{roman}{\encodingdefault}{\rmdefault}{m}{n}
  \DeclareMathSymbol{\bar@sym}{\mathord}{roman}{124}
  \DeclareMathSymbol{\hide@sym}{\mathord}{roman}{092}
  \def\lchan@sym{{\{}\mkern-5mu{|}}
  \def\rchan@sym{{|}\mkern-5mu{\}}}
  \def\lseq@sym{\langle}
  \def\rseq@sym{\rangle}
  \def\lren@sym{[}
  \def\rren@sym{]}
  \def\llink@sym{\langle\mkern-4mu\langle}
  \def\rlink@sym{\rangle\mkern-4mu\rangle}
  \def\then@sym{\simple@enlarge{\rightarrow}}
  \def\parallel@sym{\bar@sym\bar@sym}
  \def\guard@sym{\&}
  \def\becomes@sym{\simple@enlarge{\leftarrow}}
  \def\linksto@sym{\simple@enlarge{\leftrightarrow}}
  \let\extchoice@sym\Box
  \let\intchoice@sym\sqcap
  \let\interrupt@sym\triangle
  \let\timeout@sym\triangleright
  \let\cpar@sym\bar@sym
  \def\lpar@sym{{\bar@sym}\mkern -2mu{[}\mkern-1mu}
  \def\rpar@sym{\mkern-1mu{]}\mkern -2mu{\bar@sym}}
  \def\interleave@sym{\bar@sym\bar@sym\bar@sym}
  \let\circ@sym=\circ
\fi

% -- mathematical sublanguage ------------------------------------------

\def\Empty#1{#1 = \emptyset}
\def\Nil#1{#1 = \nil}
\def\elem#1{\mathrel{\in \ran} #1}
\def\lseq{\mathord{\lseq@sym}}
\def\lset{\{}
\def\nil{\langle\rangle}
\def\range{\upto}
\def\rseq{\mathord{\rseq@sym}}
\def\rset{\}}

\def\If{\mathrel{\mathrm{if}}}
\def\Then{\mathrel{\mathrm{then}}}
\def\Else{\mathrel{\mathrm{else}}}

\def\lchan{\mathord{\lchan@sym}}
\def\rchan{\mathord{\rchan@sym}}
\def\productions{\mathop{\mathrm{productions}}}
\def\extensions{\mathop{\mathrm{extensions}}}

% -- process language --------------------------------------------------

\def\then{\mathrel{\then@sym}}
\def\intchoice{\mathrel{\intchoice@sym}}
\def\extchoice{\mathrel{\extchoice@sym}}

\def\guard{\mathrel{\guard@sym}}

\def\lren{\mathord{\lren@sym}}
\def\rren{\mathord{\rren@sym}}
\def\becomes{\mathbin{\becomes@sym}}

\def\llink{\mathbin{\llink@sym}}
\def\rlink{\mathbin{\rlink@sym}}
\def\linksto{\mathbin{\linksto@sym}}

\def\interrupt{\mathrel{\interrupt@sym}}
\def\timeout{\mathrel{\timeout@sym}}

\def\hide{\mathrel{\hide@sym}}

\def\parallel{\@ifnextchar[{\@parallel}{\mathrel{\parallel@sym}}}
\def\@parallel[#1]{%
  \@ifnextchar[{\@@parallel[#1]}{\lpar #1 \rpar}}
\def\@@parallel[#1][#2]{\lpar #1 \cpar #2 \rpar}

\def\cpar{\mathbin{\cpar@sym}}
\def\lpar{\mathbin{\lpar@sym}}
\def\rpar{\mathbin{\rpar@sym}}

\def\interleave{\mathrel{\interleave@sym}}

\def\linking{\@ifnextchar[{\@linking}{\@linking[]}}
\def\@linking[#1]{\llink #1 \rlink}

% -- indexed operators -------------------------------------------------

\def\indexed@op#1{%
  \mathop{\vcenter@enlarge{\mathstrut#1}}\nolimits}

\def\indexed@bin#1{\mathbin{\vcenter@enlarge{\mathstrut#1}}}

\def\circ{\mathrel{\circ@sym}}

\def\Intchoice{\indexed@op{\intchoice@sym}}
\def\Extchoice{\indexed@op{\extchoice@sym}}
\def\Parallel{\indexed@op{\parallel@sym}}
\def\Interleave{\indexed@op{\interleave@sym}}
\def\Comp{\indexed@op{\comp@sym\,}}

\def\Linking{\@ifnextchar[{\@Linking}{\@Linking[]}}
\def\@Linking[#1]{\indexed@bin{\llink} #1 \indexed@bin{\rlink}}

% -- properties --------------------------------------------------------

\def\Deterministic{%
  \@ifnextchar[{%
    \@deterministic}{%
    \@deterministic[FD]}}
\def\@deterministic[#1]{\mathop{\mathrm{deterministic}_{#1}~}}

\def\DeadlockFree{%
  \@ifnextchar[{%
    \@deadlockfree}{%
    \@deadlockfree[FD]}}
\def\@deadlockfree[#1]{\mathop{\mathrm{deadlock\;free}_{#1}~}}

\def\DivergenceFree{%
  \mathop{\mathrm{divergence\;free}~}}

\def\refinedby{%
  \@ifnextchar[{\@refinedby}{\mathrel{\sqsubseteq}}}

\def\@refinedby[#1]{\mathrel{\sqsubseteq_{#1}}}

% -- displayed mathematics ---------------------------------------------

\newdimen\cspindent \cspindent=\leftmargini
\newdimen\cspleftsep \cspleftsep=1em
\newdimen\csptab \csptab=1em

\newskip\cspskip \cspskip=0.5\baselineskip plus0.333333\baselineskip%
                                minus0.333333\baselineskip%

\def\@cspjot{0.5\cspskip}

\newcount\intercsplinepenalty \intercsplinepenalty=10000%
\newcount\preboxpenalty \preboxpenalty=0%

%\let\cedilla=\c
%\def\c#1{\afterassignment\@c\count@=#1}
%\def\@c{\hskip\count@\csptab}

\newdimen\csprulewidth
\newcount\cspindentdepth

\if@nolines@
  \csprulewidth=0pt
  \cspindentdepth=0
\else
  \csprulewidth=\arrayrulewidth
  \cspindentdepth=1
\fi

\def\@cspnarrow{\advance\linewidth by-\cspindent}
\def\@csprulefill{\leaders\hrule height\csprulewidth\hfill}

\def\cspdisplayindent{\hskip\cspindentdepth\csptab}

\def\csp@topline#1{\hbox to\linewidth{%
    \color{CSPBoxColor}%
    \vrule height\csprulewidth width\csprulewidth
    \vrule height0pt depth\@cspjot width0pt
    \@csprulefill\thinspace{\color{CSPColor}#1}\thinspace%
    \hbox to\cspleftsep{\@csprulefill}}}

\def\@cspline{\omit \vrule height\csprulewidth width\linewidth \cr}

\def\@cspskip#1{\crcr \omit \vrule height#1 width\csprulewidth \cr}

\newif\if@in@csp@display@ \@in@csp@display@false

\def\@csp{\ifvmode\@cspleavevmode\fi$$
  \advance\linewidth by-\cspindent
  \advance\displayindent by\cspindent
  \def\\{\cr}%
  \@in@csp@display@true
  \let\par=\relax
  \tabskip=0pt}

\def\@cspskip#1{\crcr \omit \vrule height#1 width\arrayrulewidth \cr}

\def\also{\crcr \noalign{\penalty\interdisplaylinepenalty
    \vskip\cspskip}}
\def\Also{\crcr \noalign{\penalty\interdisplaylinepenalty
    \vskip2\cspskip}}

\def\@csplign{\tabskip\z@skip\everycr{}}

\def\csp{\@csp\halign to\linewidth\bgroup%
  {\color{CSPColor}\strut$\@csplign##$}\hfil
  \tabskip=0pt plus1fil\cr}
\def\endcsp{\crcr\egroup$$\global\@ignoretrue}

\def\barcsp{\def\also{\@cspskip\cspskip}\def\Also{\@cspskip{2\cspskip}}%
  \color{CSPBoxColor}%
  \@csp\offinterlineskip\halign to\linewidth\bgroup
  \strut \vrule width\csprulewidth\cspdisplayindent%
  {\color{CSPColor}$\@csplign##$}\hfil
  \tabskip=0pt plus1fil\cr}
\def\endbarcsp{\crcr\egroup$$\global\@ignoretrue}

\def\@cspleavevmode{\if@inlabel \indent
  \else\if@noskipsec \indent
  \else\if@nobreak \global\@nobreakfalse
  \everypar={}\abovedisplayskip=0pt\fi
  {\parskip=0pt\noindent}\fi\fi}

\def\block{\@ifnextchar[{\@block}{\@block[t]}}
\def\@block[#1]{\array[#1]{@{}l@{}}}
\let\endblock=\endarray

% -- contexts and declarations -----------------------------------------

\def\extends{\mathrel{\mathrm{extends}}}
\def\uses{\mathrel{\mathrm{uses}}}

\def\declarationname{}

\def\innerdeclarationlabel{\declarationname\\ \hskip\csptab}
\def\innerdeclaration{\block\innerdeclarationlabel\block}
\def\endinnerdeclaration{\endblock\endblock}

\def\outerdeclarationlabel{\global\advance\cspindentdepth
  by 1\declarationname\cr}

\def\outerdeclaration{%
  \@ifnextchar[{\boxdeclaration}{\linedeclaration}}
\def\boxdeclaration[#1]{%
  \def\endouterdeclaration{\global\advance\cspindentdepth
    by -1\@cspskip\@cspjot\@cspline\endbarcsp}%
  \@cspnarrow\barcsp%
  \omit\csp@topline{$\strut#1$}\cr\@cspskip\@cspjot\outerdeclarationlabel}
\def\linedeclaration{%
  \def\endouterdeclaration{\global\advance\cspindentdepth
  by -1\@cspskip\@cspjot\endbarcsp}
  \barcsp\@cspskip\@cspjot\outerdeclarationlabel}

% -- called by @declaration

\if@color@
  \def\@declaration@font{\color{MetaColor}\mathrm}
\else
  \def\@declaration@font{\mathsf}
\fi

\def\@declare#1{\mathop{{\@declaration@font{#1}~}}}

\def\@declaration#1{%
  \def\declarationname{{\@declaration@font{#1}}}%
  \@ifnextchar[{\opt@dec}{\plain@dec}}

\def\plain@dec{%
  \if@in@csp@display@
  \def\finish@dec{\endinnerdeclaration}%
  \innerdeclaration
  \else
  \def\finish@dec{\endouterdeclaration}%
  \outerdeclaration
  \fi}

\def\opt@dec[#1]{%
  \if@in@csp@display@
  \def\finish@dec{\endinnerdeclaration}%
  \innerdeclaration
  \else
  \def\finish@dec{\endouterdeclaration}%
  \outerdeclaration[#1]%
  \fi}

\def\end@declaration{\finish@dec}

\def\newdeclaration#1#2#3{%
  \global\@namedef{#1}{\@declaration{#3}}%
  \global\@namedef{end#1}{\end@declaration}%
  \global\@namedef{#2}{\@declare{#3}}}

\newdeclaration{assertion}{Assertion}{assert}
\newdeclaration{channel}{Channel}{channel}
\newdeclaration{context}{Context}{context}
\newdeclaration{datatype}{Datatype}{datatype}
\newdeclaration{external}{External}{external}
\newdeclaration{function}{Function}{function}
\newdeclaration{nametype}{Nametype}{nametype}
\newdeclaration{process}{Process}{process}
\newdeclaration{set}{Set}{set}
\newdeclaration{subtype}{Subtype}{subtype}
\newdeclaration{transparent}{Transparent}{transparent}
\newdeclaration{within}{Within}{within}

% -- \declaration is an exception to the rule

\def\declaration{%
  \def\declarationname{{\@declaration@font{let}}}%
  \def\outerdeclarationlabel{}
  \@ifnextchar[{\optdeclaration}{\plaindeclaration}}

\def\plaindeclaration{%
  \if@in@csp@display@%
  \def\finishdeclaration{\endinnerdeclaration}%
  \innerdeclaration%
  \else %
  \def\finishdeclaration{%
    \global\advance\cspindentdepth
    by 1\endouterdeclaration}%
  \outerdeclaration \fi}

\def\optdeclaration[#1]{%
  \if@in@csp@display@
  \def\finishdeclaration{\endinnerdeclaration}%
  \innerdeclaration%
  \else
  \def\finishdeclaration{%
    \global\advance\cspindentdepth
  by 1\endouterdeclaration}%
  \outerdeclaration[#1]%
  \fi}

\def\enddeclaration{\finishdeclaration}

\def\Let{\@declare{let}}

% -- semantics ---------------------------------------------------------

\def\newsemantics#1#2{%
  \@namedef{#1}{#2\@ifnextchar[{\@semapp}{\relax}}}
\def\@semapp[#1]{\,\ldbrack #1 \rdbrack}

\newsemantics{traces}{traces}
\newsemantics{divergences}{divergences}
\newsemantics{failures}{failures}

% -- csp.sty -----------------------------------------------------------

\endinput
