\ProvidesPackage{hetcasl}[2002/10/04 v0.1 LaTeX Package for CASL v1.0.1]
%% $Id$
\NeedsTeXFormat{LaTeX2e}
% Required packages
\RequirePackage{ifthen}
\RequirePackage{tabularx}
\RequirePackage{calc}
\RequirePackage[utf8]{inputenc}
\RequirePackage{xspace}
\RequirePackage{latexsym}
\newcounter{@opentabulars}
\setcounter{@opentabulars}{0}
\newlength{\@oldparindent}
\newlength{\@hetcaslmaxwidth}
\newlength{\@remhetcaslwidth}
\newlength{\@KWwidth}%
% The next two length variables will be used in \KW
\newlength{\@realWidth}\newlength{\@neededWidth}
\newlength{\@EqSpace}
\newlength{\@ABSpace}
\newlength{\@LeftABSpace}
\newlength{\@RightABSpace}
\newif\ifhetcasl \hetcaslfalse
\newenvironment{hetcasl}[1][\textwidth]%
{%begin stuff
\ifhetcasl%
\PackageError{hetcasl evironments cannot nested}%
\else\hetcasltrue\fi%
\begingroup%
\setlength{\@oldparindent}{\the\parindent}%
\setlength{\parindent}{0cm}%
\setlength{\@hetcaslmaxwidth}{#1}%
\setlength{\@remhetcaslwidth}{\the\@hetcaslmaxwidth}%
%\begin{alltt}\begingroup\rmfamily
\begin{tabbing}%
% a little line to set up three useful tabstops for rendering parts
% of a library and or specification
\KW{view} \=\KW{preds} \=~~~~~~~\=\kill
}%
{%end stuff
\end{tabbing}%
%\endgroup\end{alltt}
%\@CloseAllTabulars%
\setlength{\parindent}{\the\@oldparindent}%
\endgroup%
\hetcaslfalse%
}
\newcommand{\@HetCASLPrelude}{% HetCASL-Prelude
\settowidth{\@KWwidth}{\textbf{view}}
%%%% define all the makros needed for typesetting hetCASL
%
% \KW prints a KeyWord within a box that is at least \@KWwidth wide.
% If the keyword needs more space the box is as wide as the kyeword
% is. The optional argument overrides \@KWwidth with the width of the
% mandatory argument in bold face. The mandatory argument is always
% printed in bold face.
\newcommand{\KW}[2][no--format--keyword]%
{\ifthenelse{\equal{##1}{no--format--keyword}}%
{% no optional argument
\settowidth{\@neededWidth}{\textbf{##2}}}%
{% optional argument given
\settowidth{\@realWidth}{\textbf{##2}}%
\settowidth{\@KWwidth}{\textbf{##1}}%
\ifthenelse{\@KWwidth > \@realWidth}%
{\setlength{\@neededWidth}{\@KWwidth}}%
{\setlength{\@neededWidth}{\@realWidth}}}%
\makebox[% set the width of the box not smaller
% than the width of the KeyWord
\@neededWidth]%
[l]{\textbf{##2}}%
}%
% print the first argument as is and use the second argument as label
\newcommand{\HetsLabel}[2]{##1}
% print label for ids
\newcommand{\IdDeclLabel}[2]{##1} %% {##1\label{##2}}
\newcommand{\IdApplLabel}[2]{##1} %% {##1\ref{##2}}
% \SId prints its argument in small caps as a Structured Id for names
% of specifications, views and libraries
\newcommand{\SId}[1]{\textsc{##1}}%
% \SIdIndex prints its argument like \SId but sets an Index Entry if
% redifined
\newcommand{\SIdIndex}[1]{\SId{##1}}%
% \Id prints its argument in italic face as one word, for all other
% identifiers not covered by \SId and only containing letters, numbers
% and \_
\newcommand{\Id}[1]{\textit{##1}}%
% \AX prints its argument in math modus
\newcommand{\Ax}[1]{\ensuremath{##1}}%
% \AltBar prints a | with the space of an = sign
\settowidth{\@EqSpace}{\Ax{=}}
\settowidth{\@ABSpace}{\Ax{|}}
\setlength{\@LeftABSpace}{(\@EqSpace - \@ABSpace) *1/2}
\setlength{\@RightABSpace}{\@EqSpace - \@ABSpace - \@LeftABSpace}
\newcommand{\AltBar}{\hspace*{\@LeftABSpace}\Ax{|}\hspace*{\@RightABSpace}}
\newcommand{\ANNOTEWORD}[1]{{\small{}\KW{\%##1}}}
%%%%% Heng todo:
%% Makros aus casl.sty definieren
\newcommand{\LBRACE} {\{}
\newcommand{\RBRACE} {\}}
\newcommand{\FREE} {\KW{free}\xspace} %plain_keyword
\newcommand{\FREELBRACE} {\FREE~\LBRACE}
\newcommand{\GENERATED} {\KW{generated}\xspace}
% \newcommand{\TYPE} {\KW{type}}
% \newcommand{\TYPES} {\KW{types}}
\newcommand{\FREETYPE} {\FREE~\TYPE\xspace}
\newcommand{\FREETYPES} {\FREE~\TYPES\xspace}
\newcommand{\GENERATEDTYPE} {\GENERATED~\TYPE\xspace} %{\KW{generated~type}}
\newcommand{\GENERATEDTYPES} {\GENERATED~\TYPES\xspace}
\newcommand{\VAR} {\KW[preds]{var}\xspace}
\newcommand{\VARS} {\KW[preds]{vars}\xspace}
\newcommand{\AXIOM} {\KW{axiom}\xspace}
\newcommand{\AXIOMS} {\KW{axioms}\xspace}
\newcommand{\HIDE} {\KW{hide}\xspace}
\newcommand{\REVEAL} {\KW{reveal}\xspace}
\newcommand{\WITH} {\KW{with}\xspace}
\newcommand{\THEN} {\KW[view]{then}\xspace} % hetcasl_keyword
\newcommand{\THENCONS} {\THEN~\ANNOTEWORD{cons}\xspace}
\newcommand{\THENDEF} {\THEN~\ANNOTEWORD{def}\xspace}
\newcommand{\THENIMPLIES} {\THEN~\ANNOTEWORD{implies}\xspace}
\newcommand{\THENMONO} {\THEN~\ANNOTEWORD{mono}\xspace}
\newcommand{\AND} {\KW[view]{and}\xspace}
\newcommand{\LOCAL} {\KW{local}\xspace}
\newcommand{\THENLOCAL} {\THEN~\LOCAL}
\newcommand{\WITHIN} {\KW{within}\xspace}
\newcommand{\CLOSED} {\KW{closed}\xspace}
\newcommand{\FIT} {\KW{fit}\xspace}
\newcommand{\TO} {\KW{to}\xspace}
\newcommand{\LOGIC} {\KW{logic}\xspace}
\newcommand{\SPEC} {\KW[view]{spec}\xspace}
\newcommand{\VIEW} {\KW[view]{view}\xspace}
\newcommand{\END} {\KW{end}\xspace}
\newcommand{\ARCH} {\KW{arch}\xspace}
\newcommand{\ARCHSPEC} {\ARCH~\KW{spec}\xspace}
\newcommand{\UNITSPEC} {\KW{unit}~\KW{spec}\xspace}
\newcommand{\UNITS} {\KW{units}\xspace}
\newcommand{\GIVEN} {\KW{given}\xspace}
\newcommand{\RESULT} {\KW{result}\xspace}
\newcommand{\LIBRARY} {\KW{library}\xspace}
\newcommand{\FROM} {\KW[view]{from}\xspace}
\newcommand{\GET} {\KW{get}\xspace}
\newcommand{\VERSION} {\KW{version}\xspace}
\newcommand{\PROD} {\Ax{\times}}
\newcommand{\TOTAL} {\Ax{\rightarrow}}
\newcommand{\PARTIAL} {\Ax{\rightarrow}}
\newcommand{\MAPSTO} {\Ax{\mapsto}}
\newcommand{\ASSOC} {\Id{assoc}}
\newcommand{\COMM} {\Id{comm}}
\newcommand{\IDEM} {\Id{idem}}
\newcommand{\UNIT} {\Id{unit}\xspace}
\newcommand{\EXISTS} {\Ax{\exists}}
\newcommand{\EXISTSUNIQUE} {\AX{\exists!}}
\newcommand{\IMPLIES} {\Ax{\Rightarrow}}
\newcommand{\IFF} {\Ax{\Leftrightarrow}}
\newcommand{\EEQ} {\Ax{\stackrel{e}{=}}}
\newcommand{\A} {\Ax{\wedge}}
\newcommand{\V} {\Ax{\vee}}
\newcommand{\IN} {\Ax{\in}}
\newcommand{\NOT} {\Ax{\neg}}
\newcommand{\FORALL} {\Ax{\forall}}
\newcommand{\BULLET} {\Ax{\;\bullet\;}}
\newcommand{\IF} {\Id{if}\xspace}
\newcommand{\WHEN} {\Id{when}\xspace}
\newcommand{\ELSE} {\Id{else}\xspace}
\newcommand{\DEF} {\Id{def}\xspace}
\newcommand{\AS} {\Id{as}\xspace}
\newcommand{\TRUE} {\Id{true}\xspace}
\newcommand{\FALSE} {\Id{false}\xspace}
%%%% SORT, OP, PRED : drei Varianten %% Type auch
\newcommand{\KWC}[2][preds]{%
\ifthenelse{\equal{##1}{KW}}%
{%KW as parameter
\KW{##2}}%
{% else to KW as parameter
\ifthenelse{\equal{##1}{ID}}%
{%ID as parameter
\Id{##2}}
{% else to ID as parameter
\KW[preds]{##2}}}%
}%% end of KWC definition
\newcommand{\SORT}[1][preds]{\KWC[##1]{sort}\xspace}
\newcommand{\SORTS}[1][preds]{\KWC[##1]{sorts}\xspace}
\newcommand{\ESORT}[1][preds]{\KWC[##1]{esort}\xspace}
\newcommand{\ESORTS}[1][preds]{\KWC[##1]{esorts}\xspace}
\newcommand{\OP}[1][preds]{\KWC[##1]{op}\xspace}
\newcommand{\OPS}[1][preds]{\KWC[##1]{ops}\xspace}
\newcommand{\PRED}[1][preds]{\KWC[##1]{pred}\xspace}
\newcommand{\PREDS}[1][preds]{\KWC[##1]{preds}\xspace}
\newcommand{\TYPE}[1][preds]{\KWC[##1]{type}\xspace}
\newcommand{\TYPES}[1][preds]{\KWC[##1]{types}\xspace}
\newcommand{\ETYPE}[1][preds]{\KWC[##1]{etype}\xspace}
\newcommand{\ETYPES}[1][preds]{\KWC[##1]{etypes}\xspace}
\newcommand{\CLASS}[1][preds]{\KWC[##1]{class}\xspace}
\newcommand{\CLASSES}[1][preds]{\KWC[##1]{classes}\xspace}
\newcommand{\FUN}[1][preds]{\KWC[##1]{fun}\xspace}
\newcommand{\FUNS}[1][preds]{\KWC[##1]{funs}\xspace}
%% 1. mit \KWC[preds]{} default
%% 2. mit \KWC[KW]{}
%% 3. mit \KWC[ID]{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% starting a library
\newcommand{\library}[1]{\KW{library}\ \SId{##1}\ }
% printing a version number
%\newcommand{\version}[1]{\KW{version}\ ##1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% comments, annotations and labels
\newcommand{\commentline}[1]{\textbf{\%\%}{\small##1}}
%
\newenvironment{commentgroup}%
{\textbf{\%\{}\begingroup\small}%
{\endgroup\textbf{\}\%}}%
%
\newcommand{\annoteline}[2]{\textbf{\%##1}\ {\small \(##2\)}}%
%
\newenvironment{annotegroup}[1]%
{\textbf{\%##1(}\begingroup\small}%
{\endgroup\textbf{)\%}}%
%
\newcommand{\casllabel}[1]{\textbf{\%(}{\small##1}\textbf{)\%}}%
%
\newenvironment{mlabel}%
{\textbf{\%(}\begingroup\small}%
{\endgroup\textbf{)\%}}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\newcommand{\place}{\_\_}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% download items (from, get are automatically printed)
\newenvironment{downloaditem}[1]%
{\begingroup\sc
\textnormal{\textbf{from}}\ ##1\ %
%\textnormal{\ifthenelse{\equal{##1}{no-version}}{}{\version{##1}\ }}%
\textnormal{\textbf{get}}}%
{\endgroup}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% specifications
% specdefn starts a new spec defn
% arguments: ##1 ::= opt. semantic-anno
% ##2 ::= spec name
% ##3 ::= parameters (see parameterspecs-env)
% ##4 ::= imports (see importspecs-env)
\newenvironment{specdefn}[4][no-semantic-anno]%
{\textbf{spec}\ \textsc{##2}%
\ifthenelse{\equal{##3}{}}{}{##3}%
\ \(=\)%
}%
{}
% end of \@HetCASLPrelude
}
\@HetCASLPrelude%
%% helpers
% calculate a new width based on \@remhetcaslwidth and the fixed width
% given as argument.
\newcommand{\@calc@width}[1]{}
%\newcommand{\@tabnewline}{\\&}
\newcommand{\@condEOL}{\ifthenelse{\the@opentabulars=0}{\\}{\@tabnewline}}
\newcommand{\@CloseAllTabulars}{}