%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Support literate book volume commands for page formatting
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Note that this file will eventually generate a dvi file
%% which will eventually be processed by dvipdfm to create a pdf.
%% The categories/domains/packages will be placed in a graphviz graph.
%% The graphviz dot syntax allows an href parameter.
%% The href parameter will reference this file. 
%% pdf href syntax allows named destinations.
%% This macro creates a named destination using \special
%% Thus, you reference http://thispdf#nameddest=ABBREV 
%% and you end up at the right page.
%% This macro is called implicitly by \pagehead so every 
%% category/domain/package can be referenced by fullname or abbrev.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Special Meanings for Math Characters
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% don't use mathbb because texlive has changed
\providecommand{\N}{\bf N}
\providecommand{\Natural}{\bf N}
\providecommand{\Z}{\bf Z}
\providecommand{\Integer}{\bf Z}
\providecommand{\Q}{\bf Q}
\providecommand{\Rational}{\bf Q}
\providecommand{\C}{\bf C}
\providecommand{\Complex}{\bf C}
\providecommand{\R}{\bf R}
\providecommand{\Real}{\bf R}
\providecommand{\F}{\bf F}
\providecommand{\abs}[1]{\left|{#1}\right|}
\mathchardef\bigp="3250
\mathchardef\bigq="3251
\mathchardef\bigslash="232C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Struggle with the latex figure-floating behavior
%% (Note: use a minipage instead. It will inline the figure.
%%
%% \spadgraph{draw(sin(tan(x)) - tan(sin(x)),x = 0..6)}
%% \begin{minipage}{\linewidth}
%%  \makebox[\linewidth]{\includegraphics[scale=0.5]{ps/2d1vara.eps}}
%% \begin{center}
%% $sin(tan(x)) - tan(sin(x))\ \ \ x = 0 \ldots6$
%% \end{center}
%% \end{minipage}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\renewcommand\floatpagefraction{.9}
\renewcommand\topfraction{.9}
\renewcommand\bottomfraction{.9}
\renewcommand\textfraction{.1}
\setcounter{totalnumber}{50}
\setcounter{topnumber}{50}
\setcounter{bottomnumber}{50}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% These are used to delimit code in bookvol0
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% sechead consolidates standard page indexing
%% it replaces the \section tag for domains so we
%% create proper cross references and index entries
%%

\newcommand{\domainhead}[1]{% e.g. \domainhead{domain}
\section{#1}
\label{#1}%
\index{{#1}}}%

%%
%% domainref consolidates standard page indexing
%% it replaces the \ref tag for domain
%%

\newcommand{\domainref}[1]{% e.g. \domainref{domain}
{\tt #1}{ \ref{#1} on page~\pageref{#1}}}

%%
%% sectionref consolidates standard page indexing
%% it replaces the \ref tag for labels
%%

\newcommand{\sectionref}[1]{% e.g. \sectionref{domain}
{section~\ref{#1} on page~\pageref{#1}}}

%%
%% figureref consolidates standard page indexing
%% it replaces the \ref tag for labels
%%

\newcommand{\figureref}[1]{% e.g. \sectionref{domain}
{figure~\ref{#1} on page~\pageref{#1}}}

\providecommand{\optArg}[1]{{{\tt [}{#1}{\tt ]}}}
\providecommand{\argDef}[1]{{\tt ({#1})}}
\providecommand{\funSyntax}[2]{{\bf #1}{\tt ({\small\it{#2}})}}
\providecommand{\funArgs}[1]{{\tt ({\small\it {#1}})}\newline}
\providecommand{\condata}[4]{{\bf #1} {\bf #2} {\bf #3} {\bf #4}}

\def\glossaryTerm#1{{\bf #1}\index{#1}}
\def\glossaryTermNoIndex#1{{\bf #1}}
\def\glossarySyntaxTerm#1{{\tt #1}\index{#1}}
\long\def\ourGloss#1#2{\par\pagebreak[3]{#1}\newline{#2}}
\def\csch{\mathop{\rm csch}\nolimits}

\def\erf{\mathop{\rm erf}\nolimits}

\def\zag#1#2{
  {{\hfill \left. {#1} \right|}
   \over
   {\left| {#2} \right. \hfill}
  }
}

\def\simpleList{%
\begin{list}{}{\itemsep 2pt \topsep \parskip \parsep 0
\leftmargin 1pc \partopsep 0 \parskip 0
\if@twocolumn\else\linewidth\xmpWidth\fi}}

\def\endsimpleList{\end{list}\vskip -\parskip}

\def\axiomOp#1{\index{library!operations!#1 @\begingroup \string\tt{} #1 \endgroup}``{\tt #1}''}
\def\spadop{\axiomOp}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% These are used in books explaining Hyperdoc pages
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newdimen\commentWidth 
\commentWidth=11pc
\newdimen\colGutterWidth 
\colGutterWidth=1pc
\newdimen\baseLeftSkip
\baseLeftSkip=\commentWidth \advance\baseLeftSkip by \colGutterWidth

\providecommand\ExitBitmap%
{{\setlength{\unitlength}{0.01in}%
\begin{picture}(50,16)(0,0)\special{psfile=ps/exit.ps}\end{picture}}}

\providecommand\ReturnBitmap%
{{\setlength{\unitlength}{0.01in}%
\begin{picture}(50,16)(0,0)\special{psfile=ps/home.ps}\end{picture}}}

\providecommand\HelpBitmap%
{{\setlength{\unitlength}{0.01in}%
\begin{picture}(50,16)(0,0)\special{psfile=ps/help.ps}\end{picture}}}

\providecommand\UpBitmap%
{{\setlength{\unitlength}{0.01in}%
\begin{picture}(50,16)(0,0)\special{psfile=ps/up.ps}\end{picture}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% dest will give the ability to use nameddest= in html pdfs
%%

\newcommand{\dest}[1]{% e.g. \dest{abb}
\special{pdf:dest (#1) [ @thispage /FitH @ypos ]}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% cmdhead consolidates standard command page setup
%%

\newcommand{\cmdhead}[1]{% e.g. \cmdhead{name}
\chapter{)#1~Command}%
\label{#1}%
\index{#1}%
\section{#1 man page}%
\index{mapage!#1}%
\index{#1!manpage}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defun marks a function definition and adds it to the index
%%

\newcommand{\defun}[2]{% e.g. \defun{functionname}{functionname}
\subsection{defun #2}%
\label{#1}%
\index{#1}%
\index{defun!#1}%
\index{#1!defun}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defplist marks a use of the symbol-plist
%%

\newcommand{\defplist}[2]{% e.g. \defplist{symbol}{entry}
\subsection{defplist #2}%
\label{#1}%
\index{#1}%
\index{defplist!#1}%
\index{#1!defplist}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defunsec marks a function definition and adds it to the index
%% It assumes that the second argument is a section title.
%%

\newcommand{\defunsec}[2]{% e.g. \defunsec{functionname}{section title}
\subsection{#2}%
\label{#1}%
\index{#1}%
\index{defun!#1}%
\index{#1!defun}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defmacro marks a macro definition and adds it to the index
%%

\newcommand{\defmacro}[1]{% e.g. \defmacro{functionname}
\subsection{defmacro {#1}}%
\label{#1}%
\index{#1}%
\index{defmacro!#1}%
\index{#1!defmacro}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defvar marks a var definition and adds it to the index
%%

\newcommand{\defvar}[1]{% e.g. \defvar{varname}
\subsection{defvar \${#1}}%
\label{#1}%
\index{#1}%
\index{defvar!#1}%
\index{#1!defvar}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defstruct marks a struct definition and adds it to the index
%%

\newcommand{\defstruct}[1]{% e.g. \defstruct{varname}
\subsection{defstruct \${#1}}%
\label{#1}%
\index{#1}%
\index{defstruct!#1}%
\index{#1!defstruct}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defdollar marks a var definition (with leading $) and adds it to the index
%%

\newcommand{\defdollar}[1]{% e.g. \defdollar{functionname}
\subsection{defvar \${#1}}%
\label{#1}%
\index{\${#1}}%
\index{defvar!\${#1}}%
\index{\${#1}!defvar}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defconst marks a constant definition and adds it to the index
%%

\newcommand{\defconstant}[1]{% e.g. \defconst{varname}
\subsection{defconstant \${#1}}%
\label{#1}%
\index{#1}%
\index{defconstant!#1}%
\index{#1!defconstant}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defdollar marks a var definition (with leading $) and adds it to the index
%%

\newcommand{\defdollarconstant}[1]{% e.g. \defdollarconstant{functionname}
\subsection{defconstant \${#1}}%
\label{#1}%
\index{\${#1}}%
\index{defconstant!\${#1}}%
\index{\${#1}!defconstant}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% pagehead consolidates standard page indexing
%%

\newcommand{\pagehead}[2]{% e.g. \pagehead{name}{abb}
\dest{#1}%
\dest{#2}%
\subsection{#1 (#2)}%
\label{#1}%
\label{#2}%
\index{{#1}}%
\index{{#2}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% pagetitle consolidates standard page indexing
%%

\newcommand{\pagetitle}[3]{% e.g. \pagetitle{page}{file.ht}{title}
\subsection{#3}%
\label{#1}%
\index{pages!#1!#2}%
\index{#1!#2!pages}%
\index{#2!pages!#1}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% calls marks a call from this function to another
%%

\newcommand{\calls}[2]{% e.g. \calls{thisfunc}{thatfunc}
[#2 p\pageref{#2}]\\%
\index{#2!{calledby #1}}%
\index{#1!{calls #2}}}%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% calls marks a call from this function to another
%%

\newcommand{\seebook}[3]{% e.g. \seebook{thisfunc}{thatfunc}{5}
[#1 #2 (vol#3)]\\%
\index{#2[#3]!{called by #1}}%
\index{#1!{calls #2[#3]}}}%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% uses marks use of a throw tagvar
%%

\newcommand{\throws}[2]{% e.g. \throws{thisfunc}{tagvar}
[#2 p\pageref{#2}]\\%
\index{throws!#1}%
\index{#1!throws}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% uses marks use of a catch tagvar
%%

\newcommand{\catches}[2]{% e.g. \catches{thisfunc}{tagvar}
[#2 p\pageref{#2}]\\%
\index{catches!#1}%
\index{#1!catches}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% uses marks a special variable use
%%

\newcommand{\uses}[2]{% e.g. \uses{thisfunc}{specialvar}
[#2 p\pageref{#2}]\\%
\index{#2!{usedby #1}}%
\index{#1!{uses #2}}}%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% calls marks a call from this function to another 
%% if the called function starts with dollar we need to fake it
%%

\newcommand{\callsdollar}[2]{% e.g. \callsdollar{thisfunc}{thatfunc}
[\$#2 p\pageref{#2}]\\%
\index{\$#2!{calledby \$#1}}%
\index{#1!{calls \$#2}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% usesdollar marks a special variable use
%% if the special variable starts with dollar we need to fake it
%%

\newcommand{\usesdollar}[2]{% e.g. \usesdollar{thisfunc}{specialvar}
[\$#2 p\pageref{#2}]\\%
\index{\${#2}!{usedby #1}}%
\index{#1!{uses \${#2}}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% defines a special variable definition that only occurs within the
%% scope of the lifetime of a function but not defined at the top level.
%% if the special variable starts with dollar we need to fake it
%%

\newcommand{\defsdollar}[2]{% e.g. \defsdollar{thisfunc}{specialvar}
[\$#2 p\pageref{#2}]\\%
\index{\${#2}!{local def #1}}%
\index{#1!{local def \${#2}}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% uses a special variable definition that only occurs within the
%% scope of the lifetime of a function but not defined at the top level.
%% if the special variable starts with dollar we need to fake it
%%

\newcommand{\refsdollar}[2]{% e.g. \refsdollar{thisfunc}{specialvar}
[\$#2 p\pageref{#2}]\\%
\index{\${#2}!{local ref #1}}%
\index{#1!{local ref \${#2}}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% uses marks a special variable use
%% if the special variable starts with dollar we need to fake it
%%

\newcommand{\usesstruct}[2]{% e.g. \usesstruct{thisfunc}{structname}
[\$#2 p\pageref{#2}]\\%
\index{\${#2}!{usedby #1}}%
\index{#1!{uses \${#2}}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% uses marks items that need attention
%%

\newcommand{\tpdhere}[1]{% e.g. \tpdhere{Some note}
{\bf TPDHERE: #1}%
\index{TPDHERE!{#1}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% pagepic adds an image and an index entry
%%

\newcommand{\pagepic}[3]{% e.g. \pagepic{pathandfile}{abb}{scale}
\includegraphics[scale=#3]{#1}\\%
\index{images!#2}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% \refto is a link to a referenced page that returns it arg
%%

\newcommand{\refto}[1]{% e.g. \refto{name}
(p\pageref{#1}) #1}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% pageto is a forward link to a referenced page
%%

\newcommand{\pageto}[2]{% e.g. \pageto{linkstring}{pagename}
\ \\${\bf\Rightarrow{}}${``#1''} (#2) \ref{#2} on page~\pageref{#2}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% pagefrom is a backward link to a referencing page
%%

\newcommand{\pagefrom}[2]{% e.g. \pagefrom{linkstring}{pagename}
\ \\${\bf\Leftarrow{}}${``#1''} (#2) \ref{#2} on page~\pageref{#2}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% fnref sets a reference link to a function
%%

\newcommand{\fnref}[1]{% e.g. \fnref{functionname}
``#1'' (\ref{#1} p~\pageref{#1})}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% varref sets a reference link to a variable
%%

\newcommand{\varref}[1]{% e.g. \varref{variablename}
``#1'' (\ref{#1} p~\pageref{#1})}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% cross will put the category and function in the index
%% cross will leave the funcname so it can be put inline.
%%

\newcommand{\cross}[2]{% e.g. \pagefrom{cat}{funcname}
\index{#1!#2}%
\index{#2!#1}%
#2}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% these commands are used in the man page descriptions for each command
%% they should probably be replaced by other equivalents

\newcommand{\lanb}{{\tt [}}
\newcommand{\ranb}{{\tt ]}}
\newcommand{\vertline}{$|$}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Axiom Literate Programming Chunk Support
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% This defines the TeX support for Axiom.

%% Latex Chunk support
%% This is the chunk environment that replaces the use of web-like tools
%%
%% \begin{verbatim}
%% To use the command you would write
%%    \begin{chunk}{some random string}
%%    random code to be verbatim formatted
%%    \end{chunk}
%% 
%%  This version prints 
%%                     --- some random string ---
%%    random code to be verbatim formatted
%%                     --------------------------
%% \end{verbatim}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% The verbatim package quotes everything within its grasp and is used to
%%% hide and quote the source code during latex formatting. The verbatim
%%% environment is built in but the package form lets us use it in our
%%% chunk environment and it lets us change the font.
%%%

\usepackage{verbatim}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 
%%% Make the verbatim font smaller
%%% Note that we have to temporarily change the '@' to be just a character
%%% because the \verbatim@font name uses it as a character
%%%

\chardef\atcode=\catcode`\@
\catcode`\@=11
\renewcommand{\verbatim@font}{\ttfamily\small}
\catcode`\@=\atcode

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% This declares a new environment named ``chunk'' which has one
%%% argument that is the name of the chunk. All code needs to live
%%% between the \begin{chunk}{name} and the \end{chunk}
%%% The ``name'' is used to define the chunk.
%%% Reuse of the same chunk name later concatenates the chunks

%%% For those of you who can't read latex this says:
%%% Make a new environment named chunk with one argument
%%% The first block is the code for the \begin{chunk}{name}
%%% The second block is the code for the \end{chunk}
%%% The % is the latex comment character

%%% We have two alternate markers, a lightweight one using dashes
%%% and a heavyweight one using the \begin and \end syntax
%%% You can choose either one by changing the comment char in column 1
 
\newenvironment{chunk}[1]{%   we need the chunkname as an argument
{\ }\newline\noindent%                    make sure we are in column 1
%{\small $\backslash{}$begin\{chunk\}\{{\bf #1}\}}% alternate begin mark
\hbox{\hskip 2.0cm}{\bf --- #1 ---}%      mark the beginning
\verbatim}%                               say exactly what we see
{\endverbatim%                            process \end{chunk}
\par{}%                                   we add a newline
\noindent{}%                              start in column 1
\hbox{\hskip 2.0cm}{\bf ----------}%      mark the end
%$\backslash{}$end\{chunk\}%              alternate end mark (commented)
\par%                                     and a newline
\normalsize\noindent}%                    and return to the document

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% This declares the place where we want to expand a chunk

\providecommand{\getchunk}[1]{%
\noindent%
{\small $\backslash{}$begin\{chunk\}\{{\bf #1}\}}}% mark the reference

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Setting up the space code has to be done differently for TeX and
%% LaTeX, so as not to screw up {LaTeX}'s \texttt{verbatim} package.
%% (Fix from Rafael Laboissiere.)
{\obeyspaces\AtBeginDocument{\global\let =\ }} % from texbook, p 381


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Within a code environment, margin tags might be used to mark sub-page
%% numbers in the margins, separated by \nwmarginglue. \stylehook
%% The interaction with \moddef involves tricky kerning.
%% The tag itself is displayed using \nwthemargintag

\def\nwopt@nomargintag{\let\nwmargintag=\@gobble}
\def\nwopt@margintag{%
  \def\nwmargintag##1{\leavevmode\llap{##1\kern\nwmarginglue\kern\codemargin}}}
\def\nwopt@margintag{%
  \def\nwmargintag##1{\leavevmode\kern-\codemargin\nwthemargintag{##1}\kern\codemargin}}
\def\nwthemargintag#1{\llap{#1\kern\nwmarginglue}}
\nwopt@margintag
\newdimen\nwmarginglue
\nwmarginglue=0.3in
\def\nwtagstyle{\footnotesize\Rm}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Noweb-style chunk support
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% make \hsize in code sufficient for 88 columns

\setbox0=\hbox{\tt m}
\newdimen\codehsize
\codehsize=91\wd0 % 88 columns wasn't enough; I don't know why
\newdimen\codemargin
\codemargin=0pt

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \defspace is the space we would like on the right of navigational info
%% that appears on definition lines, so that it lines up with the text above
%% and below.

\newdimen\nwdefspace
\nwdefspace=\codehsize
% need to use \textwidth in {\LaTeX} to handle styles with
% non-standard margins (David Bruce).  Don't know why we sometimes
% wanted \hsize.  27 August 1997.
%% \advance\nwdefspace by -\hsize\relax
\ifx\textwidth\undefined
  \advance\nwdefspace by -\hsize\relax
\else
  \advance\nwdefspace by -\textwidth\relax
\fi

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Most code is set in an environment in which \setupcode has been
%% executed.
%% In this environment, only \, {, and } have their usual categories; 
%% every other character represents itself.
%% Appropriate \chardef ensure that the special characters can be
%% escaped with a backslash.

\chardef\other=12
\def\setupcode{%
  \chardef\\=`\\
  \chardef\{=`\{
  \chardef\}=`\}
  \catcode`\$=\other
  \catcode`\&=\other
  \catcode`\#=\other
  \catcode`\%=\other
  \catcode`\~=\other
  \catcode`\_=\other
  \catcode`\^=\other
  \catcode`\"=\other    % fixes problem with german.sty
  \obeyspaces\Tt
}
\let\nwlbrace=\{
\let\nwrbrace=\}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \nwendquote is called after quoted code.It resets the spacefactor

\def\nwendquote{\relax\ifhmode\spacefactor=1000 \fi}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \eatline is used to consume newlines that should be ignored,
%% for example, the newlines at the end of @ %def identifiers lines.
%% I can't remember what \startline or \newlines are for; I don't
%% think noweave ever emits them.

{\catcode`\^^M=\active % make CR an active character
  \gdef\newlines{\catcode`\^^M=\active % make CR an active character
         \def^^M{\par\startline}}%
  \gdef\eatline#1^^M{\relax}%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% DON'T   \gdef^^M{\par\startline}}% in case ^^M appears in a \write

\def\startline{\noindent\hskip\parindent\ignorespaces}
\def\nwnewline{\ifvmode\else\hfil\break\leavevmode\hbox{}\fi}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Within a code environment, it may be necessary to restore the 
%% category codes in order to set a module (chunk) name.
%% This hack doesn't properly restore " for use in german.sty.

\def\setupmodname{%
  \catcode`\$=3
  \catcode`\&=4
  \catcode`\#=6
  \catcode`\%=14
  \catcode`\~=13
  \catcode`\_=8
  \catcode`\^=7
  \catcode`\ =10
  \catcode`\^^M=5
  \let\{\nwlbrace
  \let\}\nwrbrace
  % bad news --- don't know what catcode to give "
  \Rm}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% noweave brackets uses of chunk names with \LA and \RA, which
%% handle the angle brackets, font, and environment.
%% 
%% As it stands, chunk names can be broken across lines (or pages).  This
%% could result in unnecessary page breaks in code \let\\maybehbox=\mbox to
%% \stylehook avoid breaking them (or to make them work in math mode); 
%% this is done in code chunks, but could be done in general.

\def\LA{\begingroup\maybehbox\bgroup\setupmodname\It$\langle$}
\def\RA{\/$\rangle$\egroup\endgroup}
\def\code{\leavevmode\begingroup\setupcode\newlines}
\def\edoc{\endgroup}
\let\maybehbox\relax

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \equivbox and \plusequivbox are used to set the``\unhcopy\equivbox''
%% and ``\unhcopy\plusequivbox'' that open a chunk definition or its
%% continuation.
%% noweave brackets definitions of chunk names with \moddef and
%% either \endmoddef or \plusendmoddef.

\newbox\equivbox
\setbox\equivbox=\hbox{$\equiv$}
\newbox\plusequivbox
\setbox\plusequivbox=\hbox{$\mathord{+}\mathord{\equiv}$}
% \moddef can't have an argument because there might be \code...\edoc
\def\moddef{\leavevmode\kern-\codemargin\LA}
\def\endmoddef{\RA\ifmmode\equiv\else\unhcopy\equivbox\fi
               \nobreak\hfill\nobreak}
\def\plusendmoddef{\RA\ifmmode\mathord{+}\mathord{\equiv}\else\unhcopy\plusequivbox\fi
               \nobreak\hfill\nobreak}
\def\chunklist{%
\errhelp{I changed \chunklist to \nowebchunks.  
I'll try to avoid such incompatible changes in the future.}%
\errmessage{Use \string\nowebchunks\space instead of \string\chunklist}}
\def\nowebchunks{\message{<Warning: You need noweave -x to use \string\nowebchunks>}}
\def\nowebindex{\message{<Warning: You need noweave -index to use \string\nowebindex>}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% We have to be careful with font-changing in the presence of
%% different font-selection schemes.  In the LaTeX New Font Selection
%% Scheme something like \it\tt will attempt to use an italic
%% typewriter font.  Thus we define new commands like \Tt which will
%% work with both the Plain and old and new LaTeX schemes.  (Note that
%% NFSS will be standard in the next version of LaTeX.)  A problem with
%% these definitions arises with NFSS: in math mode the won't work
%% unless the {\tt oldlfont} backwards-compatibility option is in effect.
%% For the moment, you can get round this by using \mbox.
%% 
%% If you wanted code set in a different font, you could re-define
%% \Tt.\stylehook  [LaTeX2e actually behaves like OFSS, but the
%% extra \reset@font does no harm.]

% here is support for the new-style (capitalized) font-changing commands
% thanks to Dave Love
\ifx\documentstyle\undefined
  \let\Rm=\rm \let\It=\it \let\Tt=\tt       % plain
\else\ifx\selectfont\undefined
  \let\Rm=\rm \let\It=\it \let\Tt=\tt       % LaTeX OFSS
\else                                       % LaTeX NFSS
  \def\Rm{\reset@font\rm}
  \def\It{\reset@font\it}
  \def\Tt{\reset@font\tt}
  \def\Bf{\reset@font\bf}
\fi\fi
\ifx\reset@font\undefined \let\reset@font=\relax \fi

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Support for noweb options

\def\noweboptions#1{%
  \def\@nwoptionlist{#1}%
  \@for\@nwoption:=\@nwoptionlist\do{%
    \@ifundefined{nwopt@\@nwoption}{%
        \@latexerr{There is no such noweb option as '\@nwoption'}\@eha}{%
        \csname nwopt@\@nwoption\endcsname}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Adjusting placement of code on the page
%% 
%% LaTeX requires a larger \codehsize because 
%% code is indented by \codemargin.\stylehook

\codemargin=10pt
\advance\codehsize by \codemargin       % make room for indentation of code
\advance\nwdefspace by \codemargin      % and fix adjustment for def/use
\def\setcodemargin#1{%
  \advance\codehsize by -\codemargin       % make room for indentation of code
  \advance\nwdefspace by -\codemargin   % and fix adjustment for def/use
  \codemargin=#1
  \advance\codehsize by \codemargin       % make room for indentation of code
  \advance\nwdefspace by \codemargin    % and fix adjustment for
                                        % def/use
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \noweboptions{shift} is used to shift the whole page left to make room for
%% the wide code lines. It may be emitted by noweave -shift, or it might be 
%% given by a user.

\def\nwopt@shift{%
  \dimen@=-0.8in
  \if@twoside                 % Values for two-sided printing:
     \advance\evensidemargin by \dimen@
  \else                       % Values for one-sided printing:
     \advance\evensidemargin by \dimen@
     \advance\oddsidemargin by \dimen@
  \fi
%  \advance \marginparwidth -\dimen@
}
\let\nwopt@noshift\@empty

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Page-breaking strategy
%% 
%% We want to insert penalties aiming for:
%% 
%% No page breaks in the middle of a code chunk unless necessary to avoid
%% an overfull vbox;
%% 
%% Documentation immediately preceding a code chunk should appear on
%% the same page as that code chunk unless doing so would violate rule 1.
%% 
%% \filbreak is useful for this sort of thing (see The TeX book) and is 
%% used to encourage breaks at the right places between chunks.  Appropriate 
%% penalties are inserted elsewhere, between code lines in particular.
%% 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Environments for setting code
%% 
%% \nwbegincode and \nwendcode are used by noweave to bracket code chunks.
%% The webcode environment is intended for users who want to paste
%% noweave output into papers.
%% 
%% The definition of \nwbegincode is based on the verbatim implementation
%% in verbatim.sty, which will, presumably be in the next version of
%% LaTeX.  One thing it does differently, apart from the catcode changes
%% is setting \linewidth; this will avoid some overfull hboxen when the
%% code lines are too long, but the lines won't be broken anyhow (even
%% within chunk names because of the \maybehbox definition).

%% Maybe the penalties ought to be parameters

\def\nwbegincode#1{%
  \begingroup
    \topsep \nwcodetopsep
    \@beginparpenalty \@highpenalty
    \@endparpenalty -\@highpenalty
  \@begincode }
\def\nwendcode{\endtrivlist \endgroup \filbreak} % keeps code on 1 page

\newenvironment{webcode}{%
  \@begincode
}{%
  \endtrivlist}

%% This is just common code between \nwbegincode and webcode.

%% The \trivlist cliche isn't quite a cliche because we adjust \leftskip
%% for indentation by \codemargin and adjust \rightskip to allow lines up
%% to \codehsize long without overfull boxen
%% ($\mbox{\codehsize}=\mbox{\hsize}+\mbox{\rightskip}$).
%% Note that \hsize isn't altered.

%% The penalty inserted between verbatim lines would normally be
%% \interlinepenalty, but we want to prohibit breaks there.

%% Note the bug lurking somewhere in this code, as reported by Steven Ooms:
%% I have some lay-out problems in the documentation chunks.  When using
%% the (La)TeX commands \hline or \vtop the right margin is always
%% extended far beyond the page margin after the first code chunk has
%% been typeset.  I'm still looking for the exact cause of it, but to me
%% it seems that LaTeX supposes for those commands that the line width
%% for the documentation chunk is as large as that for code chunks, which
%% isn't true in reality.

%% \nwcodepenalty is the penalty for breaking between lines in a
%% code chunk.  If you set it to 10000, code will never be broken across
%% pages.  I guess this should be settable in \noweboptions.

%% The cursing chunk accounts for the addition of a mess of characters
%% to those reset by \noligs in LaTeX2e.

%% We can't make ` other, because then we'll get ligatures.
%% (Why Don put these ligatures in the \tt font I wish I knew.)
%% But we'll step on all the others.

\def\@begincode{%
    \trivlist \item[]%
    \leftskip\@totalleftmargin \advance\leftskip\codemargin
    \rightskip\hsize \advance\rightskip -\codehsize
    \parskip\z@ \parindent\z@ \parfillskip\@flushglue
  \linewidth\codehsize
    \@@par
    \def\par{\leavevmode\null \@@par \penalty\nwcodepenalty}%
    \obeylines
    \@noligs   \ifx\verbatim@nolig@list\undefined\else
                 \let\do=\nw@makeother \verbatim@nolig@list \do@noligs\`
               \fi
    \setupcode \frenchspacing \@vobeyspaces
  \nowebsize \setupcode
  \let\maybehbox\mbox }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% .TP
%% .B smallcode
%% Set code in 
%% .I LaTeX
%% .B "\\\\small"
%% font instead of 
%% .B "\\\\normalsize."
%% Similar options exist for all the 
%% .I LaTeX
%% size-changing commands.
%% @ \fi
%% @ \nowebsize governs the size at which code is set; users who want
%% to minimize code can \let\nowebsize=\small.  
%% Slitex users should try
%% 
%% \def\nowebsize{\normalsize\baselineskip=20pt \parskip=5pt }
%% 
%% to avoid code lines that are too far apart.
%% \nwcodetopsep is the glue placed before code chunks.\stylehook

  \newskip\nwcodetopsep \nwcodetopsep = 3pt plus 1.2pt minus 1pt
  \let\nowebsize=\normalsize
  \def\nwopt@tinycode{\let\nowebsize=\tiny}
  \def\nwopt@footnotesizecode{\let\nowebsize=\footnotesize}
  \def\nwopt@scriptsizecode{\let\nowebsize=\scriptsize}
  \def\nwopt@smallcode{\let\nowebsize=\small}
  \def\nwopt@normalsizecode{\let\nowebsize=\normalsize}
  \def\nwopt@largecode{\let\nowebsize=\large}
  \def\nwopt@Largecode{\let\nowebsize=\Large}
  \def\nwopt@LARGEcode{\let\nowebsize=\LARGE}
  \def\nwopt@hugecode{\let\nowebsize=\huge}
  \def\nwopt@Hugecode{\let\nowebsize=\Huge}

%%  Maybe the penalties ought to be parameters\dots
\newcount\nwcodepenalty  \nwcodepenalty=\@highpenalty

\def\nw@makeother#1{\catcode`#1=12 }

%% noweave uses \nwbegindocs{nnn} and \nwenddocs to bracket documentation
%% chunks.  If a documentation chunk does not continue the current
%% paragraph, noweave inserts \nwdocspar, which uses \filbreak in an
%% attempt to keep the documentation chunk on the same page as the code
%% chunk that follows it.  (The code chunk will have another \filbreak
%% after it---see \nwbegincode.)  \nwbegindocs doesn't start a new
%% paragraph if the previous chunk didn't end one, i.e. didn't enter
%% vmode; if it does start a new one, it's only indented by the use of
%% \nwdocspar.

\def\nwbegindocs#1{\ifvmode\noindent\fi}
\let\nwenddocs=\relax
\let\nwdocspar=\filbreak

%% The page-breaking strategy implies ragged bottom pages, so we should
%% turn it on in general (this is relevant for the report style):

\raggedbottom

%% noweave doesn't bracket quoted code with \code and \edoc any more.  It
%% probably should do something nifty, just to make TeX hackers happy,
%% but it doesn't.

\def\code{\leavevmode\begingroup\setupcode\@vobeyspaces\obeylines}
\let\edoc=\endgroup

%% The noweb page style

%% Headers contain file name, date, and page number.  noweave emits
%% \nwfilename{name} for each new file.  In the noweb page style, new
%% files cause page breaks; otherwise they are ignored.

\newdimen\@original@textwidth
\def\ps@noweb{%
  \@original@textwidth=\textwidth
  \let\@mkboth\@gobbletwo
  \def\@oddfoot{}\def\@evenfoot{}%       No feet.
  \if@twoside         % If two-sided printing.
    \def\@evenhead{\hbox to \@original@textwidth{%
           \Rm \thepage\qquad{\Tt\leftmark}\hfil\today}}%        Left heading.
    \def\@oddhead{\hbox to \@original@textwidth{%
           \Rm \today\hfil{\Tt\leftmark}\qquad\thepage}}% Right heading.
  \else               % If one-sided printing.
    \def\@oddhead{\hbox to \@original@textwidth{%
           \Rm \today\hfil{\Tt\leftmark}\qquad\thepage}}% Right heading.
    \let\@evenhead\@oddhead
  \fi
  \let\chaptermark\@gobble
  \let\sectionmark\@gobble
  \let\subsectionmark\@gobble
  \let\subsubsectionmark\@gobble
  \let\paragraphmark\@gobble
  \let\subparagraphmark\@gobble
  \def\nwfilename{\begingroup\let\do\@makeother\dospecials
                \catcode`\{=1 \catcode`\}=2 \nw@filename}
  \def\nw@filename##1{\endgroup\markboth{##1}{##1}\let\nw@filename=\nw@laterfilename}%
}
\def\nw@laterfilename#1{\endgroup\clearpage \markboth{#1}{#1}}
\let\nwfilename=\@gobble

%% Chunk cross-reference

%% \nwalsodefined, \nwused, and \nwnotused are emitted by the noweb
%% cross-referencers. (What arguments?)  If unused chunks are output
%% chunks, a filter can slip in \let\nwnotused\nwoutput.  The style uses
%% \nwcodecomment for all annotations that follow code chunks.  Fiddling
%% with it can change the appearance of the output.  Note that
%% \nwcodecomment is used after \nwbegincode, with \obeylines in efect.
%% Since linebreaking can occur here, we need to change the
%% \interlinepenalty.  A little vertical space
%% (\nwcodecommentsep\stylehook) appears before the first comment.

%% We firkled with \rightskip in \nwbegincode above; now we want to reset
%% it so that paragraphs are the normal width (\textwidth, possibly less
%% \codemargin) and set ragged right.  This is done as usuall by making
%% \rightskip naturally zero but stretchable.

\def\nwcodecomment#1{\@@par\penalty\nwcodepenalty
    \if@firstnwcodecomment
      \vskip\nwcodecommentsep\penalty\nwcodepenalty\@firstnwcodecommentfalse
    \fi%
    \hspace{-\codemargin}{%
        \rightskip=0pt plus1in
        \interlinepenalty\nwcodepenalty
        \let\\\relax\footnotesize\Rm #1\@@par\penalty\nwcodepenalty}}

%% This stuff is used at the end of a chunk.

\def\@nwalsodefined#1{\nwcodecomment{\@nwlangdepdef\ \nwpageprep\ \@pagesl{#1}.}}
\def\@nwused#1{\nwcodecomment{\@nwlangdepcud\ \nwpageprep\ \@pagesl{#1}.}}
\def\@nwnotused#1{\nwcodecomment{\@nwlangdeprtc.}}
\def\nwoutput#1{\nwcodecomment{\@nwlangdepcwf\ {\Tt \@stripstar#1*\stripped}.}}
\def\@stripstar#1*#2\stripped{#1}

%% This stuff on the definition line. Note the hooks for pointer styles.

\providecommand{\nwprevdefptr}[1]{%
  \mbox{$\mathord{\triangleleft}\,\mathord{\mbox{\subpageref{#1}}}$}}
\providecommand{\nwnextdefptr}[1]{%
  \mbox{$\mathord{\mbox{\subpageref{#1}}}\,\mathord{\triangleright}$}}

\providecommand{\@nwprevnextdefs}[2]{%
  {\nwtagstyle
  \ifx\relax#1\else ~~\nwprevdefptr{#1}\fi
  \ifx\relax#2\else ~~\nwnextdefptr{#2}\fi}}
\providecommand{\@nwusesondefline}[1]{{\nwtagstyle~~(\@pagenumsl{#1})}}
\providecommand{\@nwstartdeflinemarkup}{\nobreak\hskip 1.5em plus 1fill\nobreak}
\providecommand{\@nwenddeflinemarkup}{\nobreak\hskip \nwdefspace minus\nwdefspace\nobreak}

%% And here are the options we use to choose one, the other, or neither.

\def\nwopt@longxref{%
  \let\nwalsodefined\@nwalsodefined
  \let\nwused\@nwused
  \let\nwnotused\@nwnotused
  \let\nwprevnextdefs\@gobbletwo
  \let\nwusesondefline\@gobble
  \let\nwstartdeflinemarkup\relax
  \let\nwenddeflinemarkup\relax
}
\def\nwopt@shortxref{%
  \let\nwalsodefined\@gobble
  \let\nwused\@gobble
  \let\nwnotused\@gobble
  \let\nwprevnextdefs\@nwprevnextdefs
  \let\nwusesondefline\@nwusesondefline
  \let\nwstartdeflinemarkup\@nwstartdeflinemarkup
  \let\nwenddeflinemarkup\@nwenddeflinemarkup
}
\def\nwopt@noxref{%
  \let\nwalsodefined\@gobble
  \let\nwused\@gobble
  \let\nwnotused\@gobble
  \let\nwprevnextdefs\@gobbletwo
  \let\nwusesondefline\@gobble
  \let\nwstartdeflinemarkup\relax
  \let\nwenddeflinemarkup\relax
}
\nwopt@shortxref % to hell with backward compatibility!

%% .TP
%% .B longxref, shortxref, noxref
%% Choose a style for chunk cross-reference.
%% Long style uses  small paragraphs after each chunk, as in Knuth.
%% Short style uses symbols on the definition line, as in Hanson.
%% .B noxref
%% provides no chunk cross-reference. 
%% Defaults to 
%% .B shortxref.

\newskip\nwcodecommentsep \nwcodecommentsep=3pt plus 1pt minus 1pt
\newif\if@firstnwcodecomment\@firstnwcodecommenttrue

%% Page ranges

%% The goal is to combine sub-page numbers in a way that makes sense.
%% Multiple sub-pages of one page become that page, and individual pages
%% are combined into ranges.  (A range may be only one page.)

\newcount\@nwlopage\newcount\@nwhipage  % range lo..hi-1
\newcount\@nwlosub              % subpage of lo
\newcount\@nwhisub              % subpage of hi

%% The sequence \pagesl makes a range of pages from a list of labels.
%% \subpages works from a list of {{subpage}{page}}.

\def\@nwfirstpage#1#2#3{% subpage page xref-tag
  \@nwlopage=#2 \@nwlosub=#1
  \def\@nwloxreftag{#3}%
  \advance\@nwpagecount by \@ne
  \@nwhipage=\@nwlopage\advance\@nwhipage by \@ne }
\def\@nwnextpage#1#2#3{% subpage page xref-tag
  \ifnum\@nwhipage=#2 
    \advance\@nwhipage by \@ne 
    \advance\@nwpagecount by \@ne
    \@nwhisub=#1 
    \def\@nwhixreftag{#3}\else
  \ifnum#2<\@nwlopage \advance\@nwhipage by \m@ne
                      \ifnum\@nwhipage=\@nwlopage
                           \edef\@tempa{\noexpand\noexpand\noexpand\\%
                                             {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                                              {\@nwloxreftag}}}%
                      \else
                        \count@=\@nwhipage \advance\count@ by \m@ne
                        \ifnum\count@=\@nwlopage % consecutive pages
                            \edef\@tempa{\noexpand\noexpand\noexpand\\%
                                             {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                                              {\@nwloxreftag}}%
                                          \noexpand\noexpand\noexpand\\%
                                             {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
                                              {\@nwhixreftag}}}%
                        \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
                                \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
                                \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
                                  \count@=\@nwlopage \divide\count@ by 100
                                  \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
                                  \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
                                    \multiply\@nwpagetemp by 100
                                    \advance \@nwhipage by -\@nwpagetemp
                                    \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
                                  \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
                                  \fi
                                \fi
                              \fi%
                        \fi
                      \fi%
                      \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa\@nwfirstpage{#1}{#2}{#3}\else
  \ifnum#2>\@nwhipage \advance\@nwhipage by \m@ne
                      \ifnum\@nwhipage=\@nwlopage
                           \edef\@tempa{\noexpand\noexpand\noexpand\\%
                                             {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                                              {\@nwloxreftag}}}%
                      \else
                        \count@=\@nwhipage \advance\count@ by \m@ne
                        \ifnum\count@=\@nwlopage % consecutive pages
                            \edef\@tempa{\noexpand\noexpand\noexpand\\%
                                             {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                                              {\@nwloxreftag}}%
                                          \noexpand\noexpand\noexpand\\%
                                             {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
                                              {\@nwhixreftag}}}%
                        \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
                                \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
                                \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
                                  \count@=\@nwlopage \divide\count@ by 100
                                  \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
                                  \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
                                    \multiply\@nwpagetemp by 100
                                    \advance \@nwhipage by -\@nwpagetemp
                                    \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
                                  \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
                                  \fi
                                \fi
                              \fi%
                        \fi
                      \fi%
                      \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa\@nwfirstpage{#1}{#2}{#3}\else
    \@nwlosub=0 \@nwhisub=0
  \fi\fi\fi
  }
\newcount\@nwpagetemp
\newcount\@nwpagecount
\def\@nwfirstpagel#1{% label
  \@ifundefined{r@#1}{\@warning{Reference `#1' on page \thepage \space undefined}%
                      \nwix@cons\nw@pages{\\{\bf ??}}}{%
    \edef\@tempa{\noexpand\@nwfirstpage\subpagepair{#1}{#1}}\@tempa}}
\def\@nwnextpagel#1{% label
  \@ifundefined{r@#1}{\@warning{Reference `#1' on page \thepage \space undefined}%
                      \nwix@cons\nw@pages{\\{\bf ??}}}{%
    \edef\@tempa{\noexpand\@nwnextpage\subpagepair{#1}{#1}}\@tempa}}
\def\@pagesl#1{%  list of labels
  \gdef\nw@pages{}\@nwpagecount=0
  \def\\##1{\@nwfirstpagel{##1}\let\\=\@nwnextpagel}#1%
  \advance\@nwhipage by \m@ne
  \ifnum\@nwhipage=\@nwlopage
       \edef\@tempa{\noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                          {\@nwloxreftag}}}%
  \else
    \count@=\@nwhipage \advance\count@ by \m@ne
    \ifnum\count@=\@nwlopage % consecutive pages
        \edef\@tempa{\noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                          {\@nwloxreftag}}%
                      \noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
                          {\@nwhixreftag}}}%
    \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
            \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
            \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
              \count@=\@nwlopage \divide\count@ by 100
              \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
              \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
                \multiply\@nwpagetemp by 100
                \advance \@nwhipage by -\@nwpagetemp
                \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
              \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
              \fi
            \fi
          \fi%
    \fi
  \fi%
  \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa\def\\##1{\@nwhyperpagenum##1}%
  \ifnum\@nwpagecount=1 \nwpageword \else \nwpagesword\fi~\commafy{\nw@pages}}
\def\@nwhyperpagenum#1#2{\nwhyperreference{#2}{#1}}

\def\@pagenumsl#1{%  list of labels -- doesn't include word `pages', commas, or `and'
  \gdef\nw@pages{}\@nwpagecount=0
  \def\\##1{\@nwfirstpagel{##1}\let\\=\@nwnextpagel}#1%
  \advance\@nwhipage by \m@ne
  \ifnum\@nwhipage=\@nwlopage
       \edef\@tempa{\noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                          {\@nwloxreftag}}}%
  \else
    \count@=\@nwhipage \advance\count@ by \m@ne
    \ifnum\count@=\@nwlopage % consecutive pages
        \edef\@tempa{\noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                          {\@nwloxreftag}}%
                      \noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
                          {\@nwhixreftag}}}%
    \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
            \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
            \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
              \count@=\@nwlopage \divide\count@ by 100
              \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
              \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
                \multiply\@nwpagetemp by 100
                \advance \@nwhipage by -\@nwpagetemp
                \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
              \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
              \fi
            \fi
          \fi%
    \fi
  \fi%
  \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa%
  \def\\##1{\@nwhyperpagenum##1\let\\=\@nwpagenumslrest}\nw@pages}
\def\@nwpagenumslrest#1{~\@nwhyperpagenum#1}
\def\subpages#1{% list of {{subpage}{page}}
  \gdef\nw@pages{}\@nwpagecount=0
  \def\\##1{\edef\@tempa{\noexpand\@nwfirstpage##1{}}\@tempa
            \def\\####1{\edef\@tempa{\noexpand\@nwnextpage####1}\@tempa}}#1%
  \advance\@nwhipage by \m@ne
  \ifnum\@nwhipage=\@nwlopage
       \edef\@tempa{\noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                          {\@nwloxreftag}}}%
  \else
    \count@=\@nwhipage \advance\count@ by \m@ne
    \ifnum\count@=\@nwlopage % consecutive pages
        \edef\@tempa{\noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                          {\@nwloxreftag}}%
                      \noexpand\noexpand\noexpand\\%
                         {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
                          {\@nwhixreftag}}}%
    \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
            \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
            \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
              \count@=\@nwlopage \divide\count@ by 100
              \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
              \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
                \multiply\@nwpagetemp by 100
                \advance \@nwhipage by -\@nwpagetemp
                \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
              \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
              \fi
            \fi
          \fi%
    \fi
  \fi%
  \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa\def\\##1{\@firstoftwo##1}%
  \ifnum\@nwpagecount=1 \nwpageword \else \nwpagesword\fi~\commafy{\nw@pages}}
\def\@nwaddrange{\advance\@nwhipage by \m@ne
                 \ifnum\@nwhipage=\@nwlopage
                      \edef\@tempa{\noexpand\noexpand\noexpand\\%
                                        {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                                         {\@nwloxreftag}}}%
                 \else
                   \count@=\@nwhipage \advance\count@ by \m@ne
                   \ifnum\count@=\@nwlopage % consecutive pages
                       \edef\@tempa{\noexpand\noexpand\noexpand\\%
                                        {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
                                         {\@nwloxreftag}}%
                                     \noexpand\noexpand\noexpand\\%
                                        {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
                                         {\@nwhixreftag}}}%
                   \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
                           \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
                           \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
                             \count@=\@nwlopage \divide\count@ by 100
                             \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
                             \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
                               \multiply\@nwpagetemp by 100
                               \advance \@nwhipage by -\@nwpagetemp
                               \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
                             \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
                             \fi
                           \fi
                         \fi%
                   \fi
                 \fi%
                 \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa}

%% \nwpageword, \nwpagesword, and \nwpageprep let you change the wording
%% of the cross-reference information.

\def\nwpageword{\@nwlangdepchk}  % chunk, was page
\def\nwpagesword{\@nwlangdepchks}  % chunk, was page
\def\nwpageprep{\@nwlangdepin}     % in, was on

%% Sub-page references

%% This is the wonderful code that Dave Love provided to make page
%% references like 7a, 7b, and so on.

%% This code provides a mechanism for defining `page sub-references'
%% using \sublabel{foo} referenced with \subpageref{foo}.  Sub-references
%% will be numbered like these real examples: 
%% \subpageref{ref:foo},
%% \subpageref{ref:bar},
%% \subpageref{ref:baz}\sublabel{ref:foo}\sublabel{ref:bar}\sublabel{ref:baz}
%% etc.\ unless there is only one on the page, in which case the letter
%% will be dropped like this: \subpageref{ref:fred}.
%% 
%% To be able to use \subpageref we must define the label with \sublabel,
%% used like label.  (Using \ref with a label defined by \sublabel will
%% produce the sub-reference number, by the way, and \pageref works as
%% expected.)  Note that \subpageref is robust and \ref and \pageref are
%% redefined to be robust also, as they will be in future LaTeX releases.
%% Incidentally, these expand to the relevant text plus \null---you might
%% want to strip this off, e.g. for sorting lists.

%% There are various ways we could attack this task (which is made
%% non-trivial by the well-known asynchrony of (La)TeX's output routine),
%% but they all must depend on hacks in the .aux file or a similar one.
%% Joachim Schrod's fnpag.sty does the same sort of thing differently to
%% this LaTeX-specific approach.  See latex.tex for enlightenment on the
%% cross-referencing mechanism and the LaTeX internals used below.  [DL:
%% The internals change in LaTeX2e compared with LaTeX 2.09.  The code
%% here still works, though.]

%% The new-style LaTeX page-reference macros all work the same way: 
%% if the thing is undefined, barf.  Otherwise, do the specified thing.
%% We need to handle the fact that the expansion of the label may be two
%% items or five items, depending on whether hypertext is used.
%% Since we're only ever interested in the first two items, we use a
%% hack---the ``do the specified thing'' must be defined as
%% \mbox{[[\def\dome#1#2#3\\{...}]]} where ... 
%% uses only the first two parameters.

\providecommand\nw@genericref[2]{% what to do, name of ref
  \expandafter\nw@g@nericref\csname r@#2\endcsname#1{#2}}
\providecommand\nw@g@nericref[3]{% control sequence, what to do, name
  \ifx#1\relax
    \ref{#3}% trigger the standard `undefined ref' mechanisms
  \else
    \expandafter#2#1.\\%
  \fi}

%% Much of what we want can be done by pulling out the first, second,
%% or first and second elements of a ref.

\def\nw@selectone#1#2#3\\{#1}
\def\nw@selecttwo#1#2#3\\{#2}
\def\nw@selectonetwo#1#2#3\\{{#1}{#2}}

%% The \subpageref macro first does a normal \pageref.  If the reference
%% is actually defined, it then goes on to check whether the control
%% sequence 2on\LA{}{page referenced}\RA{} is defined and sets the \ref
%% value to get a etc. if so.  The magic, of course, is in defining the
%% 2on bit appropriately.  \subpageref also tries to include the right
%% hyperstuff for xhdvi.

\providecommand{\subpageref}[1]{%
  \nwhyperreference{#1}{\nw@genericref\@subpageref{#1}}}

%% \subpagepair produces a {subpage}{page} pair.

\def\@subpageref#1#2#3\\{%
  \@ifundefined{2on#2}{#2}{\nwthepagenum{#1}{#2}}}
\providecommand{\subpagepair}[1]{%  % produces {subpage}{page}
  \@ifundefined{r@#1}%
    {{0}{0}}%
    {\nw@genericref\@subpagepair{#1}}}
\def\@subpagepair#1#2#3\\{%
  \@ifundefined{2on#2}{{0}{#2}}{{#1}{#2}}}

%% \sublabel is like the \label command, except that it writes
%% \newsublabel onto the .aux file rather than \newlabel.
%% For hyperreferencing, all labels must be hypertext 
%% anchors, for which we use \nwblindhyperanchor.

\providecommand{\sublabel}[1]{%
  \@bsphack
  \nwblindhyperanchor{#1}%
  \if@filesw {\let\thepage\relax
   \def\protect{\noexpand\noexpand\noexpand}%
   \edef\@tempa{\write\@auxout{\string
      \newsublabel{#1}{{}{\thepage}}}}%
   \expandafter}\@tempa
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}

%% \nosublabel creates a label with a sub-page part of 0.

\providecommand{\nosublabel}[1]{%
  \@bsphack\if@filesw {\let\thepage\relax
   \def\protect{\noexpand\noexpand\noexpand}%
   \edef\@tempa{\write\@auxout{\string
      \newlabel{#1}{{0}{\thepage}}}}%
   \expandafter}\@tempa
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}

%% \newsublabel is the macro that does the important work.  It is called
%% with the same sort of arguments as \newlabel: the first argument is
%% the label name and the second is {<<ref value>>}{<<page number>>}.
%% (Note that the only definition here which needs to be global is the
%% one which is, and that \global is redefined by \enddocument, which
%% will bite you if you use it

%% Before we create a \newsublabel for the first time, we set the
%% proper trailers.

\providecommand\newsublabel{%
  \nw@settrailers
  \global\let\newsublabel\@newsublabel
  \@newsublabel}

%% First we extract the page number into \this@page.

%% Then we see whether it's changed from the value of \last@page which
%% was stashed away by the last \newsublabel (or is \relax if this is the
%% first one).  If the page has changed, we reset the counter \sub@page
%% telling us how many sub-labels there have been on the page.

%% If we've had at least two on the page, we define the 
%% 2on\LA{}{page no.}\RA{} macro to indicate the fact.

%% \nextchunklabel{cl1}\nextchunklabel{cl2}
%% Then we write a normal \newlabel with the sub-reference as the normal
%% reference value in the second argument.  Unfortunately, if we want
%% hypertext support, the second argument of \newlabel gets complicated.
%% 
%% It is either
%% 
%% {<<ref value>>}{<<page number>>}, when normal {LaTeX} is running, or
%% 
%% {<<ref value>>}{<<page number>>}{<<text>>}}{<<hyper category>>}{<<URL>>},
%% when the hyperref package is running.  (We actually detect this by
%% looking for the nameref package, because that's the one that changes
%% the use of labels.)
%% 
%% We unify these two things by producing
%% {<<ref value>>}{<<page number>>}\nw@labeltrailers
%% 
%% We may have pending labels in support of \nextchunklabel, as defined in
%% chunk~\subpageref{chunklabel}. 
%% 
%% Because we want to define all of the ``pending sublabels'' in exactly
%% the same way, we do something a bit odd---we make the current label a
%% pending label as well.

\providecommand{\@newsublabel}[2]{%
  \edef\this@page{\@cdr#2\@nil}%
  \ifx\this@page\last@page\else
    \sub@page=\z@
  \fi
  \edef\last@page{\this@page}
  \advance\sub@page by \@ne
  \ifnum\sub@page=\tw@
    \global\@namedef{2on\this@page}{}%
  \fi
  \pendingsublabel{#1}%
  \edef\@tempa##1{\noexpand\newlabel{##1}%
    {{\number\sub@page}{\this@page}\nw@labeltrailers}}%
  \pending@sublabels
  \def\pending@sublabels{}}

%% We can't use \@ifpackageloaded to see if nameref is loaded, because
%% that is restricted to the preamble, and \newsublabel goes into the
%% .aux file, which is executed after the whole document is processed.
%% We therefore test for \@secondoffive.  This is lame, but what else can
%% we do?

\providecommand\nw@settrailers{% -- won't work on first run
  \@ifpackageloaded{nameref}%
     {\gdef\nw@labeltrailers{{}{}{}}}%
     {\gdef\nw@labeltrailers{}}}
\renewcommand\nw@settrailers{% 
  \@ifundefined{@secondoffive}%
     {\gdef\nw@labeltrailers{}}%
     {\gdef\nw@labeltrailers{{}{}{}}}}

%% Now we keep track of those pending guys.\nextchunklabel{chunklabel}
%% The goal here is to save them up until they're all equivalent to the
%% label on the next chunk.  We have to control expansion so chunks like
%% \subpageref{cl1} (\subpageref{cl2}) can be labelled twice.

\providecommand{\nextchunklabel}[1]{%
  \nwblindhyperanchor{#1}%   % looks slightly bogus --- nr
  \@bsphack\if@filesw {\let\thepage\relax
      \edef\@tempa{\write\@auxout{\string\pendingsublabel{#1}}}%
      \expandafter}\@tempa
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
\providecommand\pendingsublabel[1]{%
  \def\@tempa{\noexpand\@tempa}%
  \edef\pending@sublabels{\noexpand\@tempa{#1}\pending@sublabels}}
\def\pending@sublabels{}

%% .PP \" .TP will not work with the backslashes on the next line. Period.
%% \fB\\nextchunklabel{l}\fP
%% .RS
%% Associates label \fBl\fP
%% with the sub-page reference of the next code chunk.
%% Can be used in for concise chunk cross-reference with, e.g.,
%% \fBchunk~\\subpageref{l}\fP.
%% .RE
%% 
%% We need to define these.

\def\last@page{\relax}
\newcount\sub@page

%% Here a a couple of hooks for formatting sub-page numbers,
%% which can be alphabetic, numeric, or omitted.\stylehook

\def\@alphasubpagenum#1#2{#2\ifnum#1=0 \else\@alph{#1}\fi}
\def\@nosubpagenum#1#2{#2}
\def\@numsubpagenum#1#2{#2\ifnum#1=0 \else.\@arabic{#1}\fi}
\def\nwopt@nosubpage{\let\nwthepagenum=\@nosubpagenum\nwopt@nomargintag}
\def\nwopt@numsubpage{\let\nwthepagenum=\@numsubpagenum}
\def\nwopt@alphasubpage{\let\nwthepagenum=\@alphasubpagenum}
\nwopt@alphasubpage

%% In rare cases, there may be more than 26 chunks on a page.  In such a
%% case, we need a sub-page numbering scheme that can go beyond ``a toz.''  
%% The scheme I have chosen is ``a to z, then aa to zz, then aaa to zzz, etc.''
%% The conversion requires a bit of thought because it is
%% not an ordinary conversion of integer to string as we usually
%% think of such things.  The problem is that the meaning of the letters
%% depends on the position; the letter a acts like a zero in some
%% positions or a one in others.

%% The solution I have implemented uses a variable bound which is always
%% equal to 26^k for some k.  If we write the recurrence B_k = B_{k-1} +
%% 26^k, with B_0 = 0, we then use a string of k letters to represent
%% numbers between B_{k-1}$ and $B_k.  Within that string, a's are 0's,
%% and so on up to z's which are 25's, and we use standard
%% integer-conversion methods to encode n-B_{k-1}.

%% The following Icon implementation may be more perspicuous than the TeX
%% code actually used.  Here the variable bound is 26^k, with k=1
%% initially, and n is n-B_{k-1}.  The first loop finds the right k, and
%% the second does the usual string conversion.

%% The Icon code for subpage numbering is 
%% 
%% procedure alphastring(n)
%%   bound := 26
%% 
%%   while n >= bound do {
%%     # invariant: bound = 26^(k+1) & n is initial n - B_k
%%     n -:= bound
%%     bound *:= 26
%%   }
%%   
%%   while bound > 1 do {
%%     bound /:= 26
%%     d := integer(n / bound)
%%     n -:= d * bound
%%     writes(&lcase[d+1])
%%   }
%% end

%% Here's TeX code to achieve the same end.  The entire macro body is
%% enclosed in braces, so that it can be used with \loop without picking
%% up the wrong \repeat.

\newcount\@nwalph@n
\let\@nwalph@d\@tempcnta
\let\@nwalph@bound\@tempcntb
\def\@nwlongalph#1{{%
  \@nwalph@n=#1\advance\@nwalph@n by-1
  \@nwalph@bound=26
  \loop\ifnum\@nwalph@n<\@nwalph@bound\else
     \advance\@nwalph@n by -\@nwalph@bound
     \multiply\@nwalph@bound by 26
  \repeat
  \loop\ifnum\@nwalph@bound>1
    \divide\@nwalph@bound by 26
    \@nwalph@d=\@nwalph@n\divide\@nwalph@d by \@nwalph@bound
    % d := d * bound ; n -:= d; d := d / bound --- saves a temporary
    \multiply\@nwalph@d by \@nwalph@bound
    \advance\@nwalph@n by -\@nwalph@d
    \divide\@nwalph@d by \@nwalph@bound
    \advance\@nwalph@d by 1 \@alph{\@nwalph@d}%
  \repeat
}}

%% .TP
%% .B alphasubpage, numsubpage, nosubpage
%% Number chunks by the number of the page on which they appear,
%% followed by an alphabetic (numeric, not used) ``sub-page'' indicator.
%% Defaults to 
%% .B alphasubpage.
%% .B nosubpage
%% implies
%% .B nomargintag.

%% WEB-like chunk numbering
%% 
%% Here's a righteous hack: we get the effect of WEB-like chunk numbers
%% just by redefining \sublabel to use a counter instead of the current
%% page number.  Since the numbers are all distinct, no sub-page number
%% is ever used.

\newcount\nw@chunkcount
\nw@chunkcount=\@ne
\providecommand{\weblabel}[1]{%
  \@bsphack
  \nwblindhyperanchor{#1}%
  \if@filesw {\let\thepage\relax
   \def\protect{\noexpand\noexpand\noexpand}%
   \edef\@tempa{\write\@auxout{\string
      \newsublabel{#1}{{}{\number\nw@chunkcount}}}}%
   \expandafter}\@tempa
   \global\advance\nw@chunkcount by \@ne
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
\def\nwopt@webnumbering{%
  \let\sublabel=\weblabel
  \def\nwpageword{chunk}\def\nwpagesword{chunks}%
  \def\nwpageprep{in}}

%% .TP
%% .B webnumbering
%% Number chunks consecutively, in 
%% .I WEB
%% style, instead of using sub-page numbers.

%% Indexing (identifier cross-reference) support
%% 
%% Tracking definitions and uses
%% 
%% All index definitions and uses are associated with a label defined
%% with \sublabel or \nosublabel.  Either the label is the \sublabel of
%% the code chunk in which the definition or use appears, or it is a
%% \nosublabel appearing in the middle of a documentation chunk.
 
% \nwindexdefn{printable name}{identifying label}{label of chunk}
% \nwindexuse{printable name}{identifying label}{label of chunk}

\def\nwindexdefn#1#2#3{\@auxix{\protect\nwixd}{#2}{#3}}
\def\nwindexuse#1#2#3{\@auxix{\protect\nwixu}{#2}{#3}}

\def\@auxix#1#2#3{% {marker}{id label}{subpage label}
   \@bsphack\if@filesw {\let\nwixd\relax\let\nwixu\relax
   \def\protect{\noexpand\noexpand\noexpand}%
   \edef\@tempa{\write\@auxout{\string\nwixadd{#1}{#2}{#3}}}%
   \expandafter}\@tempa
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
% \nwixadd{marker}{idlabel}{subpage label}
\def\nwixadd#1#2#3{%
  \@ifundefined{nwixl@#2}%
    {\global\@namedef{nwixl@#2}{#1{#3}}}%
    {\expandafter\nwix@cons\csname nwixl@#2\endcsname{#1{#3}}}}

%% Subscripted identifiers
%% 
%% We use either explicit subscripts or hyperlinks to point identifiers
%% to their definitions.

\def\@nwsubscriptident#1#2{\mbox{$\mbox{#1}_{\mathrm{\subpageref{#2}}}$}}
\def\@nwnosubscriptident#1#2{#1}
\def\@nwhyperident#1#2{\leavevmode\nwhyperreference{#2}{#1}}

%% We can use subscripts, hyperlinks, or nothing on all identifiers.

\def\nwopt@subscriptidents{%
  \let\nwlinkedidentq\@nwsubscriptident
  \let\nwlinkedidentc\@nwsubscriptident
}
\def\nwopt@nosubscriptidents{%
  \let\nwlinkedidentq\@nwnosubscriptident
  \let\nwlinkedidentc\@nwnosubscriptident
}
\def\nwopt@hyperidents{%
  \let\nwlinkedidentq\@nwhyperident
  \let\nwlinkedidentc\@nwhyperident
}
\def\nwopt@nohyperidents{%
  \let\nwlinkedidentq\@nwnosubscriptident
  \let\nwlinkedidentc\@nwnosubscriptident
}

%% We can change only identifiers appearing in quoted code.

\def\nwopt@subscriptquotedidents{%
  \let\nwlinkedidentq\@nwsubscriptident
}
\def\nwopt@nosubscriptquotedidents{%
  \let\nwlinkedidentq\@nwnosubscriptident
}
\def\nwopt@hyperquotedidents{%
  \let\nwlinkedidentq\@nwhyperident
}
\def\nwopt@nohyperquotedidents{%
  \let\nwlinkedidentq\@nwnosubscriptident
}

%% The default is to hyperlink everything.

\nwopt@hyperidents

%% .TP
%% .B subscriptidents, nosubscriptidents, hyperidents, nohyperidents
%% Controls subscripting of identifiers in code, including quoted code.
%% Selecting
%% .B subscriptidents
%% means an identifier appearing in a code chunk (or in quoted code
%% within a documentation 
%% chunk) will be subscripted with the chunk number of its definition.
%% .B hyperidents
%% means such identifiers will be hyperlinked to their definitions,
%% provided of course that a hypertext package like
%% .B hyperref
%% is loaded.
%% .B nosubscriptidents
%% and 
%% .B nohyperidents
%% are equivalent, and they turn off such markings.
%% The default is
%% .B hyperidents.
%% .TP
%% .B subscriptquotedidents, nosubscriptquotedidents, hyperquotedidents,
%%  nohyperquotedidents
%% 
%% Controls linking of identifiers as above, but applies only to uses of
%% identifiers in quoted code.

%% Writing lists with commas and ``and''
%% 
%% You get one of
%%  ``$a$''
%%  ``$a$ and $b$''
%%  ``$a$, $\ldots$, $b$, and $c$''
%% Plus \\ is applied to each element of the list.

\newcount\@commacount
\def\commafy#1{%
  {\nwix@listcount{#1}\@commacount=\nwix@counter
   \let\@comma@each=\\%
   \ifcase\@commacount\let\\=\@comma@each\or\let\\=\@comma@each\or
     \def\\{\def\\{ \@nwlangdepand\ \@comma@each}\@comma@each}\else
     \def\\{\def\\{, %
                   \advance\@commacount by \m@ne
                   \ifnum\@commacount=1 \@nwlangdepand~\fi\@comma@each}\@comma@each}\fi
   #1}}

%% New, improved index code
%% 
%% There are two kinds of lists.
%% One kind is a generic list in which elements are preceded by \.
%% If the elements are index elements, they are printable{identifier}{label} 
%% pairs. The other kind is a list of sub-page labels, in which each 
%% element is preceded by either \nwixd or \nwixu.

\def\nwix@cons#1#2{% {list}{\marker{element}}
  {\toks0=\expandafter{#1}\def\@tempa{#2}\toks2=\expandafter{\@tempa}%
   \xdef#1{\the\toks0 \the\toks2 }}}

%% The reference list for an identifier labelled id is always called 
%% \nwixl@{id}. Most applications will work with reference lists by applying 
%% \\ either to the defs or to the uses.

\def\nwix@uses#1{% {label}
  \def\nwixu{\\}\let\nwixd\@gobble\@nameuse{nwixl@#1}}
\def\nwix@defs#1{% {label}
  \def\nwixd{\\}\let\nwixu\@gobble\@nameuse{nwixl@#1}}

%% Some applications count uses to see whether there is any need to
%% display information.

\newcount\nwix@counter
\def\nwix@listcount#1{% {list with \\}
  {\count@=0
   \def\\##1{\advance\count@ by \@ne }%
   #1\global\nwix@counter=\count@ }}
\def\nwix@usecount#1{\nwix@listcount{\nwix@uses{#1}}}
\def\nwix@defcount#1{\nwix@listcount{\nwix@defs{#1}}}

%% Supporting a mini-index at the end of each chunk
%% 
%% When displaying identifiers used, show the identifier and its
%% definitions.

\def\nwix@id@defs#1{% index pair
  {{\Tt \@car#1\@nil}%
  \def\\##1{~\subpageref{##1}}\nwix@defs{\@cdr#1\@nil}}}
\def\nwidentuses#1{% list of index pairs
  \nwcodecomment{\@nwlangdepuss\ \let\\=\nwix@id@defs\commafy{#1}.}}

%% The definitions section is a bit more complex, because it is omitted
%% if none of the identifiers defined is ever used.

\def\nwix@totaluses#1{% list of index pairs
  {\count@=0
   \def\\##1{\nwix@usecount{\@cdr##1\@nil}\advance\count@ by\nwix@counter}%
   #1\global\nwix@counter\count@ }}
\def\nwix@id@uses#1#2{% {ident}{label}
  \nwix@usecount{#2}\ifnum\nwix@counter>0
    {\advance\leftskip by \codemargin
     \nwcodecomment{{\Tt #1}, \@nwlangdepusd\ \nwpageprep\ \@pagesl{\nwix@uses{#2}}.}}%
  \else
    \ifnw@hideunuseddefs\else
      {\advance\leftskip by \codemargin \nwcodecomment{{\Tt #1}, \@nwlangdepnvu.}}%
    \fi
  \fi}
\def\nwidentdefs#1{% list of index pairs
  \ifnw@hideunuseddefs\nwix@totaluses{#1}\else\nwix@listcount{#1}\fi
  \ifnum\nwix@counter>0
    \nwcodecomment{\@nwlangdepdfs:}%
    {\def\\##1{\nwix@id@uses ##1}#1}%
  \fi}
\newif\ifnw@hideunuseddefs\nw@hideunuseddefsfalse
\def\nwopt@hideunuseddefs{\nw@hideunuseddefstrue}

%% .TP
%% .B hideunuseddefs
%% Omit defined but unused identifiers from
%% the local identifier cross-reference (Preston Briggs).

\def\nwopt@noidentxref{%
  \let\nwidentdefs\@gobble
  \let\nwidentuses\@gobble}

%% .TP
%% .B noidentxref
%% Omit the local identifier cross-reference which follows each code chunk.

%% Support for chunk and identifier indices
%% 
%% The index in the back shows absolutely all the pages.

\def\nw@underlinedefs{% {list with \nwixd, \nwixu}
  \let\\=\relax\def\nw@comma{, }
  \def\nwixd##1{\\\underline{\subpageref{##1}}\let\\\nw@comma}%
  \def\nwixu##1{\\\subpageref{##1}\let\\\nw@comma}}

\def\nw@indexline#1#2{%
   {\indent {\Tt #1}: \nw@underlinedefs\@nameuse{nwixl@#2}\par}}

\newenvironment{thenowebindex}{\parindent=-10pt \parskip=\z@ 
        \advance\leftskip by 10pt 
        \advance\rightskip by 0pt plus1in\par\@afterindenttrue
    \def\\##1{\nw@indexline##1}}{}

%% The information comes from the list nwisx@i.

\def\nowebindex{%
  \@ifundefined{nwixs@i}%
     {\@warning{The \string\nowebindex\space is empty}}%
     {\begin{thenowebindex}\@nameuse{nwixs@i}\end{thenowebindex}}}

%% Here's a more efficient version for the external case:

\def\nowebindex@external{%
  {\let\nwixadds@c=\@gobble
   \def\nwixadds@i##1{\nw@indexline##1}%
   \def\nwixaddsx##1##2{\@nameuse{nwixadds@##1}{##2}}%
   \begin{thenowebindex}\@input{\jobname.nwi}\end{thenowebindex}}}

%% That list (nwisx@i) is created by calls to \nwixlogsorted{i}.

\def\nwixlogsorted#1#2{% list data
   \@bsphack\if@filesw 
     \toks0={#2}\immediate\write\@auxout{\string\nwixadds{#1}{\the\toks0}}
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}

%% nwixs@c and nwixs@i are sorted lists of chunks and identifiers, respectively

\def\nwixadds#1#2{%
  \@ifundefined{nwixs@#1}%
    {\global\@namedef{nwixs@#1}{\\{#2}}}%
    {\expandafter\nwix@cons\csname nwixs@#1\endcsname{\\{#2}}}}
\let\nwixaddsx=\@gobbletwo

%% If an external index is used, we need a .nwi file,
%% \nwixadds is to be ignored, and we use \nwixaddsx.

\def\nwopt@externalindex{%
  \ifx\nwixadds\@gobbletwo % already called
  \else
    \let\nwixaddsx=\nwixadds \let\nwixadds=\@gobbletwo
    \let\nowebindex=\nowebindex@external
    \let\nowebchunks=\nowebchunks@external
  \fi}

%% .TP
%% .B externalindex
%% Use an index generated with 
%% .I noindex(1)
%% (q.v.).

\def\nowebchunks{%
  \@ifundefined{nwixs@c}%
     {\@warning{The are no \string\nowebchunks}}%
     {\begin{thenowebchunks}\@nameuse{nwixs@c}\end{thenowebchunks}}}
\def\nowebchunks@external{%
  {\let\nwixadds@i=\@gobble
   \def\nwixadds@c##1{\nw@onechunk##1}%
   \def\nwixaddsx##1##2{\@nameuse{nwixadds@##1}{##2}}%
   \begin{thenowebchunks}\@input{\jobname.nwi}\end{thenowebchunks}}}
    \@namedef{r@nw@notdef}{{0}{(\@nwlangdepnvd)}}
\def\nw@chunkunderlinedefs{% {list of labels with \nwixd, \nwixu}
  \let\\=\relax\def\nw@comma{, }
  \def\nwixd##1{\\\underline{\subpageref{##1}}\let\\\nw@comma}%
  \def\nwixu##1{\\\subpageref{##1}\let\\\nw@comma}}
\def\nw@onechunk#1#2#3{% {name}{label of first definition}{list with \nwixd, \nwixu}
  \@ifundefined{r@#2}{}{%
    \indent\LA #1~{\nwtagstyle\subpageref{#2}}\RA 
    \if@nwlongchunks{~\nw@chunkunderlinedefs#3}\fi\par}}
\newenvironment{thenowebchunks}{\vskip3pt
  \parskip=\z@\parindent=-10pt \advance\leftskip by 10pt
  \advance\rightskip by 0pt plus10pt \@afterindenttrue
  \def\\##1{\nw@onechunk##1}}{}
\newif\if@nwlongchunks
\@nwlongchunksfalse
\let\nwopt@longchunks\@nwlongchunkstrue

%% .TP
%% .B longchunks
%% When expanding 
%% .B "\\\\nowebchunks,"
%% show page numbers of definitions and uses of each chunk.

%% Support for hypertext

%% There are two sets of support for hypertext.
%%  Balasubramanian Narasimhan wrote initial support for hyper.sty.

\providecommand\@nw@hyper@ref{\hyperreference} % naras
\providecommand\@nw@hyper@anc{\blindhyperanchor} % naras

%% Norman Ramsey wrote support for the \texttt{hyperrref} package (May 1998).

\providecommand\@nw@hyperref@ref[2]{\hyperlink{noweb.#1}{#2}}  % nr
\providecommand\@nw@hyperref@anc[1]{\hypertarget{noweb.#1}{\relax}}  % nr
%%\renewcommand\@nw@hyperref@ref[2]{{#2}}  % nr
%%\renewcommand\@nw@hyperref@anc[1]{}  % nr

%% We define the independent macros \nwhyperreference and
%% \nwblindhyperanchor, which test for the presence of one of these two
%% packages, redefine themselves accordingly, and re-invoke themselves.

\providecommand\nwhyperreference{%
  \@ifundefined{hyperlink}
    {\@ifundefined{hyperreference}
       {\global\let\nwhyperreference\@gobble}
       {\global\let\nwhyperreference\@nw@hyper@ref}}
    {\global\let\nwhyperreference\@nw@hyperref@ref}%
  \nwhyperreference
}

\providecommand\nwblindhyperanchor{%
  \@ifundefined{hyperlink}
    {\@ifundefined{hyperreference}
       {\global\let\nwblindhyperanchor\@gobble}
       {\global\let\nwblindhyperanchor\@nw@hyper@anc}}
    {\global\let\nwblindhyperanchor\@nw@hyperref@anc}%
  \nwblindhyperanchor
}

%% Support for hypertext translation to HTML

\providecommand\nwanchorto{%
  \begingroup\let\do\@makeother\dospecials
     \catcode`\{=1 \catcode`\}=2 \nw@anchorto}
\providecommand\nw@anchorto[1]{\endgroup\def\nw@next{#1}\nw@anchortofin}
\providecommand\nw@anchortofin[1]{#1\footnote{See URL \texttt{\nw@next}.}}
\let\nwanchorname\@gobble

%% .PP
%% .B "\\\\nwanchorto{URL}{anchor text}"
%% .RS
%% Creates a link to the given URL with the given anchor text.
%% Implemented in 
%% .I latex(1)
%% using footnotes, but 
%% .I sl2h(1)
%% translates this to
%% .B "<a href=URL>anchor text</a>"
%% .RE
%% .PP
%% .B "\\\\nwanchorname{name}{anchor text}"
%% .RS
%% Creates an anchor point for a hyperlink.
%% Implemented in 
%% .I latex(1)
%% using 
%% .B "\\\\label",
%% but
%% .I sl2h(1)
%% translates this to
%% .B "<a name=name>anchor text</a>"
%% .RE

%% This lets us hide stuff intended for use only when converting to HTML:

\newif\ifhtml
\htmlfalse

%% .PP
%% .B "\\\\ifhtml ... \\\\fi"
%% .RS
%% Text between
%% .B "\\\\ifhtml"
%% and
%% .B "\\\\fi"
%% is ignored by 
%% .I latex(1),
%% but 
%% .I sl2h(1)
%% and the 
%% .I l2h 
%% noweb filter translate the text into HTML.
%% .RE

%% Support for Prettyprinting
%% 
%% The following macro can be redefined to allow custom typesetting of
%% identifiers in the index and mini-indices.

\let\nwixident=\relax

%% The following macros can be redefined to typeset `\', `{' and`}'
%% correctly in non-typewriter fonts.  The problem is that the built-in
%% LaTeX \{ tries to produce a math symbol, which doesn't exist in the
%% typewriter font, so we get a brace in the wrong font and a warning.
%% Most unpleasant.  Noweave therefore attempts to emit \nwlbrace and
%% \nwrbrace wherever it believes braces should appear.  The standard
%% noweb style is to set code in typewriter font, and so the standard
%% definitions just select the proper characters from that font.  People
%% setting code in fonts other than typewriter are responsible for
%% redefining those macros to work in their environment.

\def\nwbackslash{\char92}
\def\nwlbrace{\char123}
\def\nwrbrace{\char125}

%% Language-dependent macros

%% Miguel Filgueiras (DCC-FCUP \& LIACC, Universidade do Porto) provided
%% some changes to add multilingual support for the words Noweb uses in
%% indexing and cross-reference.

%% He inserted macros that are defined by, e.g., \noweboptions{english}.

%% The Noweb package uses the (apparently standard) LaTeX macro
%% \languagename to select a language at load time.  If the babel package
%% is loaded (with the appropriate language name) before Noweb is loaded,
%% the Noweb package will select language appropriately, provided the
%% language is one of those Noweb supports.
%% 
%% Mr. Filgueiras provided support for English, Portuguese, German, and
%% French.  He notes that the French is faulty; the translations may be
%% poor, and there are bugs in the implementation that he could not
%% solve.

%% The language-dependent macros are defined here in each supported
%% language in a different subsubsection.

%% The choice of language depends on testing the \languagename
%% macro. There must be a more elegant way of coding the tests below

\def\nwopt@english{%
  \def\@nwlangdepdef{This definition is continued}%
  \def\@nwlangdepcud{This code is used}%
  \def\@nwlangdeprtc{Root chunk (not used in this document)}%
  \def\@nwlangdepcwf{This code is written to file}%
  \def\@nwlangdepchk{chunk}%
  \def\@nwlangdepchks{chunks}%
  \def\@nwlangdepin{in}%
  \def\@nwlangdepand{and}%
  \def\@nwlangdepuss{Uses}%
  \def\@nwlangdepusd{used}%
  \def\@nwlangdepnvu{never used}%
  \def\@nwlangdepdfs{Defines}%
  \def\@nwlangdepnvd{never defined}%
}
\let\nwopt@american\nwopt@english
\def\nwopt@portuges{%
  \def\@nwlangdepdef{Defini\c{c}\~ao continuada em}%
  % This definition is continued
  \def\@nwlangdepcud{C\'odigo usado em}%
  % This code is used
  \def\@nwlangdeprtc{Fragmento de topo (sem uso no documento)}%
  % Root chunk (not used in this document)
  \def\@nwlangdepcwf{Este c\'odigo foi escrito no ficheiro}%
  % This code is written to file
  \def\@nwlangdepchk{fragmento}%
  % chunk
  \def\@nwlangdepchks{fragmentos}%
  % chunks
  \def\@nwlangdepin{no(s)}%
  % in
  \def\@nwlangdepand{e}%
  % and
  \def\@nwlangdepuss{Usa}%
  % Uses
  \def\@nwlangdepusd{usado}%
  % used
  \def\@nwlangdepnvu{nunca usado}%
  % never used
  \def\@nwlangdepdfs{Define}%
  % Defines
  \def\@nwlangdepnvd{nunca definido}%
  % never defined
}
\def\nwopt@frenchb{%
  \def\@nwlangdepdef{Cette d\'efinition suit}%
  % This definition is continued
  \def\@nwlangdepcud{Ce code est employ\'e}%
  % This code is used
  \def\@nwlangdeprtc{Morceau racine (pas employ\'e dans ce document)}%
  % Root chunk (not used in this document)
  \def\@nwlangdepcwf{Ce code est \'ecrit aux fichier}%
  % This code is written to file
  \def\@nwlangdepchk{le morceau}%
  % chunk
  \def\@nwlangdepchks{les morceaux}%
  % chunks
  \def\@nwlangdepin{dans}%
  % in
  \def\@nwlangdepand{et}%
  % and
  \def\@nwlangdepuss{Il emploie}%
  % Uses
  \def\@nwlangdepusd{employ\'{e}}%
  % used
  \def\@nwlangdepnvu{jamais employ\'{e}}%
  % never used
  \def\@nwlangdepdfs{Il d\'{e}fine}%
  % Defines
  % Cannot use the accent here: \def\@nwlangdepnvd{jamais d\'{e}fini}%
  \def\@nwlangdepnvd{jamais defini}%
  % never defined
}
\let\nwopt@french\nwopt@frenchb
\def\nwopt@german{%
  \def\@nwlangdepdef{Diese Definition wird fortgesetzt}%
  % This definition is continued
  \def\@nwlangdepcud{Dieser Code wird benutzt}%
  % This code is used
  \def\@nwlangdeprtc{Hauptteil (nicht in diesem Dokument benutzt)}%
  % Root chunk (not used in this document)
  \def\@nwlangdepcwf{Dieser Code schreibt man zum File}%
  % This code is written to file
  \def\@nwlangdepchk{Teil}%
  % chunk
  \def\@nwlangdepchks{Teils}%
  % chunks
  \def\@nwlangdepin{im}%
  % in
  \def\@nwlangdepand{und}%
  % and
  \def\@nwlangdepuss{Benutztt}%
  % Uses
  \def\@nwlangdepusd{benutzt}%
  % used
  \def\@nwlangdepnvu{nicht benutzt}%
  % never used
  \def\@nwlangdepdfs{Definiert}%
  % Defines
  \def\@nwlangdepnvd{nicht definiert}%
  % never defined
}
\let\nwopt@ngerman\nwopt@german
\ifx\languagename\undefined % default is English
  \noweboptions{english}
\else
  \@ifundefined{nwopt@\languagename}
     {\noweboptions{english}}
     {\expandafter\noweboptions\expandafter{\languagename}}
\fi

%% Final names for the system and its components were in doubt so
%% Language is used throughout the book to specify what the system is named.

\providecommand{\Language}{AXIOM}

%% HyperName was used to specify the name of the browser

\providecommand{\HyperName}{HyperDoc}

%% This is nothing more than inline math mode in Tex but has additional
%% meaning within the browser.

\providecommand{\spad}[1]{${#1}$}

%% This is a way to say 8th, 100th, etc.
%% We use providecommand so it doesn't clash with amsmath package

\def\eth#1{${\hbox{#1}\:}^{\hbox{\small\rm th}}$}

%% add the binom function for combfunc

\providecommand{\binom}[2]{\left(\begin{array}{c}#1\\#2\end{array}\right)}

%% spadcommands are the actual text that you type at the axiom prompt

\providecommand{\spadcommand}[1]%
{\begin{flushleft}{\tt #1}\end{flushleft}\vskip .1cm }

%% spadgraph are the actual text that you type at the axiom prompt for draw

\providecommand{\spadgraph}[1]%
{\begin{flushleft}{\tt #1}\end{flushleft}\vskip .1cm }

%% spadsig gives the standard -> notation for signatures

\providecommand{\spadsig}[2]{{\sf #1 $\rightarrow$ #2}}

%% returnType is the type signature returned by the axiom interpreter

\providecommand{\returnType}[1]%
{\begin{flushright}{\tt #1}\end{flushright}\vskip .1cm}

%%  Axiom commands are set off in a special boxed area. 
%%  This is used to draw a line around that boxed area.

\providecommand\boxed[2]{%
\begin{center}
\begin{tabular}{|c|}
\hline
\begin{minipage}{#1}
\normalsize
{#2}
\end{minipage}\\
\hline
\end{tabular}
\end{center}}

%% The book begins with some introductory material that is not really
%% listed as a chapter. This creates a header similar to \chapter.

\providecommand{\pseudoChapter}[1]%
{\vskip .5in \noindent {\Huge{\bf #1}}\vskip .5in}

%% The book begins with some introductory material that is not really
%% listed as a section. This creates a header similar to \section.

\providecommand{\pseudoSection}[1]%
{\vskip .25in \noindent {\large{\bf #1}}\vskip .25in}

%% spadofFrom records the operation in the index and the domain in the index

\providecommand{\spadopFrom}[2]{\index{library!operations!#1 @\begingroup \string\tt{} #1 \endgroup}\index{#2}``{\tt #1}''}

%% spadfunFrom records the function name and domain in the index

\providecommand{\spadfunFrom}[2]{{\bf #1}\index{#1 @\begingroup \string\bf{} #1 \endgroup}\index{#2}}

%% These are special markers within the text for Hypertex keywords
%% They have no particular meaning in the book form.

\providecommand{\spadfun}[1]{{\it #1}}
\providecommand{\spadgloss}[1]{{\it #1}}
\providecommand{\spadkey}[1]{\index{#1 @\begingroup \string\tt{} #1 \endgroup}}
 
%% spadtype records the domain in the index

\providecommand{\spadtype}[1]{{\bf #1}\index{#1 @\begingroup \string\bf{} #1 \endgroup}}

%% This is used to create a caption on an included image

\providecommand{\simpleCaption}[1]{\def\thefigure{\@arabic\c@figure}\caption{#1}}

%% This is the name of the ``glossy'' pages in the physical book.

\providecommand{\Gallery}{\Language{} Images}

%% spadofFrom records the operation in the index and the domain in the index

\providecommand{\spadopFrom}[2]{\index{library!operations!#1 @\begingroup \string\tt{} #1 \endgroup}\index{#2}``{\tt #1}''}

%% typeset e.g. and i.e.

\providecommand{\eg}{\emph{e.g.}}
\providecommand{\ie}{\emph{i.e.}}
\newdimen\xmpWidth \xmpWidth=29pc
\def\axiomType#1{{\sf #1}}
\def\spadtype{\axiomType}
\def\axiomFun#1{{\bf #1}%
\index{library!operations!#1 @\begingroup \string\bf{} #1 \endgroup}}
\def\spadfun{\axiomFun}
\long\def\texht#1#2{#1}

%% Typeset in-line code.

\providecommand{\Code}[1]{\texttt{#1}}

%% Typeset a file name

\providecommand{\File}[1]{{\itshape{#1}}}

%% Typeset a tool name, e.g. Axiom

\providecommand{\Tool}[1]{{\bfseries\sffamily{#1}}}
\providecommand\AXIOM{\vskip\parindent\indent{\bf AXIOM}\vskip\parindent\noindent\ignorespaces}
\providecommand\maxima{\vskip\parindent\noindent{\bf MAXIMA}\vskip\parindent\noindent\ignorespaces}
\providecommand\yacas{\vskip\parindent\noindent{\bf YACAS}\vskip\parindent\noindent\ignorespaces}
