\ProvidesPackage{hetcasl}[2002/10/04 v0.1 LaTeX Package for CASL v1.0.1]

\NeedsTeXFormat{LaTeX2e}

% Required packages
\RequirePackage{ifthen}
\RequirePackage{tabularx}
\RequirePackage{calc}
\RequirePackage[latin1]{inputenc}
% \RequirePackage{alltt}

\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}

\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}{%
\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}}%
}%
% \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}}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% starting a library
\newcommand{\library}[1]{\textbf{library}\ \textsc{##1}\ } 
% printing a version number
%\newcommand{\version}[1]{\textnormal{\textbf{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}{}
