summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/cweb/contrib
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 /macros/latex/contrib/cweb/contrib
Initial commit
Diffstat (limited to 'macros/latex/contrib/cweb/contrib')
-rw-r--r--macros/latex/contrib/cweb/contrib/Index16
-rw-r--r--macros/latex/contrib/cweb/contrib/cwbl-deutsch.sty83
-rw-r--r--macros/latex/contrib/cweb/contrib/cwbl-french.sty64
-rw-r--r--macros/latex/contrib/cweb/contrib/cwbl-italian.sty63
-rw-r--r--macros/latex/contrib/cweb/contrib/cweb-hy/README.txt131
-rw-r--r--macros/latex/contrib/cweb/contrib/cweb-hy/cwbasehy.tex2239
-rw-r--r--macros/latex/contrib/cweb/contrib/cweb-hy/cweb-hy.cls1538
-rw-r--r--macros/latex/contrib/cweb/contrib/cweb-hy/nodoc.tex121
-rw-r--r--macros/latex/contrib/cweb/contrib/wagner/cwebzw.sty323
9 files changed, 4578 insertions, 0 deletions
diff --git a/macros/latex/contrib/cweb/contrib/Index b/macros/latex/contrib/cweb/contrib/Index
new file mode 100644
index 0000000000..bf7a308a66
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/Index
@@ -0,0 +1,16 @@
+% $ITI: Index,v 1.2 1995/11/21 00:42:08 schrod Exp $ -*- Indented-Text -*-
+%----------------------------------------------------------------------
+
+The following files are contributed to LaTeX CWEB:
+
+ cwbl-french - by Andreas Scherer <scherer@physik.rwth-aachen.de>
+ Support for French CWEB documents.
+ cwbl-italian - by Andreas Scherer <scherer@physik.rwth-aachen.de>
+ Support for Italian CWEB documents.
+ cwbl-deutsch - by Andreas Scherer <scherer@physik.rwth-aachen.de>
+ Another support for German CWEB documents,
+ different texts than the one in src/.
+
+ cwebzw.sty - by Zden\v{e}k Wagner <wagner@csearn.bitnet>
+ Created for cweb.sty 1.8;
+ most probably doesn't run any more, moved to wagner/.
diff --git a/macros/latex/contrib/cweb/contrib/cwbl-deutsch.sty b/macros/latex/contrib/cweb/contrib/cwbl-deutsch.sty
new file mode 100644
index 0000000000..9192ad883b
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/cwbl-deutsch.sty
@@ -0,0 +1,83 @@
+% $Id: dcweb.sty,v 1.3 1995/09/11 18:03:44 scherer Exp $
+%
+% THIS IS A TEST!
+%
+% I have no idea how to write a style-conformant package, so bear with me.
+% This `package' translates the `LaTeX CWEB' class to German.
+%
+% Andreas Scherer
+% Rolandstra{\ss}e 16
+% 52070 Aachen, Germany
+%
+% 31. August 1995
+%
+% $Log: dcweb.sty,v $
+% Revision 1.3 1995/09/11 18:03:44 scherer
+% Following Joachim Schrod's advice, `chunk' means `Baustein'.
+%
+% Revision 1.2 1995/09/11 18:01:24 scherer
+% Make this package usable with `german.sty'.
+%
+% Revision 1.1 1995/09/11 18:00:41 scherer
+% Initial revision
+%
+\renewcommand{\CwebCRAlso}{\CwebCrossRef{Siehe auch den Baustein}}
+ % See also chunk
+\renewcommand{\CwebCRsAlso}{\CwebCrossRef{Siehe auch die Bausteine}}
+ % See also chunks
+
+\renewcommand{\CwebCRCite}
+ {\CwebCrossRef{Dieser Programmteil wird zitiert im Baustein}}
+ % This code is cited in chunk
+\renewcommand{\CwebCRsCite}
+ {\CwebCrossRef{Dieser Programmteil wird zitiert in den Bausteinen}}
+ % This code is cited in chunks
+
+\renewcommand{\CwebCRUse}
+ {\CwebCrossRef{Dieser Programmteil wird verwendet im Baustein}}
+ % This code is used in chunk
+\renewcommand{\CwebCRsUse}
+ {\CwebCrossRef{Dieser Programmteil wird verwendet in den Bausteinen}}
+ % This code is used in chunks
+
+\renewcommand{\CwebCREt}{ und~}
+ % and~
+\renewcommand{\CwebCRsEt}{ und~}
+ % , and~
+
+\renewcommand{\CwebCRChanged}{%
+ \CwebCrossRef{Die folgenden Bausteine sind vom Change-File
+ ver\"andert worden:}%
+ }
+ % The following chunks were changed by the change file:
+\renewcommand{\CwebChangedListName}{Ver\"anderte Bausteine}
+ % Changed Chunks
+
+\renewcommand{\CwebRefListName}{Liste der Verfeinerungen}
+ % List of Refinements
+
+\renewcommand{\CwebXRCite}{\CwebCrossRef{Zitiert im Baustein}}
+ % Cited in chunk
+\renewcommand{\CwebXRCites}{\CwebCrossRef{Zitiert in den Bausteinen}}
+ % Cited in chunks
+\renewcommand{\CwebXRUse}{\CwebCrossRef{Verwendet im Baustein}}
+ % Used in chunk
+\renewcommand{\CwebXRUses}{\CwebCrossRef{Verwendet in den Bausteinen}}
+ % Used in chunks
+
+
+%% -js [07 Nov 95]:
+%% Discarded code below, this problem has been repaired in the
+%% cwebbase module.
+%%
+%% \makeatletter
+%% \catcode`\_=\CatLetter
+%% \def\CwebString#1{%
+%% \hbox{\tt
+%% \cweb@string_setup
+%% \ifx\originalTeX\undefined\else\originalTeX\fi % for `german.sty'
+%% #1\kern .05em
+%% }%
+%% }
+%% \catcode`\_=\CatUsCode
+%% \makeatother
diff --git a/macros/latex/contrib/cweb/contrib/cwbl-french.sty b/macros/latex/contrib/cweb/contrib/cwbl-french.sty
new file mode 100644
index 0000000000..6dd3f6203e
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/cwbl-french.sty
@@ -0,0 +1,64 @@
+% $Id: fcweb.sty,v 1.2 1995/10/26 12:28:04 scherer Exp $
+%
+% THIS IS A TEST!
+%
+% I have no idea how to write a style-conformant package, so bear with me.
+% This `package' translates the `LaTeX CWEB' class to French.
+%
+% Andreas Scherer
+% Rolandstra{\ss}e 16
+% 52070 Aachen, Germany
+%
+% 31. August 1995
+%
+% $Log: fcweb.sty,v $
+% Revision 1.2 1995/10/26 12:28:04 scherer
+% Some French corrections pointed out by <bronne@@montefiore.ulg.ac.be.
+% Merci beaucoup !
+%
+% Revision 1.1 1995/09/11 17:57:59 scherer
+% Initial revision
+%
+\renewcommand{\CwebCRAlso}{\CwebCrossRef{Voir aussi le fragment}}
+ % See also chunk
+\renewcommand{\CwebCRsAlso}{\CwebCrossRef{Voir aussi les fragments}}
+ % See also chunks
+
+\renewcommand{\CwebCRCite}
+ {\CwebCrossRef{Code cit\'e dans le fragment}}
+ % This code is cited in chunk
+\renewcommand{\CwebCRsCite}
+ {\CwebCrossRef{Code cit\'e dans les fragments}}
+ % This code is cited in chunks
+
+\renewcommand{\CwebCRUse}
+ {\CwebCrossRef{Code utilis\'e dans le fragment}}
+ % This code is used in chunk
+\renewcommand{\CwebCRsUse}
+ {\CwebCrossRef{Code utilis\'e dans les fragments}}
+ % This code is used in chunks
+
+\renewcommand{\CwebCREt}{ et~}
+ % and~
+\renewcommand{\CwebCRsEt}{ et~}
+ % , and~
+
+\renewcommand{\CwebCRChanged}{%
+ \CwebCrossRef{Les fragments suivants ont \'et\'e modifi\'es dans
+ le fichier de changements\,:}%
+ }
+ % The following chunks were changed by the change file:
+\renewcommand{\CwebChangedListName}{Fragments modifi\'es}
+ % Changed Chunks
+
+\renewcommand{\CwebRefListName}{Liste des fragments}
+ % List of refinements
+
+\renewcommand{\CwebXRCite}{\CwebCrossRef{Cit\'e dans le fragment}}
+ % Cited in chunk
+\renewcommand{\CwebXRCites}{\CwebCrossRef{Cit\'e dans les fragments}}
+ % Cited in chunks
+\renewcommand{\CwebXRUse}{\CwebCrossRef{Utilis\'e dans le fragment}}
+ % Used in chunk
+\renewcommand{\CwebXRUses}{\CwebCrossRef{Utilis\'e dans les fragments}}
+ % Used in chunks
diff --git a/macros/latex/contrib/cweb/contrib/cwbl-italian.sty b/macros/latex/contrib/cweb/contrib/cwbl-italian.sty
new file mode 100644
index 0000000000..dc75642bff
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/cwbl-italian.sty
@@ -0,0 +1,63 @@
+% $Id: icweb.sty,v 1.2 1995/09/28 09:20:01 scherer Exp $
+%
+% THIS IS A TEST!
+%
+% I have no idea how to write a style-conformant package, so bear with me.
+% This `package' translates the `LaTeX CWEB' class to Italian.
+%
+% Andreas Scherer
+% Rolandstra{\ss}e 16
+% 52070 Aachen, Germany
+%
+% 31. August 1995
+%
+% $Log: icweb.sty,v $
+% Revision 1.2 1995/09/28 09:20:01 scherer
+% I must apologize for my poor Italian. Giuseppe Ghibň corrected this.
+%
+% Revision 1.1 1995/09/11 17:56:07 scherer
+% Initial revision
+%
+\renewcommand{\CwebCRAlso}{\CwebCrossRef{Vedi anche chunk}}
+ % See also chunk
+\renewcommand{\CwebCRsAlso}{\CwebCrossRef{Vedi anche chunk}}
+ % See also chunks
+
+\renewcommand{\CwebCRCite}
+ {\CwebCrossRef{Questo codice \`e citato nel chunk}}
+ % This code is cited in chunk
+\renewcommand{\CwebCRsCite}
+ {\CwebCrossRef{Questo codice \`e citato nei chunk}}
+ % This code is cited in chunks
+
+\renewcommand{\CwebCRUse}
+ {\CwebCrossRef{Questo codice \`e usato nel chunk}}
+ % This code is used in chunk
+\renewcommand{\CwebCRsUse}
+ {\CwebCrossRef{Questo codice \`e usato nei chunk}}
+ % This code is used in chunks
+
+\renewcommand{\CwebCREt}{ e~}
+ % and~
+\renewcommand{\CwebCRsEt}{ e~}
+ % , and~
+
+\renewcommand{\CwebCRChanged}{%
+ \CwebCrossRef{I seguenti chunk sono stati modificati tramite
+ il change-file:}%
+ }
+ % The following chunks were changed by the change file:
+\renewcommand{\CwebChangedListName}{Chunk modificati}
+ % Changed Chunks
+
+\renewcommand{\CwebRefListName}{Nomi dei chunk:}
+ % List of Refinements
+
+\renewcommand{\CwebXRCite}{\CwebCrossRef{Citato nel chunk}}
+ % Cited in chunk
+\renewcommand{\CwebXRCites}{\CwebCrossRef{Citato nei chunk}}
+ % Cited in chunks
+\renewcommand{\CwebXRUse}{\CwebCrossRef{Usato nel chunk}}
+ % Used in chunk
+\renewcommand{\CwebXRUses}{\CwebCrossRef{Usato nei chunk}}
+ % Used in chunks
diff --git a/macros/latex/contrib/cweb/contrib/cweb-hy/README.txt b/macros/latex/contrib/cweb/contrib/cweb-hy/README.txt
new file mode 100644
index 0000000000..676de55038
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/cweb-hy/README.txt
@@ -0,0 +1,131 @@
+Dear User:
+
+I present to you an evolution of the excellent CWEB class, originally by
+Joachim Schrod.
+The purpose of the new files is twofold:
+
+1.- To allow a file written using this class to be included in other
+documents, as for instance as an appendix to some report. For this,
+the file nodoc.tex may be of help.
+
+2.- To insert hyperlinks from the places where a chunk of code is
+referenced to the chunk itself, including the indices that are produced at
+the end of cweb document. The result makes it a lot more easy to follow
+the code if it is typeset using PDFLaTeX, or is otherwise processed
+to obtain a PDF or an HTML file, and makes no harm in the paper version
+of the document.
+
+The installation is straightforward. Put the files cweb-hy.cls and
+cwbasehy.tex where TeX can find them. Since cweb.cls was installed
+under tex/latex/literate, may I suggest you put all these files under
+tex/latex/liter-hy, all paths relative to your TEXMF hierarchy.
+
+1 The Class as a Package.
+
+For using the class as a normal package (with \usepackage{cweb-hy}), you
+simply have to copy the file cweb-hy.cls with the name cweb-hy.sty, so
+that it is found by LaTeX.
+
+How this works I can explain as follows. Suppose you have a file called
+whatever.w such as
+
+--------------------------------------
+% Very simple CWEB
+\documentclass[]{cweb-hy}
+\usepackage[T1]{fontenc}
+\usepackage{ae}
+\begin{document}
+\title{Whatever}
+\author{Me}
+
+@* CWEB program.
+This is your program.
+@c
+@<Header files@>@/
+@<Main program@>
+
+@ If we want to use the system resources, we must insert the definition
+of the standard functions.
+
+@<Header...@>=
+#include <stdio.h>
+
+@ The code makes whatever.
+
+@<Main...@>=
+int
+main(void)
+{
+printf("Whatever\n");
+exit(0);
+}
+@ \end{document}
+--------------------------------------
+And suppose further that you want to make a report including your
+beautifully typeset program (with CWEB and TeX).
+Well, with the CWEB class as it stands, you can't. However, with the very
+simple changes I have implemented, you could say
+
+\documentclass{report}
+\title{All my life's programs}
+\author{Me}
+\begin{document}
+\part{Rationale}
+Blah, Blah...
+
+\part{Programs}
+\section{Makes Whatever}
+\input{whatever}
+\end{document}
+
+and the file whatever.tex will get just in with all your very skillful
+code and clear documentation, everything typeset by TeX. The package
+accepts almost all the options the class does, but I decided not to
+include some auxiliary files with the cross-references in the former
+case. For two reasons. I am unsure as to how to do it and it is a
+bit overwhelming if you are in a large document to have these sections.
+I guess it can be done, however, and I guess you may like it. Drop me a
+mail in this case.
+
+You may now say to yourself, how is this going to work, if in my
+file whatever.tex there is a \documentclass, etc. all forbidden in
+a document's body? You have two choices. One is to delete all the
+offending commands and \input the diminished file. Another is to use
+nodoc.tex which I also provide. This nodoc.tex inhibits all offending
+commands for a while ---long enough for LaTeX not noticing it---,
+and restores the definitions just in time for you to have your dose of
+error-messages if you dare putting a preamble macro in the wrong place.
+For using it, simply add an \input{nodoc} at the very beginning of your
+file, and you will then be allowed both to typeset your file with LaTeX
+directly and to include it in other files, at the expense of a very
+limited memory use.
+
+2. Making screen versions of your programs
+
+Programs are cumbersome to follow. With CWEB your programs get a
+better structure, are better typeset and are more easy to understand.
+They remain, however, hard to follow because you have to move paper to
+and fro, looking for the referenced code. Using this new package, and
+if the documentation file (the one obtained with cweave) is processed to
+provide a screen version that can use hyperlinks (such as with PDFLaTeX,
+xdvi, dvipdfm) with the help of the hyperref package, the screen version
+you get has all the program chunks linked and referenced, so that when
+one is used or cited, there is a link you can click on to get to the
+adequate place. If you do not use the hyperref package no harm is done
+and the changes take no effect.
+
+Enjoy yourself with this demonstration of my clumsy TeX programming,
+and let me know if you experience any problems. Please write to Enrique
+Meléndez <UEI0560130010@eurociber.es> in case of failure, being as
+precise as you can with the error, possibly with a short example
+that demonstrates the failure, and providing a workaround (in the best of
+the worlds :-))
+
+Regards,
+Enrique Meléndez
+
+By the way, no responsibility is held. I did this for fun (among other
+things) and it worked for me. it may not work for you or, if it works,
+it may not perform exactly as you intended. If you write to me I can
+try my best to solve your problem (and I probably will try), but I make no
+formal promises. See the GNU public license for details.
diff --git a/macros/latex/contrib/cweb/contrib/cweb-hy/cwbasehy.tex b/macros/latex/contrib/cweb/contrib/cweb-hy/cwbasehy.tex
new file mode 100644
index 0000000000..1f7941323c
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/cweb-hy/cwbasehy.tex
@@ -0,0 +1,2239 @@
+% $StyleId: cwebbase.doc,v 1.4 1995/11/07 17:55:19 schrod Exp $
+%----------------------------------------------------------------------
+% Written by Joachim Schrod <schrod@iti.informatik.th-darmstadt.de>.
+% Copyright conditions see below (GPL).
+
+%
+% LaTeX macros cwebbase
+% support for incorporation of CWEAVE markup in LaTeX documents
+%
+% [LaTeX in MAKEPROG]
+% (history at end)
+
+
+
+
+%%%%
+%%%%
+%%%% These TeX macros were documented with the documentation system
+%%%% MAKEPROG and automatically converted to the current form.
+%%%% If you have MAKEPROG available you may transform it back to
+%%%% the original input: Remove every occurence of three percents
+%%%% and one optional blank from the beginning of a line and remove
+%%%% every line which starts with four percents. The following lex
+%%%% program will do this:
+%%%%
+%%%% %%
+%%%%
+%%%% ^%%%\ ? ;
+%%%% ^%%%%.*\n ;
+%%%%
+%%%% If you just want to print the documentation you may fetch
+%%%% the archive print-makeprog.tar.Z from ftp.th-darmstadt.de (directory
+%%%% pub/tex/latex). It contains *all* used styles -- but beware, they
+%%%% may not be in a documented form...
+%%%%
+%%%%
+%%% \documentclass{progltx}
+
+%%% \usepackage{cweb-doc} % document-specific markup
+%%% \usepackage{fullpage}
+
+
+%%% \RCS $StyleRevision: 1.4 $
+%%% \RCS $StyleDate: 1995/11/07 17:55:19 $
+
+
+%%% \begin{document}
+
+
+%%% \title{Typesetting \cweave{} Output}
+%%% \author{% % LaTeX does not discard unnecessary glue...
+%%% Joachim Schrod%
+%%% \thanks{%
+%%% \protect\raggedright
+%%% TU~Darmstadt, Computer Science Department, WG Systems Programming,
+%%% Alexanderstr.~10, D-64283~Darmstadt, Germany.
+%%% Email: \texttt{schrod@iti.informatik.th-darmstadt.de}.%
+%%% }%
+%%% }
+%%% \date{%
+%%% Revision \RCSStyleRevision\\
+%%% (as of \RCSStyleDate)%
+%%% }
+
+%%% \maketitle
+
+
+%%% % doesn't work with progltx yet
+%%% %\tableofcontents
+
+
+
+
+%%% \chap Introduction.
+
+%%% This code shall interpret and render the tag set output by \cweave{}.
+%%% That's realized in this module as it's needed in multiple places --
+%%% when we want to use \LaTeX{} markup in \cweb{}, when we want to
+%%% incorporate \cweb{} pieces in \LaTeX{} documents (as examples, or in
+%%% textbooks), and when we want to incorporate whole \cweb{} documents in
+%%% a \LaTeX{} document. (That's by far the most difficult task.)
+
+%%% As \cweb{} operates in modes, for obvious reasons our implementation
+%%% is based on a finite state automaton (FSA). The whole tag set is
+%%% separated into subsets that are valid in certain states.
+
+%%% The complete set of tags does not obey any name conventions, some tags
+%%% are even in conflict with standard \LaTeX{} tags (e.g.\ |\\|). Most
+%%% tags are used to render code pieces. With the introduction of states
+%%% we can restrict the visibilities of these tags to those states where
+%%% we typeset program parts. The needed functionality will be available
+%%% in cseqs of our namespace, we'll map that to \cweave{}'s names in a
+%%% group.
+
+%%% Then we have to implement the rendering of chunks and sections, that's
+%%% (more or less) a straight-forward task. Actually, we only set up the
+%%% basic code pieces, the integration of section divisions in the actual
+%%% \LaTeX{} document is a task of higher-level code; that integration
+%%% depends heavily on the type of document. That also implies that we
+%%% won't implement front or back matter material (document markup, table
+%%% of contents, index, list of refinements, etc.)\ in this module.
+
+
+%%% \sect Let's identify this module.
+
+%%% \noindent The code below is explained in the implementation
+%%% documentation of the \pkg{rcs} package.
+
+%%% \beginprog
+\begingroup
+ \def\RCSFile#1#2 $#3: #4 #5\endRCS $#6: #7 #8\endRCS{%
+ \def\date{#4}\def\id{v#7}%
+ \ProvidesFile{#1}[\date\space\id\space #2]%
+ }
+
+ \RCSFile{cwebbase.tex}{CWEAVE tags for LaTeX markup}
+ $StyleDate: 1995/11/07 17:55:19 $: 9999/00/00 \endRCS
+ $StyleRevision: 1.4 $: 0.0 \endRCS
+\endgroup
+%%% \endprog
+
+
+%%% \sect This module is part of the supported \textsl{cweb-sty} bundle.
+%%% Send bug reports, comments and repairs.
+
+%%% It assumes that the canonical setup of my modules has happened and can
+%%% be used herein. (In particular, the underscore is a letter.)
+
+
+%%% \sect This module reserves the namespace |cwbb|. It assumes that
+%%% |\cweb_warning| is bound either to |\PackageWarningNoLine| or
+%%% |\ClassWarningNoLine|, depending on the environment.
+
+%%% \beginprog
+\ifx \cwbb@loaded\undefined
+ \def\cwbb@loaded{$StyleRevision: 1.4 $}
+\else
+ \cweb_warning{cwebbase}%
+ {Some other package already uses namespace `cwbb'}
+\fi
+%%% \endprog
+
+
+%%% \sect This is freely distributable software; you can redistribute it
+%%% and/or modify it under the terms of the GNU General Public License as
+%%% published by the Free Software Foundation; either version~2 of the
+%%% License, or (at your option) any later version.
+
+%%% This software is distributed in the hope that it will be useful, but
+%%% \textbf{without any warranty}; without even the implied warranty of
+%%% \textbf{merchantability} or \textbf{fitness for a particular purpose}.
+%%% See the GNU General Public License for more details.
+
+%%% You should have received a copy of the GNU General Public License in
+%%% the file |License| along with this package; if not, write to the Free
+%%% Software Foundation, Inc., 675~Mass Ave, Cambridge, MA~02139,~USA.
+
+
+\ifx\hypertarget\undefined
+\def\hypertarget#1#2{#2}
+\def\hyperlink#1#2{#2}
+\fi
+
+
+%%% % ------------------------------------------------------------
+%%% %
+%%% % subdocument: The interface between CWEAVE and TeX
+%%% %
+
+%%% \input{cweave-spec}
+
+%%% %
+%%% % ------------------------------------------------------------
+
+
+
+
+%%% \chap Interface of \pkg{cwebbase} module.
+
+%%% \pkg{cwebbase} implements most of \cweave{} tags. It sets up tons of
+%%% redefinable cseqs, all of them start with |Cweb|.
+%%% %
+%%% \begin{fixme}
+%%% How do I document them? We need a configuration document anyhow. Do
+%%% I present here just a list of those cseqs realized in this module
+%%% and refer to the config docs? Need to wait until I have it, then
+%%% we'll see how the stuff here will be added.
+%%% \end{fixme}
+
+
+%%% \sect This module supports both hierarchic and flat section
+%%% structuring. You have to bind |\cweb@structure| to 0 (hierarchic) or 1
+%%% (flat) before importing it, to show which structure is wanted.
+
+
+%%% \sect This module supports suppression of different document parts.
+%%% You have to define flags |@cweb@suppress@|\<foo>|@| with
+%%% $\mbox{\<foo>} \in \{ |changehints|, |unchanged|, |format| \}$ to
+%%% denote if suppression shall happen.
+
+
+%%% \sect The counter |secnumdepth| must be~11 if chunks shall be
+%%% numbered. That counter doesn't need to be set when this module is
+%%% imported, it can be set locally during typesetting \cweb{} code.
+
+%%% The definitions for flat structure assume that |secnumdepth| is~11
+%%% during typesetting.
+
+
+%%% \sect |\part|, |\chapter| (if available), and |\section| are used for
+%%% \cweb{} section divisions (those with the lowest ranks). These
+%%% commands will change the respective counters globally and will
+%%% add toc lines and marks. You might want to prevent that by redefining
+%%% |\addcontentsline| and |\mark|.
+
+%%% Table of contents macros are not defined for the section divisions
+%%% introduced by this module. You must either prevent that they are
+%%% written to the |AUX| file at all; or you must define them.
+%%% %
+%%% \begin{fixme}
+%%% Add explanation of introduced section divisions.
+%%% \end{fixme}
+
+%%% For flat structure, all section divisions are of type `|chunk|', like
+%%% chunks. The section names start with `|\cwbbRank{|\<rank>|}|'. By
+%%% default, |\cwbbRank| takes one argument and expands to the empty list
+%%% -- this can be redefined for the table of contents.
+
+
+%%% \sect The document end, as explained in the \cweave{} interface specs
+%%% (chunk~\ref{spec:sec:docend}), is not implemented. That must be done
+%%% by the user of this module -- if the back matter is to be processed at
+%%% all.
+
+
+
+
+%%% \chap Processing states.
+
+%%% We have to typeset five different categories of material:
+%%% Documentation, program pieces---embedded within the documentation and
+%%% as large chunks, \TeX{} material within program pieces (i.e., comments
+%%% and refinement names), and cross reference information. Since we need
+%%% a complete other environment for the program pieces than for the rest
+%%% we design ``states'' where we switch to appropriately.
+%%% %
+%%% \begin{enumerate}
+
+%%% \item A chunk starts in the \textsl{documentation state}.
+
+%%% \item |\B| switches to \textsl{program state}. This can happen in
+%%% documentation and program state.
+
+%%% \item While we process the argument of |\PB| we're in \textsl{restricted
+%%% program state}; |\PB| may appear in documentation and in \TeX{}
+%%% state. Since \TeX{} state can be switched on within restricted
+%%% program state, |\PB| can appear within the argument of itself.
+
+%%% \item In the arguments of |\C|, |\SHC|, and |\X| we switch to
+%%% \textsl{\TeX{} state}. All these cseqs appear only in (restricted)
+%%% program state, their official names are actually different. I.e., only
+%%% in (restricted) program state these cseq are bound to the meaning
+%%% described here.
+
+%%% \item Cross reference information are attached to most chunks with
+%%% refinements. This information is processed in \textsl{CR state}.
+%%% After CR state material
+%%% comes always the next chunk or the document end, i.e., material in
+%%% documentation state.
+
+%%% \end{enumerate}
+%%% %
+%%% This FSA is illustrated by the diagram in figure~\ref{fig:fsa}.
+
+%%% \begin{figure}
+
+%%% \begin{center}
+%%% \chardef\\=`\\
+%%% \input{cweb-fsa.latex}
+%%% \end{center}
+
+%%% \caption{The processing state's FSA. The automaton starts and ends in
+%%% the ``documentation'' state.}
+%%% \label{fig:fsa}
+
+%%% \end{figure}
+
+%%% |\cwbb@documentation| will switch to documentation state,
+%%% |\cwbb@program| to program state, |\cwbb@Rprogram| to restricted
+%%% program state, |\cwbb@tex| to \TeX{} state, and |\cwbb@CR| to CR state.
+%%% If we're already in a state, the switch to this state shall be a
+%%% permissible null operation.
+
+
+%%% \sect The basic difference between these states can be named with
+%%% two parameters: (1)~The cseq bindings in effect and (2)~the layout
+%%% parameters used for paragraph makeup.
+
+%%% In (restricted) program state and in CR state the text is output
+%%% under the control of \cweave{}, and tagged by \cweave{}. The used
+%%% tags are from a global namespace and should only be in effect during
+%%% these states. We call this tag set the \textsl{\cweave{} bindings}. In the
+%%% other two states the tags are largely defined by the user, the tag
+%%% set is called the \textsl{user bindings}. The switch to another binding
+%%% is always done locally, i.e., if we switch from documentation to
+%%% restricted program state within a group we don't have to bother about
+%%% the restauration of the user binding; it will be done automatically
+%%% by \TeX{} at the end of the group. Nevertheless we must be able to
+%%% switch from the \cweave{} bindings back to the user bindings which
+%%% were in effect when we activated the \cweave{} bindings. This is
+%%% needed for the \TeX{} state which is always activated within
+%%% (restricted) program state.
+
+%%% The parameters for \textsl{program layout} are really special ones
+%%% since they need to support the indentation which shows the program
+%%% structure. These parameters are used in program and in \TeX{} state.
+%%% The \textsl{document layout} parameters established by the user are
+%%% used in the other three states.
+
+%%% The following table shall summarize this. $C$~denotes \cweave{}
+%%% bindings, $U$~user bindings, $P$~program layout, and $D$~document
+%%% layout. If an entry is empty, its value is not changed on entry in
+%%% this state.
+%%% %
+%%% \begin{center}
+%%% \DeleteShortVerb\|
+%%% \begin{tabular}{r|c|c}
+%%% \multicolumn1{c|}{\textsc{State}} & \textsc{Binding} & \textsc{Layout} \\[1pt]
+%%% \hline
+%%% documentation & $U$ & $D$ \\
+%%% program & $C$ & $P$ \\
+%%% restricted program & $C$ & \\
+%%% \TeX{} & $U$ & \\
+%%% CR & $C$ & $D$ \\
+%%% \end{tabular}
+%%% \MakeShortVerb\|
+%%% \end{center}
+
+
+%%% \sect Since the user bindings and the document layout is defined
+%%% initially, we don't have to do anything if it's requested. Only if we
+%%% change it, i.e., within |\cwbb@cweave_bindings| and
+%%% |\cwbb@program_layout|, we redefine |\cwbb@user_bindings| and
+%%% |\cwbb@doc_layout|. If they are eventually executed, they shall
+%%% rebind themselves back to |\relax|. This way we can switch to
+%%% documentation state as often as we want.
+
+%%% \beginprog
+\let\cwbb@user_bindings=\relax
+\let\cwbb@doc_layout=\relax
+
+\def\cwbb@documentation{%
+ \cwbb@user_bindings
+ \cwbb@doc_layout
+ }
+\def\cwbb@Rprogram{\cwbb@cweave_bindings}
+
+\def\cwbb@program{%
+ \cwbb@cweave_bindings
+ \cwbb@program_layout
+ }
+\def\cwbb@tex{\cwbb@user_bindings}
+
+\def\cwbb@CR{%
+ \cwbb@cweave_bindings
+ \cwbb@doc_layout
+ }
+%%% \endprog
+
+
+
+
+%%% \chap Saving and restoring control sequences.
+
+%%% We have a lot of cseqs which are defined within the namespace of this
+%%% module and which will be used with other names. This usage is in a
+%%% controlled environment, namely neither in documentation nor in \TeX{}
+%%% state. (I.e., the text processed is tagged by \cweave{}, not by humans;
+%%% therefore we have a precise specification of the cseqs we have to
+%%% accept.) We cannot work with groups where a cseq is just redefined
+%%% and \TeX{} takes care for establishing the old binding again; when we
+%%% switch from program state to \TeX{} state all the bindings which were
+%%% in effect before the program state get active, i.e., in the
+%%% documentation state, must be in effect again. We cannot simply
+%%% consider the \TeX{} state as something parallel to program state, it
+%%% must be a hierarchical relationship: In the program state values are
+%%% set up which must be available after switching back from \TeX{} to
+%%% program state.
+
+%%% We save the current binding of a cseq in another cseq, but only if
+%%% there exists a binding currently. This is done to save valuable
+%%% \TeX{} main memory. (Why don't all those people who talk about
+%%% extending \TeX{} not just implement dynamic memory management for the
+%%% existing \TeX{}? It would still be \TeX{} and would \emph{really} be
+%%% a worthy activity. But not enough fun, I assume\,\dots) Actually, one
+%%% can assume that nearly no cseq bindings must be saved at all---the
+%%% used names are strange enough. The bindings of |\foo|, i.e., of the
+%%% cseq with the name \fbox{\ttfamily foo}, is saved as the cseq with the
+%%% name \fbox{\ttfamily cweb\char `\\ foo}, i.e., as
+%%% |\csname cweb\string\foo \endcsname|.
+
+
+%%% \sect The save process is not done statically, but by the macro
+%%% |\cwbb@rebind| which interprets a list of tuples $({\it old\_name},
+%%% {\it new\_name})$, terminated by the tuple $(|\stop|, |\stop|)$.
+%%% Eventually it constructs two new lists, |\cwbb@to_restore| with the
+%%% cseqs which had a binding, and |\cwbb@undefined| with the names which
+%%% didn't have one.
+
+%%% The saving is actually done by |\cwbb@save_binding|, |\cwbb@rebind|
+%%% is responsible for the initialization, |\cwbb@do_rebind| for the
+%%% effective rebinding and the tail recursion on the list.
+
+%%% \begin{fixme}
+%%% We could pull the |\next| assignment in the |\else| branch out of
+%%% the loop to get a better performance. Should measure if this is of
+%%% interest.
+%%% \end{fixme}
+
+%%% \beginprog
+\newtoks\cwbb@undefined
+\newtoks\cwbb@to_restore
+
+\def\cwbb@rebind{%
+ \cwbb@undefined{}%
+ \cwbb@to_restore{}%
+ \cwbb@do_rebind
+ }
+\def\cwbb@do_rebind#1#2{%
+ \ifx #1\stop
+ \let\next\relax
+ \else
+ \cwbb@save_binding #2%
+ \let #2=#1%
+ \let\next\cwbb@do_rebind
+ \fi
+ \next
+ }
+%%% \endprog
+
+
+%%% \sect If the cseq to be saved is undefined, it may just be added to
+%%% the ``undefined list.'' Otherwise its binding is saved and it's added
+%%% to the ``to-be-restored list.''
+
+%%% \TeX{}nical note: The cseq-name for the saved binding must be created
+%%% before the |\let| is executed.
+
+%%% \beginprog
+\def\cwbb@save_binding#1{%
+ \ifx #1\undefined
+ \cwbb@undefined \expandafter{\the\cwbb@undefined #1}%
+ \else
+ \expandafter\let \csname cweb\string#1\endcsname =#1%
+ \cwbb@to_restore \expandafter{\the\cwbb@to_restore #1}%
+ \fi
+ }
+%%% \endprog
+
+
+%%% \sect The restoration of rebound cseqs is a two-tied activity: All
+%%% previously undefined cseqs must be made undefined again, and all saved
+%%% cseqs must be restored. Actually, we don't need to reset the two token
+%%% lists, but we do it to save space.
+
+%%% Both |\cwbb@undefine| and |\cwbb@restore_binding| iterate over a list
+%%% of cseqs terminated by |\stop|.
+
+%%% \begin{fixme}
+%%% And here the |\next| assignment could be prepended to the loop as
+%%% well.
+%%% \end{fixme}
+
+%%% \beginprog
+\def\cwbb@restore_bindings{%
+ \expandafter\cwbb@undefine \the\cwbb@undefined \stop
+ \cwbb@undefined{}%
+ \expandafter\cwbb@restore_binding \the\cwbb@to_restore \stop
+ \cwbb@to_restore{}%
+ }
+
+\def\cwbb@undefine#1{%
+ \ifx #1\stop
+ \let\next\relax
+ \else
+ \let#1\undefined
+ \let\next\cwbb@undefine
+ \fi
+ \next
+ }
+%%% \endprog
+
+
+%%% \sect \TeX{}nical note: As in |\cwbb@save_binding|, the cseq-name for
+%%% the saved binding must be created before the |\let|s are executed.
+
+%%% \begin{fixme}
+%%% Another |\next| assignment.
+%%% \end{fixme}
+
+%%% \beginprog
+\def\cwbb@restore_binding#1{%
+ \ifx #1\stop
+ \let\next\relax
+ \else
+ \expandafter\let \expandafter#1\csname cweb\string#1\endcsname
+ \expandafter\let \csname cweb\string#1\endcsname \undefined
+ \let\next\cwbb@restore_binding
+ \fi
+ \next
+ }
+%%% \endprog
+
+
+
+
+%%% \chap Chunks.
+
+%%% All chunks are numbered subsequently. The chunk number is supplied as
+%%% part of the markup. In addition, the `changed' tag |\*| may be
+%%% appended to the chunk number.
+
+%%% By default, chunks have approximately two picas vertical space in
+%%% front.
+
+%%% If we use an hierarchic structure, we output the chunk number at the
+%%% refinement. (It's only needed to identify the refinement for cross
+%%% references.) But chunks are important structural units and thus should
+%%% be marked by typographic means that's more visible than the space
+%%% mentioned above, we add a `chunk start marker'.
+
+%%% For a flat structure, we output the chunk number as the chunk start
+%%% marker, that is the traditional \WEB{} layout.
+
+%%% In any case, the documentation part shall be run in after the chunk
+%%% start marker.
+
+%%% \beginprog
+\newskip\CwebChunkPreSkip
+ \CwebChunkPreSkip=2pc plus 1pc minus 6pt
+%%% \endprog
+
+
+%%% \sect In \LaTeX{}, structural divisions are best realized by
+%%% |\@startsection|, we'll use it also for chunk starts. The chunk start
+%%% marker is the section heading. For hierarchic structure, we use a
+%%% traditional paragraph sign, used since medieval times to tag new text
+%%% units. Our first test showed that the paragraph sign has typically an
+%%% underlength, that doesn't look good at the start of a chunk. We raise
+%%% the sign by its depth.
+
+%%% For flat structure, we don't have text as the section heading,
+%%% but we have to cope for a deficiency of \LaTeX{}: It always leaves a
+%%% quad after the section number (by the way, this is not mentioned in
+%%% the documentation---you have to look in the macros to figure this
+%%% out). So we use a backskip of $\rm -1\,em$ as the chunk start marker
+%%% then.
+
+%%% Changed chunks are marked by a changeflag, by default a star lapping
+%%% to the right. We need the information if that chunk is changed to
+%%% decide if we shall output the changeflag. We demand from the chunk
+%%% macros that they record that info in the flag |@cwbb_changed_chunk@|.
+
+%%% Each structural division must be categorized, it belongs to a
+%%% \textsl{type}. This type determines also the name of the counter, the
+%%% mark handling for this category, and how this section tag is
+%%% represented in the table of contents. The type of chunks is `|chunk|'
+%%% (trivial, isn't it?).
+
+%%% Furthermore, a structural division in \LaTeX{} has an associated
+%%% \textsl{level}. That level is used to determine if that division get
+%%% numbered in text or table of contents. For sections, we'll compute the
+%%% level from the rank, it will not be larger than the rank.%
+%%% \footnote{Check the next section for a more precise definition of
+%%% `rank' and `level'.}
+%%% Since the highest section rank is~10, we may use 11 as chunk level.
+
+%%% For flat structure, we output the number for all section headings,
+%%% including chunks. For hierarchic structure we use the default maximum
+%%% level as supplied by our document class (e.g., 3~for \cls{article},
+%%% and 2~for \cls{report} or \cls{book}).
+
+%%% As a last point, we have to care already for sections in flat
+%%% structure. They will use the |chunk| category as well, we have to
+%%% distinguish them in the table of contents. For that, we'll record the
+%%% level in the text, it will get written to the table of contents.
+
+%%% \beginprog
+\newif\if@cwbb_changed_chunk@
+\let\CwebChangeFlag=*
+\if@cweb@suppress@changehints@
+ \let\cwbb@change_flag=\relax
+\else
+ \let\cwbb@change_flag=\CwebChangeFlag
+\fi
+\def\cwbb@lap_change_flag{\rlap{\cwbb@change_flag}}
+
+\ifcase \cweb@structure
+ %% hierarchic
+ \let\CwebChunkHeadingStyle\relax
+ \newbox\cweb@chunk_marker
+ \setbox\cweb@chunk_marker=\hbox{\P} % tradition from medivial times
+ \setbox\cweb@chunk_marker=\hbox{%
+ \raise\dp\cweb@chunk_marker \box\cweb@chunk_marker
+ }
+ \def\CwebChunkHeadingMarker{\copy\cweb@chunk_marker}
+ \def\CwebChunkHeading#1{%
+ \CwebChunkHeadingMarker
+ \if@cwbb_changed_chunk@ \cwbb@lap_change_flag \fi
+ }
+ \or
+ %% flat
+ \def\cwbbRank#1{}
+ \def\CwebChunkHeadingStyle{\bfseries}
+ \def\CwebChunkHeading#1{%
+ \protect\cwbbRank{#1}%
+ \kern -1em
+ \if@cwbb_changed_chunk@ \cwbb@lap_change_flag \fi
+ }
+\fi
+%%% \endprog
+
+
+%%% \sect Chunks are tagged with |\M| and get passed the chunk number as
+%%% argument. Before we evaluate |\@startsection|, we'll start the chunk.
+%%% That's common code to be used by sections as well, as they also
+%%% implicitely start a chunk.
+
+%%% Enrique Mel\'endez (\texttt{ema@csn.es}) introduced some code to insert
+%%% hyperlinks.
+
+%%% \beginprog
+\def\M#1{%
+ \cwbb@start_chunk{#1}%
+ \@startsection
+ {chunk}% % category, == counter etc.
+ {11}% % level
+ {\z@}% % no indentation for heading
+ {\CwebChunkPreSkip}% % skip above heading
+ {\m@ne em}% % run-in heading, 1em distance to text
+ {\normalfont\CwebChunkHeadingStyle}% % layout
+ {\CwebChunkHeading{11}}% % text, level might go to toc file
+ \hypertarget{_hypersect_#1}{}%
+ }
+%%% \endprog
+
+
+%%% \sect But let's first declare how a chunk number is represented. The
+%%% principle rendering is controlled by |\thechunk|, namely, we get
+%%% arabic numbers. This rendering is used both for creation of the
+%%% section header (if in flat mode) and for cross references. I.e.,
+%%% |\ref| expands into it.
+
+%%% But for flat structure we need different expansions: In the section
+%%% header a period shall be appended, a cross reference shall appear
+%%% without such a period. We use two different macros: |\thechunk|
+%%% creates the number with the period, |\cwbb@refchunk| only the number.
+%%% The latter is used for a redefinition of |\@currentlabel|. Of course,
+%%% for hierarchic structure, both are the same.
+
+%%% \beginprog
+\newcounter{chunk}
+
+\def\cwbb@refchunk{\arabic{chunk}}
+
+\ifcase \cweb@structure
+ %% hierarchic
+ \let\thechunk=\cwbb@refchunk
+ \or
+ %% flat
+ \def\thechunk{\arabic{chunk}.}
+\fi
+%%% \endprog
+
+
+%%% \sect Each chunk is started by |\cwbb@start_chunk|, which does the
+%%% common actions. First of all, we switch to documentation state.
+
+%%% Then we store the chunk number in the |chunk| counter. That implies
+%%% that the chunk start must not step this counter! We'll take care for
+%%% that later by redefining |\refstepcounter|. The actual number is
+%%% passed as the argument, including an optional |\*| used to denote
+%%% changed chunks. We'll redefine that cseq to update the flag
+%%% |@cwbb_changed_chunk@|.
+
+%%% Each chunk must be typeset with an open |\if| since it is finished by
+%%% |\fi|. If we shall suppress the output of unchanged chunks, we have
+%%% to use |\iffalse| if not |@cwbb_changed_chunk@|, otherwise |\iftrue|.
+%%% The flag |@cwbb_print_chunk@| is set up to provide an appropriate
+%%% test.
+
+%%% When we typeset a chunk, we evaluate |\cwbb@init_print_chunk|. For
+%%% hierarchic structure, that cseq will be used to initialize the
+%%% typesetting of the chunk number at program parts.
+
+%%% \beginprog
+\if@cweb@suppress@unchanged@
+ \def\if@cwbb_print_chunk@{\if@cwbb_changed_chunk@}
+ \@gobble\fi % close \if in case it's skipped
+\else
+ \let\if@cwbb_print_chunk@=\iftrue
+ \@gobble\fi % same here
+\fi
+
+\def\cwbb@start_chunk#1{%
+ \cwbb@documentation
+% \hypertarget{_hypersect_#1}{}%
+ %%\hypertarget{_hyperchunk_#1}{}%
+ \begingroup
+ \def\*{\global\@cwbb_changed_chunk@true}%
+ \global\@cwbb_changed_chunk@false
+ \global \c@chunk #1\relax % might expand \*
+ \endgroup
+ \if@cwbb_print_chunk@
+ \cwbb@init_print_chunk
+ }
+%%% \endprog
+
+
+%%% \sect |\@startsection| will step the section counter (i.e., |chunk|).
+%%% Since we just assigned it in |\cwbb@start_chunk|, that would leave us
+%%% with a counter that's one too high. And our output in cross references
+%%% may be wrong, as a period is appended in flat structure.
+
+%%% That damage all comes from one macro, |\refstepcounter|; let's
+%%% advice it to do the Right Thing for |chunk| counters.
+
+%%% \beginprog
+\let\cwbb@refstepcounter=\refstepcounter
+
+\def\cwbb@string@chunk{chunk}
+\def\refstepcounter#1{%
+ \def\@tempa{#1}%
+ \ifx \@tempa\cwbb@string@chunk
+ \protected@edef\@currentlabel{\cwbb@refchunk}%
+ \else
+ \cwbb@refstepcounter{#1}%
+ \fi
+ }
+%%% \endprog
+
+
+
+
+%%% \chap Sections.
+
+%%% Important sections are started on a new page, normal sections have the
+%%% same space as chunks in front. The very first section does not
+%%% automatically start on a new page since a title may be in front of it.
+
+%%% Each section division has a \textsl{rank}, that denotes the section
+%%% depth as seen by \cweave{}.
+
+%%% For this depth we compute a \textsl{level}, used to denote the section
+%%% depth for \LaTeX{}. This section depth is used to decide where
+%%% numbering shall stop, or if that entry shall be presented in the table
+%%% of contents, etc.
+
+%%% These two numbers are not the same, due to the support of document
+%%% classes with chapters.
+
+%%% We consider a section as important if it's rank is smaller than~3,
+%%% i.e., then we'll start a new page. This limit is controlled by the
+%%% number |\CwebRankNoEject|. The rank is used as the section level
+%%% and is therefore available to configure depth of typeset numbering and
+%%% appearance in table of contents.
+
+%%% \beginprog
+\def\CwebRankNoEject{3}
+%%% \endprog
+
+
+%%% \sect Sections are started with the macro |\N|. It's first parameter
+%%% is the section's rank. The second parameter is the chunk number, the
+%%% third the title of the section. This last parameter must be terminated
+%%% by a dot.
+
+%%% Each section implicitly starts a chunk. As explained above, major
+%%% sections may eject the page, and we add our actual section heading
+%%% with |\CwebSection|.
+
+%%% We also tell the user that we have reached the next section by telling
+%%% him about the current chunk number. The message is output after the
+%%% section header is set, it shall be on the correct page. Since the
+%%% token list to be output is expanded at shipout time, we must take care
+%%% for the immediate expansion ourselves.
+
+%%% Enrique Mel\'endez (\texttt{ema@csn.es}) introduced some code to insert
+%%% hyperlinks.
+%%% \beginprog
+\def\N#1#2#3.{%
+ \cwbb@start_chunk{#2}%
+ \CwebEjectSection{#1}%
+ \hypertarget{_hypersect_#2}{}%
+ \CwebSection{#1}{#3}%
+ \begingroup
+ \def\*{}%
+ \edef\tmp{*#2}%
+ \message \expandafter{\tmp}%
+ \endgroup
+ }
+%%% \endprog
+
+
+%%% \sect At the start of a section we usually eject the page if our rank
+%%% is not too low. But if the user had a title above the first section,
+%%% he won't want this page break. So we try to guess it. If we guess
+%%% wrong, the user may either add |\newpage| himself or he may redefine
+%%% |\CwebEjectSection| in a package.
+
+%%% \beginprog
+\def\CwebEjectSection#1{% % #1 == rank
+ \gdef\CwebEjectSection##1{%
+ \relax
+ \ifnum ##1<\CwebRankNoEject\relax
+ \newpage
+ \fi
+ }%
+ }
+
+\if@titlepage
+ \CwebEjectSection{}
+\fi
+%%% \endprog
+
+
+%%% \sect Now comes a heary piece. We have 11~section ranks, and need 11
+%%% different section categories, section counters, etc. For flat
+%%% structure, they shall all do the same; for hierarchic structure, they
+%%% shall be really different.
+
+%%% \noindent Let's have a look at the hierarchic structure first, it's
+%%% more complex.
+%%% %
+%%% \begin{itemize}
+
+%%% \item We associate section rank~0 (that's `|@**|') with document
+%%% parts, i.e., map it to |\part|. Many smaller programs won't use it.
+
+%%% \item If we are used in a class that has a bound cseq |\chapter|, we
+%%% associate rank~1 (`|@*0|') with it and rank~2 (`|@*1|') with
+%%% |\section|. Otherwise we associate rank~1 with |\section|. These
+%%% tags (|\chapter| and/or |\section|) must be defined because many
+%%% macros that want to create section divisions will use them.
+
+%%% \item All other section ranks are placed below |\section|.
+%%% |\subsection| and other \LaTeX{} style markup is not supported.
+
+%%% For hierarchic structure, we identify these sections with category
+%%% names `|section|$l$', where $l$ is the respective level, computed
+%%% from the rank. Those section names do not exist yet, we have to
+%%% create them.
+
+%%% \end{itemize}
+
+%%% Now we come to the point why we can't use the rank as the section
+%%% level passed to \LaTeX{}: When we assume the level usage of \LaTeX{}'s
+%%% standard classes, |\section| is \emph{always} on level~1, independent
+%%% of the existence of |\chapter|. The latter is placed on level~0, its
+%%% existence only influences the section level of |\part|, which is
+%%% either $-1$ or~0.
+
+%%% This implies that |\subsection| in a standard class is always on
+%%% level~2, but our equivalent section division is either `|@*0|'
+%%% (rank~1) or `|@*1|' (rank~2). I.e., when we have chapters, we use a
+%%% level that's one lower than the rank, otherwise we use the rank.
+
+%%% For flat structure, we use type |chunk|. This way we'll use the chunk
+%%% numbers, they are already set up.
+
+%%% For flat structure, we will map all ranks to the same section markup.
+%%% This markup will also be accessible by |\section| or |\chapter|. They
+%%% will be declared to be on a level that is the same as the rank.
+
+
+%%% \sect The printed representation of a section divison number is simply
+%%% the presentation from the next upper level, a full stop, and an arabic
+%%% section number. When we compute the name of the previous level we must
+%%% pay attention to our first section division created this way. This
+%%% division must be placed below |section|, without any following number.
+
+%%% Since registers are a valuable resource in \TeX{}, we have to take
+%%% care not to allocate a superfluous one.
+
+%%% \beginprog
+\def\toclevel@chunk{12}
+\def\theHchunk{chunk.\arabic{chunk}}
+\ifcase \cweb@structure
+ %% hierarchic
+ \newcounter{section2}[section]
+ \@namedef{thesection2}{\@nameuse{thesection}.\arabic{section2}}
+ \newcounter{section3}[section2]
+ \@namedef{thesection3}{\@nameuse{thesection2}.\arabic{section3}}
+ \newcounter{section4}[section3]
+ \@namedef{thesection4}{\@nameuse{thesection3}.\arabic{section4}}
+ \newcounter{section5}[section4]
+ \@namedef{thesection5}{\@nameuse{thesection4}.\arabic{section5}}
+ \newcounter{section6}[section5]
+ \@namedef{thesection6}{\@nameuse{thesection5}.\arabic{section6}}
+ \newcounter{section7}[section6]
+ \@namedef{thesection7}{\@nameuse{thesection6}.\arabic{section7}}
+ \newcounter{section8}[section7]
+ \@namedef{thesection8}{\@nameuse{thesection7}.\arabic{section8}}
+ \newcounter{section9}[section8]
+ \@namedef{thesection9}{\@nameuse{thesection8}.\arabic{section9}}
+%
+ \@namedef{theHsection2}{\@nameuse{thesection}.\arabic{section2}}
+ \@namedef{theHsection3}{\@nameuse{thesection2}.\arabic{section3}}
+ \@namedef{theHsection4}{\@nameuse{thesection3}.\arabic{section4}}
+ \@namedef{theHsection5}{\@nameuse{thesection4}.\arabic{section5}}
+ \@namedef{theHsection6}{\@nameuse{thesection5}.\arabic{section6}}
+ \@namedef{theHsection7}{\@nameuse{thesection6}.\arabic{section7}}
+ \@namedef{theHsection8}{\@nameuse{thesection7}.\arabic{section8}}
+ \@namedef{theHsection9}{\@nameuse{thesection8}.\arabic{section9}}
+ \@namedef{toclevel@section2}{2}
+ \@namedef{toclevel@section3}{3}
+ \@namedef{toclevel@section4}{4}
+ \@namedef{toclevel@section5}{5}
+ \@namedef{toclevel@section6}{6}
+ \@namedef{toclevel@section7}{7}
+ \@namedef{toclevel@section8}{8}
+ \@namedef{toclevel@section9}{9}
+ \ifx \chapter\undefined
+ \newcounter{section10}[section9]
+ \@namedef{thesection10}{\@nameuse{thesection9}.\arabic{section10}}
+ \@namedef{theHsection10}{\@nameuse{theHsection9}.\arabic{section10}}
+ \@namedef{toclevel@section10}{10}
+ \else
+ \fi
+\fi
+%%% \endprog
+
+
+%%% \sect Sections are typeset by |\CwebSection|; rank and title are the
+%%% arguments.
+
+%%% For hierarchic structure, we select the proper cseq according to rank:
+%%% |\part|, |\chapter| if this is a structure with chapters, |\section|,
+%%% and |\cwbb@section{|\<rank>|}| for other ranks. For the last cseq we
+%%% also have to supply the section category, it's `|section|$l$' where
+%%% $l$ is the rank~$r$ if we don't have chapters, $r-1$ otherwise.
+
+%%% That category cannot be computed by |\cwbb@section| itself since we
+%%% want to use that macro also for flat structure. But there all sections
+%%% are basically chunks, we have to use the |chunk| category there. Since
+%%% we want to differentiate them in the table of contents nevertheless,
+%%% we record the current rank in the title.
+
+%%% \beginprog
+\ifcase \cweb@structure
+ %% hierarchic
+ \ifcase\cweb@cls
+ \ifx \chapter\undefined
+ \def\CwebSection#1#2{%
+ \ifcase #1
+ %% 0
+ \let\next\part
+ \or %% 1
+ \let\next\section
+ \else %% level = rank
+ \def\cwbb@sect_name{section#1}%
+ \def\next{\cwbb@section{#1}}%
+ \fi
+ \next{#2}%
+ }
+ \else
+ \def\CwebSection#1#2{%
+ \ifcase #1
+ %% 0
+ \let\next\part
+ \or %% 1
+ \let\next\chapter
+ \or %% 2
+ \let\next\section
+ \else %% level = rank - 1
+ \count@=#1 \advance \count@\m@ne
+ \edef\cwbb@sect_name{section\number\count@}%
+ \edef\next{\noexpand\cwbb@section{\number\count@}}%
+ \fi
+ \next{#2}%
+ }
+ \fi
+ \or %% In case we are included from other classes
+ %%
+ \ifx \chapter\undefined
+ \def\CwebSection#1#2{%
+ \count@=#1 \advance \count@\@ne\advance \count@\@ne
+ \edef\cwbb@sect_name{section\number\count@}%
+ \edef\next{\noexpand\cwbb@section{\number\count@}}%
+ \next{#2}%
+ }
+ \else
+ \def\CwebSection#1#2{%
+ \ifcase #1
+ %% 0
+ \let\next\chapter
+ \or %% 1
+ \let\next\section
+ \else %% level = rank
+ \def\cwbb@sect_name{section#1}%
+ \def\next{\cwbb@section{#1}}%
+ \fi
+ \next{#2}%
+ }
+ \fi
+ \fi
+ \or
+ %% flat
+ \def\CwebSection#1#2{%
+ \def\cwbb@sect_name{chunk}%
+ \cwbb@section{#1}{\protect\cwbbRank{#1}#2}%
+ }
+ \def\section{%
+ \def\cwbb@sect_name{chunk}%
+ \cwbb@section{1}%
+ }
+\fi
+%%% \endprog
+
+
+%%% \sect We use the same layout for all minor sections. That layout can
+%%% be changed by ammended by defining |\CwebSect|$r$|Hook| to redefine
+%%% |\CwebSectPreSkip| and/or |\CwebSectLayout| locally. (Of couse, it may
+%%% be redefined once globally, too.) These are the values to be used for
+%%% arguments 4 and~5 of |\@startsection|, pay attention to the skip sign,
+%%% telling about indentation of the first paragraph. And don't forget
+%%% that the skip is only used for sections on ranks below
+%%% |\CwebRankNoEject|, the others start on a new page anyhow.
+
+%%% The default definition sets the section title in bold and leaves the
+%%% same space as before chunks. The first paragraph of the following
+%%% documentation has no indentation.
+
+%%% Other layout changes (indentation for heading, etc.)\ must be made by
+%%% redefining |\cwbb@section|. Or---email me, if you want to do it. Then
+%%% I might be enclined to introduce further possibilities.
+
+%%% \beginprog
+\newskip\CwebSectPreSkip
+ \CwebSectPreSkip = -\CwebChunkPreSkip
+\def\CwebSectLayout{\normalfont\bfseries}
+
+\def\cwbb@section#1{% % #2 (next token) is title
+ \csname CwebSect#1Hook\endcsname % \relax if undefined
+ \expandafter\@startsection
+ \expandafter{\cwbb@sect_name}% % category; for counter, etc.
+ {#1}% % level is rank
+ \z@ % no indentation for heading
+ \CwebSectPreSkip % skip above, maybe no next par indent
+ \medskipamount % skip below heading
+ \CwebSectLayout
+ }
+%%% \endprog
+
+
+
+
+%%% \chap Marks.
+
+%%% \begin{fixme}
+%%% Since I don't know yet how to handle marks I ignore most of them for
+%%% the time being.
+
+%%% Have to change this later.
+%%% \end{fixme}
+
+%%% \beginprog
+\let\chunkmark\@gobble
+
+\count@=2
+\@whilenum \count@<11 \do {
+ \expandafter\let \csname section\number\count@ mark\endcsname \@gobble
+ \advance \count@ by 1
+ }
+%%% \endprog
+
+
+
+
+%%% \chap Typesetting programs.
+
+%%% Program pieces come in two flavours: as argument of |\PB|, or as
+%%% material after |\B|. In the former case we can use a group for the
+%%% switch to the restricted program state, the group end will restore the
+%%% previous state again. In the latter case we use |\B| for the switch to
+%%% program state, the cross reference list or the next chunk will go to
+%%% another state. Since we have to do more for the material after |\B|,
+%%% we define this cseq later.
+
+%%% \beginprog
+\def\PB#1{%
+ \begingroup
+ \cwbb@Rprogram
+ \leavevmode
+ #1%
+ \endgroup
+ }
+%%% \endprog
+
+
+%%% \sect Note, that |\Y| cannot just be |\smallskip|, as in Plain
+%%% \cweb{}. We must assert that the current paragraph is ended before the
+%%% vertical glue is inserted, and that's not done by the \LaTeX{}
+%%% definition of |\smallskip|. In addition we add some negative penalty,
+%%% here is a good place for a page break. As the penalty value we use
+%%% half the chunk break penalty---of course a chunk start is an even
+%%% better place for a page break\,\dots
+
+%%% It might be that |\Y| is the very first token in a chunk. Then the
+%%% chunk start marker isn't set already since it is regarded as a run-in
+%%% section heading. In that case we don't set the vertical skip but
+%%% simply start the chunk with the program part.
+
+%%% \TeX{}nical note: The flag |@noskipsec| may be used to test if we're
+%%% immediately after a run-in section heading.
+
+%%% \beginprog
+\newcount\CwebProgPenalty
+ \CwebProgPenalty=\@secpenalty
+ \divide\CwebProgPenalty by 2
+\def\Y{%
+ \if@noskipsec
+ \else
+ \par
+ \penalty\CwebProgPenalty
+ \smallskip
+ \fi
+ }
+%%% \endprog
+
+
+%%% \sect Yep, let's unfold the ``official'' names of the cseqs used in
+%%% program state.
+
+%%% If we turn on the \cweave{} bindings, they might be in effect already,
+%%% we don't need to establish them again. We can test
+%%% |\cwbb@user_bindings| for this case, it will be redefined then.
+
+%%% \beginprog
+\def\cwbb@cweave_bindings{%
+ \ifx \cwbb@user_bindings\relax
+ \cwbb@rebind
+ % indentation and paragraph layout
+ \cwbb@incr_indent \1%
+ \cwbb@decr_indent \2%
+ \cwbb@expr_break \3%
+ \cwbb@backup \4%
+ \cwbb@opt_break \5%
+ \cwbb@break \6%
+ \cwbb@big_break \7%
+ \cwbb@noindent \8%
+ % C/C++ tokens
+ \CwebRel \?%
+ \CwebAddress \AND
+ \CwebComplement \CM
+ \CwebScope \DC
+ \CwebEquiv \E
+ \CwebGe \G
+ \CwebRightShift \GG
+ \CwebNe \I
+ \CwebAssign \K
+ \CwebLeftShift \LL
+ \CwebMod \MOD
+ \CwebNull \NULL
+ \CwebNot \R
+ \CwebBinOr \OR
+ \CwebMemberRef \PA
+ \CwebThis \this
+ \CwebOr \V
+ \CwebAnd \W
+ \CwebXor \XOR
+ \CwebLe \Z
+ \CwebPointer \MG
+ \CwebPointerMemberRef \MGA
+ \CwebDecr \MM
+ \CwebIncr \PP
+ % more tokens
+ \CwebId \\%
+ \CwebIdLetter \|%
+ \CwebRes \&%
+ \CwebString \.% %% ( ...Emacs...
+ \CwebStringBreak \)%
+ \CwebNumber \T
+ \CwebCombinedOp \MRL
+ % goes to TeX state
+ \CwebComment \C
+ \CwebCxxComment \SHC
+ \CwebRefName \X
+ % CWEB tokens
+ \CwebMacrosHere \ATH
+ \CwebDefine \D
+ \cwbb@format \F
+ \CwebIdCat \J
+ \CwebVerbString \vb
+ % cross reference tags
+ \cwbb@change_flag \*%
+ \CwebCRAlso \A
+ \CwebCRsAlso \As
+ \CwebCRCite \Q
+ \CwebCRsCite \Qs
+ \CwebCRUse \U
+ \CwebCRsUse \Us
+ \CwebCREt \ET
+ \CwebCRsEt \ETs
+ % finish the list
+ \stop\stop
+ \def\cwbb@user_bindings{%
+ \cwbb@restore_bindings
+ \let\cwbb@user_bindings\relax
+ }%
+ \fi
+ }
+%%% \endprog
+
+
+%%% \sect Since most of the \cweave{} bindings are simple and tedious
+%%% coding, we'll have a look at the program layout next. Between two
+%%% paragraphs there must not be any skip, the skip used in document
+%%% layout is saved in |\cwbb@save@parskip|. A few other layout
+%%% parameters from the document layout must be saved as well.
+
+%%% \beginprog
+\newskip\cwbb@save@parskip
+\newskip\cwbb@save@rightskip
+\newcount\cwbb@save@sem_sfcode
+\newcount\cwbb@save@pretolerance
+\newcount\cwbb@save@hyphenpenalty
+\newcount\cwbb@save@exhyphenpenalty
+
+\def\cwbb@save_doc_layout{%
+ \cwbb@save@parskip\parskip
+ \cwbb@save@rightskip\rightskip
+ \cwbb@save@sem_sfcode\sfcode`\;
+ \cwbb@save@pretolerance\pretolerance
+ \cwbb@save@hyphenpenalty\hyphenpenalty
+ \cwbb@save@exhyphenpenalty\exhyphenpenalty
+ }
+\def\cwbb@restore_doc_layout{%
+ \parskip\cwbb@save@parskip
+ \rightskip\cwbb@save@rightskip
+ \sfcode`\;=\cwbb@save@sem_sfcode
+ \pretolerance\cwbb@save@pretolerance
+ \hyphenpenalty\cwbb@save@hyphenpenalty
+ \exhyphenpenalty\cwbb@save@exhyphenpenalty
+ }
+%%% \endprog
+
+
+%%% \sect When |\cwbb@program_layout| is called for the very first time
+%%% we have to set up some variables. This cannot be done in advance
+%%% since they depend on values which might be changed by the user in the
+%%% preamble. This setup is done in |\cwbb@layout_init|.
+
+%%% If the program layout is already active, we must not switch it on
+%%% another time. This can be tested by the current binding of
+%%% |\cwbb@doc_layout|.
+
+%%% \beginprog
+\def\cwbb@program_layout{%
+ \ifx \cwbb@doc_layout\relax
+ \cwbb@layout_init
+ \cwbb@save_doc_layout
+ \def\cwbb@doc_layout{%
+ \cwbb@restore_doc_layout
+ \let\cwbb@doc_layout\relax
+ }%
+ % set new values
+ \parskip\z@skip
+ \rightskip\z@ plus 100\p@ minus 10\p@
+ \sfcode`\;=3000
+ \pretolerance\@M
+ \hyphenpenalty 1000 % strings can be broken this way
+ \exhyphenpenalty\@M
+ \fi
+ }
+%%% \endprog
+
+
+%%% \sect The unit of the basic indentation is stored in
+%%% |\CwebIndentUnit|. Continuation lines are indented two units further,
+%%% i.e., the initial hanging indentation is 3~units. The current hanging
+%%% indentation is kept in |\cwbb@indent|.
+
+%%% We need undiscardable items which can be used as backspaces, of one
+%%% and two units, respectively. This is done best by boxes. The
+%%% initialization of the boxes must be postponed until the user had the
+%%% chance to change |\CwebIndentUnit|, it's done in the program state
+%%% initialization.
+
+%%% \beginprog
+\newdimen\CwebIndentUnit
+ \CwebIndentUnit=1em
+\newdimen\cwbb@indent
+
+\newbox\cwbb@bak % backspace one unit
+\newbox\cwbb@bakk % backspace two units
+
+\def\cwbb@layout_init{%
+ \global\setbox\cwbb@bak \hbox to -1\CwebIndentUnit{}%
+ \global\setbox\cwbb@bakk \hbox to -2\CwebIndentUnit{}%
+ \global\let\cwbb@layout_init\relax
+ }
+%%% \endprog
+
+
+%%% \sect Now we can formulate how to start typesetting program pieces: We
+%%% switch to program state, set the initial indentation, and add the
+%%% basic indentation of the first code line. Then we might add a marker
+%%% to this program part; for hierarchic structure we want to typeset the
+%%% chunk number in the margin of the chunk's program part. That's not
+%%% really possible, 'though: definitions and format requests are also
+%%% introduced with |\B|, so the chunk number will happen to be at the
+%%% start of the definition part if one exists.
+
+%%% If the code line is the very first text to be typeset in this chunk,
+%%% we don't add the basic indentation---we're already indented from the
+%%% run-in chunk start marker. But we must not start our chunk with
+%%% |\noindent|, the marker would be typeset in the left margin then. (I
+%%% consider this as a \LaTeX{} error.) So we just emulate an empty
+%%% documentation part, the marker is now set correctly. |\B| can test for
+%%% this case: |@noskipsec| is still true then.
+
+%%% \beginprog
+\def\B{%
+ \cwbb@program
+ \cwbb@indent 3\CwebIndentUnit \hangindent\cwbb@indent
+ \ifvmode
+ \if@noskipsec
+ \indent % add an empty documentation part
+ \else
+ \noindent \kern\CwebIndentUnit
+ \fi
+ \fi
+ \CwebNumberProgramPart
+ }
+%%% \endprog
+
+
+%%% \sect The chunk number shall be added at the first program part. We
+%%% have a hook in the chunk start where we can set up
+%%% |\CwebNumberProgramPart|. It will redefine itself at first call, to
+%%% disable further output on more |\B| occurences in a chunk.
+
+%%% The chunk number should always be in the left margin. If it's in the
+%%% right margin, there would be too much horizontal space between the
+%%% code start and the actual number. (The first code line is typically
+%%% not very long.) \LaTeX{} does not allow to select the margin for
+%%% marginpars, therefore we have to typeset the marginal note `by hand'.
+%%% As we know that we're in horizontal mode when we're called, |\vadjust|
+%%% is used to create the note. The standard \LaTeX{} dimen register for
+%%% the distance between marginal notes and text matter is used, of
+%%% course.
+
+%%% Note that marginal notes may overwrite the chunk number. As it's very
+%%% unlikely that somebody issues marginal notes in program mode (that's
+%%% quite difficult and involves ingenious usage of the implementation of
+%%% this macros), I won't care for that case.
+
+%%% \begin{fixme}
+%%% The baseline of the marginal note shall be aligned to the baseline
+%%% of the preceding line. That does not happen by default. Currently, I
+%%% assume that the preceding line has a depth of appropriately the
+%%% depth of a~`g'. Experiments showed that this gives good results for
+%%% most \cweb{} documents. But nevertheless one should determine the
+%%% exact depth of the preceding line, to know how much |box0| should be
+%%% raised. If anybody knows how this can be done, please tell me. (I
+%%% know about the route over the output routine, implementing an own
+%%% marginal note category, but this seems too much effort.)
+%%% \end{fixme}
+
+%%% For flat structure, we don't add any program part marker and we
+%%% don't need to initialize it.
+
+%%% Enrique Mel\'endez (\texttt{ema@csn.es}) introduced some code to insert
+%%% hyperlinks.
+%%% \beginprog
+\ifcase \cweb@structure
+ %% hierarchic
+ \def\cwbb@marginal_chunkno{%
+ \vadjust{%
+ \setbox\z@ \hbox to \z@{%
+ \hss \vphantom{g}%
+ \hypertarget{_hyperchunk_\thechunk}{%
+ \small \thechunk
+ }%
+ \hskip \marginparsep
+ }%
+ \vbox to \z@{%
+ \hsize\z@
+ \vss
+ \noindent \raise \dp\z@ \box\z@
+ }%
+ }%
+ }
+ \def\cwbb@init_print_chunk{%
+ \def\CwebNumberProgramPart{%
+ %\hypertarget{_hyperchunk_\thechunk}{%
+ \cwbb@marginal_chunkno%}
+ \let\CwebNumberProgramPart\relax
+ }%
+ }
+ \or
+ %% flat
+ \let\cwbb@init_print_chunk\relax
+ \let\CwebNumberProgramPart\relax
+\fi
+%%% \endprog
+
+
+%%% \sect If a statement is finished, a new paragraph with the basic
+%%% indentation has to be started.
+
+%%% An optional statement break is implemented by a low penalty which
+%%% will be selected if the line has to be broken. We assume that the
+%%% hanging indentation of the new line is already set correctly, and
+%%% have to backup two units to get the basic indentation. It might be
+%%% that the line break is not chosen by \TeX{}, we compensate the
+%%% backspace for this case. This compensation is discarded at the start
+%%% of a new line.
+
+%%% \beginprog
+\def\cwbb@break{% % forced break, between statements
+ \ifmmode\else
+ \endgraf % in LaTeX it isn't sure what \par is really...
+ \noindent
+ \hangindent\cwbb@indent \kern\cwbb@indent
+ \copy\cwbb@bakk % go back to basic indentation
+ \ignorespaces
+ \fi
+ }
+\def\cwbb@opt_break{% % optional break between statements
+ \hfil \penalty\m@ne
+ \hfilneg \kern .5em \kern 2\CwebIndentUnit % discarded on line break
+ \copy\cwbb@bakk
+ \ignorespaces
+ }
+\def\cwbb@big_break{% % forced break and a little extra space
+ \Y
+ \cwbb@break
+ }
+\def\cwbb@expr_break#1{% % break with penalty #1 * 10
+ \hfil \penalty#10
+ \hfilneg % discarded on line break
+ }
+%%% \endprog
+
+
+%%% \sect When we increment the indentation, we must not forget to set
+%%% the hanging indentation immediately since |\cwbb@opt_break| relies on
+%%% the new value. If a continuation line is needed it will also be
+%%% indented one unit more, which is ok since it should be distinguishable
+%%% from the next line.
+%%% %
+%%% \begin{fixme}
+%%% Shouldn't the hanging indentation be set anew at the end of
+%%% |\cwbb@decr_indent| as well?
+%%% \end{fixme}
+
+%%% \beginprog
+\def\cwbb@incr_indent{%
+ \global\advance\cwbb@indent\CwebIndentUnit
+ \hangindent\cwbb@indent
+ }
+\def\cwbb@decr_indent{\global\advance\cwbb@indent -\CwebIndentUnit}
+\def\cwbb@backup{\copy\cwbb@bak}
+\def\cwbb@noindent{% % no indentation
+ \hskip -\cwbb@indent \hskip 2\CwebIndentUnit
+ }
+%%% \endprog
+
+
+
+
+%%% \chap Program (C or \C++) tokens.
+
+%%% Since the user might want to change the (somewhat unusual) way some
+%%% of the operators are typeset, we supply names for them.
+
+%%% \beginprog
+\let\CwebAnd=\land % logical and, &&
+\let\CwebEquiv=\equiv % equiv sign, for ==
+\let\CwebGe=\ge % greater or equal
+\let\CwebLe=\le % less or equal
+\let\CwebNe=\ne % unequal, !=
+\let\CwebNull=\Lambda % NULL pointer
+\let\CwebNot=\lnot % logical not, !
+\let\CwebOr=\lor % logical or, ||
+\let\CwebXor=\oplus % bitwise exclusive or, ^
+%%% \endprog
+
+
+%%% \sect Some symbols have to be shifted around, to save computation time
+%%% we put them in boxes.
+
+%%% \begin{fixme}
+%%% It's not sure if the following symbols still look good in other font
+%%% families than Computer Modern. The movements might need to get
+%%% adapted when more experience is available. They were chosen from
+%%% Plain \cweb{}, where these were explicit movements measured in
+%%% points. I changed the dimension to quads, to achieve at least the
+%%% support for different sizes in the Computer Modern family.
+%%% \end{fixme}
+
+%%% \TeX{}nical note: The pointer symbol must not be declared as a math
+%%% symbol (e.g., with |\DeclareMathSymbol|). Then \TeX{} would insert an
+%%% italic correction behind it, according to rule~17 from appendix~G.
+%%% (Please send email if you know of an easy way to prevent that
+%%% addition.) So I use the symbol as an accent, but then I have to supply
+%%% a nucleus for this math list. That nucleus also determines the total
+%%% width of this construct. As the vector accent has a width of
+%%% approximately 5\,pt in |cmmi10|, I'm going to use 0.5\,em. (That
+%%% heuristic is as good as any other I can think of.)
+
+%%% \beginprog
+%% pointer to struct component (`->'), use symbol of \vec accent
+\newbox\cwbb@pointer
+\setbox\cwbb@pointer=\hbox{%
+ \kern -.2em
+ \lower .3em \hbox{$\vec{\kern .5em}$}%
+ \kern .1em
+ }
+
+\newbox\cwbb@decr % decrement, --
+\setbox\cwbb@decr=\hbox{%
+ \kern .05em
+ \raise .1em \hbox{$\scriptstyle {-}\kern -.1em{-}$}%
+ \kern .05em
+ }
+\newbox\cwbb@incr % increment, ++
+\setbox\cwbb@incr=\hbox{%
+ \kern .05em
+ \raise .1em \hbox{$\scriptstyle {+}\kern -.1em{+}$}%
+ \kern .05em
+ }
+%%% \endprog
+
+
+%%% \sect Although the following symbols are typeset like an ``ordinary
+%%% \C++ programmer'' would expect them, we provide own module names
+%%% nevertheless. They can now be changed as well, i.e., orthogonality is
+%%% enhanced. (And we can use |\cwbb@rebind| for assigning them to their
+%%% names while we switch to program state\,\dots).
+
+%%% Note: The comment at |\CwebMod| says ``modulo/remainder'', as this is
+%%% not defined by the C standard, i.e., implementation-dependent.
+
+%%% \beginprog
+\mathchardef\CwebAddress="2026 % `&', as binary op
+\let\CwebAssign== % assignment
+\let\CwebBinOr=\mid % binary or
+\def\CwebComplement{{\sim}} % `~', as ordinary symbol
+\def\CwebDecr{\copy\cwbb@decr} % decrement
+\def\CwebIncr{\copy\cwbb@incr} % increment
+\let\CwebLeftShift=\ll % left shift, <<
+\def\CwebMod{\mathbin{\hbox{\footnotesize\rm\%}}} % modulo/remainder, %
+\def\CwebMemberRef{\mathbin{.*}} % ptr to member (on object)
+\def\CwebPointer{\copy\cwbb@pointer}
+\def\CwebPointerMemberRef{\mathbin{\CwebPointer*}} % ptr to member (on ptr)
+\def\CwebRel{\mathrel?} % relation operator
+\let\CwebRightShift=\gg % right shift, >>
+\def\CwebScope{\kern.1em{::}\kern.1em} % scope resolution
+
+\def\CwebThis{\CwebRes{this}} % reserved identifier `this'
+%%% \endprog
+
+
+%%% \sect The special identifier |\TeX| remains. In math mode it shall be
+%%% the identifier, in other modes the usual logo. We use the definition
+%%% supplied by DEK (or \textsc{Silvio Levy}?)\ from Plain \cweb{}.
+
+%%% \beginprog
+\def\TeX{%
+ {%
+ \ifmmode\it\fi
+ \mbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125emX}%
+ }}
+%%% \endprog
+
+
+%%% \sect Some tokens don't have constant names, the name is supplied as
+%%% the argument.
+
+%%% Identifiers are typeset in italics, reserved words and type names in
+%%% boldface, and strings in typewriter. For an underscore in the bold
+%%% words we use a line that's 50\,\% thicker as the usual line thickness.
+%%% -- But what is the usual line thickness. As Knuth uses 0.4\,pt for a
+%%% 10\,pt Computer Modern font, we'll use 0.06\,em for a CM font in an
+%%% arbitrary size. If that line thickness is still OK for other fonts is
+%%% doubtful, as it should fit to the stem width. (CM is a rather light
+%%% font, after all.) But since there is no font dimension that gives a
+%%% hint to an appropriate line thickness, it's our best try.
+
+%%% \beginprog
+\def\CwebCombinedOp#1{\mathrel{\let\K==#1}} % e.g., += operator
+\def\CwebId#1{\hbox{\it#1\/\kern.05em}} % identifier, more than one char
+\def\CwebIdLetter#1{\hbox{$#1$}} % identifier, one letter
+\def\CwebRes#1{% % reserverd words and type names
+ \hbox{\bf
+ \def\_{\kern.04em\vbox{\hrule width.3em height.06em}\kern.08em}%
+ #1\/\kern .05em
+ }%
+ }
+%%% \endprog
+
+
+%%% \sect In Plain \cweb{} strings are typeset in the font |cmtex10|,
+%%% which is a typewriter font with extended ASCII characters. This font
+%%% does not have the usual accents and can therefore not used for
+%%% typesetting national characters. (Very often they are input in some
+%%% 8-bit encoding, the respective character code is made active and is
+%%% substituted by a cseq which expands to the correct glyph. Of course,
+%%% there are better ways, but that's the reality we have to cope with.)
+%%% Instead of this special font we use the standard typewriter font.
+%%% This has the further advantage that |cmtex10| may not be introduced
+%%% to NFSS\@.
+
+%%% \beginprog
+\def\CwebString{%
+ \hbox \bgroup
+ \tt
+ \cwbb@string_setup
+ \cwbb@string
+ }
+\def\cwbb@string#1{%
+ #1\kern .05em
+ \egroup
+ }
+%%% \endprog
+
+
+%%% \sect Within strings certain cseqs have a special meaning; this is
+%%% introduced by |\cwbb@string_setup|. The cseqs within strings are
+%%% mostly special \TeX{} characters that are to be typeset by cseqs with
+%%% the same name.
+
+%%% But a problem remains: active characters. They will still expand, and
+%%% will mess up the string visualization. This is a particular problem
+%%% with |german.sty| where the double quote is active. (Of course, that's
+%%% a problem -- I'm German. :--) When one typesets strings, a double
+%%% quote shall be typeset as double quotes, and must not expand to the
+%%% special meaning. Remember that double quotes happen to appear quite
+%%% often in strings. As the string argument is already tokenized, one has
+%%% to redefine the binding of $(\textit{\textup{symbol}}\ \textbf{.}\
+%%% |#\"|)$.
+
+%%% \begin{fixme}
+%%% Perhaps one might use a loop over all characters except the braces,
+%%% and set their catcode to other. That would give us enough security.
+
+%%% For now, we handle only the double quote.
+%%% \end{fixme}
+
+%%% Every once in a while we have discretionary breaks in a string,
+%%% denoted by |\CwebStringBreak|. This break is shown with the C
+%%% convention of escaped newlines.
+
+%%% \beginprog
+\def\cwbb@string_setup{%
+ \chardef\ =`\ % % <-- two spaces !
+ \chardef\&=`\&
+ \chardef\\=`\\
+ \chardef\^=`\^
+ \chardef\_=`\_
+ \chardef\{=`\{
+ \chardef\}=`\}
+ \chardef\~=`\~
+ \catcode`\"=\CatOther
+ }
+
+\def\CwebStringBreak{\discretionary{\hbox{\tt\char`\\}}{}{}}
+%%% \endprog
+
+
+%%% \sect Numbers are typeset in different ways. We use the definition of
+%%% Plain \cweb{}.
+%%% %
+%%% \begin{fixme}
+%%% Should add a specification of the possible input and an explanation
+%%% of the macros below. In particular, that the closing brace after
+%%% |\aftergroup| is used much later is probably not grokked by most
+%%% \TeX{} programmers.
+%%% \end{fixme}
+
+%%% \beginprog
+\def\cwbb@oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}
+\def\cwbb@hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}}
+
+\def\CwebNumber#1{% % octal, hex, or decimal constant
+ \hbox{%
+ $%
+ \def\?{\kern.2em}%
+ \def\$##1{\egroup\sb{\,\rm##1}\bgroup}% suffix to constant
+ \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
+ \let\~\cwbb@oct \let\^\cwbb@hex
+ {#1}%
+ $}%
+ }
+%%% \endprog
+
+
+%%% \sect Comments are typeset in \TeX{} state. We add a hook, the user
+%%% shall be able to change the layout (e.g., he might want another font).
+%%% %
+%%% \begin{fixme}
+%%% Currently \C++ comments are typeset like C comments. This is
+%%% horrible in usual circumstances, i.e., when complete blocks of text
+%%% are prefixed with |//|. We should simply catenate all these text and
+%%% typeset it as one paragraph, each line prefixed by |//|. But then we
+%%% have to implement an |\everyline| first, and since that's not so
+%%% easy we postpone it\,\dots
+%%% \end{fixme}
+%%% %
+%%% In front of a C comment there is an optional stmt break, with 2\,quad
+%%% in front if the line is not broken and 1.5\,quad if the line is broken.
+
+%%% \beginprog
+\def\CwebComment#1{%
+ \5% % 0.5em will be discarded on line break
+ \hskip 1.5em
+ $/\ast\,$%
+ {\cwbb@tex
+ \CwebCommentHook
+ #1%
+ }%
+ $\,\ast/$%
+ }
+\let\CwebCommentHook\relax
+\let\CwebCxxComment\CwebComment
+%%% \endprog
+
+
+
+
+
+%%% \chap \cweb{} tokens.
+
+%%% We distinguish three categories of \cweb{} tokens: (1) Those which
+%%% output constant text, (2) those which have attributes to be displayed
+%%% in a special way, and (3) those which start a new structure element,
+%%% namely |@d| and~|@f|. Let's consider them in this order.
+
+
+%%% \sect \cweb{} tokens which expand in a constant string are the
+%%% identifier catenation operator~(`|@&|') and the macro placement
+%%% directive~(`|@h|').
+
+%%% \beginprog
+\def\CwebIdCat{\CwebString{@\&}}
+\def\CwebMacrosHere{%
+ \begingroup
+ \def\CwebRefNumber##1{}%
+ \CwebRefName :Preprocessor definitions\X
+ \endgroup
+ }
+%%% \endprog
+
+
+%%% \sect Verbatim program strings, i.e., strings passed verbatim by
+%%% \ctangle{}~(`|@=|') are typeset like normal strings, but within a box.
+%%% We use 2\,pt as the separating distance, this is set locally.
+
+%%% \beginprog
+\def\CwebVerbString#1{{\fboxsep\tw@\p@ \fbox{\CwebString{#1}}}}
+%%% \endprog
+
+
+%%% \sect The refinement names are typeset in angles, this has a long
+%%% tradition. We burry the typesetting of the chunk number (which is
+%%% the first parameter) in a macro call; the user may change this to
+%%% achieve special effects.
+%%% %
+%%% \begin{fixme}
+%%% One could think about handling special values of the chunk numbers
+%%% differently. E.g., an empty argument is not typeset at all, a~0
+%%% triggers a marginal note about a missing definition, etc.
+%%% \end{fixme}
+
+%%% A refinement name may be typeset both in math and horizontal mode.
+%%% The name itself is typeset in horizontal mode, of course; for the
+%%% angles we need math mode. Therefore we assert at the start of the
+%%% macro that we're not in math mode any more. At the end we switch back
+%%% to math mode if we've started in it. This conditional switch from and
+%%% back to math mode is done by |\cwbb@toggle_text|.
+
+%%% \TeX{}nical note: If we're in math mode |\cwbb@toggle_text| must be
+%%% defined globally, as it will turn off math mode and the definition
+%%% would be un-made then. The second invocation of |\cwbb@toggle_text|
+%%% would be undefined then.
+
+%%% A refinement may also consist of the file name the expansion of this
+%%% refinement shall be written to.
+%%% %
+%%% \label{sec:refname-dot}
+%%% %
+%%% This file name is tagged with |\.|, it shall be typeset like a string.
+%%% But the user shall be able to use the dot accent in the refinement
+%%% name as well. We check if the text consists solely of the tag and its
+%%% argument; in this case we substitute |\.| with |\CwebString|.
+%%% Otherwise we leave it as it is. Then a refinement name may not
+%%% consist of a single dot-accented expression---well, that's highly
+%%% unlikely. (Nevertheless I'll document it in the user's manual\,\dots)
+
+%%% \begin{fixme}
+%%% One should be able to use |\EnsureMath| here. But the refinement
+%%% name must not be set in math mode and must not be set in an hbox;
+%%% the latter would prevent line breaks.
+%%% \end{fixme}
+%%% Enrique Mel\'endez (\texttt{ema@csn.es}) added the macro |\cweb@num@lnk|
+%%% include hyperlinks into the cross references.
+
+%%% \beginprog
+\def\CwebRefName#1:#2\X{%
+ \ifmmode \gdef\cwbb@toggle_text{\null$\null}%
+ \else \let\cwbb@toggle_text\relax
+ \fi
+ \cwbb@toggle_text
+ $\langle\,${\cwbb@tex \cwbb@check_dot{#2}\CwebRefNumber{#1}}$\,\rangle$%
+ %}
+ \cwbb@toggle_text
+ }
+\def\CwebRefNumber#1{%
+ {\reset@font \footnotesize \kern .5em\cweb@num@lnk#1, |}%
+ }
+%%% \endprog
+
+%%% \sect This is the implementation of |\cweb@num@lnk|. It essentially
+%%% processes the incoming list, takink care of whether one element of the
+%%% list is processed with the macro |\[|. It borrows the phylosophy from
+%%% |\check_dot| below in that we inhibit the behaviour of |\[| for a while,
+%%% so that we can test its presence. Then we proeceed differently when it is
+%%% present. I (\texttt{ema@csn.es}) have not a lot of experience in list
+%%% processing in \LaTeX. I have done my best, using only two macros, the
+%%% already named |\def\cweb@num@lnk| and a wrapper for it,
+%%% |\def\cweb@@num@lnk|. I need the strange termination code (\texttt{|}).
+
+%%% \beginprog
+\newif\if@lbracket@
+\def\hyper@i\[#1]{\hyperlink{_hyperchunk_#1}{\[#1]}}
+\def\cweb@num@lnk #1, #2|{%
+ \begingroup
+ \def\[##1]{}%
+ \expandafter\def\expandafter\next\expandafter{#1}%
+ \ifx\next\empty
+ \global\@lbracket@true
+ \else
+ \global\@lbracket@false
+ \fi
+ \endgroup
+ \if@lbracket@%
+ \hyper@i#1%
+ \else
+ \hyperlink{_hyperchunk_#1}{#1}%
+ \fi
+ \@lbracket@false
+ \edef\next{#2}%
+ \ifx\next\empty
+ \else
+ { } % Yep, a space by itself.
+ \cweb@@num@lnk #2|%
+ \fi
+}
+\def\cweb@@num@lnk #1, |{\cweb@num@lnk#1, |}
+%%% \endprog
+
+
+%%% \sect The next macro, |\cwbb@check_dot| is a hassle to implement. We
+%%% must check if it's argument consists solely of a `|\.|'~tag, together
+%%% with the argument to this tag. Then the `|\.|'-argument shall be
+%%% typeset like a string, |\.| itself must be ignored.
+
+%%% The check for |\.| must not evaluate the parameter. Especially |\PB|
+%%% must not be evaluated within, it would lead to havoc with the
+%%% redefinition of all bindings, etc. (At least that's the empirical
+%%% result---it happened; although I don't know where the problems are.
+%%% Anyhow, it wasn't in the specs of the rebinding process.) All other
+%%% cseqs which shouldn't be used in moving arguments may cause problems
+%%% here, too. Note that |\protect| is no solution here, the user often is
+%%% not aware of the presence of \cweave{}-generated tags. As an example,
+%%% consider the refinement \verb"@< local variables of |foo| @>|" which
+%%% will lead to a call with the argument `|local variables of \PB{\\{foo}}|'.
+%%% |\\| must not be evaluated here.
+
+%%% I use an approach where I hope that it will work---but to be honest,
+%%% I'm not sure. I want to define a macro |\next| which shall have an
+%%% empty expansion iff |#1| was a `|\.|'~tag with its argument. Empty
+%%% refinement names are not allowed so we can assume that |#1| consists
+%%% of at least one token. I evaluate the first token of |#1| before the
+%%% |\def| is done. With an appropriate binding a |\.| will disappear,
+%%% perhaps leaving an empty token list. I also take care that |\PB| is
+%%% not evaluated then, by temporary rebinding it to |\relax|. Thereby I
+%%% have taken care for all cseqs \cweave{} might have introduced at the
+%%% very front of |#1|. Other cseqs are user-tags. If they cause
+%%% problems, the user might circumstance them by adding |\protect|.
+
+%%% \beginprog
+\def\cwbb@check_dot#1{%
+ \begingroup
+ \let\.\@gobble
+ \let\PB\relax
+ \expandafter\def \expandafter\next \expandafter{#1}%
+ \ifx \next\empty
+ \gdef\next##1{\CwebString}%
+ \else
+ \global\let\next\relax
+ \fi
+ \endgroup
+ \next #1%
+ }
+%%% \endprog
+
+
+%%% \sect \cweb{} macro definitions (done by~|@d|) and format directives are
+%%% basically program text. When they are started we are already in
+%%% program state, i.e., |\B| has appeared in front of it. But since we have
+%%% an introductionary identifier (either |#define| or |format|) to set at
+%%% the very front we increase the indentation by three units.
+
+%%% The output of format directives may be suppressed. Then we have to
+%%% gather both identifiers that will appear after |\F|. Both of them
+%%% consist of one group-token (a cseq and the identifier name), after
+%%% each identifier one other token separates them. I.e., we have to
+%%% gobble six group-tokens. As the very last token is |\par| if a format
+%%% directive follows directly on another one, the definition must be
+%%% long.
+
+%%% \TeX{}nical note: |\cwbb@format| must expand to |\CwebFormat|, not to
+%%% its expansion. Otherwise a redefinition of |\CwebFormat| in a package
+%%% would not be used.
+
+%%% \beginprog
+\def\CwebDefine{\cwbb@macro{\#define}}
+\def\CwebFormat{\cwbb@macro{format}}
+\if@cweb@suppress@format@
+ \long\def\cwbb@format#1#2#3#4#5#6{}
+\else
+ \def\cwbb@format{\CwebFormat}
+\fi
+
+\def\cwbb@macro#1{%
+ \global\advance\cwbb@indent \tw@\CwebIndentUnit
+ \cwbb@incr_indent
+ \CwebRes{#1 }% % <-- blank!
+ }
+%%% \endprog
+
+
+
+
+%%% \chap Refinement cross references and changes.
+
+%%% At the end of chunks with refinements, \cweave{} may output cross
+%%% reference information: In which chunks additional definitions for
+%%% this refinement are found, where this refinement is used, and where it
+%%% is cited. This cross reference information is always introduced by a
+%%% tag followed by a non-empty list of chunk numbers. Different tags
+%%% are used for lists with only one element and for lists with more than
+%%% one element, this way the introductionary text may be adapted.
+
+%%% Within a list of $n$~chunk numbers the first $n-1$~numbers are
+%%% separated by commas with one following blank. The last two numbers
+%%% are separated by |\ET| if~$n=2$, and by |\ETs| if~$n>2$. If a chunk
+%%% is changed by the changefile, a changeflag~(`|\*|') is appended to
+%%% its number. The list is eventually terminated by a full stop.
+
+
+%%% \sect We separate the cross reference information by a smallskip from
+%%% the refinement or from a previous cross reference information. The
+%%% information itself is typeset in a smaller font, as it is auxilliary,
+%%% inserted stuff. The number list has a hanging indentation of
+%%% |\CwebNumberListHangindent|. But beware: This isn't a dimension
+%%% register, it's a macro. This way one can use ems as dimensions.
+
+%%% The actual size change is represented by a macro. We will redefine it
+%%% when we need an other size, e.g., in the lists at the end of the
+%%% document.
+
+%%% We must assert that we're in CR state while we set a cross reference.
+
+%%% The first parameter of a cross reference information unit is the
+%%% introductionary text, the second is the number list. The parameters
+%%% must be evaluated in a group---local parameter changes therein must
+%%% not influence the environment.
+
+%%% Enrique Mel\'endez (\texttt{ema@csn.es}) included some code to handle
+%%% putting in hyperlinks. In the case of only one item, a single
+%%% |\hyperlink| has been included. The processing of several
+%%% cross-references is somewhat more difficult. This amounts to inhibiting
+%%% the effect of |\ET| and |\ETs| so that the list can be processed
+%%% properly, and calling the macro |\cweb@cr@lnk| to process it. The
+%%% appropriate end-list conjunction will be added there.
+
+%%% \beginprog
+\def\CwebNumberListHangindent{2em}
+\let\CwebCRSize\footnotesize
+\def\CwebCrossRef#1#2.{%
+ \par\smallskip
+ \cwbb@CR
+ \begingroup
+ \reset@font \CwebCRSize
+ \noindent \hangindent\CwebNumberListHangindent\relax
+ #1~\hyperlink{_hypersect_#2}{#2}.\par
+ %#1~\hyperlink{_hyperchunk_#2}{#2}.\par
+ \endgroup
+ }
+\def\CwebCrossRefs#1#2.{%
+ \par\smallskip
+ \cwbb@CR
+ \begingroup
+ \reset@font \CwebCRSize
+ \noindent \hangindent\CwebNumberListHangindent\relax
+ \let\save@et\ET%
+ \let\save@ets\ETs
+ \def\ET{, }%
+ \let\ETs\ET%
+ \edef\@cr@lst{#2}%
+ \let\LastList@Conjunction\save@et
+ #1~\expandafter\cweb@cr@lnk\@cr@lst, ]\par
+ \endgroup
+ }
+%%% \endprog
+
+%%% \sect The cross references are added here for the case of a list of them.
+%%% We test whether we are at the last point of the list, and then add the
+%%% adequate conjunction, which is updated in the macro |\cweb@@cr@lnk|, which
+%%% takes care of the case of there being more than two elements. The
+%%% processing of the list goes along the same lines as |\cweb@num@lnk|.
+
+%%% \beginprog
+\def\cweb@cr@lnk #1, #2, #3]{%
+ \hyperlink{_hyperchunk_#1}{#1}%
+ \edef\next{#3}%
+ \ifx\next\empty
+ \LastList@Conjunction\hyperlink{_hyperchunk_#2}{#2}%
+ \else
+ , \hyperlink{_hyperchunk_#2}{#2}%
+ \cweb@@cr@lnk#3]%
+ \fi
+}
+\def\cweb@@cr@lnk #1, #2]{%
+ \let\LastList@Conjunction\save@ets
+ \edef\next{#2}%
+ \ifx\next\empty
+ \LastList@Conjunction\hyperlink{_hyperchunk_#1}{#1}%
+ \else
+ , \cweb@cr@lnk#1, #2]%
+ \fi
+}
+%%% \endprog
+
+
+%%% \sect Well, let's define all introducing tags, which in fact start the
+%%% cross reference information unit. The number list is gathered by
+%%% |\CwebCrossRef|.
+
+%%% \beginprog
+\def\CwebCRAlso{\CwebCrossRef{See also chunk}}
+\def\CwebCRsAlso{\CwebCrossRefs{See also chunks}}
+
+\def\CwebCRCite{\CwebCrossRef{This code is cited in chunk}}
+\def\CwebCRsCite{\CwebCrossRefs{This code is cited in chunks}}
+
+\def\CwebCRUse{\CwebCrossRef{This code is used in chunk}}
+\def\CwebCRsUse{\CwebCrossRefs{This code is used in chunks}}
+
+\def\CwebCREt{ and~}
+\def\CwebCRsEt{, and~}
+%%% \endprog
+
+
+
+
+%%% \chap Bells and whistles.
+
+%%% \begin{fixme}
+%%% Just copied from Plain \cweb{}. It doesn't work
+%%% anyhow---|\char"|\<xy> usually doesn't typeset the correct
+%%% character. That's because this character is most probably an active
+%%% character; at least that's typical for the way \TeX{} systems are
+%%% used in Europe. I have to think about the implementation.
+%%% \end{fixme}
+
+%%% \beginprog
+\def\ATL{\par\noindent\bgroup\catcode`\_=12 \postATL} % print @l in limbo
+\def\postATL#1 #2 {\bf letter \\{\uppercase{\char"#1}}
+ tangles as \tentex "#2"\egroup\par}
+\def\noATL#1 #2 {}
+\def\noatl{\let\ATL=\noATL} % suppress output from @l
+%%% \endprog
+
+
+
+%%% \chap The end.
+
+%%% Well, after all we're finished with this module
+
+%%% \beginprog
+\endinput
+%%% \endprog
+
+
+%%%
+%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%% \vskip \PltxPreSectSkip
+
+%%% \rcsLogIntro{After the actual revision log of this module, we give an
+%%% extract of log messages of the \cls{cweb} class. This module was
+%%% extracted from revision~2.8 of that class, we present to you the
+%%% log entries that concern the code of the new module.}
+
+%%% \begin{rcslog}
+%%% $StyleLog: cwebbase.doc,v $
+%%% \Revision 1.4 1995/11/07 17:55:19 schrod
+%%% \LaTeX{} \cweb{} should work at least with the last two \LaTeX{}
+%%% versions; make it work with the previous-to-last one, version
+%%% \mbox{$\langle$1994/12/01$\rangle$}. For that, one has to install the
+%%% \mbox{$\langle$1995/06/01$\rangle$} (non-outer) definition of
+%%% |\newif|, and |\hb@xt@| must not be used.\\
+%%% Problem reported by Laurent Desnogues
+%%% \path|<laurent.desnogues@aiguemarine.unice.fr>| and somebody else (XXX
+%%% -- add name).
+
+%%% \Revision 1.3 1995/11/07 14:13:12 schrod
+%%% Reset section numbers when higher-level section begins.\\
+%%% Error reported by Bronne Louis \path|<bronne@montefiore.ulg.ac.be>|.
+
+%%% \Revision 1.2 1995/11/06 10:58:47 schrod
+%%% Support active double quotes in strings. That happens when
+%%% |german.sty| is used. Problems with other active characters may still
+%%% appear.
+
+%%% \Revision 1.1 1995/09/12 23:02:22 schrod
+%%% Moved all code that does the actual typesetting of \cweave{} tags and
+%%% is therefore also needed for a |cweb| environment. It's now an own
+%%% module named \pkg{cwebbase}.
+
+%%% Chunk markers and chunk marginal numbers don't hang below the
+%%% baseline any more.
+
+
+%%% \item[] \noindent\hrulefill\break
+%%% \textbf{Extract of the revision log for |cweb.doc|:}
+
+%%% \vskip 2ex
+
+%%% \Revision 2.5 1995/08/29 02:07:26 schrod
+%%% Discard dependencies on 10\,pt fonts.
+
+%%% Support suppression of format directives.
+
+%%% \Revision 2.4 1995/08/27 19:31:43 schrod
+%%% Make configuration of change flag easier.
+
+%%% Put section title of changed chunks list in marks, and tell the user
+%%% that it got typeset.
+
+%%% \Revision 2.3 1995/08/27 17:24:46 schrod
+%%% Make usage of baseclass with chapters work.
+
+%%% \Revision 2.2 1995/08/27 13:26:22 schrod
+%%% Add possibility to suppress change hints.
+
+%%% \Revision 2.1 1995/08/25 19:11:18 schrod
+%%% Hierarchic structures are supported now, in addition to the flat
+%%% structure of the beta-test version. One can choose with an option. For
+%%% that step, the terminology was cleaned up, too: Chunks are not named
+%%% sections any more. (That change involved reimplementation of almost
+%%% all the structure and toc stuff.)
+
+%%% The chunk number supplied by \cweave{} is used now, not some computed
+%%% number. Change flags are printed, too.
+
+%%% One can suppress output of unchanged sections.
+
+%%% \Revision 1.12 1993/08/10 14:15:43 schrod
+%%% New page on main section only if group level $<$ |\cwebSecNoEject|.
+%%% Default for the latter is 3.
+
+%%% \Revision 1.11 1993/08/10 11:21:07 schrod
+%%% Reference to section number does not render a period after the
+%%% number any more.
+
+%%% \Revision 1.10 1993/08/09 20:08:20 schrod
+%%% |\cweb@cweave_bindings| is now a no-op if \cweave{} bindings are in
+%%% effect already.\\
+%%% (Problem reported by Michael M\"uller \path|<mimu@mpi-sb.mpg.de>|.)
+
+%%% \Revision 1.9 1993/08/09 18:05:28 schrod
+%%% Left shift operator wasn't defined correctly.\\
+%%% (Problem reported by Michael M\"uller \path|<mimu@mpi-sb.mpg.de>|.)
+
+%%% \Revision 1.6 1993/06/15 08:49:23 schrod
+%%% |\cweb@check_dot| must not evaluate its argument in an |\edef|, this
+%%% causes problems if a |\PB| is within. Now I try hard not to evaluate any
+%%% tokens outside of my control.
+
+%%% Can use |\@defpar| for an empty line in |\cweb@has_entries|, don't
+%%% need an own macro.
+
+%%% \Revision 1.4 1993/06/14 15:54:18 schrod
+%%% Add FSA diagram about processing states. CR state is also switched
+%%% to from \TeX{} state (that happens with |\ch| at the document end).
+
+%%% \Revision 1.3 1993/05/13 17:51:21 schrod
+%%% Refinements may also be filenames (`|@(|'). Then the complete name
+%%% consists of a |\.| macro call, which is handled now.\\
+%%% (Problem reported by Michael M\"uller \path|<mimu@mpi-sb.mpg.de>|.)
+
+%%% Made the detection of `|@.|' index entries more robust.
+
+%%% \Revision 1.2 1993/05/12 18:28:59 schrod
+%%% Adapted to recent changes of \cweave{} (of April 93):
+
+%%% Main sections have a group level, represented in the table of
+%%% contents. This changed the complete implementation of section tags.
+
+%%% New C token cseqs: |\Z| and |\MRL|, implemented as |\CwebLe| and
+%%% |\CwebCombinedOp|.
+
+%%% \Revision 1.1 1993/04/09 15:00:37 schrod
+%%% Initial revision
+
+%%% \end{rcslog}
+
+
+
+%%% \end{document}
+
+
+%%%
+%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Local Variables:
+%%% mode: LaTeX
+%%% TeX-brace-indent-level: 4
+%%% indent-tabs-mode: t
+%%% TeX-auto-untabify: nil
+%%% TeX-auto-regexp-list: LaTeX-auto-regexp-list
+%%% compile-command: "make cwebbase.tex"
+%%% End:
diff --git a/macros/latex/contrib/cweb/contrib/cweb-hy/cweb-hy.cls b/macros/latex/contrib/cweb/contrib/cweb-hy/cweb-hy.cls
new file mode 100644
index 0000000000..e1ca54752a
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/cweb-hy/cweb-hy.cls
@@ -0,0 +1,1538 @@
+% $StyleId: cweb.doc,v 3.6 1995/11/30 15:44:53 schrod Exp $
+%----------------------------------------------------------------------
+% Written by Joachim Schrod <schrod@iti.informatik.th-darmstadt.de>.
+% Copyright conditions see below (GPL).
+% Modified by Enrique Meléndez <ema@csn.es> to support hyperlinks and to allow
+% it to be included in other classes documnts.
+
+%
+% LaTeX class cweb
+% support for LaTeX markup in CWEB sources
+%
+% [LaTeX in MAKEPROG]
+% (history at end)
+
+% If you have received this style file without the user manual (in the
+% file cweb-user.dvi or the respective LaTeX file), it's incomplete and
+% near to useless. If it was given to you as something that you shall
+% use as an author -- complain bitterly to your provider. You need the
+% documentation and you have a right on it! (Below you can find info
+% where to get the reference version.)
+
+
+
+
+%%%%
+%%%%
+%%%% These TeX macros were documented with the documentation system
+%%%% MAKEPROG and automatically converted to the current form.
+%%%% If you have MAKEPROG available you may transform it back to
+%%%% the original input: Remove every occurence of three percents
+%%%% and one optional blank from the beginning of a line and remove
+%%%% every line which starts with four percents. The following lex
+%%%% program will do this:
+%%%%
+%%%% %%
+%%%%
+%%%% ^%%%\ ? ;
+%%%% ^%%%%.*\n ;
+%%%%
+%%%% If you just want to print the documentation you may fetch
+%%%% the archive print-makeprog.tar.Z from ftp.th-darmstadt.de (directory
+%%%% pub/tex/latex). It contains *all* used styles -- but beware, they
+%%%% may not be in a documented form...
+%%%%
+%%%%
+%%% \documentclass{progltx}
+
+%%% \usepackage{cweb-doc} % document-specific markup
+%%% \usepackage{fullpage}
+
+
+%%% \RCS $StyleRevision: 3.6 $
+%%% \RCS $StyleDate: 1995/11/30 15:44:53 $
+
+
+%%% \begin{document}
+
+
+%%% \title{The \texttt{cweb} Class\\
+%%% {\large (Implementation)}%
+%%% }
+%%% \author{% % LaTeX does not discard unnecessary glue...
+%%% Joachim Schrod%
+%%% \thanks{%
+%%% \protect\raggedright
+%%% TU~Darmstadt, Computer Science Department, WG Systems Programming,
+%%% Alexanderstr.~10, D-64283~Darmstadt, Germany.
+%%% Email: \texttt{jschrod@acm.org}%
+%%% }%
+%%% }
+%%% \date{%
+%%% Revision \RCSStyleRevision\\
+%%% (as of \RCSStyleDate)%
+%%% }
+
+%%% \maketitle
+
+
+%%% % doesn't work with progltx yet
+%%% %\tableofcontents
+
+
+
+%%% % ------------------------------------------------------------
+%%% %
+%%% % subdocument: The user interface of cweb.cls
+%%% %
+
+%%% \input{cweb-user}
+
+%%% %
+%%% % ------------------------------------------------------------
+%%% %
+%%% % subdocument: The internal interface
+%%% %
+
+%%% \input{cweb-conf}
+
+%%% %
+%%% % ------------------------------------------------------------
+
+
+
+
+%%% \chap Implementation.
+
+%%% This implementation must typeset complete files output by \cweave{}.
+%%% Large parts of this task are available from the module \pkg{cwebbase}.
+%%% It remains mainly to implement document-level markup and front and
+%%% back matter (table of contents, index, etc.) In particular, the back
+%%% matter material is not trivial; its tags are behind |\end{document}|,
+%%% we have to read carefully behind the end of our \cweb{} document to
+%%% detect if we have to typeset them at all.
+
+
+%%% \sect This module reserves the namespace |cweb|.
+
+%%% \beginprog
+\ifx \cweb@loaded\undefined
+ \def\cweb@loaded{$StyleRevision: 3.6 $}
+\else
+ \PackageWarningNoLine{cweb}%
+ {Some other package already uses namespace `cweb'}
+\fi
+%%% \endprog
+
+
+%%% \sect Let's identify this class.
+
+%%% \noindent The code below is explained in the implementation
+%%% documentation of the \pkg{rcs} package.
+
+%%% \beginprog
+\begingroup
+ \def\RCSClass#1#2 $#3: #4 #5\endRCS $#6: #7 #8\endRCS{%
+ \def\date{#4}\def\id{v#7}%
+ \ProvidesClass{#1}[\date\space\id\space #2]%
+ }
+
+ \RCSClass{cweb-inc}{LaTeX markup for CWEB sources}
+ $StyleDate: 1995/11/30 15:44:53 $: 9999/00/00 \endRCS
+ $StyleRevision: 3.6 $: 0.0 \endRCS
+\endgroup
+%%% \endprog
+
+
+%%% \sect This module is from a supported bundle. Send bug reports,
+%%% comments and repairs.
+
+%%% The reference version may be retrieved via anonymous ftp from
+%%% |ftp.th-darmstadt.de| [130.83.47.112], directory
+%%% |pub/programming/literate-programming/c.c++/|. It's
+%%% placed there as a gzipped tar file. (The information on the IP~number
+%%% is dated August~29,~1995.
+%%% It might have changed, although this is very unlikely. Use
+%%% your friendly nameserver.)
+
+
+%%% \sect This is freely distributable software; you can redistribute it
+%%% and/or modify it under the terms of the GNU General Public License as
+%%% published by the Free Software Foundation; either version~2 of the
+%%% License, or (at your option) any later version.
+
+%%% This software is distributed in the hope that it will be useful, but
+%%% \textbf{without any warranty}; without even the implied warranty of
+%%% \textbf{merchantability} or \textbf{fitness for a particular purpose}.
+%%% See the GNU General Public License for more details.
+
+%%% You should have received a copy of the GNU General Public License in
+%%% the file |License| along with this package; if not, write to the Free
+%%% Software Foundation, Inc., 675~Mass Ave, Cambridge, MA~02139,~USA.
+
+
+%%% \sect Before we start we declare some shorthands for category codes.
+%%% By declaring the underscore~`(|_|)' as letter we can use it in our
+%%% macros. (I agree with \textsc{D.~Knuth} that
+%%% |\identifier_several_words_long| is more readable than
+%%% |\IdentifierSeveralWordsLong| and in every case better than |\p@@@s|.)
+
+%%% As this is a \LaTeX{} style file the at sign is a letter anyhow; so
+%%% we can use the ``private'' \LaTeX{} macros; and with the underscore we
+%%% can make our own macros more readable. But as we have to restore this
+%%% category code at the end of this macro file we store its former value
+%%% in the control sequence |\CatUsCode|. This method is better than to
+%%% use a group because not all macros have to be defined global this way.
+
+%%% Since somebody might use more styles from me, this cseqs might be
+%%% defined already.
+
+%%% \beginprog
+\ifx \CatEscape\undefined
+ \chardef\CatEscape=0
+ \chardef\CatOpen=1
+ \chardef\CatClose=2
+ \chardef\CatIgnore=9
+ \chardef\CatLetter=11
+ \chardef\CatOther=12
+ \chardef\CatActive=13 % is defined in Plain already
+
+ \chardef\CatUsCode=\catcode`\_
+\fi
+
+\catcode`\_=\CatLetter % top level macro file
+%%% \endprog
+
+
+
+%%% See if we are a class or a package. If |cweb| is a class, |section| is
+%%% still undefined, as it will be defined when the base package is loaded
+%%% later on. This allows us to define |cweb@cls| to be true and act
+%%% under this condition.[ema@csn.es]
+%%% \beginprog
+
+\ifx\section\undefined
+ \def\cweb@cls{0}
+\else
+ \def\cweb@cls{1}
+\fi
+%%% \endprog
+
+
+%%% \sect Problems over problems with different \LaTeX{} versions. I have
+%%% decided that I will take the same stand as the \LaTeX{} team: I will
+%%% only support the last two official \LaTeX{} versions, folks who run
+%%% older software might need to upgrade.
+
+%%% The implementation will use `star'-forms of \LaTeX{}'s command
+%%% definition macros. They were introduced with \LaTeX{}
+%%% \mbox{$\langle$1994/12/01$\rangle$}.
+
+%%% Currently (as of 07 Nov 95), 1995/06/01 is the most recent version.
+%%% I want to use a features introduced with that version: |\newif| is not
+%%% outer any more. So I check here for the version and supply the new
+%%% definition if necessary.
+
+%%% \beginprog
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\@ifl@t@r \fmtversion{1995/06/01}{}% else
+ {
+ \@namedef{newif}#1{%
+ \count@\escapechar \escapechar\m@ne
+ \let#1\iffalse
+ \@if#1\iftrue
+ \@if#1\iffalse
+ \escapechar\count@
+ }
+ \def\@if#1#2{%
+ \expandafter\def
+ \csname \expandafter\@gobbletwo\string#1%
+ \expandafter\@gobbletwo\string#2\endcsname {%
+ \let#1#2%
+ }%
+ }
+ }
+%%% \endprog
+
+
+%%% \chap Options.
+
+%%% Our options are of the ``keyword-value'' category. We realize them by
+%%% the \pkg{keyvald} package, an enhancement of the \pkg{keyval} package
+%%% from the Graphics bundle that supports defaulting for unknown keys.
+
+%%% \begin{fixme}
+%%% Most of the code below should be extracted and moved to a
+%%% \pkg{keyvalx} package (or a new version of \pkg{keyval}). In
+%%% particular, support for package/class option processing, enumeration
+%%% values, and set values for keyword options.
+%%% \end{fixme}
+
+%%% |\ProcessKeyValOptions| may be used instead of |\ProcessOptions|, it
+%%% takes the keyval set identifier as argument. At the end it evaluates
+%%% and resets a hook. That hook may be used at option definition to
+%%% define further dependencies. (E.g., enabling that option implies
+%%% enabling an other option, too.)
+%%% %
+%%% \begin{fixme}
+%%% Like |\ProcessOptions|, I define |\@curroptions|, since I don't know
+%%% if that's needed later. The only place where it could been needed is
+%%% in the check for unprocessed options.
+%%% \end{fixme}
+
+%%% \beginprog
+\RequirePackage{keyvald}
+
+\let\ProcessKeyValOptionsHook\empty
+\providecommand*\ProcessKeyValOptions[1]{%
+ \edef\@curroptions{\@ptionlist{\@currname.\@currext}}%
+ \edef\next{\noexpand\setkeys{#1}{\@curroptions}}%
+ \next
+ \ProcessKeyValOptionsHook
+ \let\ProcessKeyValOptionsHook\empty
+ \AtEndOfPackage{\let\@unprocessedoptions\relax}
+ }
+%%% \endprog
+
+
+%%% \sect The enumeration option |structure| selects hierarchic~(0) or
+%%% flat~(1) structure. The predefined value is `hierarchic', there is no
+%%% default. The option value is bound to |\cweb@structure|.
+%%%
+%%% I make this behaviour conditional on whether |cweb| is a class or a
+%%% package. [ema@csn.es]
+
+%%% \beginprog
+\ifcase\cweb@cls
+%%% \endprog
+
+%%% \beginprog
+%% \define@key@enum{cweb}{structure}{hierarchic,flat}[hierarchic]
+\@namedef{KV@cweb@structure@enum:hierarchic}{0 } % <-- space!
+\@namedef{KV@cweb@structure@enum:flat}{1 } % <-- space!
+\define@key{cweb}{structure}{%
+ \expandafter\let \expandafter\@tempa
+ \csname KV@cweb@structure@enum:#1\endcsname % \relax if undefined
+ \ifx \@tempa\relax
+ \PackageError{cweb}%
+ {%
+ Invalid value `#1' for option structure%
+ }{%
+Possible valid values are `hierarchic' and `flat'.\MessageBreak
+The predefined value is `hierarchic'.\MessageBreak
+There's no default value, you have to specify one.%
+ }%
+ \else
+ \let\cweb@structure\@tempa
+ \fi
+ }
+\setkeys{cweb}{structure=hierarchic}
+%%% \endprog
+
+%%% Since usually this will be inserted in a `normal' LaTeX document, I
+%%% stick to the hierarchic structure.[ema@csn.es]
+%%% \beginprog
+\or
+\def\cweb@structure{0}
+\fi
+%%% \endprog
+
+
+%%% \sect With the set option |suppress| one can select suppression of
+%%% different document parts: |changehints| suppresses output of hints
+%%% that a changefile was involved, |unchanged| output of unchanged
+%%% chunks, |index| and |reflist| output of index and reference list, and
+%%% |format| output of `|@f|' directives.
+
+%%% The predefined value is no suppression. There is no default value.
+%%% %
+%%% \begin{fixme}
+%%% Shouldn't I supply a default value? `|{index,reflist}|'?
+%%% \end{fixme}
+
+%%% Set options are represented by flags named
+%%% |@cweb@|\<option>|@|\<value>|@|.
+
+%%% This options also receive a predetermined value for the `package' case
+%%% [ema@csn.es]
+
+
+%%% \beginprog
+%% \define@key@set{cweb}{suppress}{changehints,unchanged,index,reflist,format}
+\@for \@tempa :=changehints,unchanged,index,reflist,format\do {%
+ \expandafter\newif \csname if@cweb@suppress@\@tempa @\endcsname
+ \csname @cweb@suppress@\@tempa @false\endcsname
+ }%
+%%% \endprog
+%%% \beginprog
+\ifcase \cweb@cls
+%%% \endprog
+%%% \beginprog
+\define@key{cweb}{suppress}{%
+ \@for \@tempa :=#1\do {%
+ \expandafter\let \expandafter\@tempb
+ \csname @cweb@suppress@\@tempa @true\endcsname
+ %% \relax if undefined
+ \ifx \@tempb\relax
+ \PackageError{cweb}%
+ {%
+ Invalid value `#1' for set option suppress%
+ }{%
+Possible valid values are `changehints', `unchanged',\MessageBreak
+or a comma-separated list of these words enclosed in braces.\MessageBreak
+Specified values are turned on, you can't turn them off.\MessageBreak
+No value is on initially.\MessageBreak
+There's no default value, you have to specify one.%
+ }%
+ \else
+ \@tempb
+ \fi
+ }%
+ }
+\g@addto@macro\ProcessKeyValOptionsHook{%
+ \if@cweb@suppress@unchanged@
+ \@cweb@suppress@changehints@true
+ \fi
+ }
+%%% \endprog
+
+%%% For the package case, I select to suppress the Index, the List of
+%%% Refinements and the change hints. [ema@csn.es]
+%%% \beginprog,
+ \or
+ \@for \@tempa :=changehints,index,reflist\do {%
+ \csname @cweb@suppress@\@tempa @true\endcsname
+ }%
+ \@for \@tempa :=unchanged,format\do {%
+ \csname @cweb@suppress@\@tempa @false\endcsname
+ }%
+ \fi
+%%% \endprog
+
+
+%%% \sect The base document class may be specified by the option
+%%% |baseclass|.
+
+%%% This class will not be loaded if we are a package.[ema@csn.es]
+%%% \beginprog
+\ifcase\cweb@cls
+%%% \endprog
+%%% \beginprog
+\def\CwebBaseClass{article}
+\define@key{cweb}{baseclass}[report]{\def\CwebBaseClass{#1}}
+%%% \endprog
+
+%%% Nothing to do for packages.[ema@csn.es]
+%%% \beginprog
+\fi
+%%% \endprog
+
+
+%%% \sect Language-specific adaptions are stored in files
+%%% \texttt{cwbl-{\it language}.sty}. They may be accessed as packages or
+%%% by the |language| option that takes the \textit{language} as value. We
+%%% have to require the respective package at the end of the class, then
+%%% all cseqs with default names are defined and may be overwritten.
+
+%%% For some languages, we provide Babel-compatible option names, to ease
+%%% the usage of global class options taken up by other packages (like
+%%% \pkg{varioref}), too.
+
+%%% \beginprog
+\def\cweb_set_language#1{%
+ \IfFileExists{cwbl-#1.sty}{%
+ %% true
+ \RequirePackage{cwbl-#1}%
+ }{%
+ %% false
+ \ClassError{cweb}{Language `#1' is unknown.}{%
+Language definitions are stored in files `cwbl-<language>.sty'.\MessageBreak
+I could not locate the file `cwbl-#1.sty'. If you didn't make a%
+\MessageBreak
+typo, please check if there is such a file in a directory searched\MessageBreak
+by LaTeX.%
+ }%
+ }%
+ }
+
+\define@key{cweb}{language}{\AtEndOfClass{\cweb_set_language{#1}}}
+
+\define@key{cweb}{german}[]{\setkeys{cweb}{language=german}}
+\define@key{cweb}{french}[]{\setkeys{cweb}{language=french}}
+\define@key{cweb}{italian}[]{\setkeys{cweb}{language=italian}}
+\define@key{cweb}{spanish}[]{\setkeys{cweb}{language=spanish}}
+%%% \endprog
+
+
+
+
+%%% \chap Configuration, inheritance, and aggregation.
+
+%%% This chapter sets up access to other modules, therefore we restore the
+%%% original catcodes for the time being.
+
+%%% \beginprog
+\catcode`\_=\CatUsCode
+%%% \endprog
+
+
+%%% \sect As usual, we provide the possibility to configure this class.
+
+%%% \beginprog
+\InputIfFileExists{cweb.cfg}{%
+ \typeout{******************************************^^J%
+ *^^J%
+ * Using local configuration file cweb.cfg^^J%
+ *^^J%
+ ******************************************%
+ }%
+ }{}
+%%% \endprog
+
+
+%%% \sect Inherit article class.
+
+%%% \beginprog
+\ifx \CwebBaseClass\undefined
+ \def\CwebBaseClass{article}
+\fi
+\define@key{cweb}*[]{\PassOptionsToClass{\KV@key}{\CwebBaseClass}}
+\ProcessKeyValOptions{cweb}
+%%% \endprog
+
+%%% The class will not be loaded if we are a package.[ema@csn.es]
+%%% \beginprog
+\ifcase\cweb@cls
+\LoadClass{\CwebBaseClass}
+%%% \endprog
+
+%%% Nothing to do for packages.[ema@csn.es]
+%%% \beginprog
+\fi
+%%% \endprog
+
+
+%%% \sect OK, now comes our own code; switch on again our lexical
+%%% conventions.
+
+%%% \beginprog
+\catcode`\_=\CatLetter
+%%% \endprog
+
+
+
+
+%%% \chap Typesetting \cweave{} output.
+
+%%% This task has been out-sourced to an other module, \pkg{cwebbase}. As
+%%% mentioned at the start of the implementation, there remain mainly some
+%%% bigger tasks, they will be implemented in further sections below. For
+%%% the most part, the necessary preconditions are actually our class
+%%% option definitions, we don't have to do anything. (Gosh, what a
+%%% coincidence. :--) We need to tell \pkg{cwebbase}, that it should use
+%%% class warnings on problems.
+
+%%% \beginprog
+\let\cweb_warning=\ClassWarningNoLine
+\input{cwbasehy}
+%%% \endprog
+
+
+
+%%% \sect But there remain also some small things to be done right now:
+%%% For flat structure, the counter |secnumdepth| must be set to~11, then
+%%% we want to number chunks in the whole document.
+
+%%% \beginprog
+\ifcase \cweb@structure
+ %% hierarchic
+ \or
+ %% flat
+ \setcounter{secnumdepth}{11}
+\fi
+%%% \endprog
+
+
+%%% \sect \pkg{cwebbase} uses |\part|, |\chapter| (if bound), and
+%%% |\section|. We have no use for any other section division that came
+%%% from the base class, let's discard the standard ones.
+
+%%% Unless we are a package, in which case we don't know if there will be
+%%% sections using them later.
+%%% \beginprog
+\ifcase\cweb@cls
+%%% \endprog
+%%% \beginprog
+\let\subsection\undefined
+\let\subsubsection\undefined
+\let\paragraph\undefined
+\let\subparagraph\undefined
+%%% \endprog
+
+%%% Nothing to do for packages.[ema@csn.es]
+%%% \beginprog
+\or\fi
+%%% \endprog
+
+
+
+
+%%% \chap Table of contents.
+
+%%% The table of contents features only sections, chunks don't have
+%%% titles, after all. Titles are indented proportionally to the rank,
+%%% with an basic indentation of |\CwebTocIndent|. An entry on major
+%%% ranks may be differentiated by layout instead of indentation, as it's
+%%% done in standard \LaTeX{} classes, too.
+
+%%% The counter |\CwebTocIndentMaxLevel| constitutes an upper limit for a
+%%% recognized indent (concerning indentation, that is).
+
+%%% \beginprog
+\newdimen\CwebTocIndent
+ \CwebTocIndent=1.5em
+\newcount\CwebTocIndentMaxLevel
+ \CwebTocIndentMaxLevel=6 % increase indentation if <= max level
+%%% \endprog
+
+
+%%% \sect For hierarchic structure, we can ignore chunk entries
+%%% completely, but have to supply a bunch of definitions for entries of
+%%% type `|section|$l$'. But for flat structure, sections are passed as
+%%% chunks, too. Then the current rank is stored in the title, as
+%%% |\cwbbRank{|$r$|}|. These differences are so large that we'll have
+%%% to make a very large |\ifcase|, over many chunks in this macro source
+%%% file. Let's start with the hierarchic stuff.
+
+%%% \beginprog
+\ifcase \cweb@structure
+ %% hierarchic
+ \def\l@chunk#1#2{}
+%%% \endprog
+
+
+%%% \sect Let's assume that we're subclassed from one of \LaTeX{}'s
+%%% standard classes; otherwise this stuff must be redefined, too. They
+%%% indent |\section| entries always by the same amount (1.5\,em), our
+%%% layout must fit to that.
+
+%%% If we have chapters, they are also indented by 1.5\,em and
+%%% distinguished by layout. The first minor section starts on rank~3 and
+%%% is placed on level~2, it should be indented larger. Let's simply add
+%%% 1.5\,em for each rank, that makes 3\,em for sections of type
+%%% |section2|. I.e., we use $f=l$ as a factor for our basic indentation.
+
+%%% If we don't have chapters, the first minor section starts on rank~2
+%%% and is placed also on level~2, it should be indented like sections
+%%% (1.5\,em), as it will be in another layout. I.e., we use $f=l-1$ as
+%%% the indentation factor.
+
+%%% The actual definitions are generated in a loop. `|\l@section|$l$'
+%%% expands to `|\cweb@toc_entry{|$l$|}|'. The indentation will be
+%%% computed within that macro.
+
+%%% \beginprog
+ \count@=2
+ \@whilenum \count@<11 \do {
+ \expandafter\edef \csname l@section\number\count@\endcsname{%
+ \noexpand\cweb@toc_entry{\number\count@}%
+ }
+ \advance \count@ by 1
+ }
+%%% \endprog
+
+
+%%% \sect A toc entry may be produced by |\@dottedtocline|. That cseq
+%%% needs the level (to decide if that entry is produced after all), the
+%%% entry indentation, the inner-entry indentation used for the number,
+%%% entry text, and page number.
+
+%%% As explained above, we use an indentation of $f \cdot
+%%% |\CwebTocIndent|$, if the level is not larger than
+%%% |\CwebTocIndentMaxLevel|. Otherwise we use the indentation of that
+%%% level.
+
+%%% Each entry is kind of an item with the number as the label. We need an
+%%% inner-entry indentation to be used for subsequent lines within this
+%%% entry. If a number is specified, it's tagged by |\numberline| in the
+%%% entry text. With a proper local definition and a pro-forma evaluation
+%%% of the text, we get at the width of the number (with a fitting space
+%%% for separation to text) and can use that as the inner-entry
+%%% indentation.
+
+%%% \beginprog
+ \def\cweb@toc_entry#1#2{% % #3 (page) will follow
+ %% \count@ == factor for basic indentation
+ %% min(#1,TocIndentMaxRank) - correct_level
+ \ifnum #1>\CwebTocIndentMaxLevel
+ \count@\CwebTocIndentMaxLevel
+ \else
+ \count@ #1 % <-- space!
+ \fi
+ \ifx \chapter\undefined
+ \advance \count@\m@ne
+ \fi
+ %% \dimen@ == inner-entry indentation
+ %% width of number & space, if existing
+ \begingroup
+ \global\dimen@ \z@ % assert value
+ \def\numberline##1{\settowidth{\global\dimen@}{##1\enskip}}%
+ \setbox\z@ \hbox{#2}% % evaluates \numberline if specified
+ \endgroup
+ \@dottedtocline
+ {#1}% % level
+ {\count@ \CwebTocIndent}% % basic indent
+ \dimen@ % num width
+ {#2}% % entry; page will follow
+ }
+%%% \endprog
+
+
+%%% \sect We're done with toc configuration for hierarchic structure,
+%%% since entry definitions for |chapter| and |section| types exist
+%%% already. Let's turn over to the flat structure.
+
+%%% \beginprog
+ \or
+ %% flat
+%%% \endprog
+
+
+%%% \sect The section rank determines how they are featured in the table.
+%%% Titles on rank~0 are typeset boldface, other titles are dotted
+%%% contents lines in roman.
+
+%%% The rank is specified within the title, i.e., in the
+%%% first argument to |\l@chunk|, as an argument for the |\cwbbRank| tag.
+%%% With an appropriate definition we might set |\count@| to the
+%%% respective value. If it is not set, an explicite invocation of
+%%% |\section| or |\addcontentsline| is responsible for this entry. Then
+%%% we assume that the rank is~0.
+
+%%% \beginprog
+ \def\l@chunk#1{% % page will be processed later
+ \count@\@ne % default value of group level
+ \begingroup
+ \let\numberline\@gobble % width not known yet
+ \def\cwbbRank##1{\global\count@ ##1\relax}%
+ \setbox\z@ \hbox{#1}%
+ \endgroup
+ \ifnum \count@=\z@
+ \let\next\cweb@bold_toc_line
+ \else
+ \let\next\cweb@normal_toc_line
+ \fi
+ \next{#1}%
+ }
+%%% \endprog
+
+
+%%% \sect A boldface line is typeset similar to the definition of
+%%% |\@dottedtocline|, only with fewer parameters. It takes two
+%%% parameters, the entry and the page number.
+
+%%% \beginprog
+ \def\cweb@bold_toc_line#1#2{%
+ \addpenalty{\@secpenalty}%
+ \addvspace{1em plus\p@}%
+ \begingroup
+ \noindent \bf
+ \hangindent\CwebTocIndent
+ \rightskip\@tocrmarg \parfillskip -\rightskip
+ \interlinepenalty\@M
+ \@tempdima\CwebTocIndent % for \numberline
+ #1\nobreak\hfill \hbox to\@pnumwidth{\hss #2}%
+ \par
+ \endgroup
+ }
+%%% \endprog
+
+
+%%% \sect A normal line uses |\@dottedtocline| like the hierarchic stuff.
+%%% Rank~1 shall still be on the same level as the bold toc line, so we
+%%% have to use $r-1$ as the proportional factor for |\CwebTocIndent|.
+
+%%% \beginprog
+ \def\cweb@normal_toc_line#1{% % page will be processed later
+ \edef\next{\noexpand\@dottedtocline{\the\count@}}% % toc entry level
+ \ifnum \count@>\CwebTocIndentMaxLevel
+ \count@ \CwebTocIndentMaxLevel
+ \fi
+ \advance\count@\m@ne % group level -= 1
+ \next{\count@\CwebTocIndent}% % basic indent
+ \CwebTocIndent % numwidth
+ {#1}% % entry
+ }
+%%% \endprog
+
+
+%%% \sect The first argument of |\@dottedtocline| is used to specify a
+%%% depth of the issued entry. All entries with a depth larger than
+%%% |tocdepth| are discarded. We typeset all entries, our |tocdepth|
+%%% value is the largest possible section level.
+
+%%% \beginprog
+ \setcounter{tocdepth}{10}
+%%% \endprog
+
+
+%%% \sect That's it. Close our distinction between hierarchic and flat
+%%% structure.
+
+%%% \beginprog
+\fi
+%%% \endprog
+
+
+
+
+%%% \chap The end of the document.
+
+%%% The end of a \cweave{} document is a rather complicated thing. It is
+%%% described in detail in the \cweave{} interface specification, we repeat the
+%%% most important points shortly.
+%%% %
+%%% \begin{itemize}
+
+%%% \item The user has issued an |\end{document}| tag in the documentation
+%%% part of the last chunk.
+
+%%% This tag is therefore part of a chunk, the chunk end (i.e., the
+%%% |\fi| cseq) does appear later in the document. Particularly, this
+%%% means that at the accurence of this tag there is still an open |\if|.
+
+%%% \item Between the |\end{document}| and the |\fi| a lot of text may
+%%% come which must be ignored. Within this text no |\fi| is allowed.
+
+%%% \item After the |\fi| the document may be finished by |\end|.
+%%% (Then the |-x| option of \cweave{} was used.)
+
+%%% Or additional information about the whole document is added: An
+%%% optional tag |\ch|, two mandatory tags |\inx\fin|, and another
+%%% optional tag |\con|.
+
+%%% \end{itemize}
+
+%%% Btw, the last chunk is marked as changed if any changefile entry has
+%%% been applied in the document. (In Plain \cweb{} that chunk is
+%%% colloquially used as the introduction to the index, and that shall be
+%%% printed always.) If we suppress unchanged chunks, the last
+%%% chunk will therefore always be processed, independent if it was really
+%%% changed or not. Yet another reason to use a whole chunk just for
+%%% |\end{document}|.
+
+%%% We'll use a the following approach for the implementation of the
+%%% iidentifier index and the refinement list (remember that we do not
+%%% produce a table of contents): We will check if there is any of these
+%%% two lists available. The available ones are typeset. Then we'll
+%%% finish the document. This functionality will be bound to |\fin|.
+%%% |\inx| will be simply a no-op. |\con| will never be reached, so we
+%%% don't have to cope with it.
+
+
+%%% \sect With the introduction of an end-document hook in \LaTeXe{}, one
+%%% might have hoped that we can utilize that hook for our task. But this
+%%% is not possible: We don't want to add some additional actions
+%%% \emph{into} the end-document handling, we want to look ahead and issue
+%%% lots of commands \emph{before} the end-document handling has happened.
+%%% (If you know \TeX{} by heart, you may skip the rest of the explanation
+%%% and go to the next chunk.)
+
+%%% As a macro language, \TeX{}'s cseqs take those tokens as arguments
+%%% that are behind them in the token stream. The token stream is
+%%% initially the document source, evaluation of a macro pushes its
+%%% expansion (a token list) on front of the stream. I.e., the evaluation
+%%% of |\end| will push the expansion on the token stream before
+%%% |\enddocument| is even looked at. And |\enddocument| will also push
+%%% its expansion before the hook is evaluated.
+
+%%% If we would allow |\enddocument| to push its expansion, all these
+%%% tokens have to be evaluated after we have typeset the backmatter --
+%%% after all, we need a proper document end, don't we? One would need to
+%%% skip over them, look at and eventually evaluate tokens that come
+%%% behind (from the initial document stream, the document source), and
+%%% then evaluate the skipped tokens. That's too hairy, we don't know
+%%% exactly how many tokens to skip, this is probable to change in future
+%%% \LaTeX{} revisions, etc.
+
+%%% The pushed tokens from |\end| don't pose so much problems. As
+%%% |\enddocument| will terminate the document processing, they are not
+%%% evaluated anyhow, we can just throw them away. And |\end| has changed
+%%% only once in the last few years, so it seems to be a stable macro --
+%%% necessary as we need to know its expansion for propper skipping.
+
+%%% A very first consequence of the demand to process tokens after
+%%% |\end{document}| is that we have to save the ``standard'' \LaTeX{}
+%%% document termination, since we will execute that later.
+
+%%% \beginprog
+\ifcase\cweb@cls
+\let\cweb@save@enddocument=\enddocument
+\or
+\let\cweb@save@enddocument=\relax
+\fi
+%%% \endprog
+
+
+%%% \sect When we encounter |\end{document}| we have to skip tokens
+%%% until we reach a |\fi|. Then we establish the correct
+%%% environment for the material behind.
+
+%%% The skip itself is actually a bit difficil, so we'll look at it more
+%%% closely. |\enddocument| is executed within |\end|. As mentioned above,
+%%% the original
+%%% definition of |\enddocument| cheats, it terminates \LaTeX{} before
+%%% the rest of |\end| is executed. |\end| first checks if we're in
+%%% the correct current environment, then it establishs the end
+%%% processing for paragraph building environments, closes the
+%%% group---each environment is in its own group, executes the end
+%%% processing established before, and it may ignore following white
+%%% space.
+
+%%% The |document| pseudo-environment is different in that it isn't in a
+%%% group. I.e., we have to open a group which can be closed by |\end|
+%%% afterwards. The environment check will be done in this group. With
+%%% |\aftergroup| we establish a macro which will skip the rest of the
+%%% |\end| processing. This processing is not needed anyhow: |document|
+%%% is no paragraph building environment and the following white space is
+%%% ignored by ourselves. Since |document| is no paragraph building
+%%% environment, the end processing described above is empty, i.e., not
+%%% existant. Then come a few tokens which ignore the white space. One of
+%%% these tokens is a |\fi|, so we have to skip them first separately.
+%%% They are discarded by |\cweb@skip_end|, we can start to look
+%%% for our |\fi| afterwards.
+
+%%% If |\end{document}| is the first (i.e., the only) text in this chunk
+%%% we discard the chunk start marker. This is possible since it isn't set
+%%% until now, it's in the |\everypar| token register. Of course, then we
+%%% have to do the house keeping work stored in |\everypar| ourselves.
+
+%%% No need of this for packages. [ema@csn.es]
+%%% \beginprog
+\ifcase\cweb@cls
+%%% \endprog
+
+%%% \beginprog
+\def\enddocument{%
+ \if@noskipsec
+ \global\everypar{}%
+ \global\@noskipsecfalse
+ \global\@nobreakfalse
+ \global\clubpenalty\@clubpenalty
+ \fi
+ \begingroup
+ \aftergroup\cweb@skip_end
+ }
+%%% \endprog
+
+%%% [ema@cwn.es]
+%%% \beginprog
+\fi
+%%% \endprog
+
+%%% \sect Let's make sure that the expansion of |\end| is the one that we
+%%% expect. Then we can define |\cweb@skip_end| appropriately, we have to
+%%% skip 5~tokens.
+
+%%% \beginprog
+\CheckCommand*\end[1]{%
+ \csname end#1\endcsname\@checkend{#1}%
+ \expandafter\endgroup\if@endpe\@doendpe\fi
+% 1 2 3 4 5
+ \if@ignore\@ignorefalse\ignorespaces\fi}
+\def\cweb@skip_end#1#2#3#4{\cweb@check_fi}
+%%% \endprog
+
+
+%%% \sect |\cweb@check_fi| gets the next token, and invokes
+%%% |\cweb@do_check_fi| who really checks it. If this token is |\fi| we
+%%% can prepare to finish our document. Otherwise we have to check the
+%%% next token.
+
+%%% Of course, first the token we have checked already must be discarded.
+%%% Therefore we insert the followup action by |\afterassignment|. It's
+%%% important that the assignment gets \emph{only} the next token, we
+%%% have to supply both the equals sign and the optional blank which are
+%%% allowed between the both arguments to |\let|.
+
+%%% \beginprog
+\def\cweb@check_fi{%
+ \futurelet\next \cweb@do_check_fi
+ }
+\def\cweb@do_check_fi{%
+ \ifx \next\fi
+ \afterassignment\cweb@finish
+ \else
+ \afterassignment\cweb@check_fi
+ \fi
+ \let\next= % <-- blank!!
+ }
+%%% \endprog
+
+
+%%% \sect When we found the |\fi|, we also discard it. But we're still
+%%% within a chunk, i.e., there is an open |\if|. So we must supply the
+%%% |\fi|.
+
+%%% \TeX{}nical note: |\next| is now equivalent to |\fi|. It must not be
+%%% used within a loop where it denotes the tail recursion's action. I.e.,
+%%% code like
+%%% %
+%%% \begin{verbatim}
+%%% \ifx \foo\bar
+%%% \let\next\relax
+%%% \else
+%%% \let\next\continue
+%%% \fi
+%%% \next
+%%% \end{verbatim}
+%%% %
+%%% will fail. This trap is closed by a redefinition of |\next|.
+
+%%% The output of all following lists may be suppressed by some option.
+%%% That is tested at the place where the respective list shall be
+%%% produced.
+
+%%% All following lists are typeset in CR state.
+
+%%% \beginprog
+\def\cweb@finish{%
+ \fi
+ \let\next\relax
+ \let\ch\cweb@changed_list
+ \let\inx\relax
+ \let\fin\cweb@end_document
+ \let\end\cweb@save@enddocument
+ \cwbb@CR
+ }
+%%% \endprog
+
+%%% But, if we are inside another document, we would not like to have all
+%%% this. As they are disabled from the arguments, I will skip
+%%% them.[ema@csn.es]
+
+%%% \beginprog
+\ifcase\cweb@cls\or
+\let\con\relax %<- Not sure!
+\let\inx\relax
+\let\fin\relax
+\fi
+%%% \endprog
+
+%%% \sect The following lists are started with unnumbered section
+%%% divisions. They are either chapters or sections.
+
+%%% \beginprog
+\ifx \chapter\undefined
+ \let\CwebListSectionDiv=\section
+\else
+ \let\CwebListSectionDiv=\chapter
+\fi
+\def\CwebListSection{\CwebListSectionDiv*}
+%%% \endprog
+
+
+%%% \sect The list of changed chunks is a cross reference list, (nearly)
+%%% like all others at the end of a chunk. The only difference is that
+%%% we do not show changeflags any more---each chunk number in this list
+%%% carries a change flag by definition.
+
+%%% \TeX{}nical note: The redefinition of |\*| is part of the second
+%%% argument of |\CwebCrossRef|. It is \emph{not} a global redefinition.
+
+%%% \beginprog
+\def\CwebCRChanged{%
+ \CwebCrossRef{The following chunks were changed by the change file:}%
+ }
+\def\CwebChangedListName{Changed Chunks}
+
+\if@cweb@suppress@changehints@
+ \def\cweb@changed_list#1.{}
+\else
+ \def\cweb@changed_list{%
+ \CwebListSection{\CwebChangedListName}%
+ \@mkboth{\uppercase{\CwebChangedListName}}%
+ {\uppercase{\CwebChangedListName}}%
+ \message{\CwebChangedListName}%
+ \let\CwebCRSize\relax
+ \CwebCRChanged \let\*\relax
+ }
+\fi
+%%% \endprog
+
+
+%%% \sect As outlined above, we want to check if there are any entries in
+%%% the identifier index or the refinement list. The former is stored in
+%%% the file |\jobname.idx|, the latter in the file |\jobname.scn|.
+
+%%% We write a macro |\cweb@if_file_not_empty| that's like |\IfFileExists|.
+
+%%% \beginprog
+\def\cweb@end_document{%
+ \cweb@if_file_not_empty{\jobname.idx}{%
+ \if@cweb@suppress@index@ \else
+ \CwebIdIndex
+ \fi
+ }{}%
+ \cweb@if_file_not_empty{\jobname.scn}{%
+ \if@cweb@suppress@reflist@ \else
+ \CwebRefList
+ \fi
+ }{}%
+ \cweb@save@enddocument
+ }
+%%% \endprog
+
+
+%%% \sect The paragraph layout for both the index and the refinement list
+%%% is much the same, it is taken from Plain \cweb{}: Each entry is a
+%%% paragraph, nearly no skip between the paragraphs (just a bit to
+%%% prevent underfull vboxes), no paragraph indentation, ragged right.
+%%% Overfull hboxes in the lists don't make sense, so we prevent them. And
+%%% we don't allow hyphenation.
+
+%%% \beginprog
+\def\cweb@list_par_layout{%
+ \parskip \z@ plus .5\p@
+ \parindent\z@
+ \rightskip \z@ plus 2.5em
+ \tolerance\@M \hyphenpenalty\@M
+ }
+%%% \endprog
+
+
+%%% \sect We consider a file as ``not empty'' if (1)~the file exists,
+%%% (2)~is not empty, and (3)~has a non-empty line at the very front. (In
+%%% fact, an empty line at the front means that there should not be
+%%% anything behind it---but we can't test this portably.)
+
+%%% |\cweb@if_file_not_empty| tests the property, it's parametrized by the
+%%% file name and gets passed actions for the true and the false case.
+
+%%% We open the file first. Then we check if it doesn't exist or if it's
+%%% empty, both conditions deliver true on |\ifeof|; in this case we
+%%% pretend that there was an empty line. (The \LaTeX{} kernel already
+%%% once provided a macro for an empty line, |\@defpar|, we repeat that
+%%% definition here since it was discarded there.) Otherwise we read the
+%%% first line. At this state, the emptiness of the first line is
+%%% equivalent to the non-availability of entries, we can easily construct
+%%% an appropriate macro call to set the flag.
+
+%%% \beginprog
+\def\@defpar{\par}
+\def\cweb@if_file_not_empty#1#2#3{%
+ \openin\@inputcheck #1\relax
+ \ifeof \@inputcheck
+ \let\next\@defpar
+ \else
+ \read\@inputcheck to \next
+ \fi
+ \closein\@inputcheck
+ \ifx \next\@defpar
+ \def\reserved@a{#3}%
+ \else
+ \def\reserved@a{#2}%
+ \fi
+ \reserved@a
+ }
+%%% \endprog
+
+
+%%% \sect The identifier index is available in the file |\jobname.idx|.
+%%% The setup for the index is a mixture of the |theindex| environment of
+%%% the \cls{article} class and DEK's index macros. It's typeset in two
+%%% columns; the user may specify an introductionary text for the index
+%%% by |\cwebIndexIntro|. If there is any introductionary text we add a
+%%% medium skip below.
+
+%%% For the index, |\parfillskip| set in such a way that almost empty
+%%% lines are avoided.
+
+%%% Before we read in this file, we have to bind the special cseqs used
+%%% therein.
+
+%%% \begin{fixme}
+%%% \LaTeX{} feature or bug? The optional argument of |\twocolumn| is
+%%% typeset as a vbox, therefore the space at top of the section heading
+%%% is not discarded at the top of a page. But we know that |\twocolumn|
+%%% will start a page in any case, we must prevent the addition of this
+%%% space. Looking in the source, we see that setting the flag
+%%% |@nobreak| will prevent this addition, let's do that as a
+%%% workaround. File a \LaTeX{} bug report?
+%%% \end{fixme}
+
+%%% \begin{fixme}
+%%% Surprise: If |@nobreak| is set \emph{and} if there are no index
+%%% entries, |\twocolumn| will drop its optional argument. (That
+%%% happened to be noticed when there was an error in
+%%% |\cweb@if_file_not_empty|.) File a \LaTeX{} bug report?
+%%% \end{fixme}
+
+%%% \begin{fixme}
+%%% If |\CwebListSection| is a chapter tag of the standard classes, that
+%%% macro will check if it's in twocolumn mode and will try to set
+%%% itself at the top of the current page in full width, as it would
+%%% have been given in an optional argument of |\twocolumn|. As the
+%%% method that optional argument uses (a float) must not be nested, we
+%%% must prevent this to happen. We set the |@twocolumn| flag to false,
+%%% chapter macros will then think they're evaluated in a one-column
+%%% document. It's debatable if that is a kludge or even \emph{the}
+%%% solution -- after all, within the optional argument we aren't in
+%%% twocolumn mode any more. File a \LaTeX{} bug report?
+%%% \end{fixme}
+
+%%% \beginprog
+\newtoks\cwebIndexIntro
+ \cwebIndexIntro={}
+\def\CwebIdIndex{%
+ %% two column format
+ \columnseprule\z@
+ \columnsep 35\p@ % value is from article.sty
+ %% introduction of index
+ \twocolumn[%
+ \cwbb@tex
+ \@nobreaktrue % don't add space in front of section
+ \@twocolumnfalse % \CwebListSection might be \chapter
+ \CwebListSection{\indexname}%
+ \edef\intro{\the\cwebIndexIntro}% % is a local def
+ \ifx \intro\empty
+ \else
+ \the\cwebIndexIntro\unskip
+ \par\medskip
+ \fi
+ ]%
+ \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}%
+ \message{\indexname:}% % tell the user what we're doing
+ %% paragraph layout
+ \cweb@list_par_layout
+ \parfillskip \z@ plus .6\hsize
+ %% bindings
+ \let\I\CwebIndexEntry
+ \let\[\CwebIndexDeclared
+ \let\*\cwbb@change_flag
+ %% read the index
+ \CwebReadIndex
+ }
+\def\CwebReadIndex{\@input{\jobname.idx}}
+%%% \endprog
+
+
+%%% \sect An index entry is typeset with the same hanging indentation like
+%%% a cross reference list.
+
+%%% The entry is tagged with |\.|, if it was entered by the \cweb{}
+%%% operator~`|@.|'. Then it shall be typeset as a string. But an indexed
+%%% name may also want to use |\.| as an accent. This is the same
+%%% situation as we had at the refinement names (in module
+%%% \pkg{cwebbase}), where we introduced |\cwbb@check_dot| to handle this
+%%% case. The same minor restriction as there holds here, a refinement
+%%% name may not consist of a single dot-accented expression. (|@:|~helps
+%%% in this singular case.)
+
+%%% Enrique Mel\'endez (\texttt{ema@csn.es})introduced come code to
+%%% insert hyperlinks (with the macro |\cweb@num@lnk|).
+
+%%% \beginprog
+\def\CwebIndexEntry#1, #2.{%
+ \par
+ \hangindent\CwebNumberListHangindent
+ \leavevmode
+ \cwbb@check_dot{#1}:\quad\cweb@num@lnk#2, |.
+ }
+%%% \endprog
+
+
+%%% \sect The chunks where identifiers are declared are noted with
+%%% underlined numbers. We also must not forget the default declaration of
+%%% |\9|, the tag for the user definable index layout.
+
+%%% \beginprog
+\def\CwebIndexDeclared#1]{$\underline{#1}$}
+\def\9#1{}
+%%% \endprog
+
+
+%%% \sect The list of the refinement names is available in the file
+%%% |\jobname.scn|. The layout is taken from the plain version: ragged
+%%% right, each entry is a paragraph, the different cross reference
+%%% categories are separated by a quad.
+
+%%% We must initialize our whole paragraph layout, as the index might have
+%%% been suppressed and no initialization has happened there then. If
+%%% there was an index, it changed |\parfillskip| and |\*|, let's restore it.
+
+%%% Enrique Mel\'endez (\texttt{ema@csn.es})introduced come code to
+%%% insert hyperlinks (also in the macro |\CwebCrossRefs|).
+
+%%% \beginprog
+\def\CwebRefListName{List of Refinements}
+
+\def\CwebRefList{%
+ %% paragraph layout: like in index, but
+ \onecolumn
+ \cweb@list_par_layout
+ \parfillskip\@flushglue % must be reset before section heading
+ \CwebListSection{\CwebRefListName}%
+ \@mkboth{\uppercase{\CwebRefListName}}%
+ {\uppercase{\CwebRefListName}}%
+ \message{\CwebRefListName:}%
+ %% different bindings
+ \def\I{\par \hangindent\CwebNumberListHangindent}%
+ \def\CwebCrossRef##1##2.{\quad %
+ {\reset@font\footnotesize ##1~\hyperlink{_hyperchunk_##2}{##2}.}}%
+ \def\CwebCrossRefs##1##2.{\quad %
+ { \let\save@et\ET%
+ \let\save@ets\ETs
+ \def\ET{, }%
+ \let\ETs\ET%
+ \edef\@crlst{##2}%
+ \let\LastList@Conjunction\save@et
+ \reset@font\footnotesize ##1~%
+ \expandafter\cweb@cr@lnk\@crlst, ].}}%
+ \let\Q\CwebXRCite
+ \let\Qs\CwebXRCites
+ \let\U\CwebXRUse
+ \let\Us\CwebXRUses
+ \let\*\cwbb@change_flag
+ %% Read the list, allow configuration first.
+ \csname CwebRefListHook\endcsname
+ \CwebReadPPList
+ }
+\def\CwebReadPPList{\@input{\jobname.scn}}
+%%% \endprog
+
+%%% \sect Extra definitions for the sake of internationalization.
+
+%%% \beginprog
+\def\CwebXRCite{\CwebCrossRef{Cited in chunk}}
+\def\CwebXRCites{\CwebCrossRefs{Cited in chunks}}
+\def\CwebXRUse{\CwebCrossRef{Used in chunk}}
+\def\CwebXRUses{\CwebCrossRefs{Used in chunks}}
+%%% \endprog
+
+
+
+%%% \chap The end.
+
+%%% Well, after all we're finished with this class. We must not forget to
+%%% restore the underscore catcode.
+
+%%% \beginprog
+\catcode`\_=\CatUsCode
+
+\endinput
+%%% \endprog
+
+
+%%% \sect I would like to thank those who helped me to improve this module.
+%%% % In particular, XXX provided XXXsubstantial parts of the code.
+
+%%% \textsc{Michael M\"uller} and \textsc{Zden\v{e}k Wagner} did thorough
+%%% checks that helped me to improve the alpha test version.
+
+
+%%%
+%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%% \vskip \PltxPreSectSkip
+
+%%% \begin{rcslog}
+%%% $StyleLog: cweb.doc,v $
+%%% \Revision 3.6 1995/11/30 15:44:53 schrod
+%%% Still didn't work with version \mbox{$\langle$1994/12/01$\rangle$},
+%%% the copy of |\newif| was not complete.\\
+%%% Problem reported by Michael Seel \path|<seel@mpi-sb.mpg.de>|.
+
+%%% \Revision 3.5 1995/11/20 22:34:18 schrod
+%%% Add language support.\\
+%%% Triggered by Christian Kumpf \path|<smurf@igd.fhg.de>| and Andreas
+%%% Scherer \path|<scherer@physik.rwth-aachen.de>|.
+
+%%% Use my `official' (ACM) email address.
+
+%%% \Revision 3.4 1995/11/07 17:55:18 schrod
+%%% \LaTeX{} \cweb{} should work at least with the last two \LaTeX{}
+%%% versions; make it work with the previous-to-last one, version
+%%% \mbox{$\langle$1994/12/01$\rangle$}. For that, one has to install the
+%%% \mbox{$\langle$1995/06/01$\rangle$} (non-outer) definition of
+%%% |\newif|, and |\hb@xt@| must not be used.\\
+%%% Problem reported by Laurent Desnogues
+%%% \path|<laurent.desnogues@aiguemarine.unice.fr>| and somebody else (XXX
+%%% -- add name).
+
+%%% \Revision 3.3 1995/09/17 14:15:36 schrod
+%%% Initialize list paragraph layout in refinement list, too. With the
+%%% introduction of index suppression, the initialization -- located in
+%%% the index code -- might have been skipped.
+
+%%% \Revision 3.2 1995/09/15 10:22:59 schrod
+%%% The \cls{cweb} class needs at least \LaTeX{} version
+%%% \mbox{$\langle$1994/12/01$\rangle$}.\\
+%%% Problem reported by John S. Robinson \path|jsrobin@umiacs.umd.edu|.
+
+%%% \Revision 3.1 1995/09/12 23:00:48 schrod
+%%% Moved all code that does the actual typesetting of \cweave{} tags and
+%%% is therefore also needed for a |cweb| environment. It's now an own
+%%% module named \pkg{cwebbase}.
+
+%%% \Revision 2.8 1995/09/12 11:44:33 schrod
+%%% Standard base classes with chapters (i.e., report \& book) produced an
+%%% error at the start of the index: |\chapter| may not be called in the
+%%% optional argument of |\twocolumn|. Add a workaround to |\twocolumn|.\\
+%%% Problem reported by Christopher Higgins \path|<C.Higgins@cit.gu.edu.au>|.
+
+%%% \Revision 2.7 1995/08/29 17:32:36 schrod
+%%% Add hook for refinement list.
+
+%%% Allow internationalization of refinement list.\\
+%%% (Problem reported by Christian Kumpf \path|<kumpf@igd.fhg.de>|.)
+
+%%% Cweb bundle, version 1.0.
+
+%%% \Revision 2.6 1995/08/29 15:19:50 schrod
+%%% Added (hint to non-existence of) description of the internal interface.
+
+%%% \Revision 2.5 1995/08/29 02:07:26 schrod
+%%% Discard dependencies on 10\,pt fonts.
+
+%%% Support suppression of format directives.
+
+%%% \Revision 2.4 1995/08/27 19:31:43 schrod
+%%% Discard superfluous space at the top of index. Spacing in refinement
+%%% heading was wrong. Repair test on empty auxilliary files. Make
+%%% section heading for index and refinement list divisions (more)
+%%% configurable. Suppression of index and reference list is supported.
+
+%%% Make configuration of change flag easier.
+
+%%% Put section title of changed chunks list in marks, and tell the user
+%%% that it got typeset.
+
+%%% \Revision 2.3 1995/08/27 17:24:46 schrod
+%%% Make usage of baseclass with chapters work.
+
+%%% \Revision 2.2 1995/08/27 13:26:22 schrod
+%%% Add possibility to suppress change hints. Suppression of unchanged
+%%% chunks suppress change hints as well, they are meaningless as all
+%%% printed chunks are changed by definition.
+
+%%% Realize dependencies in options by |\ProcessKeyValOptionsHook|.
+%%% Illegal values for enumeration options don't alter the current value
+%%% any more.
+
+%%% List of changed chunks is an unnumbered section now.
+
+%%% \Revision 2.1 1995/08/25 19:11:18 schrod
+%%% Add keyword-value option style, with new \pkg{keyvald} package.
+
+%%% Hierarchic strucutures are supported now, in addition to the flat
+%%% structure of the beta-test version. One can choose with an option. For
+%%% that step, the terminology was cleaned up, too: Chunks are not named
+%%% sections any more. (That change involved reimplementation of almost
+%%% all the structure and toc stuff.)
+
+%%% The chunk number supplied by \cweave{} is used now, not some computed
+%%% number. Change flags are printed, too.
+
+%%% One can suppress output of unchanged sections.
+
+%%% One can select the baseclass with an option. That may be used to use
+%%% \cls{report} or \cls{book} to get chapter-style layout. Of course,
+%%% using an arbitrary baseclass is dangerous, it must conform to the
+%%% conventions of \LaTeX{} standard classes.
+
+%%% \Revision 1.13 1995/08/08 00:14:29 schrod
+%%% Updated to \LaTeXe{}, the |cweb| style is now a document class. Used
+%%% my standard templates for that, no changes in functionality.
+
+%%% \Revision 1.12 1993/08/10 14:15:43 schrod
+%%% New page on main section only if group level $<$ |\cwebSecNoEject|.
+%%% Default for the latter is 3.
+
+%%% Document that logos will not be defined in this style file.
+
+%%% Copy of plain macros for |\CwebNumber| does not work. Repaired the
+%%% most important one (subscript must be accessed via |\sb|).
+%%% Incompatibility to NFSS will be addressed later.\\
+%%% (Problems reported by Zden\v{e}k Wagner \path|<wagner@csearn.bitnet>|.)
+
+%%% \Revision 1.11 1993/08/10 11:21:07 schrod
+%%% Reference to section number does not render a period after the
+%%% number any more.
+
+%%% \Revision 1.10 1993/08/09 20:08:20 schrod
+%%% |\cweb@cweave_bindings| is now a no-op if \cweave{} bindings are in
+%%% effect already.\\
+%%% (Problem reported by Michael M\"uller \path|<mimu@mpi-sb.mpg.de>|.)
+
+%%% \Revision 1.9 1993/08/09 18:05:28 schrod
+%%% Left shift operator wasn't defined correctly.\\
+%%% (Problem reported by Michael M\"uller \path|<mimu@mpi-sb.mpg.de>|.)
+
+%%% \Revision 1.8 1993/06/15 15:22:30 schrod
+%%% \textbf{Version 0.2:} Moved from |pub/incoming| to official place, in
+%%% Literate Programming Archive.
+
+%%% \Revision 1.7 1993/06/15 13:25:48 schrod
+%%% First attempt to make it a style: |article| is imported. Warns the
+%%% user if he tries to use |cweb| as a style option.
+
+%%% \Revision 1.6 1993/06/15 08:49:23 schrod
+%%% |\cweb@check_dot| must not evaluate its argument in an |\edef|, this
+%%% causes problems if a |\PB| is within. Now I try hard not to evaluate any
+%%% tokens outside of my control.
+
+%%% Can use |\@defpar| for an empty line in |\cweb@has_entries|, don't
+%%% need an own macro.
+
+%%% \Revision 1.5 1993/06/14 17:50:30 schrod
+%%% Handle a missing |\con|: |\inx| and |\con| are now never looked at.
+%%% Instead |\fin| checks for the existence of the lists and typeset them
+%%% if there are entries available.
+
+%%% \Revision 1.4 1993/06/14 15:54:18 schrod
+%%% Made it work with older versions of \LaTeX{}, too. The |\enddocument|
+%%% implementation of cweb.sty depends on the |\end| implementation; check
+%%% if the current implementation is one we know of (currently: 91-01-14
+%%% and 92-03-25).\\
+%%% (Problem reported by Michael M\"uller \path|<mimu@mpi-sb.mpg.de>|.)
+
+%%% Add FSA diagram about processing states. CR state is also switched
+%%% to from \TeX{} state (that happens with |\ch| at the document end).
+
+%%% \Revision 1.3 1993/05/13 17:51:21 schrod
+%%% Refinements may also be filenames (`|@(|'). Then the complete name
+%%% consists of a |\.| macro call, which is handled now.\\
+%%% (Problem reported by Michael M\"uller \path|<mimu@mpi-sb.mpg.de>|.)
+
+%%% Made the detection of `|@.|' index entries more robust.
+
+%%% \Revision 1.2 1993/05/12 18:28:59 schrod
+%%% Adapted to recent changes of \cweave{} (of April 93):
+
+%%% Main sections have a group level, represented in the table of
+%%% contents. This changed the complete implementation of section tags.
+
+%%% New C token cseqs: |\Z| and |\MRL|, implemented as |\CwebLe| and
+%%% |\CwebCombinedOp|.
+
+%%% \Revision 1.1 1993/04/09 15:00:37 schrod
+%%% Initial revision
+
+%%% \end{rcslog}
+
+
+
+%%% \end{document}
+
+
+%%%
+%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Local Variables:
+%%% mode: LaTeX
+%%% TeX-brace-indent-level: 4
+%%% indent-tabs-mode: t
+%%% TeX-auto-untabify: nil
+%%% TeX-auto-regexp-list: LaTeX-auto-regexp-list
+%%% compile-command: "make cweb.cls"
+%%% End:
diff --git a/macros/latex/contrib/cweb/contrib/cweb-hy/nodoc.tex b/macros/latex/contrib/cweb/contrib/cweb-hy/nodoc.tex
new file mode 100644
index 0000000000..fe9e4b8658
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/cweb-hy/nodoc.tex
@@ -0,0 +1,121 @@
+% File nodoc.tex
+% By Enrique Mel\'endez, <UEI0560130010@eurociber.es> April, 14, 1999.
+% Freely distributable under, f. i. GNU.
+% I do this for fun, but if you use it, I would like no know how it performs
+% Please, keep the author notice.
+% Put \include nodoc.tex as the very first line of your documents.
+% No responsibility. Usde this at your own risk. (That is, it may not work
+% as you intended, but I never designed it to.)
+
+
+\makeatletter
+\ifx\section\undefined
+ \makeatother
+ \expandafter\endinput
+\else
+
+% Things we suppress are `only preamble'
+% documentclass
+\let\n@documentclass\documentclass
+\def\documentclass{\@ifnextchar[\@documentclass@{\@documentclass@[]}}
+\def\@documentclass@[#1]#2{\relax}
+
+% usepackage
+\let\n@usepackage\usepackage
+\def\usepackage{\@ifnextchar[\@usepackage@{\@usepackage@[]}}
+\def\@usepackage@[#1]#2{\relax}
+% The following 4 should be allowed to change. I don't know how.
+% author
+\let\n@author\author
+\def\author#1{\gdef \@author{#1}%\relax
+}
+% date
+\let\n@date\date
+\def\date#1{\relax}
+% title
+\let\n@title\title
+\def\title#1{\gdef \@title{#1}%\relax
+}
+% maketitle
+\let\n@maketitle\maketitle
+\def\maketitle{%
+ \vskip 2em%
+ \begin{center}%
+ \let \footnote \thanks
+ {\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
+ \global\let\@title\@empty
+ \global\let\@author\@empty
+ \global\let\title\relax
+ \global\let\author\relax
+%\relax
+}
+\def\pagestyle#1{\relax}
+\def\thispagestyle#1{\relax}
+\renewenvironment{titlepage}
+ {%
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse\newpage
+ \fi
+ \thispagestyle{empty}%
+ %\setcounter{page}\@ne
+ }%
+ {\if@restonecol\twocolumn \else \newpage \fi
+ %\if@twoside\else
+ %\setcounter{page}\@ne
+ %\fi
+ }
+% tableofcontents
+\let\n@tableofcontents\tableofcontents
+\def\tableofcontents{\relax}
+% The begindocument, where we rebind some of the above
+\let\@document@=\document
+\def\document{\endgroup\relax%
+\let\document\@document@%
+\let\documentclass\n@documentclass%
+\let\usepackage\n@usepackage%
+}
+% The enddocument, where some more things are rebound
+\let\@enddoc@=\enddocument
+\def\enddocument{%
+\let\tableofcontents\n@tableofcontents%
+\let\maketitle\n@maketitle
+\let\title\n@title
+\let\author\n@author
+\let\date\n@date
+\let\enddocument\@enddoc@%
+\begingroup}
+\fi
+
+%% Borrowed from LaTeX general format.
+\def\@ifnextchar#1#2#3{%
+ \let\reserved@d=#1%
+ \def\reserved@a{#2}\def\reserved@b{#3}%
+ \futurelet\@let@token\@ifnch}
+\def\@ifnch{%
+ \ifx\@let@token\@sptoken
+ \let\reserved@c\@xifnch
+ \else
+ \ifx\@let@token\reserved@d
+ \let\reserved@c\reserved@a
+ \else
+ \let\reserved@c\reserved@b
+ \fi
+ \fi
+ \reserved@c}
+\def\:{\let\@sptoken= } \: % this makes \@sptoken a space token
+\def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch}
+
+\makeatother
diff --git a/macros/latex/contrib/cweb/contrib/wagner/cwebzw.sty b/macros/latex/contrib/cweb/contrib/wagner/cwebzw.sty
new file mode 100644
index 0000000000..cff2d7c254
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/wagner/cwebzw.sty
@@ -0,0 +1,323 @@
+%% $Id: cwebzw.sty,v 1.2 1993/08/10 14:14:33 schrod Exp $
+%%----------------------------------------------------------------------
+%% Changed by Joachim Schrod <schrod@iti.informatik.th-darmstadt.de>
+%% Original received by mail:
+%% Date: Thu, 05 Aug 93 12:34:21 MDT
+%% From: Zdenek Wagner <WAGNER@CSEARN.BITNET>
+
+%% This is file ``cwebzw.sty'' written by Z. Wagner as an extension and
+%% correction of ``cweb.sty'' Revision 1.8
+
+%% This file is self-documenting. If you process this file through LaTeX,
+%% you will get the documentation. You can use MakeIndex to create an
+%% index of macros used. In your cweb documents you can either use it as
+%% is or you can remove all comment lines by your editor or the docstrip
+%% utility (or a program of your own).
+
+%% See chapter ``Introduction'' for other remarks.
+
+\def\cwebzwrevision{1.8} % Do not remove this line!
+
+% You can remove the next two lines
+\ifcat a\noexpand @\let\next\relax\else\def\next{%
+ \documentstyle[doc]{article}\MakePercentIgnore}\fi\next
+
+% \EnableCrossrefs
+% \CodelineIndex
+% \catcode`\_=12
+% \DoNotIndex{\cweb,\orig,\p} ^^A doc.sty cannot handle underscore
+% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
+% \DoNotIndex{\@ne,\tw@,\bgroup,\egroup,\endinput,\end,\kern,\hbox,\vbox,\vtop}
+% \DoNotIndex{\aftergroup,\arabic,\begin,\protect,\rm,\reset@font,\setbox}
+% \DoNotIndex{\show,\typeout,\errhelp,\unskip,\unvbox,\wd,\input,\hskip}
+% \DoNotIndex{\ifdim,\ifmmode,\ifnum,\long,\footnotesize,\newbox,\newpage}
+% \DoNotIndex{\@ifnextchar,\@ifundefined,\@namedef}
+% \DoNotIndex{\advance,\begingroup,\catcode,\closein,\closeout}
+% \DoNotIndex{\day,\def,\edef,\else,\empty,\endgroup,\errmessage}
+% \DoNotIndex{\expandafter,\fi,\futurelet,\gdef,\global,\if,\ifeof}
+% \DoNotIndex{\ifx,\immediate,\let,\loop,\m@ne,\message,\month,\newcount}
+% \DoNotIndex{\newif,\newlinechar,\newread,\newtoks,\newwrite}
+% \DoNotIndex{\noexpand,\openin,\openout,\par,\read,\relax,\repeat}
+% \DoNotIndex{\space,\the,\undefined,\write,\xdef,\year,\z@}
+% \advance\textwidth by 40pt
+% \def\pcws{{\tt cweb.sty}}
+% \def\cws{\protect\pcws}
+% \newbox\cwebincr
+% \setbox\cwebincr=\hbox{^^A
+% \kern .5pt
+% \raise .1em\hbox{$\scriptstyle{+}\kern -.1em{+}$}^^A
+% \kern .5pt}
+% \def\Cpp{C\copy\cwebincr}
+% \begin{document}
+% \MakeShortVerb\|
+% \title{Extension and correction of \cws\ revision~\cwebzwrevision}
+% \author{Zden\v{e}k Wagner\\
+% $\langle$wagner@csearn.bitnet$\rangle$ or
+% $\langle$wagner@earn.cvut.cz$\rangle$}\date{}
+% \maketitle\vspace{3ex}
+
+% \tableofcontents\thispagestyle{empty}\newpage
+
+% \section{Introduction}
+% The purpose of this file is to add new features to \cws\ and
+% correct some bugs. When doing this we intended not to make a faintest
+% change into \cws. Therefore some definitions may look strangely
+% cumbersome. However, this file should be treated as a test of new
+% features and bug fixes which should then be placed in the official
+% distribution of \cws\ and in the ideal state this file will one day
+% vanish at all.
+
+% {\bf Note by Joachim Schrod}:\quad I have incorporated most error
+% repairs and some of the enhancements into \cws{} (Revision~1.12). To
+% avoid problems, I deleted all the respective macros from this
+% option. The rest that you see here will not be incorporated (at
+% least not as-is) and is therefore provided as a contributed style
+% option for those who like it.
+
+
+% \section{Preliminaries}
+% First we make sure that this file is not input twice.
+% \begin{macrocode}
+\@ifundefined{\cweb@egroup}{}{\endinput}
+% \end{macrocode}
+
+% Throughout this file we will use tags defined in \cws. Therefore we
+% begin the file with identifying itself and displaying the revision of
+% \cws\ for which it is written. Afterwards we change catcode of
+% underscore in order to have the same conditions as \cws.
+% \begin{macrocode}
+\typeout{Extension of cweb style, revision \cwebzwrevision}
+\typeout{(if you have an older revision of cweb.sty, please upgrade)}
+\catcode`\_=\CatLetter
+% \end{macrocode}
+
+% \section{Extensions}
+% \begin{macro}{\C++}
+% \begin{macro}{\Cpp}
+% \begin{macro}{\CPLUSPLUS/}
+% The documentation of \cws\ says that |\C++| may now be used for \Cpp\
+% logo. However, |\C++| is not defined in \cws. The conservative users
+% of {\tt ccwebmac.tex} designed by Hans--Hermann Bode might be
+% accustomed to |\Cpp| while users of {\tt cwebmac.tex} from {\tt CWEB
+% 3.0} might like |\CPLUSPLUS/|. Therefore we supply all three tags and
+% moreover make them robust so that they can safely be used in moving
+% arguments.
+% \begin{macrocode}
+\def\p_cpp{C\CwebIncr}
+\def\C++{\protect\p_cpp}
+\def\Cpp{\protect\p_cpp}
+\def\CPLUSPLUS/{\protect\p_cpp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+
+% \section{Improvements}
+% \begin{macro}{\CwebScope}
+% If your program contains description of member functions as
+% |TListBox::|\-|handleEvent|, the documentation part may easily contain
+% lots of overfull boxes. Therefore we try to allow the line break after
+% the scope operator. We make the change only if it is not typeset in
+% the math mode. The following solution is not perfect. The expression
+% ``|::close|'' may be incorrectly split after the scope resolution
+% operator. To make a robust macro we should probably fiddle with
+% |\lastskip| and |\lastpenalty|.
+% \begin{macrocode}
+\def\CwebScope{\ifmmode \kern.1em::\kern.1em\else
+ \kern.1em::\hskip.1em\fi}
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Index appearance}
+% When typesetting two or more columns it is more pleasant if the
+% columns are balanced. This may easily be achieved with Frank
+% Mittelbach's {\tt multicol.sty}. We try whether the style is
+% available.
+% \begin{macrocode}
+\newif\ifhave@multicol
+\openin\@ne multicol.sty
+\ifeof\@ne \else \have@multicoltrue \fi
+\closein\@ne \relax
+% \end{macrocode}
+
+% If we found {\tt multicol.sty}, we use it. It might me nice to delay
+% this until we know that the index is really requested.
+% \begin{macrocode}
+\ifhave@multicol \input{multicol.sty} \fi
+% \end{macrocode}
+
+% \begin{macro}{\CwebIdIndex}
+% \begin{macro}{\twocolumn}
+% \begin{macro}{\onecolumn}
+% We delay the redefinitions of the twocolumn format into the definition
+% of |\CwebIdIndex|. If we made the changes globally, we could
+% eventually break something in the user's code.
+
+% I dare say that I do not like the page break in between the index and
+% the list of refinements so I do not put it into the redefinition of
+% |\onecolumn|. Notice also that the new version of |\onecolumn|
+% restores everything for the rare case it is needed somewhere later.
+% \begin{macrocode}
+\let\orig_CwebIdIndex=\CwebIdIndex
+\let\orig_twocolumn=\twocolumn
+\let\orig_onecolumn=\onecolumn
+
+\ifhave@multicol
+ \def\CwebIdIndex{%
+ \def\twocolumn{\newpage
+ \@ifnextchar[{\zw@twocol}{\begin{multicols}{2}}}
+ \long\def\zw@twocol[##1]{\setbox\cweb_tempbox=\vbox{##1}%
+ \begin{multicols}{2}[\unvbox\cweb_tempbox]}
+ \def\onecolumn{%
+ \let\onecolumn=\orig_onecolumn
+ \let\twocolumn=\orig_twocolumn}
+ \orig_CwebIdIndex\cweb@restore_end\end{multicols}}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+
+% \begin{macro}{\cweb@restore_end}
+% The index is processed after the user supplied |\end{document}| where
+% the |\end| tag has unfortunately been redefined. We would always get a
+% \LaTeX\ error informing us about unmatched |\begin| and |\end|.
+% Therefore we prepare a macro which will be used inside a group to
+% restore temporarily the original meaning of |\end|.
+% \begin{macrocode}
+\let\orig_end=\end
+\def\cweb@restore_end{\let\end=\orig_end}
+% \end{macrocode}
+% \end{macro}
+
+% \section{Crazy inventions}
+% As we can see from the documentation of \cws, it can handle two
+% versions of \LaTeX. Older versions of \LaTeX\ are unlikely to be used
+% and \LaTeX3 will handle |\end|'s in a different way so the following
+% invention does not seem useful. I wrote it mainly as an exercise so
+% that I could proudly say with the White Knight from Through the
+% Looking Glass, ``It's my own invention.''
+
+% \begin{macro}{\cweb@end_tokens}
+% When skipping around the |\end{document}| we have to catch the tokens
+% which are placed after |\endgroup|. For this purpose we establish a
+% new token register.
+% \begin{macrocode}
+\newtoks\cweb@end_tokens
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\cweb@report_error}
+% Before we start the job of catching tokens we prepare some macros. The
+% first of them will display our error message. Though we hope that the
+% catching algorithm will work with all \LaTeX's currently available, it
+% may according to Murphy's Laws happen that someone's obsolete (or
+% brand new) \LaTeX\ will break it. We do not want to bother the user
+% with strange error messages. We therefore supply ours. The text is
+% taken exactly from \cws. The macro will be issued from inside a group
+% therefore we take no care about restoring the original definitions.
+% \begin{macrocode}
+\def\cweb@report_error{\let\orig_errmsg=\errmessage
+ \def\errmessage##1{%
+ \errhelp={^^J%
+This style depends on an internal implementation detail of LaTeX.^^J%
+Sad to note, this detail has changed; you cannot use the cweb style.^^J%
+Please type "i\show\end" now. TeX will spit out a few lines of^^J%
+definitions and ask again for input. Type "x" then, this will finish TeX.^^J
+Then send the log file to the style's author, Joachim Schrod^^J%
+(Email: schrod@iti.informatik.th-darmstadt.de). He will adapt cweb.sty^^J%
+to the new LaTeX version.^^J}
+ \orig_errmsg{Sorry, you cannot use the cweb style with this LaTeX version}}
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\cweb@catch_tokens}
+% We also prepare the macro which will catch the tokens. This is an
+% incomplete assignment to the token register. Its function will be
+% explained later.
+% \begin{macrocode}
+\def\cweb@catch_tokens{\cweb@end_tokens=\bgroup}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\cweb_3_env}
+% \begin{macro}{\endcweb_3_env}
+% For catching the tokens we will invoke a very special environment with
+% the name |cweb_3_env|. \LaTeX\ would complain if the environment were
+% undefined. Therefore we place to |\cweb_3_env| everything which is
+% needed at the beginning of the catching job and similarly
+% |\endcweb_3_env| will contain the trap for the tokens. Notice that we
+% have to use |\@namedef| to define tags with such strange names.
+% \begin{macrocode}
+\@namedef{cweb_3_env}{\cweb@report_error}
+\@namedef{endcweb_3_env}{\aftergroup\cweb@catch_tokens}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+% \begin{macro}{\cweb@skip_end}
+% Now we can catch the tokens and define |\cweb@skip_end| accordingly.
+% First we write it and then explain how it works.
+% \begin{macrocode}
+\begin{cweb_3_env}
+{\egroup\end{cweb_3_env}}
+\expandafter\def\expandafter\cweb@skip_end\the\cweb@end_tokens{\cweb@check_fi}
+% \end{macrocode}
+% When we start the environment, \LaTeX\ will invoke our error reporting
+% macro. It is invoked inside a group as we have promised. The ending
+% command will tell \TeX\ that |\cweb@catch_tokens| should be carried
+% out after the end of group. When the group is closed (after some
+% checks), the tokens which stem from the expansion of |\end| are not
+% executed but stored in our token register. So we have to complete the
+% assignment. You might have temptation to just append |\egroup| after
+% the statement ending the environment. But beware! This will store
+% |\egroup| as the next token in |\cweb@end_tokens|. It will also eat up
+% the rest of the file. Fortunately we are redefining \cws\ so that the
+% official tags will do the job. We could start catching tokens with
+% |\bgroup| which is equivalent to \{ but we must put \} and nothing
+% else at the end of the assignment. We solve it by inserting an empty
+% group |{\egroup|. This is syntactically correct. In almost all
+% contexts \} and |\egroup| are interchangeable. So when \TeX\ scans the
+% text, it sees matched braces and when executing the macros it finds
+% balanced groups. The definition of |\cweb@skip_end| is now
+% straightforward. Isn't it a pretty nonsense code?
+% \end{macro}
+
+% \section{Bug corrections}
+% \begin{macro}{\egroup_}
+% A funny (and instructive) bug invaded into the definition of
+% |\CwebNumber|. This tag is defined in \cws\ where underscore is
+% recatcoded to letter. Therefore, what would work in a usual \TeX\
+% context, does not work here. We correct it by defining |\egroup_|
+% which will do the correct things. However, there is one more thing
+% which should be mentioned. When using NFSS, |\rm| has no effect in the
+% math mode. The easiest safe way for switching to roman alphabet from
+% inside math is to use |\hbox|. Placing |\,| as done in \cws\ seems
+% unpleasant to my eyes therefore I remove it. Please notice that the
+% catcode of underscore is restored to the original value within the
+% following definition.
+
+% {\bf Note from Joachim Schrod:}\quad This will not work any more
+% since the bug with the underscore has been repaired (one shouldn't
+% simply copy plain macros to \LaTeX{} code\,\dots). Nevertheless the
+% problem with NFSS remains. But I'm not (yet?)\ convinced that the
+% work-around presented here is the adequate solution. So the code is
+% here for reference, but it will not be used.
+
+% \begin{macrocode}
+\def\egroup_{\egroup\begingroup
+ \catcode`\_=\CatUsCode
+ \let\,=\relax
+ \def\rm{\reset@font\footnotesize}%
+ \cweb@egroup}
+
+\catcode`\_=\CatUsCode
+\def\cweb@egroup#1{_{\hbox{#1}}\endgroup}
+% \end{macrocode}
+% \end{macro}
+
+% \PrintIndex
+% \end{document}
+\endinput
+