summaryrefslogtreecommitdiff
path: root/web/latexspider/web.doc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /web/latexspider/web.doc
Initial commit
Diffstat (limited to 'web/latexspider/web.doc')
-rw-r--r--web/latexspider/web.doc955
1 files changed, 955 insertions, 0 deletions
diff --git a/web/latexspider/web.doc b/web/latexspider/web.doc
new file mode 100644
index 0000000000..65d9df1ca6
--- /dev/null
+++ b/web/latexspider/web.doc
@@ -0,0 +1,955 @@
+\iffalse % -*-latex-*-
+
+%% Copyright D.Love, SERC Daresbury Laboratory, 1991
+%% The `doc' version of this style is re-distributable and usuable
+%% under conditions of the GNU copyleft, but please mark any changes,
+%% list them here and report any major enhancements to the author.
+
+% This is a self-documenting style. To produce the documentation you
+% might use a driver file like this:
+% \def\webmacs{null} \documentstyle[a4,makeidx,newdoc,web]{article}
+% \EnableCrossrefs \CodelineIndex
+% \begin{document} \DocInput{web.sty} \PrintIndex
+% \end{document}
+% and run `makeindex -s gind.ist doc' in between passes. You need
+% Mittelbach's newdoc.sty at v1.6d or later.
+
+% To produce the .sty file use `latex docstrip' to remove most of the
+% comments. Please don't distribute the .sty file without the .doc
+% file.
+\fi
+
+\iffalse % hack RCS info into a sensible form:
+\fi
+\def\next$#1: #2/#3/#4 #5 ${\def\filedate{#4/#3/#2}\def\filetime{#5}}
+\next$Date: 1991/06/19 10:28:40 $
+
+\def\next$#1: #2 ${\def\fileversion{#2}}
+\next$Revision: 1.2 $
+
+% \title{A a \web{} style file for \LaTeX{}\thanks{This file is version
+% \fileversion\ of \filedate}}
+% \author{David Love\\[2ex]{\it SERC Daresbury Laboratory, Warrington
+% WA4 4AD, UK}\\ \tt d.love@daresbury.ac.uk}
+% \date{}
+%
+% \newcommand{\web}{{\tt WEB}}
+% \newcommand{\weave}{{\tt WEAVE}}
+% \newcommand{\tangle}{{\tt tangle}}
+% \newcommand{\spider}{Spider}
+% \MakeShortVerb{\"}
+
+% \DoNotIndex{\/,\@date,\@ifundefined,\@makefnmark,\@starttoc}
+% \DoNotIndex{\@topnum,\addpenalty,addvspace,\advance,aftergroup}
+% \DoNotIndex{\begin,\begingroup,\bgroup,\char,\def,\egroup,\else,\end}
+% \DoNotIndex{\endgroup,\fi,\fnsymbol,\hfil,\hfill,\hfilneg,\hss,\kern}
+% \DoNotIndex{\let,\lineskip,\newcommand,\protect,\qquad,\quad,\relax}
+% \DoNotIndex{\thanks,\thefootnote,\z@,\@M,\@thanks,\@thefnmark,\hbox}
+% \DoNotIndex{\empty,\mbox}
+
+% \maketitle
+%
+% \begin{abstract} \noindent
+% This style file is for use with a version of the Spidery \weave\ system
+% that has been adapted to use \LaTeX\ rather than plain \TeX\ for the
+% formatting. It is a first attempt.
+% \end{abstract}
+%
+% \section{Assumptions of \weave{} and the {\tt .web} file}
+%
+% We assume we're using the version of Spidery \weave{} \cite{spider}
+% changed for \LaTeX\@. This will write out
+% \begin{quote}"\def\webmacs{"\meta{ext}"web.tex}",\end{quote}
+% (where \meta{ext} is
+% the \spider{} {\tt extension}), then the limbo section, then
+% \begin{quote}"\begin{document}\maketitle" \end{quote}
+% the latter to stop you forgetting it. The "\webmacs" file will be
+% included at the end of this style.
+% After the index (if any), we get
+% "\end{document}". The user thus has to put the "\documentstyle"
+% command in the limbo part and include "web" in the style options to
+% get this stuff and can use other options as appropriate. You're
+% meant to use the "article" main style, although I think "report"
+% would work too.
+%
+% \section{Strategy}
+%
+% The idea was to change the original \spider{} \TeX{} stuff as little
+% as possible, although it has actually been changed quite
+% substantially. Changes are forced where there is a clash of macro
+% names; most of the original one-character control sequences are
+% already used by \LaTeX, for instance. Some features have been
+% converted to a \LaTeX{} equivalent,
+% notably the table of contents mechanism, the title page, running
+% header and double-columning for the index. For safety, "\def"s have
+% been replaced by "\newcommands" where possible since there are
+% probably plenty of possibilities for name clashes.
+% User-visible differences from the plain version are given in
+% appendix~\ref{changes}.
+%
+% \section{Use with old webs}
+%
+% Examples of the use of this style with old webs using the plain
+% conventions can be found in the accompanying changes files for
+% {\tt weave.web} and {\tt spider.web}. You can use the limbo section
+% to check whether the generated ".tex" file is being run through
+% \LaTeX\ or plain \TeX\ by doing something like this:
+% \begin{quote}
+% \begin{verbatim}
+% \ifx\enddocument\undefined
+% % plain things
+% \else
+% % LaTeX things
+% \fi
+% \end{verbatim}
+% \end{quote}
+%
+% \section{Bugs}
+%
+% Floats
+% don't always come out where you'd expect due to interaction with
+% \web's attempts to keep all of a module on one page if possible.
+% "\str" and "\vstr", which
+% might well get used in a moving argument, are
+% fragile. Module titles (after "@*") are moving arguments. I think
+% if you use \web's "|"\dots"|" construction in a
+% moving argument it will break and there's not much you can do about
+% it.
+%
+% \section{Code}
+% \subsection{Preliminaries --- page layout}
+%
+% Let's announce ourselves as usual:
+% \begin{macrocode}
+\typeout{Sub-style `web', version \fileversion\space of \filedate}
+% \end{macrocode}
+% We don't want stretch between paragraphs.
+% \begin{macrocode}
+\parskip \z@
+% \end{macrocode}
+% \begin{macro}{\textwidth}\begin{macro}{\textheight}
+% \begin{macro}{\oddsidemargin} \begin{macro}{\evensidemargin}
+% The default page width should be large for \web\@. This is for
+% non-Americans (A4)---if you want to alter the page dimensions with a
+% suitable style option put it {\em after\/} "web" in the
+% "\documentstyle" list. The width here is too big for decently
+% readable text, but is
+% still less than the $6.5''$ of the original. Note that there's no
+% point in trying to use "\marginpar" at
+% this width since the margins have disappeared! The "twoside" option
+% will work sensibly if you care to use it.\DescribeMacro{twoside} We
+% want to avoid doing this when typesetting the documenttation, hence
+% the test for "\DocInput".
+% \begin{macrocode}
+\ifx\DocInput\undefined
+\ifcase \@ptsize
+ \textheight = 53 \baselineskip
+\or
+ \textheight = 47 \baselineskip
+\or
+ \textheight = 43 \baselineskip
+\fi \advance \textheight by \topskip
+\textwidth=6.27in \oddsidemargin=\z@ \evensidemargin=\z@
+\fi
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+% We use the "myheadings" page style with headings containing module
+% information (see below).
+% \begin{macrocode}
+\pagestyle{myheadings}
+% \end{macrocode}
+% If we start off with a "\sectionmark" we won't miss the running
+% header off the first page where it should appear.
+% \begin{macrocode}
+\ifx\DocInput\undefined \sectionmark{1} \fi
+% \end{macrocode}
+%
+% \subsubsection{Font selection}
+%
+% \begin{macro}{\normal@font}
+% We have to check whether we're in the old or new font selection scheme
+% and set up appropriately. "\normal@font" is invoked before the font
+% changes for identifiers, reserved words and strings to make sure
+% that they use the default series and shape in the new scheme. This
+% is actually only necessary if "\id", "\res" or "\str" is used in
+% \TeX\ text that is being set in a different shape or series, not
+% normally in the code. If you use the new selection scheme you can
+% do things like using Concrete or PostScript fonts easily.
+% \begin{macrocode}
+\@ifundefined{selectfont}{%
+ \let\normal@font=\relax} % old scheme
+ {% new scheme
+ \def\normal@font{\series \mediumseriesdefault
+ \shape \normalshapedefault}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Front matter}
+%
+% We depart from the plain version here. The first page (or pages, if
+% the contents are very long) is produced with the "titlepage"
+% environment. The "\author", "\date" and
+% "\title" \DescribeMacro{\title} can be specified
+% as usual in \LaTeX\@. Note that you now say
+% "\title{"\meta{title}"}" rather than "\def\title{"\meta{title}"}" as
+% in the plain version and this title will be used in the running
+% header.
+%
+% \begin{macro}{\@maketitle}
+% We'll re-define "\@maketitle" to include the "\topofcontents" and
+% "\botofcontents" information, with the contents information in the
+% middle. The normal title, author and date will be put automatically
+% at the top---"\topofcontents" is extra. You get the titling and
+% contents information automatically, since "\maketitle" is inserted
+% by \weave{} immediately after "\begin{document}". If you want to
+% suppress it, "\let\maketitle=\relax" in the limbo part.
+%
+% Of course, you have to make two
+% passes to get the contents printed, unlike the original plain
+% system. This should not be much hardship as one usually reckons on
+% running \LaTeX{} at least twice. (Putting the titlepage at the back
+% won't help, since the ".toc" file only exists after the ".aux" file
+% has been read on the secind pass. One could change the standard
+% behaviour so that the ".toc" file was created at the end of the
+% first pass, I guess.)
+% We first test for "\DocInput" as above to
+% avoid messing things up when typesetting the documentation.
+% \begin{macrocode}
+\ifx\DocInput\undefined
+\def\@maketitle{%
+ \newpage \thispagestyle{empty} \null
+ \begin{center}
+ {\LARGE \@title \par} \vskip 1.5em
+ {\large \lineskip .5em
+ \begin{tabular}[t]{c} \@author \end{tabular} \par}
+ \vskip 1em {\large \@date}
+ \end{center}
+ \par \vskip 1.5em
+ \topofcontents \tableofcontents \par \botofcontents \newpage }
+\fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\maketitle}
+% We change "\maketitle" to avoid the "\thispagestyle{plain}" that it
+% otherwise contains, to set the page number to 1 at the end and to
+% avoid losing the definitions of "\@title" and "\@author".
+% ("\@title" is used in the running header.)
+% \begin{macrocode}
+\ifx\DocInput\undefined
+\def\maketitle{%
+ \par \begingroup
+ \pagenumbering{roman} \setcounter{page}{0}
+ \def\thefootnote{\fnsymbol{footnote}}
+ \def\@makefnmark{\hbox to \z@ {$^{\@thefnmark}$\hss}}
+ \if@twocolumn \twocolumn[\@maketitle]
+ \else \newpage \global\@topnum\z@ \@maketitle \fi
+ \@thanks
+ \endgroup
+ \setcounter{footnote}{0} \pagenumbering{arabic}
+ \let\maketitle\relax \let\@maketitle\relax
+ \gdef\@thanks{}\let\thanks\relax}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@title} \begin{macro}{\@author}
+% We better define these in case they're not supplied:
+% \begin{macrocode}
+\let\@title=\empty \let\@author=\empty
+% \end{macrocode}
+% \end{macro} \end{macro}
+% \begin{macro}{\tableofcontents}
+% "\tableofcontents" is re-defined to produce a header saying
+% ``Section'' and ``Page'' a bit like the plain version, although the
+% section (module) number is at the left.
+% \begin{macrocode}
+\def\tableofcontents{%
+ \noindent Section \hfill Page \par \@starttoc{toc}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\topofcontents} \begin{macro}{\botofcontents}
+% The "\topofcontents" material that comes between the title\slash author
+% information and the contents list and the "\botofcontents" stuff
+% that comes after the contents list are empty initially. I'm not
+% sure it's worth preserving them.
+% \begin{macrocode}
+\def\topofcontents{} \def\botofcontents{}
+% \end{macrocode}
+% \end{macro} \end{macro}
+% \begin{macro}{\ttitlefont} \begin{macro}{\titlefont}
+% These are just for compatibility with the plain version---they
+% should probably go.
+% \begin{macrocode}
+\let\ttitlefont=\tt \let\titlefont=\rm
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \subsection{Prettyprinting stuff}
+% \subsubsection{Identifiers, reserved words and strings}
+%
+% \begin{macro}{\id}\begin{macro}{\ida}\begin{macro}{\idfont}
+% Multi-letter identifiers are set by the macro "\id" in font "\idfont",
+% which is italic by default i.e., \id{identifier}.
+% One-letter identifiers are
+% actually set by "\ida" in math italic as they are supposed to look
+% better that way (\ida{a} rather than \id{a}).
+% \begin{macrocode}
+\newcommand{\id}[1]{\mbox{\idfont #1\/\kern.05em}}
+\newcommand{\ida}[1]{\mbox{$ #1 $}}
+\newcommand{\idfont}{\normal@font \it}
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro}
+% \begin{macro}{\reservedfont}\begin{macro}{\res}
+% Reserved words are set by macro "\res", using "\reservedfont" which
+% is bold by default i.e., \res{reserved}.
+% \begin{macrocode}
+\newcommand{\reservedfont}{\normal@font \bf}
+\newcommand{\res}[1]{\mbox{\reservedfont#1\/}}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\str}
+% Typewriter type is used for strings, set by "\str" i.e.,
+% \str{string}. The definitions of the escaped characters
+% are given below. I don't understand why the ampersand is treated
+% like this, since "\&" is defined anyway, but quotes and "^" are
+% escaped to avoid
+% ligatures.\footnote{{\tt \char`\^} and {\tt \char`\~} form ligatures
+% in PostScript virtual fonts as well as "'".} It's necessary to do a
+% "\def" of "\^" rather than just
+% "\let\^\CF" to avoid an error with the use of "\^" not matching its
+% definition. Note the use of "\@tempa" below rather than "\XX" as
+% used in the same situation elsewhere---using "\XX", "\str" breaks if
+% it is used in, say, a comment.
+% \begin{macrocode}
+\def\str#1{%
+ \ifmmode \gdef\@tempa{\null$\null}\else \gdef\@tempa{}\fi
+ \@tempa {%
+ \let\\=\BS \let\'=\RQ \let\`=\LQ \let\{=\LB \let\}=\RB
+ \let\~=\TL \let\ =\SP \let\&=\AM \def\^{{\tt \char`\^}}%
+ \leavevmode \normal@font\tt #1}\@tempa}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\AM} \begin{macro}{\BS} \begin{macro}{\LB}
+% \begin{macro}{\LQ} \begin{macro}{\RB} \begin{macro}{\UL}
+% \begin{macro}{\TL}
+% Here are the definitions of the control sequences for strings. The
+% plain version redefined "\#", "\$", "\%" and "\^" globally. "\$"
+% isn't used by awk or C \web s, and has been removed. The others are
+% done only in code, using "\startcodehook" (below).
+% \begin{macrocode}
+\chardef\AM=`\& % ampersand
+\chardef\BS=`\\ % backslash
+\chardef\LB=`\{ % left brace
+\def\LQ{{\tt\char'22}} % left quote
+\chardef\RB=`\} % right brace
+\def\RQ{{\tt\char'23}} % right quote
+\def\UL{{\tt\char`\_}} % underline character in a string
+\def\TL{{\tt\char`\~}} % tilde
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \end{macro}
+% \begin{macro}{\SP}
+% Strings may be rather long and we want some way of breaking
+% them, so
+% "\SP" produces a visible space (\str{\SP}) and also adds a discretionary
+% break afterwords. If a break occurs, the line is ended with a
+% backslash. Spaces are probably the most sensible place to break
+% strings, especially if they are messages, but one could consider
+% doing the same thing for other of the macros above e.g., "\BS" might
+% check if the next character was "n" and insert a discretionary break
+% after that.
+% \begin{macrocode}
+\newcommand{\SP}{\char`\ \discretionary{\hbox{\char`\\}}{}{}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\vstr}
+% This does a verbatim string (from "@=") using the existing \LaTeX
+% nology rather than the original definition to put a frame around it
+% (\vstr{string}).
+% \begin{macrocode}
+\newcommand{\vstr}[1]{\kern 2pt \fbox{\str{#1}}\kern 2pt}
+\setlength{\fboxsep}{2pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\const}
+% This looks after setting octal, hex or decimal constants. The first
+% thing in its argument may be one of the control sequences in the
+% example on the left,
+% producing the result in the middle:
+% \[\begin{tabular}{lll}
+% "\const{\$10}" & $\const{\$10}$ & (long) \\
+% "\const{\_10}" & $\const{\_10}$ & (power of ten)\\
+% "\const{\~10}" & $\const{\~10}$ & (octal) \\
+% "\const{\^AB10}" & $\const{\^AB10}$ & (hex) \\
+% \end{tabular}\]
+% \DeleteShortVerb{\"}
+% \begin{macrocode}
+\def\const#1{{%
+ \def\?{\kern.2em}%
+ \def\${\ell}% long
+ \def\_{\RealConstFormat{\aftergroup}}% power of ten
+ \def\~{\hbox{\rm \char'23\kern-.2em \it \aftergroup\?\aftergroup}}% octal
+% \end{macrocode}
+% The \verb+"+ here was originally \verb+\char'175+ which,
+% unfortunately, is different in PostScript virtual fonts and Computer
+% Modern:
+% \begin{macrocode}
+ \def\^{\hbox{\rm "\tt \aftergroup}}% hex
+ #1}} % (\def{\const})
+% \end{macrocode}
+% \end{macro}
+% \MakeShortVerb{\"}
+% \begin{macro}{\RealConstFormat}
+% I prefer to re-define the decimal style
+% to print as the more code-like `$\mbox{\rm e}10$'. You can
+% do this by using the hook "\RealConstFormat" in your Spider "macros"
+% section:
+% \begin{quote} "\newcommand{\RealConstFormat}{\mbox{\rm e}}" .\end{quote}
+% For a go at a Fortran web, I hacked the lexing so that an "e" or "d" in
+% a real or double-precision constant was transmitted verbatim into the
+% argument of "\const" instead of "\_" and re-defined "\const" to ensure
+% this was set in roman.
+% \begin{macrocode}
+\newcommand{\RealConstFormat}{\cdot 10^}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Indentation and breaks}
+%
+% \begin{macro}{\ind}
+% This counter stores the current indentation in ems.
+% \begin{macrocode}
+\newcount\ind
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\bak} \begin{macro}{\bakk}
+% These backspace one and two ems respectively.
+% \begin{macrocode}
+\newbox\bak \setbox\bak=\hbox to \m@ne em{}
+\newbox\bakk \setbox\bakk=\hbox to -2em{}
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\0}
+% A forced break, as from "@/":
+% \begin{macrocode}
+\def\0{%
+ \ifmmode
+ \ifinner$\par\hangindent\ind em\noindent\kern\ind em\ignorespaces$\fi
+ \else
+ \par\hangindent\ind em\noindent \kern\ind em\ignorespaces
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\1}
+% Indent one more notch:
+% \begin{macrocode}
+\newcommand{\1}{\global\advance\ind by 1 \hangindent\ind em}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\2}
+% Indent one less notch:
+% \begin{macrocode}
+\newcommand{\2}{\global\advance\ind by \m@ne }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\3}
+% An optional break within a statement, as from "@|":
+% \begin{macrocode}
+\newcommand{\3}[1]{\hfil \penalty#10 \hfilneg}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\4}
+% Backspace one notch:
+% \begin{macrocode}
+\newcommand{\4}{\copy\bak}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\5}
+% Optional break:
+% \begin{macrocode}
+\newcommand{\5}{\hfil \penalty \m@ne \hfilneg \kern 2.5em \copy\bakk
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\6}
+% A forced break with no indentation:
+% \begin{macrocode}
+\def\6{\ifmmode \else \par
+ \hangindent\ind em\startline \ignorespaces \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\startline}
+% This is used by "\code" as well as "\6" above.
+% \begin{macrocode}
+\def\startline{\noindent \count255=\ind \advance\count255 by -2
+ \hskip\count255 em}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\7}
+% A forced break and a little extra vertical space, as from "@#":
+% \begin{macrocode}
+\newcommand{\7}{\Y\6}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\8}
+% No indentation. It works only in code, not in "|"\dots"|".
+% \begin{macrocode}
+\newcommand{\8}{\unskip}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\J}
+% \tangle's join operation ("@&"):
+% \begin{macrocode}
+\newcommand{\J}{\str{@\&}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\C}
+% This looks after comments. The hooks are inserted because comments
+% aren't code (see below).
+% \begin{macrocode}
+\def\C#1{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi
+ \XX \hfil \penalty \m@ne\hfilneg\quad % original spider
+ $\commentbegin\,$\endcodehook{#1}\startcodehook$\,
+ \commentend$\XX}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Modules}
+%
+% \begin{macro}{\onmaybe} \begin{macro}{\maybe} \begin{macro}{\ifon}
+% These switches are concerned with only printing changed sections if
+% so desired.
+% \begin{macrocode}
+\def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue \newif\ifon
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% \begin{macro}{\M}
+% Beginning of an un-starred section:
+% \begin{macrocode}
+\outer\def\M#1.{%
+ \MN#1.\ifon\vfil\penalty-100\vfilneg
+ \vskip12ptminus3pt \startsection \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\startsection} \begin{macro}{\lapstar}
+% Some auxilliary definitions:
+% \begin{macrocode}
+\def\startsection{\Q \noindent {\let\*=\lapstar \bf \modstar.\quad }}
+\newcommand{\lapstar}{\rlap{*}}
+% \end{macrocode}
+% \end{macro} \end{macro}
+% \begin{macro}{\N}
+% This introduces a starred section (where "#2" is the title). We
+% have to check the title with "\headcheck" for a leading
+% character indicating a subsection. Then we write a contents entry,
+% change the running header and set the title in bold. "\old@S" is
+% used in the header rather than "\S" since "\S" is probably
+% wrongly-defined at this point (see below).
+% \begin{macrocode}
+\outer\def\N#1.#2.{%
+ \MN#1.\headcheck#2\headcheck
+ \typeout{*\modno} % progress report
+ \addcontentsline{toc}{\headcheck@type}
+ {\hbox to 2em{\modno\hfill} \quad \theopen \relax \themodtitle}
+ \markboth{% running headline
+ {\protect\small \qquad\uppercase{\ignorespaces\themodtitle}}
+ \hfill {\protect\small \@title}\qquad{\rm \old@S \modno}}
+ {\rm \old@S \modno\qquad {\protect\small \@title}\hfill
+ {\protect\small \uppercase{\ignorespaces\themodtitle\qquad}}}
+ \ifon\startsection {\bf \ignorespaces \themodtitle.\quad }\ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\MN}
+
+% Here is some common code for "\M" and "\N"\@.
+% It sets
+% "\sectionmark" for the headers and defines cross-referencing
+% information for the current module.
+% It also
+% looks after the decision about whether or not to set this module if it
+% is not starred.
+% \begin{macrocode}
+\def\MN#1.{%
+ \par {\xdef\modstar{#1}\let\*=\empty\xdef\modno{#1}}%
+ \ifx\modno\modstar \onmaybe \else \ontrue \fi
+ \sectionmark{\modno}
+% \end{macrocode}
+% The following code for setting the currentlabel to the module number
+% is a variation on that in {\tt latex.tex}.
+% \begin{macrocode}
+ \let\@tempa\protect
+ \def\protect{\noexpand\protect\noexpand}%
+ \def\@currentlabel{#1}%
+ \let\protect\@tempa} % def\MN
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\note} \begin{macro}{\A}
+% Auxilliary macros. "\A" is for cross-references for multiply
+% defined section names.
+% \begin{macrocode}
+\def\note#1#2.{\Y \noindent {\hangindent 2em \footnotesize
+ \baselineskip 10pt#1 #2.\par}}
+\newcommand{\A}{\note{See also}}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \subsubsection{Processing special section headings}
+%
+% This complicated stuff, introduced with \spider{} and modified for the
+% \LaTeX{} version, is to allow an inital =, 1, 2, 3 or 4 in
+% starred module titles to indicate a hierarchy. Their effect is as follows:
+% \[ \begin{tabular}{c|c|c}
+% Introduction & Page eject? & Indentation in contents\\ \hline
+% "@*=" & yes & 0 \\
+% "@*1" & yes & 2 em \\
+% "@*2" & no & 2 em \\
+% "@*3" & yes & 4 em \\
+% "@*4" & no & 4 em \\
+% \end{tabular} \]
+% "@*=" also suppresses a following page eject and emboldens the
+% table of contents entry and puts some extra vertical space before
+% it. Normal starred sections have no indentation in the contents and
+% don't do anything special about page breaks.
+%
+% \begin{macro}{\l@part} \begin{macro}{\l@norm} \begin{macro}{\l@num}
+% Two new sorts of contents entry are defined here and the `part'
+% type re-defined. (See "latex.tex" for details of how this works.)
+% "\l@part" determines the t.o.c.\ entry for a "@*=" section,
+% "\l@norm" the entry for a normal starred section and "\l@num" that
+% for a numbered section. Some penalties are inserted (the normal
+% values for the main style) in case the t.o.c.\ extends over more
+% than one page. The "\headcheck@type" definition is used in the
+% sectioning commands to write the t.o.c.\ entry.
+% \begin{macrocode}
+\def\l@part{\addpenalty{\@secpenalty}
+ \addvspace{3pt plus 1pt} % space above part line
+ \@dottedtocline{0}{\z@ }{4em}}
+\def\l@norm{\addpenalty{\@secpenalty}
+ \@dottedtocline{0}{\z@ }{4em}}
+\def\l@num{\@dottedtocline{0}{0em}{4em}}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% \begin{macro}{\ifcancel} \begin{macro}{\ifnextchar}
+% \begin{macro}{\ifnch} \begin{macro}{\makethechar}
+% Here's the tricky stuff, presented without further comment!
+% \begin{macrocode}
+\newif\ifcancel \cancelfalse
+\def\ifnextchar#1#2#3{%
+ \let\@tempe=#1\def\@tempa{#2}\def\@tempb{#3}\@ifnch}
+\def\@ifnch{%
+ \ifx \@tempc \@tempe\let\@tempd\@tempa
+ \else \let\@tempd\@tempb
+ \fi
+ \@tempd}
+\def\makethechar#1{\let\@tempc=#1}
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro}
+% \begin{macro}{\headcheck}
+% ~
+% \begin{macrocode}
+\def\headcheck#1#2\headcheck{%
+ \makethechar{#1}%
+ \def\theskipper{\vfil\penalty-100 % skip before new module
+ \vfilneg\vskip12ptminus3pt}%
+ \def\theopen{}% opening skip in toc entry
+ \def\thetocskip{}% vertical skip before toc entry
+ \def\themodtitle{{#2}}%
+ \def\headcheck@type{num}%
+ \ifnextchar={%
+ \def\theskipper{\newpage} \canceltrue
+ \def\headcheck@type{part} \def\theopen{\bf}%
+ \def\thetocskip{\vskip 3pt plus 1in \penalty-100
+ \vskip \z@ plus -1in}%
+ }{\ifnextchar1{%
+ \cancelfalse \def\theskipper{\newpage}%
+ \def\theopen{\hskip2em}%
+ }{\ifnextchar2{%
+ \cancelfalse \def\theopen{\hskip2em}%
+ }{\ifnextchar3{%
+ \cancelfalse \def\theskipper{\newpage}%
+ \def\theopen{\hskip4em}%
+ }{\ifnextchar4{%
+ \cancelfalse \def\theopen{\hskip4em}%
+ }{% else
+ \ifcancel\else \def\theskipper{\newpage}\fi
+ \cancelfalse \def\headcheck@type{norm}%
+ \def\themodtitle{#1{#2}}%
+ }}}}}%
+ \theskipper }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Starting and ending code sections}
+%
+% \begin{macro}{\code}
+% This takes us into code mode. The old version used infinite hyphen
+% penalty which stopped the discretionary breaks in strings. Extra
+% space is put after ";" with the "\sfcode".
+% \begin{macrocode}
+\newcommand{\code}{%
+ \rightskip=\z@ plus 100pt minus 10pt
+ \sfcode`;=3000 \pretolerance \@M
+ \hyphenpenalty 9999 \exhyphenpenalty \@M
+ \global\ind=2 \1 \startline
+% \end{macrocode}
+% \DescribeMacro{\@}
+% The original says that every web must define "\?", where "?" is the
+% at-sign. Since "\@" is used for end-of-sentence space in \LaTeX, we
+% make sure this is only done in code mode. We need the old and new
+% definitions, "\old@" and "\code@", between which to switch.
+% \spider{} unfortunately uses "\S" instead of "\equiv" and the awk
+% and C \web s assume that "\%" and "\#" translate to typewriter
+% versions, so we have to define these properly in code mode too.
+% \DescribeMacro{\startcodehook} \DescribeMacro{\endcodehook}
+% For convenience, we define token registers
+% "\startcodehook" and "\endcodehook" for this sort of purpose when we
+% go into and out of code mode. These might be altered by the
+% \spider\ description if appropriate.
+% \begin{macrocode}
+ \startcodehook} % \def\code
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\old@}\begin{macro}{\code@}\begin{macro}{\old@S}
+% \begin{macro}{\old@percent} \begin{macro}{\old@hash}
+% Let's store the original definitions of these:
+% \begin{macrocode}
+\let\old@=\@ \let\old@S=\S \let\old@percent=\%
+\let\old@hash=\#
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \begin{macro}{\code@}\begin{macro}{\tt@percent}\begin{macro}{\tt@hash}
+% And here are replacements for use in code mode.
+% \begin{macrocode}
+\chardef\code@=`\@
+\def\tt@percent{\hbox{\tt\char`\%}} \def\tt@hash{\hbox{\tt\char`\#}}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% \begin{macro}{\startcodehook}\begin{macro}{\endcodehook}
+% Here are the hooks. Should these be token registers?
+% \begin{macrocode}
+\def\startcodehook{\let\@=\code@ \let\S=\equiv \let\%=\tt@percent
+ \let\#=\tt@hash \def\^{\hbox{\tt\char`\^}}}
+\def\endcodehook{\let\@=\old@ \let\S=\old@S \let\%=\old@percent
+ \let\#=\old@hash \def\^##1{{\accent94 ##1}}}
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\Q}
+% This gets us out of code mode, setting things back to normal.
+% \begin{macrocode}
+\def\Q{\rightskip=\z@ \sfcode`;=1500 \pretolerance 200
+ \endcodehook}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CD} \begin{macro}{\DC}
+% Web text in "|"\dots"|" is woven into text surrounded by
+% "\CD"\dots"\DC"\@. The original definition didn't bother with the
+% grouping if not in math mode, but it's convenient now that the hooks
+% need to be added.
+% \begin{macrocode}
+\def\DC{\endcodehook \egroup}
+\def\CD{\relax
+ \ifmmode \hbox\fi \bgroup \startcodehook}
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\U}
+% This provides a cross-reference for uses of sections.
+% \begin{macrocode}
+\newcommand{\U}{\note{This code is used in}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\X}
+% This does modules which introduce the code. Note the usage:
+% "\X"\meta{module number}":"\meta{module name}"\X".
+% \begin{macrocode}
+\def\X#1:#2\X{%
+ \ifmmode \gdef\XX{\null$\null}\else \gdef\XX{}\fi
+ \XX$\langle\,$#2{\footnotesize \kern.5em #1}$\,\rangle$\XX }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\XF}
+% This is for a file module (from "@("):
+% \begin{macrocode}
+\def\XF#1:#2\XF{%
+ \ifmmode \gdef\XX{\null$\null}\else \gdef\XX{}\fi
+ \XX {\tt (#2{\footnotesize \kern.5em #1})}\XX}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Y} \begin{macro}{\yskip}
+% This does a vertical skip by "\yskip", used in "\note" and "\7".
+% \begin{macrocode}
+\newcommand{\Y}{\par\yskip}
+\let\yskip=\smallskip
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \subsection{Definitions and formats}
+%
+% \begin{macro}{\D} \begin{macro}{\F} \begin{macro}{\defin}
+% "\D" and "\F" deal with macro and format definitions from "@d" and
+% "@f" respectively.
+% \begin{macrocode}
+\newcommand{\D}{\defin{define}} % macro definition
+\newcommand{\F}{\defin{format}} % format definition
+\newcommand{\defin}[1]{\global\advance\ind by 2 \1\res{#1 }}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \subsection{Miscellaneous symbols}
+%
+% \begin{macro}{\DO} \begin{macro}{\G} \begin{macro}{\I}
+% \begin{macro}{\K} \begin{macro}{\L} \begin{macro}{\R}
+% \begin{macro}{\TI} \begin{macro}{\V} \begin{macro}{\W}
+% Here are some miscellaneous symbols. I think these should really be
+% defined in the \spider\ descriptions that need them, but they are
+% assumed by the current webs.
+% \begin{macrocode}
+\newcommand{\DO}{\hbox{\sl\char'044}} % slant dollar sign (used by awkweb)
+\let\G=\ge % greater than or equal sign
+\let\I=\ne % unequal sign
+\let\K=\gets % left arrow
+\let\L=\le % less than or equal sign
+\let\R=\lnot % logical not
+\let\TI=\sim % tilde
+\let\V=\lor % logical or
+\let\W=\land % logical and
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \end{macro}\end{macro}\end{macro}
+% \begin{macro}{\vert} \begin{macro}{\amp} \begin{macro}{\PP}
+% \begin{macro}{\*}
+% And some more: (n.b., the plain \TeX{} definitions of "\vert"
+% and "\*" are over-written, as expected by spidery \weave---maybe this
+% should be changed).
+% \begin{macrocode}
+\def\vert{|} \let\amp=\& \let\PP=\P \let\*=*
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+% \begin{macro}{\AT!}
+% \changes{v1.2}{10/6/91}{Re-instate trailing !.}
+% This is the `at sign in control
+% text'. I dn't know why it has the trailing "!", but it apears to
+% have bene intentional in the plain version.
+% \begin{macrocode}
+\def\AT!{@}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Indexing}
+%
+% \begin{macro}{\ch}
+% This is used trivially at the start of the index in the case of
+% changes:
+% \begin{macrocode}
+\def\ch{\note{The following sections were changed by the change file:}
+ \let\*=\relax}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\inx} \begin{macro}{\:}
+% The index is set in two-column mode.
+% Each item in each index is introduced by "\:". This is a \LaTeX{}
+% macro but is unlikely to get used in the index and so is preserved
+% from the original.
+% \begin{macrocode}
+\def\inx{%
+ \typeout{Index:}
+ \begin{multicols}{2}
+ \parskip \z@ plus .5pt
+ \parfillskip \z@ plus .6\hsize % try to avoid almost empty lines
+ \outer\def\:##1, {\par\hangindent2em\noindent##1:\kern1em} % index entry
+ \rm \tolerance \@M \let\*=\lapstar
+ \hyphenpenalty \@M \parindent=\z@ }
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\fin}
+% This finishes off the name index and starts off the module index.
+% "\:" acts as in "\inx". The modules may be
+% qualified with "\U", which cross-references section uses. The page
+% header is changed appropriately.
+% \begin{macrocode}
+\def\fin{%
+ \end{multicols} \newpage
+ \parfillskip \z@ plus 1fil
+ \markboth{{\protect\small NAMES OF THE SECTIONS}\hfill
+ {\protect\small\@title}}
+ {{\protect\small\@title}\hfill
+ {\protect\small NAMES OF THE SECTIONS\quad}}
+ \typeout{Section names:}
+ \def\note##1##2.{\quad{\footnotesize##1 ##2.}}
+ \def\U{\note{Used in}}%
+ \def\:{\par\hangindent 2em}\let\*=*}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\con}
+% This finishes everything off, rather trivially. (It used to make
+% the contents page.)
+% \begin{macrocode}
+\newcommand{\con}{\end{document}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Including other files}
+%
+% \DescribeEnv{multicols}
+% We need the {\tt multicols} environment to make a two-column index
+% without a forced page break.
+% \begin{macrocode}
+\input{multicol.sty}
+% \end{macrocode}
+% \DescribeMacro{\webmacs}
+% Finally we include the macros defined by \spider. Doing things this way
+% means that \spider{} can override things done in this file for the
+% \web{} system of a particular language (like the
+% definition of "\res", for instance) and the limbo section can do
+% further overriding for a particular web file. If we're using this
+% file to document itself, "\webmacs" should have been defined in the
+% driver file to be "null"!
+% \begin{macrocode}
+\input{\webmacs}
+% \end{macrocode}
+% "\webmacs" is no further use and we might as well save the space.
+% \begin{macrocode}
+\let\webmacs=\empty
+% \end{macrocode}
+%
+% \appendix
+% \section{Changes from the plain version}\label{changes}
+%
+% \begin{description}
+% \item[{\tt \BS.}] becomes "\str";
+% \item[{\tt \BS\char`\^}] has been removed from the global
+% definitions (where it was assumed by the "c.spider" translation for
+% "^") and put in limbo in "weave.ch";
+% \item[{\tt \BS\%}, {\tt \BS\#} and {\tt \BS\$}] also removed from global
+% definitions and put in "\startcodehook";
+% \item[{\tt \BS\char`\~}] removed globally since it doesn't seem to be used;
+% \item[{\tt \BS\BS} and {\tt \BS|}] become "\id" and "\ida" respectively;
+% \item[{\tt \BS\&}] becomes "\res";
+% \item[{\tt \BS B} and {\tt \BS T}] (for controlled comments) removed
+% since no controlled comments in \spider;
+% \item[{\tt \BS)}] (string pool check sum) removed;
+% \item[{\tt \BS]}] (sign for forced line break) appears not be be
+% used, so removed;
+% \item[{\tt \BS=}] becomes "\vstr";
+% \item[{\tt \BS H}] (hat) removed since it seems not to be used and
+% clashes with \LaTeX;
+% \item[{\tt \BS Z}] replaced by \LaTeX{} contents stuff;
+% \item[{\tt \BS lheader} and {\tt \BS rheader}] replaced by \LaTeX{} marks;
+% \item[output routine stuff] all gone;
+% \item[{\tt \BS rhead}] no longer relevant---use the \LaTeX{} mark
+% mechanism;
+% \item[{\tt \BS title}] should be called as a macro with the title as
+% its argument rather than "\def"ed;
+% \item[{\tt \BS contentspagenumber}, {\tt \BS contentsfile} and {\tt
+% \BS readcontents}] no longer relevant;
+% \item[{\tt \BS pagewidth}, {\tt \BS pageheight} and {\tt \BS
+% fullpageheight}] no longer relevant---use the \LaTeX\ equivalents;
+% \item[{\tt \BS pageshift}] no longer relevant---use "twoside" option;
+% \item[verbatim macros] no longer relevant;
+% \item[{\tt \BS iftitle}] removed---use "\pagestyle{empty}" to
+% suppress page header.
+% \end{description}
+%
+% \begin{thebibliography}{1}
+% \bibitem{spider} N. Ramsey, {\sl Comm. ACM}, {\bf 32} (1989) 1051
+% \end{thebibliography}