% Macros for R^nRS.

\makeatletter

% Chapters, sections, etc.

\newcommand{\extrapart}[1]{
  \chapter*{#1}
  \markboth{#1}{#1}
  \vskip 1ex
  \addcontentsline{toc}{chapter}{#1}}

\newcommand{\clearchapterstar}[1]{
  \clearpage
  \topnewpage[
    \centerline{\large\bf\uppercase{#1}}
    \bigskip]}

\newcommand{\clearextrapart}[1]{
  \clearchapterstar{#1}
  \markboth{#1}{#1}
  \addcontentsline{toc}{chapter}{#1}}


\newcommand{\vest}{}
\newcommand{\dotsfoo}{$\ldots\,$}

\newcommand{\sharpfoo}[1]{{\tt\##1}}
\newcommand{\schfalse}{\sharpfoo{f}}
\newcommand{\schtrue}{\sharpfoo{t}}

\newcommand{\singlequote}{{\tt'}}  %\char19
\newcommand{\doublequote}{{\tt"}}
\newcommand{\backquote}{{\tt\char18}}
\newcommand{\backwhack}{{\tt\char`\\}}
\newcommand{\atsign}{{\tt\char`\@}}
\newcommand{\sharpsign}{{\tt\#}}
\newcommand{\verticalbar}{{\tt|}}

\newcommand{\coerce}{\discretionary{->}{}{->}}

% Knuth's \in sucks big boulders
\def\elem{\hbox{\raise.13ex\hbox{$\scriptstyle\in$}}}

\newcommand{\meta}[1]{{\noindent\hbox{\rm$\langle$#1$\rangle$}}}
\let\hyper=\meta
\newcommand{\hyperi}[1]{\hyper{#1$_1$}}
\newcommand{\hyperii}[1]{\hyper{#1$_2$}}
\newcommand{\hyperj}[1]{\hyper{#1$_i$}}
\newcommand{\hypern}[1]{\hyper{#1$_n$}}
\newcommand{\var}[1]{\noindent\hbox{\it{}#1\/}}  % Careful, is \/ always the right thing?
\newcommand{\vari}[1]{\var{#1$_1$}}
\newcommand{\varii}[1]{\var{#1$_2$}}
\newcommand{\variii}[1]{\var{#1$_3$}}
\newcommand{\variv}[1]{\var{#1$_4$}}
\newcommand{\varj}[1]{\var{#1$_j$}}
\newcommand{\varn}[1]{\var{#1$_n$}}

\newcommand{\vr}[1]{{\noindent\hbox{$#1$\/}}}  % Careful, is \/ always the right thing?
\newcommand{\vri}[1]{\vr{#1_1}}
\newcommand{\vrii}[1]{\vr{#1_2}}
\newcommand{\vriii}[1]{\vr{#1_3}}
\newcommand{\vriv}[1]{\vr{#1_4}}
\newcommand{\vrj}[1]{\vr{#1_j}}
\newcommand{\vrn}[1]{\vr{#1_n}}


\newcommand{\defining}[1]{\mainindex{#1}{\em #1}}
\newcommand{\ide}[1]{{\schindex{#1}\frenchspacing\tt#1}}

\newcommand{\lambdaexp}{lambda expression}
\newcommand{\Lambdaexp}{Lambda expression}

% \reallyindex{SORTKEY}{HEADCS}{TYPE}
% writes (index-entry "SORTKEY" "HEADCS" TYPE PAGENUMBER)
% which becomes  \item \HEADCS{SORTKEY} mainpagenumber ; auxpagenumber ...

\global\def\reallyindex#1#2#3{%
\write\@indexfile{(index-entry "#1" "#2" #3 \thepage)}}

\newcommand{\mainschindex}[1]{\label{#1}\reallyindex{#1}{tt}{main}}
\newcommand{\mainindex}[1]{\reallyindex{#1}{rm}{main}}
\newcommand{\schindex}[1]{\reallyindex{#1}{tt}{aux}}
\newcommand{\sharpindex}[1]{\reallyindex{#1}{sharpfoo}{aux}}
\renewcommand{\index}[1]{\reallyindex{#1}{rm}{aux}}

\newcommand{\domain}[1]{#1}
\newcommand{\nodomain}[1]{}
%\newcommand{\todo}[1]{{\rm$[\![$!!~#1$]\!]$}}
\newcommand{\todo}[1]{}

% \frobq will make quote and backquote look nicer.
\def\frobqcats{%\catcode`\'=13
\catcode`\`=13{}}
{\frobqcats
\gdef\frobqdefs{%\def'{\singlequote}
\def`{\backquote}}}
\def\frobq{\frobqcats\frobqdefs}

% \cf = code font
% Unfortunately, \cf \cf won't work at all, so don't even attempt to
% next constructions which use them...
\newcommand{\cf}{\frenchspacing\frobq\tt}

% Same as \obeycr, but doesn't do a \@gobblecr.
{\catcode`\^^M=13 \gdef\myobeycr{\catcode`\^^M=13 \def^^M{\\}}%
\gdef\restorecr{\catcode`\^^M=5 }}

{\catcode`\^^I=13 \gdef\obeytabs{\catcode`\^^I=13 \def^^I{\hbox{\hskip 4em}}}}

{\obeyspaces\gdef {\hbox{\hskip0.5em}}}

\gdef\gobblecr{\@gobblecr}

\def\setupcode{\@makeother\^}

% Scheme example environment
% At 11 points, one column, these are about 56 characters wide.
% That's 32 characters to the left of the => and about 20 to the right.

\newenvironment{schemenoindent}{
  % Commands for scheme examples
  \newcommand{\ev}{\>\>\evalsto}
  \newcommand{\lev}{\\\>\evalsto}
  \newcommand{\unspecified}{{\em{}unspecified}}
  \newcommand{\scherror}{{\em{}error}}
  \setupcode
  \small \cf \obeytabs \obeyspaces \myobeycr
  \begin{tabbing}%
\qquad\=\hspace*{5em}\=\hspace*{9em}\=\kill%   was 16em
\gobblecr}{\unskip\end{tabbing}}

%\newenvironment{scheme}{\begin{schemenoindent}\+\kill}{\end{schemenoindent}}
\newenvironment{scheme}{
  % Commands for scheme examples
  \newcommand{\ev}{\>\>\evalsto}
  \newcommand{\lev}{\\\>\evalsto}
  \newcommand{\unspecified}{{\em{}unspecified}}
  \newcommand{\scherror}{{\em{}error}}
  \setupcode
  \small \cf \obeyspaces \myobeycr
  \begin{tabbing}%
\qquad\=\hspace*{5em}\=\hspace*{9em}\=\+\kill%   was 16em
\gobblecr}{\unskip\end{tabbing}}


\newcommand{\evalsto}{$\Longrightarrow$}

% Rationale

\newenvironment{rationale}{%
\bgroup\small\noindent{\em Rationale:}\space}{%
\egroup}

% Notes

\newenvironment{note}{%
\bgroup\small\noindent{\em Note:}\space}{%
\egroup}

% Manual entries

\newenvironment{entry}[1]{
  \vspace{3.1ex plus .5ex minus .3ex}\noindent#1%
\unpenalty\nopagebreak}{\vspace{0ex plus 1ex minus 1ex}}

\newcommand{\exprtype}{syntax}

% Primitive prototype
\newcommand{\pproto}[2]{\unskip%
\hbox{\cf\spaceskip=0.5em#1}\hfill\penalty 0%
\hbox{ }\nobreak\hfill\hbox{\rm #2}\break}

% Parenthesized prototype
\newcommand{\proto}[3]{\pproto{(\mainschindex{#1}\hbox{#1}{\it#2\/})}{#3}}

% Variable prototype
\newcommand{\vproto}[2]{\mainschindex{#1}\pproto{#1}{#2}}

% Random prototype
\newcommand{\rproto}[3]{\proto{#1}{#2}{#3}}

% Grammar environment

\newenvironment{grammar}{
  \def\:{\goesto{}}
  \def\|{$\vert$}
  \cf \myobeycr
  \begin{tabbing}
    %\qquad\quad \= 
    \qquad \= $\vert$ \= \kill
  }{\unskip\end{tabbing}}

%\newcommand{\unsection}{\unskip}
\newcommand{\unsection}{{\vskip -2ex}}

% Commands for grammars
\newcommand{\arbno}[1]{#1\hbox{\rm*}}  
\newcommand{\atleastone}[1]{#1\hbox{$^+$}}

\newcommand{\goesto}{$\longrightarrow$}

\makeatother
