The webfiles Package Version 1.0.1

Mark Potse ^{∗}

2002/03/05

1 Introduction

The webfiles package makes it possible to plug the documentation of CWEB^{1} and Spidery WEB programs into a L^{A}TEX document. One can include any number of webs by including the weave processor’s output with the command

\webfile[⟨options⟩]{⟨filename⟩}

where ⟨filename⟩ is the name of the .tex file (with or without the extension) that is output by the weave processor and ⟨options⟩ is a comma-separated list of options, as explained later. Of course, the webfiles package must be loaded:

     \usepackage[⟨options⟩]{webfiles}

in the preamble of the document. The package recognizes the same options as the \webfiles command.

This manual does not describe the usage of WEB systems themselves; they have their own manuals[1, 2, 3]. In what follows, it is assumed that you read at least one of them, but note that some of the information here overrides what was said there.

This package is based on the cweb style by Joachim Schrod (even this manual is based on his). Apart from the fact that, with this package, web’s are ‘plugged in’ while in Schrod’s style they are the main and only body, there is a number of differences:

1. This package can also work with Spidery webs.

2. The layout (determined by the document class and maybe other packages) is not changed.

3. Existing counters are not affected.

4. The section numbers in weave’s output are used.

5. The contents of all webs are listed in a “List of Programs”, if the user wishes so.

6. The user may choose if pagebreaks may occur inside sections. If not, the result is a ‘ragged bottom’.

7. A section is only printed if it is ‘on’. (Refer to the documentation of a WEB to see what ‘on’ means in this context.)

8. The multicol package is used, if present, to typeset the identifier index in two columns. Therefore a pagebreak between the identifier index and the list of refinements is no longer necessary. If multicol cannot be found, L^{A}TEX’s \twocolumn is used.

9. The index and list of refinements can be suppressed in the L^{A}TEX document.

10. Format (@f) statements can be suppressed in the L^{A}TEX document.

11. Support for hyperlinks is included, as well as direct support for PDFTEX.

∗Medical Physics Department, University of Amsterdam.

Email: M.Potse@amc.uva.nl

1version 3, this package does not work with older versions

2 §2 CUSTOMIZATION

1.1 The overall structure

The philosophy behind this package is that you, like it’s author, may wish to import more than one WEB program, maybe in more than one programming language, in a single L^{A}TEX document. With this package, you can regard to the .web file as just a part of your document, like the parts that you \include when writing a large document in more than one file, and in the documentation parts of the WEB program you can use all features of L^{A}TEX the way you would in that case.

CWEB Version 3.0 introduced the notion of a starred section’s “depth.” As in the layout produced by cwebmac.tex the depth value does only influence the web’s table of contents (and “List of Programs”), not the rendering of the title within the text. (cwebmac.tex is the original, plain-based macro package used to typeset CWEB sources; I refer henceforth to it as the “plain version.”)

The document structure is tagged in the mother document, with \section and such. Although it is not forbidden to use sectioning commands in the documentation part of the WEB program, it doesn’t seem useful to do so. The only place where a sectioning command could be useful is in the limbo section.

The ‘mother document’ must load the “webfiles” package:

     \usepackage{webfiles}

Then you can include a WEB program with the following command:

     \webfile{⟨filename⟩}

where ⟨filename⟩ is the .tex file that is output by a weave processor.

The resulting structure of the mother document is exemplified in figure 1. Text may be inserted anywhere inbetween the tags shown there.

1.2 Notes on running weave processors

• Recent versions of Levy & Knuth’s cweave should be run with the +e flag to work correctly with the webfiles package (if this flag is omitted, program code fragments between vertical bars in the documentation part will not be printed correctly).

• If cweave or a Spidery weave is run with the -x option, a (harmless) error message occurs about a file that “ended while scanning use of \end”.

2 Customization

Both the \webfile command and the \usepackage{webfiles} command accept an optional argument that may contain a comma-separated list of options. Options specified to \usepackage act as global defaults that can be overridden in the optional argument to \webfile. Therefore each option has an opposite. The recognized options are summarized in table 1, and discussed in the following sections. Other customizations are possible through the redefinition of macros and the setting of counters; the most important of these will be explained in this section.

2.1 The index and the list of refinements

An identifier index and a list of refinements are created at the end of each WEB document, if you didn’t call weave with the -x option^{2}. You can specify an introductionary text for the index with the tag \xwebIndexIntro, the introduction is the argument of this tag. To suppress generation of an identifier index, even when weave was not called with the -x option you can use an optional argument to the \webfile command; for example:

       \webfile[noindex]{foo}

To suppress identifier indexes in all web’s, use this option in the \usepackage command:

       \usepackage[noindex]{webfiles}

You can use the index option in the \webfile command to override this global default.

The same applies to the list of refinements, using the options reflist and noreflist.

2The ‘-x’ option suppresses output of the index and reflist—see the documentation.

             \documentclass{report}
             \usepackage{webfiles}
             \begin{document}
             \title{Three solutions for the Travelling Salesman problem}
             \author{Joe L. User}
             \maketitle
             \tableofcontents    % optional
             \listoffigures      % etc., optional
             \listofprograms     % optional
             \chapter{A PSPACE solution for the Travelling Salesman}
             \webfile{pspace}
             \chapter{The Travelling Salesman problem, solved by Simulated
               Annealing}
             \webfile{anneal}
             \chapter{A Neural Network solution for the Travelling Salesman}
             \webfile{neu_net}
             \appendix
             \chapter{The Travelling Salesman Problem, solved by telepresence}
             \input{internet-user}
             \end{document}

Figure 1: Exemplified document structure

2.2 The table of contents

Each web document gets its own table of contents. It can be suppressed with the nocon option; the opposite option is contents. You can produce the table of contents of any web document in any position with the \xwebContents command. This command takes one argument: the basename of the web document, and does not work with Spidery webs (yet^{3}).

The tables of contents are produced like all L^{A}TEX’s tables of contents etc., in the second L^{A}TEX run. They are stored in a file with name ⟨basename⟩.con, where ⟨basename⟩ is the basename of the web document.

2.3 The List of Programs

In addition to the table of contents there is a “List of Programs”, analogous to the “List of Figures” etc. that standard L^{A}TEX provides. The list can be produced with a

      \listofprograms

command, which can be placed at any position. It is customary to put it at the beginning of the mother document, after it’s table of contents. As with the List of Figures, the List of Programs is generated at the second L^{A}TEX run. It can list programs, main sections and normal sections; the default is to list only programs and main sections. You can control what goes into the list by setting the counter

xwebLopDepth:

3I consider releasing a revised version of Spider that is more compatible with CWEB, and has less bugs

option  opposite  effect
index*  noindex  print identifier index
noindex        index  don’t print identifier index
reflist* noreflist print List of Refinements
noreflist      reflist  don’t print List of Refinements
contents* nocon print table of contents
nocon          contents  don’t print table of contents

allsections* onlychanges print all sections

onlychanges    allsections print only changed sections

showformats* hideformats show @f declarations
hideformats    showformats don’t show @f declarations

raggedbottom* flushbottom try not to break modules across pages

flushbottom raggedbottom try to create a flush bottom, break modules if neces-

sary

hyperref       nohype  make hyperlinks using hyperref package
pdftex         nohype  make hyperlinks and PDF outlines with PDFTEX
nohype* … no hyperlinks

nofiles writefiles dont’t write a contents file (equivalent to setting

                              \setcounter{xwebLopDepth}{-9}).

writefiles*  nofiles  do write a contents file. (equivalent to setting

                              \setcounter{xwebLopDepth}{9}).

Table 1: Webfiles options. Defaults are tagged with a *.

• Normal sections get into it if xwebLopDepth is greater than or equal to 10.

• All starred sections that have a depth smaller than xwebLopDepth will be mentioned.

• Programs will be mentioned unless xwebLopDepth is smaller than or equal to −10.

By setting xwebLopDepth inbetween \webfile commands you can handle each WEB file differently, if you wish. The default value is 9. It is a L^{A}TEX counter, so its value can be changed using the \setcounter

and \addtocounter commands.

The PDF outline (if you use PDFTEX) can be controlled in the same way, using the counter xwebOutlineDepth, except that normal sections never get into the outline.

The entries for the List of Programs are put into the file “⟨jobname⟩.lop”, where ⟨jobname⟩ is the jobname that TEX chose for the mother document (usually the name of the .tex file, without the extension). Edit this file only if you’re desparate, as with the .toc and .lof files etc.

2.4 Newpages

The default behaviour of the webfiles package is never to break sections across pages if they fit on a single page. If sections may be broken across pages, the webfiles package is able create ‘flush bottom’ pages. To enable this, specify the flushbottom option to the \webfile or the \usepackage command. To re-enable the default behaviour locally, specify the raggedbottom option.

A main section can start a new page regardless if it will fit on the current one. To change this behaviour, set the counter xwebSecNoEject, which keeps the lowest group level where no new page is started at a main section. The default is 3. It is a L^{A}TEX counter, so its value can be changed using the

\setcounter and \addtocounter commands.

2.5 Hyperlinks

If the hyperref option is specified, all module references are turned into hyperlinks using the hyperref package[4]. To use this feature, you have to import the hyperref package yourself, before importing the webfiles package, e.g.:

\usepackage[hypertex]{hyperref}

§3 PROBLEMS AND RESTRICTIONS 5

      \usepackage[hyperref]{webfiles}

Alternatively, with the pdftex option, direct support for PDFTEX can be enabled. This provides the same look and feel as the pdfcwebmac macros, including the ‘PDF Outline’, but of course works only with PDFTEX.

Both types of hyperlinked references can be switched off with the nohype option.

2.6 Output in other languages

WEB documentation can contain a few—predefined—informal texts. As in the plain version, you can change these texts, for example to obtain output in an other language than English, by redefining some macros. The macro names concerned are listed below, together with their default definitions.

    \def\xwebIndexName{Index of \xwebJobname}
    \def\xwebReflistName{List of Refinements in \xwebJobname}
    \def\xwebCRAlso{\xwebCrossRef{See also section}}
    \def\xwebCRsAlso{\xwebCrossRef{See also sections}}
    \def\xwebCRCite{\xwebCrossRef{This code is cited in section}}
    \def\xwebCRsCite{\xwebCrossRef{This code is cited in sections}}
    \def\xwebRLCite{\xwebCrossRef{Cited in section}}
    \def\xwebRLsCite{\xwebCrossRef{Cited in sections}}
    \def\xwebCRUse{\xwebCrossRef{This code is used in section}}
    \def\xwebCRsUse{\xwebCrossRef{This code is used in sections}}
    \def\xwebRLUse{\xwebCrossRef{Used in section}}
    \def\xwebRLsUse{\xwebCrossRef{Used in sections}}
    \def\xwebCRChanged{%
       \xwebCrossRef{The following sections were changed by the change file:}%
       \let\*\relax}
    \def\xwebCREt{ and~}
    \def\xwebCRsEt{, and~}
    \def\xwebLopName{List of Programs}
    \def\xwebTocName{Contents of \xwebJobname}
    \def\xwebRefMacrosHere{Preprocessor Definitions}
    \def\xwebSectionName{Section}
    \def\xwebPageName{Page}

2.7 Documenting changefiles

If a web file is included that has some sections changed by a changefile you can have the \webfile command print only the changed sections by giving the onlychanges option. As with all options, this option can also be given to the \usepackage command. Its opposite option is allsections. Specifying onlychanges is equivalent to saying \let\maybe=\iffalse in the plain version.

2.8 Miscellaneous

You can control the appearance of web section numbers by redefining the appearance of \thexwebModule. Its default definition is \arabic{xwebModule}.

With the noformats option, you can suppress the printing of @f specifiers. (In cweb, you can also use @s instead of @f, that way you can control which format specifiers get printed and which don’t).

3 Problems and Restrictions

Restrictions:

• Please be aware that the vertical bar (‘|’) is used by WEB to delimit small program code pieces in the documentation parts, and is therefore processed by weave. You cannot use it for L^{A}TEX anymore.

In particular, you cannot specify rules for the tabular or the array environment. Since you probably want to do so: You have two choices left:

1. Make sure you have the array package (by Frank Mittelbach and David Carlisle) installed. Then you may use the package cwebarray, it defines ‘I’ (that’s an uppercase i) as a specifier for rules. I.e., instead of

                         \begin{tabular}{l|l}

you have to write

                         \begin{tabular}{lIl}

2. Use ‘^^7c’ instead of ‘|’. I.e., instead of \begin{tabular}{l|l} you may write

         \begin{tabular}{l^^7cl}.

These two choices are compatible, you may use both in one document. Needless to say, I consider the first alternative the better one.

• One cannot use restricted program mode in moving arguments. Most notably, this is annoying in the titles of starred sections and in \caption tags.

• Neither a refinement name nor an index entry made by @^may consist of a single dot-accented term. I.e., you must not write ‘@<\.O@>’, ‘@^\.o@>’, or even ‘@^\.{foolish}@>’. Of course you

     may write ‘@^\.o accent@>’ or ‘@< Handle accent \.o @>’.

• If weave is run with the -x option, a (harmless) error message occurs about a file that “ended while scanning use of \end”.

3.1 Reserved Control Sequences

The following tags are reserved and must neither be used nor redefined:

     \ATL
     \B
     \M
     \N
     \PB
     \Y

\9 is already explained in the CWEB user manual: It’s a special control sequence used for the index entries tagged with ‘@:’. Its default definition is setup in such a way that you can cheat weave concerning the sort order of this entry: If you enter ‘@:sort}{print@>’ you will get an index entry “print” next to the place where the index entry “sort” would be. But you’re allowed to change this default definition.

The names of all other control sequences defined by this package—besides the common L^{A}TEX control sequences—start with xweb. Please don’t define new control sequences starting with this prefix. (The control sequences that don’t have a ‘@’ or ‘_’ in them may be redefined to change the appearence of the WEB document, check the implementation’s documentation for their meaning.)

3.2 Problems

Since this is still a test version of the package, there are some known bugs and problems.

Known Bugs:

• The presentation of @l redefinitions is not proper. But it wasn’t in the plain version, either.

Problems:

§4 TEXNICAL DATA 7

• One cannot use an other basic font size than 10 pt. A few symbol definitions and layout parameters depend on this.

• C^{++} comments in CWEB (i.e., from // to the end of the line) are typeset as C comments. This is especially bad if they are used for a whole block of comment lines, as it is quite common. Please put such comment blocks in the documentation part.

4 TEXnical Data

WEB programmers who used the plain version before should note that the macros from cwebmac.tex and webkernel.tex are not available anymore. E.g., you cannot use \. to typeset typewriter material; use either \texttt or \verb, as it fits the situation. On the other hand, now you’re able, for example, to use \. for the dot accent, \\ will be the newline again (as usual in L^{A}TEX), you can define \C++ for the C^{++} logo, etc.

Another detail for ex-plainies: The “List of Programs” that replaces the table of contents is produced by the \listofprograms tag (during the second L^{A}TEX run), not automatically. But this is the standard L^{A}TEX way of handling such things.

There are now two kinds of indexes, both optional: Those that are created by weave, which come at the end of each WEB program, and the index of the mother document, that is, the one that is created with \index commands and the theindex environment (possibly with the help of MakeIndex[5]). There are no problems in using these together, but it’s for you to decide in which of them the entries must go that you specify yourself. You may, with a few definitions, get the indexes of the WEB files into the index of the mother document.

The modules are put in a new environment, called xwebModule. They are not made into \sections and such, and they are numbered in a single layer, in exactly the same way as in the plain version, so that the cross-reference information output by weave will always be right. (It refers literally to the section numbers.)

You can change this, e.g., you can let xwebModules be \sections, but you’ll have to change the way cross-references are printed too. For more information, consult the documentation[6].

The webfiles package is documented with the doc package, and uses docstrip to create its .sty files. See the L^{A}TEX Companion or the README file that goes together with the webfiles package for instructions on how to use these to change the sources or produce typeset documentation.

This package reserves the namespace xweb.

4.1 Files

webfiles.sty is the main package file. It suffices to handle CWEB files.

cwebmac.tex is the macro package that is input on the first line of the .tex file that cweave creates. It contains macros that enable TEX to handle CWEB, but it can see if it’s being input by L^{A}TEX (instead of TEX), and, if so, it won’t define anything.

xweb.tex is the file that is input on the first line of output of xweave, where xweave is a Spidery weave. It inputs webkernel.tex, and defines additional macros that are specific for xweb. The person that made xweb should make sure that these macros work with L^{A}TEX too.

webkernel.tex is input by xweb.tex; it is the Spidery analogon of cwebmac.tex, but it contains no language-dependent macros: These are concentrated in the xweb.tex files. If webkernel.tex sees that it is being input by L^{A}TEX, it inputs swebbind.sty, and doesn’t define anything, else it defines the macros that enable TEX to handle a Spidery WEB.

swebbind.sty contains redefinitions of some macros in webfiles.sty that make them able to handle Spidery WEBs.

   webfiles.sty and swebbind.sty are supplied with the webfiles package. So is webkernel.tex;

this file replaces the file of the same name that goes together with Spider. The xweb.tex files are supplied with their respective (Spidery) WEBs. cwebmac.tex is supplied with CWEB.

8 §6. THE DOCUMENTATION DRIVER.

4.2 Bug reports

If you have any comments on the webfiles package that may be of interest to others, please report them to the author:

Mark Potse

Medical Physics department, Academic Medical Center Meibergdreef 15, 1105 AZ Amsterdam, The Netherlands.

     email: M.Potse@amc.uva.nl

You may be able to fix bugs or customize the package after consulting the documentation that goes together with this manual.

5 Acknowledgements

Most of the code in this package was shamelessly stolen from the cweb style by Joachim Schrod (even this manual is based on his). Thanks to Andreas Scherer and Amelie Stein for useful comments. And if God had not given us TEX it would have been necessary to invent it.

6. The documentation driver.

The webfiles package is documented with docstrip. This code will generate the documentation. Since it is the first piece of code in the file, the documentation can be obtained by simply processing this file with L^{A}TEX 2ε.

1 ⟨∗driver⟩

 2 \documentclass[twoside]{ltxdoc}
 3 \usepackage{xwebdoc,array,cwebarray}
 4 \pagestyle{headings}
 5 \renewcommand\MakePrivateLetters{\makeatletter\catcode`\_=11\relax}
 6 \IndexPrologue{\section*{Index}%
 7 \markboth{Index}{Index}%
 8  The italic numbers denote the code lines where the corresponding
 9  entry is described, underlined numbers point to the definition,
10  all others indicate the places where it is used.}
11 \EnableCrossrefs
12 \CodelineIndex % \RecordChanges
13 % \OnlyDescription

14 ⟨/driver⟩

6.1 The RCS version number is extracted from the keyword string and joined with the manually-set major version number. The complete version number is also written in “version.tex” for use in the Makefile.

15 ⟨∗driver | main⟩

16

17 %%
18 %% $Id: webfiles.dtx,v 2.1 2002/03/05 10:38:14 potse Exp $
19 %%

20

21 \begingroup
22 \catcode`\$=9  % ignore $
23 \gdef\xwebMajorNr{1.0.}
24 \def\setversion#1:#2.#3:{\xdef\xwebVersion{\xwebMajorNr #3}}
25 \setversion $Revision: 2.1 $:
26 \def\setdate#1: #2/#3/#4#5#6:#7:#8;{\gdef\xwebDate{#2/#3/#4#5}}

27 \setdate $Date: 2002/03/05 10:38:14 $;
28 \newwrite\vf \immediate\openout\vf=version.tex
29 \immediate\write\vf{\xwebVersion}\immediate\closeout\vf
30 \endgroup

31 ⟨/driver | main⟩

6.2 After that, the document can be input by the driver.

32 ⟨∗driver⟩

33 \begin{document}
34 \DocInput{webfiles.dtx}
35 \PrintIndex
36 % \PrintChanges
37 \end{document}

38 ⟨/driver⟩

10 §7 IMPLEMENTATION.

7 Implementation.

The implementation is still somewhat messy.

A good explanation of the vocabulary used here is given by Schrod in the implementation of the cweb style:

Before we start with an overview of the implementation I want to explain the CWEB vocabulary I use while I guide you through this document. The commonly used terms sometimes denote two entities, but for the purpose of this style we need exact terms. I’ve tried to stick to a “canonical” computer science terminology.

I distinguish two different structures in a CWEB file: The document structure and the program structure.

A CWEB document consists of a series of sections. Within this series some sections are especially emphasized, we call them the main sections. (They are also called starred sections, since their corresponding CWEB tag is @*.) These main sections have a title, ordinary sections are untitled. A table of contents may therefore list only the main sections. Note that there is no hierarchy in the sections, they are all on the same level, i.e., they are numbered subsequently.

Each section consists of three parts: (1) the documentation part, (2) the definition part, and (3) the program part. Each of these parts can be empty. The documentation part is mostly text with L^{A}TEX tags. In this text material from restricted program mode can appear. The definition part consists of a series of either macro or format definitions. The program part is one piece of a refinement, identified by a name (see below).

A CWEB program consists of a tree of refinements. A refinement is a list of program parts with the same name, ordered in appearence. The root of the tree is the refinement with the special name @c. The program text is defined by the DFS (i.e., infix-order) traversal of the tree.

7.1 Before we start we declare some names for category codes. By declaring the underscore ‘(_)’ as letter we can use it in our macros. As this is a L^{A}TEX package the at sign is a letter anyhow; so we can use the “private” plain and L^{A}TEX control sequences; and with the underscore we can make our own control sequences (cseqs for short) more readable. Since we have to restore this category code at the end of this macro file, we save its former value in the control sequence \xwebCatUsCode. This method is better than to use a group, not all cseqs must be defined global this way.

39 ⟨∗main | spider⟩

40 \catcode`\@=11
41 \chardef\xwebCatUsCode=\catcode`\_% top level macro file!
42 \catcode`\_=11 % Catcode letter
43 \chardef\xwebCatEscape=0
44 \chardef\xwebCatOpen=1
45 \chardef\xwebCatClose=2
46 \chardef\xwebCatIgnore=9
47 \chardef\xwebCatLetter=11
48 \chardef\xwebCatOther=12
49 \chardef\xwebCatActive=13

50 ⟨/main | spider⟩

7.2 Let’s identify this package against the user and in the Log file.

51 ⟨∗main⟩

52 \ProvidesPackage{webfiles}
53 \begingroup
54  \typeout{LaTeX package `webfiles', version \xwebVersion, \xwebDate}
55 \endgroup

56 ⟨/main⟩

7.3 The very first (alpha) version of the cweb style was a style option. The version on which the webfiles style is based was a full style. webfiles.sty itself is an option again, and since the author has L^{A}TEX 2ε, it has become a package. Therefore we test if a documentclass was chosen (by testing if \section is defined).

57 ⟨∗main⟩

58 \ifx \section\undefined
59  \PackageError{webfiles}{`webfiles' is a package, not a class}{%
60  webfiles is not a document class, but only a package.
61  Please adapt your documentclass tag appropriately.
62  I.e., write \MessageBreak
63  \protect\usepackage{webfiles} instead of
64  \protect\documentclass{webfiles}.}
65 \fi

66 ⟨/main⟩

12 §8 OPTIONS.

8 Options.

The package options may be used in the optional argument of the \usepackage command, or in the optional argument of the \webfile command. In the second case, they only apply to a single web. We keep track of the choices with logical variables and a count register, each having a global and a local variant.

67 ⟨∗main⟩

68 \newif\ifxweb_GlobalIndex \newif\ifxwebIndex
69 \newif\ifxweb_GlobalRef    \newif\ifxwebRef
70 \newif\ifxweb_GlobalRagged \newif\ifxwebRagged
71 \newif\ifxweb_GlobalOC
72 \newif\ifxweb_GlobalHideFormats \newif\ifxwebHideFormats
73 \newif\ifxweb_GlobalCon    \newif\ifxwebCon
74 \DeclareOption{index}{\xweb_GlobalIndextrue}
75 \DeclareOption{noindex}{\xweb_GlobalIndexfalse}
76 \DeclareOption{reflist}{\xweb_GlobalReftrue}
77 \DeclareOption{noreflist}{\xweb_GlobalReffalse}
78 \DeclareOption{raggedbottom}{\xweb_GlobalRaggedtrue}
79 \DeclareOption{flushbottom}{\xweb_GlobalRaggedfalse}
80 \DeclareOption{onlychanges}{\xweb_GlobalOCtrue}
81 \DeclareOption{allsections}{\xweb_GlobalOCfalse}
82 \DeclareOption{nocon}{\xweb_GlobalConfalse}
83 \DeclareOption{contents}{\xweb_GlobalContrue}
84 \DeclareOption{hideformats}{\xweb_GlobalHideFormatstrue}
85 \DeclareOption{showformats}{\xweb_GlobalHideFormatsfalse}

86

87 \newcount\xweb_hypertype
88 \newcount\xweb_GlobalHypertype
89 \DeclareOption{hyperref}{\xweb_GlobalHypertype=1}
90 \DeclareOption{pdftex}{\xweb_GlobalHypertype=2 \input pdfcolor}
91 \DeclareOption{nohype}{\xweb_GlobalHypertype=0}

92

93 \newcounter{xwebLopDepth}  \setcounter{xwebLopDepth}{9}
94 \newcounter{xwebOutlineDepth}  \setcounter{xwebOutlineDepth}{9}
95 \DeclareOption{nofiles}{\c@xwebLopDepth=-9}
96 \DeclareOption{writefiles}{\c@xwebLopDepth=9}
97 \ExecuteOptions{index,reflist,raggedbottom,allsections,%
98  contents,showformats,nohype,writefiles}

99 ⟨/main⟩

§9 THE INTERFACE BETWEEN CWEAVE AND TEX. 13

9 The interface between cweave and TEX.

Here we present all tags output by cweave^{4} in an ordered fashion. First we look at those tags which are part of the ‘protected interface,’ ie, they are visible to a CWEB user, but he must not use them. Then we consider the private tags, some are used in the documentation part, others are needed to typeset program code, and there are a few tags for typesetting special characters in strings.

9.1 Some tags output by cweave are part of the protected interface even though they are not prefixed by cweb. We’ll present them in the order they’ll arrive in the document instance.

The following table specifies in the second column if this tag takes arguments. If the entry is nonempty, it’s either a number listing just how many arguments are expected; then usual argument passing is used. Or it displays the context required.

      \ATL   #1␣#2␣  CWEB operator: @l

(how to output non-ASCII chars in ctangle)

Arg. 1: hex code of mapped character Arg. 2: string output by ctangle

\M  1 CWEB structure tag: start of a section

Arg. 1: section number

\N    #1#2#3.  CWEB structure tag: start of a section group

Arg. 1: group depth, 0 ≤ #1 Arg. 2: section number Arg. 3: section group name

\PB  1 restricted program mode material

Arg. 1: program code

\Y  between major pieces of a program part
\B  start program material
\fi             CWEB structure tag: end of a section
\9  1 index entry, user defined layout

Arg. 1: text of index entry

\ATL does only appear in front of the very first section. The section number is an explicit TEX number which might be followed by a ‘changed flag’ (see section 9.3). Note the usage of \fi, ie, each section must open an according \if. \PB might appear within its own argument (created by restricted program mode material in a refinement name within restricted program mode).

\9 deserves a further explanation: It is expected, though not defined, that it expands to an empty token list. The parameter will be a sort key, actually; the real key to be typeset will appear afterwards. So a CWEB user might index TEX as ‘@:TeX}{\TeX@>’, the index will feature it in the “T” section, not in the “\” section.

With the exception of \PB the tags above will not appear in math mode.

9.2 The following tags might appear to be public ones, but they are, in fact, never used. That’s because they will be placed after the \fi which terminates the last section. The tags are given with their respective meaning in the Plain version:

\ch         #1. Note which sections are changed

Arg. 1: list of section numbers, like in \U and such.

\inx  Create index
\fin  Create the table of refinement names
\con  Create the table of contents
\vfill\end  output if index and all lists were suppressed

4This information refers to CWEB 3.0.

9.3 Some tags appear only in special circumstances and may therefore be considered as private tags. The largest part of them concern the tagging of program code, we’ll have a look at them later. First we present the tags used in other areas.

Lists of section numbers occurs on several places: At the section start (where the list has actually only one element), within refinement names, in the identifier index, and for cross reference purposes. Cross references can be made at the end of a section, and in the refinement name list at the very end. Everywhere where a section number can occur it can be followed by a tag which shows that this section was changed by the changefile.

\*  tag after section number: this section is changed.

Within the identifier index we have also special tags. The identifiers are tagged like in the program mode, ie, with \\ and \&. Remember that \9, listed above, appears also in the index.

\I  #1,␣ start of an index entry

Arg. 1: index entry

\[   #1] underlined section number in index

Arg. 1: section number

\.  1 @. index entry

Arg. 1: index entry

In the list of refinement names the entries are marked similar to the index entries. But note that \I has no arg here.

\I  start of a new refinement name

9.4 OK, now we can have a look at the large amount of tags used for tagging program code. First, we have those which represent directly C or C^{++} tokens.

\?  C operator: conditional expression
\AND  C operator: logical and
\CM  C operator: binary complement
\DC  C^{++} operator: scope resolution
\E  C operator: equivalence

and equivalence sign after refinement name on it’s definition

\G  C operator: greater or equal
\GG  C operator: shift right
\I  C operator: not equal
\K  C operator: assignment
\LL  C operator: shift left
\MG  C operator: pointer to struct component
\MGA  C^{++} operator: pointer to pointer to member
\MM  C operator: decrement
\MOD  C operator: modulo (actually, remainder)
\NULL  ‘quoted’ identifier
\OR  C operator: binary or
\PA  C^{++} operator: pointer to member
\PP  C operator: increment
\R  C operator: logical negation
\this  ‘quoted’ identifier
\TeX  ‘customized’ identifier
\V  C operator: logical or
\W  C operator: logical and
\XOR  C operator: binary exclusive or
\Z  C operator: less or equal

Other tokens have variable parts, passed as arguments.

\.  1 C string

Arg. 1: string

\)  discretionary break between string parts
\&  1 reserved identifier

Arg. 1: identifier

\\  1 “normal” identifier with more than one chars

Arg. 1: identifier

\|  1 “normal” identifier with one char

Arg. 1: character

\C  1 C comment

Arg. 1: comment text

\MRL  1 C operator: combined binary operators

Arg. 1: operators, \K must print as ‘=’

\SHC  1 C^{++} comment

Arg. 1: comment text

\T  1 numeric constants

Arg. 1: constant

\X    #1: #2\X refinement name

Arg. 1: section number Arg. 2: refinement name

The refinement name (second argument of \X) may be a file name tagged by ‘\.’. Then the name must be set like a C string.

CWEB itself introduces its own operators:

\ATH      @h (place the preprocessor definitions here)
\D        @d (define macro)
\F        @f (format identifier like another one)
\J        @& (join)
\vb 1 @= (pass arg verbatim by ctangle)

Arg. 1: string

And we have some tags used for cross referencing. Section cross-referencing (actually, for program parts) is started with some tag, then follows a list of section numbers.

\A  one add-on definition (“See also section”)
\As  more than one add-on definition (“See also sections”)
\ET  separator between the last two numbers if there are only two
\ETs  separator between the last two numbers if there are more than two
\Q  the section where it is cited (“This code is cited in section”)
\Qs  more than one section where it is cited (“This code is cited in section”)
\U  used in one section (“This code is used in section”)
\Us  used in more than one section (“This code is used in sections”)

Program code must be indented according to its structure. Each “larger” statement is typeset as one paragraph, usually only one line long. The basic indentation of the next statement may be incremented and decremented in given units. If a statement has to be broken in more than one line nevertheless, a hanging indentation is added to the basic indentation for the subsequent lines. One can mark an ‘optional’ statement start, ie, some kind of optional paragraph start. If a line break must be inserted it should be inserted here and no hanging indentation should be added to the basic indentation.

\1  future stmts indented one more unit
\2  future stmts indented one less unit
\3 1 optional line break within a statement

Arg. 1: digit, penalty for line break

\4  backspace one indentation unit
\5  optional line break or small space (between run-in statements)
\6  line break
\7  line break and additional vertical space
\8  line is a preprocessor directive (must be issued at start of line)

9.5 Some args are designated as strings above. Within these args the following tags are used to represent special characters:

\␣  space
\&  ampersand
\\  backslash
\^hat
\_underscore
\{  left brace
\}  right brace
\~  tilde

9.6 Last, we have tags which are used in their “standard” L^{A}TEX meaning. We don’t have much work with them:

\#  hash mark in program or in string
\$  dollar
\%  percent
\{  block start (is set in math mode)
\}  block end (is set in math mode)
\,  thin space (like the L^{A}TEX default)
\langle  left delimiter in include directives, or in templates
\le  C operator: less or equal
\ldots  Function protoypes: Variable number of arguments
\rangle  right delimiter in include directives, or in templates

§10 PROCESSING STATES. 17

[figure: Documentation; Restricted; Program; (CR) Cross; Reference; TEX; Program; \SHC; \C \X; \A \Q; \U; \X; \PB; \PB; \B; \M \N; \M \N; \ch]

Figure 2: The processing state’s FSA. The automaton starts and ends in the “documentation” state.

10 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.

1. A section starts in the documentation state.

2. \B switches to program state. This can happen in documentation and program state.

3. While we process the argument of \PB we’re in 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.

4. In the arguments of \C, \SHC, and \X we switch to 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 cseqs are bound to the meaning described here.

5. Cross reference information are attached to most sections with refinements. This information is processed in CR state. After CR state material comes always the next section or the document end, i.e., material in documentation state.

This FSA is illustrated by the diagram in figure 2.

\xweb_documentation will switch to documentation state, \xweb_program to program state, \xweb_Rprogram to restricted program state, \xweb_tex to TEX state, and \xweb_CR to CR state. If we’re already in a state, the switch to this state shall be a permissible null operation.

10.1 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 CWEAVE bindings. In the other two states the tags are largely defined by the user, the tag set is called the 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 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 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.

State  Binding Layout
documentation  U  D
program  C  P
restricted program  C
TEX  U
CR  C  D

10.2 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 \xweb_CweaveBindings and \xweb_ProgramLayout, we redefine \xweb_UserBindings and \xweb_DocLayout. 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.

100 ⟨∗main⟩

101 \let\xweb_UserBindings=\relax
102 \let\xweb_DocLayout=\relax
103 \def\xweb_documentation{%
104 \xweb_UserBindings
105 \xweb_DocLayout}
106 \def\xweb_Rprogram{%
107 \xweb_CweaveBindings}
108 \def\xweb_program{%
109 \xweb_CweaveBindings
110 \xweb_ProgramLayout}
111 \def\xweb_tex{%
112 \xweb_UserBindings}
113 \def\xweb_CR{%
114 \xweb_CweaveBindings
115 \xweb_DocLayout}

116 ⟨/main⟩

§11 SAVING AND RESTORING CONTROL SEQUENCES. 19

11 Saving and restoring control sequences.

We have a lot of cseqs which are defined within the namespace of this package 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 got 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. 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 foo , is saved as the cseq with the name xweb s \foo , i.e., as

\csname xweb\_s\_\string\foo\endcsname.

11.1 The save process is not done statically, but by the macro \xweb_rebind which interprets a list of tuples (old name, new name), terminated by the tuple (\stop, \stop). Eventually it constructs two new lists, \xweb_ToRestore with the cseqs which had a binding, and \xweb_undefined with the names which didn’t have one.

The saving is actually done by \xweb_SaveBinding, \xweb_rebind is responsible for the initialization, \xweb_DoRebind for the effective rebinding and the tail recursion on the list.

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.

117 ⟨∗main⟩

118 \newtoks\xweb_undefined
119 \newtoks\xweb_ToRestore
120 \def\xweb_rebind{%
121  \xweb_undefined{}%
122  \xweb_ToRestore{}%
123  \xweb_DoRebind

124 }

125 \def\xweb_DoRebind#1#2{%
126  \ifx #1\stop
127  \let\next\relax
128  \else
129  \xweb_SaveBinding #2%
130  \let #2=#1%
131  \let\next\xweb_DoRebind
132  \fi
133  \next

134 } 135 ⟨/main⟩

11.2 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.”

TEXnical note: The cseq-name for the saved binding must be created before the \let is executed.

136 ⟨∗main⟩

137 \def\xweb_SaveBinding#1{%
138  \ifx #1\undefined
139  \xweb_undefined \expandafter{\the\xweb_undefined #1}%
140  \else
141  \expandafter\let \csname xweb_s_\string#1\endcsname =#1%

142  \xweb_ToRestore \expandafter{\the\xweb_ToRestore #1}%
143  \fi

144 } 145 ⟨/main⟩

11.3 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 \xweb_undefine and \xweb_RestoreBinding iterate over a list of cseqs terminated by \stop.

And here the \next assignment could be prepended to the loop as well.

146 ⟨∗main⟩

147 \def\xweb_RestoreBindings{%
148  \expandafter\xweb_undefine \the\xweb_undefined \stop
149  \xweb_undefined{}%
150  \expandafter\xweb_RestoreBinding \the\xweb_ToRestore \stop
151  \xweb_ToRestore{}%

152 }

153 \def\xweb_undefine#1{%
154  \ifx #1\stop
155  \let\next\relax
156  \else
157  \let#1\undefined
158  \let\next\xweb_undefine
159  \fi
160  \next

161 } 162 ⟨/main⟩

11.4 TEXnical note: As in \xweb_SaveBinding, the cseq-name for the saved binding must be created before the \lets are executed.

Another \next assignment.

163 ⟨∗main⟩

164 \def\xweb_RestoreBinding#1{%
165  \ifx #1\stop
166  \let\next\relax
167  \else
168  \expandafter\let \expandafter#1\csname xweb\string#1\endcsname
169  \expandafter\let \csname xweb_s_\string#1\endcsname \undefined
170  \let\next\xweb_RestoreBinding
171  \fi
172  \next

173 } 174 ⟨/main⟩

§12 HYPERLINKS. 21

12 Hyperlinks.

Because at least two implementations of hyperlinks are supported, it is most convenient to define private macros for hyperlinks and hypertargets. Their definition depends on \xweb_hypertype and must therefore be performed as part of the \webfile command, after the options are processed. (This is more efficient than testing \xweb_hypertype again for each link.)

The anchor name depends on the current value of the xwebModule counter; this value must be set

 before \xweb_hyperlink or \xweb_hypertarget is used.

175 ⟨∗main⟩

176 \def\xweb_anchor{xwebmod:\xwebJobname:\arabic{xwebModule}}
177 \def\xweb_SetupHrefs{
178 \ifnum\xweb_hypertype=0
179  \def\xweb_hlink##1{##1}
180  \def\xweb_htarget##1{##1}
181 \else\ifnum\xweb_hypertype=1
182  \def\xweb_hlink##1{\hyperlink{\xweb_anchor}{##1}}
183  \def\xweb_htarget##1{\hypertarget{\xweb_anchor}{##1}}
184 \else\ifnum\xweb_hypertype=2
185  \def\xweb_hlink##1{\xweb_pdflink{\xweb_anchor}{##1}}
186  \def\xweb_htarget##1{\xweb_pdftarget{\xweb_anchor}{##1}}
187 \else\PackageError{webfiles}{This can't happen.}{%
188  this may be a bug in the webfiles package}
189 \fi\fi\fi}
190 \xweb_SetupHrefs

191 ⟨/main⟩

22 §13 PDFTEX SUPPORT.

13 PDFTEX support.

PDFTEX is an implementation of TEX that has the ability to output pdf instead of dvi. It has some extra primitives, that control pdf-specific things, such as hyperlinks, colours, and ‘outlines’.

13.1 The outline is a kind of table of contents, that is always present at the left side of the pdf reader window (if the user wishes so). Web documents and main sections get outline entries.

192 ⟨∗main⟩

193 \def\xwebPDFOutline#1#2{{%
194  \edef\tmpnr{#1}%
195  \edef\name{#2}%
196  \c@xwebModule=\tmpnr\relax
197  \ifnum\xweb_hypertype=2
198  \edef\anchor{\xweb_anchor}
199  \pdfoutline goto name{\anchor}{#1 \name}
200  \fi}}

201 ⟨/main⟩

13.2 PDF links are implemented using code copied from pdfcwebmac.tex, with fixes from Andreas Scherer. The raised \hbox is to ensure that the top line of the module will be entirely visible. It must be \smashed to avoid spurious vertical material.

202 ⟨∗main⟩

203 \def\xweb_pdflink#1#2{%
204  \pdfannotlink
205  attr{/Border [0 0 0]}
206  goto name{#1}
207  \Blue #2\Black
208  \pdfendlink}
209 \def\xweb_pdftarget#1#2{
210  \smash{\raise\baselineskip\hbox to 0pt{\pdfdest name{#1} fith}}
211  #2}

212 ⟨/main⟩

§14 SECTIONS. 23

14 Sections.

We distinguish between main sections with titles which start a group of sections and normal (untitled) sections within a group. All sections are numbered sequentially by cweave. The section numbers are output in boldface at the very start of a section, followed by a dot and a quad. The changeflag is a star lapping to the right.

213 ⟨∗main⟩

214 \def\xwebLapStar{\rlap{*}}

215 ⟨/main⟩

14.1 Important main sections are (optionally) started on a new page, normal sections have approximately two picas vertical space in front. The very first main section does not automatically start on a new page since a title may be in front of it.

The user may also add a “level” to the title of a main section. A newpage is inserted before a section if its level is smaller than the value of the counter xwebSecNoEject which has default value 3. And we will pay attention to this group level when we create a table of contents.

The title of a main section is set as a heading after the section number, also in bold face. The first paragraph of the following documentation has no indentation. The documentation part of normal sections is run in after the section number.

216 ⟨∗main⟩

217 \newcount\xwebGroupLevel
218 \newcounter{xwebSecNoEject}
219  \setcounter{xwebSecNoEject}{3}

220 ⟨/main⟩

14.2 The section number that is supplied by cweave is used to set the counter xwebModule. This is necessary because the section numbers can be non-sequentially, for example, if only changed sections are printed, or if an excerpt from a web is taken. By using a counter, the appearance of the number is made changeable in the normal L^{A}TEX way through redefinition of \thexwebModule. The number can contain a star, to indicate that the section is changed by a changefile. In that case, \ifon is made true; else it will be \maybe, and by redefining \maybe the user can decide wether non-changed sections should be printed. The default behaviour is to print them. This weird interface is copied from the plain version, but this package adds a friendlier interface.

This is all implemented in the macro \xweb_PrepareSection, which is used before each section. This macro also changes to documentation state.

221 ⟨∗main⟩

222 \newcounter{xwebModule}
223 \newif\ifon % determines if the section is `on'
224 \def\onmaybe{\let\ifon=\maybe} % analogous to \ontrue
225 \let\maybe=\iftrue  % initial meaning; the user can say "\let\maybe=\iffalse"
226 \def\xweb_PrepareSection#1{%
227 {\xdef\secstar{#1}%
228  \let\*=\empty%  remove \* from the number
229  \xdef\xweb_secno{#1}}
230 \ifx\xweb_secno\secstar % if they are the same; i.e.:
231  \onmaybe                  % if there was no star in #1
232  \xdef\xweb_star{}%
233 \else
234  \ontrue
235  \xdef\xweb_star{*}%
236 \fi
237  \setcounter{xwebModule}{#1}% global set!
238  \xweb_documentation

239 } 240 ⟨/main⟩

14.3 Every web section is contained in a xwebModule environment. This environment takes care of vertical space before the section, optional page breaks, setting the section number, and initializing the \everypar token register.

\everypar must make \@noskipsec false, to indicate that the first paragraph of the documentation part has been processed. We have to initialize it ourselves, because there is no \section to do it. \Y and \B use @noskipsec to decide if there must be a \par before the program part.

The current reference, \@currentlabel, is set to the web section.

If \xwebRaggedtrue, the user has specified that sections should preferably not be broken across pages, so every section will be finished with optional vertical space and a negative penalty. Else, just the negative penalty is inserted to indicate that this is a good place for a page break.

The module is typeset in a \vbox that is \unvboxed at the end of the environment. This way, the output routine cannot fire while TEX is processing a program text, and no name conflicts can arise even when the weave bindings are in effect. Thanks to Hans Hagen for the idea. —No, we can’t do it this way. The documentation part cannot generate floats if it’s in a vbox. Only the program part should be vboxed and unvboxed, but this is more difficult. Must think about it.

The module is also the target for hyperlinks, using \xweb_htarget. (This macro is defined to produce only its second argument if the hyperref package is not in use.)

If it is the first module, the table of contents is set first. By setting the table of contents when the first module is found, we allow the user to change \xwebContentsTop etc. in the limbo section.

xwebModule

241 ⟨∗main⟩

242 \def\thexwebModule{\arabic{xwebModule}}
243 \newbox\xweb_ModBox
244 \newif\ifxweb_FirstModule \xweb_FirstModulefalse
245 \newenvironment{xwebModule}{%
246 \ifxweb_FirstModule
247  \ifxwebCon\xwebContents{\xwebJobname}\fi
248  \global\xweb_FirstModulefalse
249  \openout\xweb_cont=\xwebJobname.con
250  \write\xweb_cont{\catcode `\noexpand\@=11\relax}%
251 \fi
252 \ifxwebRagged\vfil\penalty-200\vfilneg%  (TeXbook p.353)
253  % (this is a \filbreak without a \par)
254 \else\penalty-200\fi
255 %\setbox\xweb_ModBox=\vbox\bgroup
256 \edef\@currentlabel{\thexwebModule}
257 \par\bigskip
258 \everypar{%
259  \if@noskipsec%
260  \global\@noskipsecfalse%
261  \everypar{\penalty-100}%
262  \fi}
263 \@noskipsectrue
264 \mbox{}\hspace{-\parindent}%
265 \xwebModuleHook
266 \xweb_htarget{\textbf{\thexwebModule.}\xweb_star}% typeset module number
267 \hskip 1em plus0.1em minus 0.1em%
268 }{%\egroup\unvbox\xweb_ModBox

269 }

270 \def\xwebModuleHook{}

271 ⟨/main⟩

14.4 The main sections are started with the macro \N. The parameters are:

#1: a number denoting the “group level” of the main section, titles of main sections with lower numbers should be presented more prominently in the table of contents.

#2: the section number.

#3: the title of the section group. This last parameter must be terminated by a dot.

The group level must be passed to the macros that format the table of contents. Since there is no easy place predetermined by L^{A}TEX for such a wish we use a trick: The entry text for the table of contents first sets the count register \xwebGroupLevel with the respective level—this register may be tested after a pro-forma evaluation of the entry.

When writing to the .con file, we have to use \@unexpandable@protect; else there will be trouble with insertion of \xweb_ModTitle in the contents file.

We tell the user that we have reached the next starred section. 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.

A newpage is inserted if the level of the section is smaller than the xwebSecNoEject counter and it is not the first section (if the user wants the web document to begin on a new page, he can insert a newpage himself).

272 ⟨∗main⟩

273 \def\xwebMainSecSkip{\clearpage}
274 \def\N#1#2#3.{%
275  \ifon\end{xwebModule}\fi
276  \global\xwebGroupLevel #1                   % <-- space!!
277  { \let\*=\empty%
278  \xdef\xweb_secno{#2}% get the section number

279 }%

280  \ifnum\xweb_secno>1
281  \ifnum \xwebGroupLevel<\c@xwebSecNoEject
282  \xwebMainSecSkip
283  \fi
284  \fi
285  \message \expandafter{*\xweb_secno}%
286  \xweb_PrepareSection{#2}
287  \ifon
288  \def\xweb_ModTitle{#3}%
289  \begin{xwebModule}{\textbf{#3.}}% title
290  \hskip 1em plus.1em minus.1em%
291  \ifnum\c@xwebLopDepth > #1%
292  \addcontentsline{lop}{starred}{%
293  \protect\global\xwebGroupLevel #1 %  space after #1 !
294  {\thexwebModule.}~{#3}}%
295  {   \let\protect\@unexpandable@protect
296  \edef\next{\write\xweb_cont{%
297  \ZZ{#3}{#1}{\xweb_secno}{\thepage}}}%
298  \next
299  }%  write "\ZZ{title}{depth}{sec}{page}" to .con file
300  \fi
301  \ifnum\c@xwebOutlineDepth > #1%
302  \xwebPDFOutline{\xweb_secno}{#3}% args: nr, title
303  \fi

304 } 305 ⟨/main⟩

14.5 Normal sections are started with \M.

306 ⟨∗main⟩

307 \def\M#1{%
308  \ifon\end{xwebModule}\fi
309  \xweb_PrepareSection{#1}%
310  \ifon\begin{xwebModule}%
311  \ifnum\c@xwebLopDepth>9%
312  \addcontentsline{lop}{xwebsection}{%

313  \protect\global\xwebGroupLevel 4 \thexwebModule.}%
314  {   \let\protect\@unexpandable@protect
315  \edef\next{\write\xweb_cont{%
316  \ZZ{}{4}{#1}{\thepage}}}%
317  \next
318  }% write "\ZZ{title}{depth}{sec}{page}" to .con file
319  \fi

320 } 321 ⟨/main⟩

§15 THE LIST OF PROGRAMS. 27

15 The List of Programs.

The “List of Programs” is like the “List of Figures” or the “List of Tables”, which are defined in the document class. The following definition is copied, with the necessary changes, from article.sty, 16-Mar-88. It defines \listofprograms which is used like \listoffigures.

322 ⟨∗main⟩

323 \def\xwebTocName{Contents of \xwebJobname}
324 \def\xwebLopName{List of Programs}
325 \ifx\listofprograms\undefined
326 \ifx \chapter\undefined
327  \def\listofprograms{\section*{\xwebLopName\@mkboth
328  {\uppercase{\xwebLopName}}{\uppercase{\xwebLopName}}}\@starttoc{lop}}
329 \else
330  \newcommand{\listofprograms}{\chapter*{\xwebLopName\@mkboth
331  {\uppercase{\xwebLopName}}{\uppercase{\xwebLopName}}}\@starttoc{lop}}
332  \fi
333 \fi

334 ⟨/main⟩

15.1 Entries for the .lop file are generated with \addcontentsline by the following commands:

    • \webfile produces a program entry

• \N produces a starred entry

• \M produces a xwebsection entry

Program names are typeset with \xweb_TTLopLine, which sets in large typewriter type:

335 ⟨∗main⟩

336 \def\l@program#1{%
337  \xwebGroupLevel\z@         % default value of group level
338  \begingroup
339  \let\numberline\@gobble        % width not known yet
340  \setbox\z@ \hbox{#1}%
341  \endgroup
342  \xweb_TTLopLine{#1}%

343 } 344 ⟨/main⟩

15.2 Normal sections are hardly ever mentioned in the list, but it will be possible. The entry consists of the number only, as they have no title.

345 ⟨∗main⟩

346 \def\l@xwebSection#1{
347  \xwebGroupLevel\z@ % default value of group level
348  \begingroup
349  \let\numberline\@gobble        % width not known yet
350  \setbox\z@ \hbox{#1}%
351  \endgroup
352  \xweb_NormalTocLine{#1}%

353 } 354 ⟨/main⟩

15.3 Titles of main sections might have an associated group level that determines how they are featured in the table. Titles on group level 0 are typeset boldface, other titles in roman. They are indented proportionally to the group level, with a basic indentation of \xwebLopIndent. An entry on group level 1 is not indented, the different layout suffices as a distinction to level 0. The counter \xwebLopIndentMaxLevel constitutes an upper limit for a recognized group level (concerning indentation, that is).

355 ⟨∗main⟩

356 \newdimen\xwebLopIndent
357  \xwebLopIndent=2em
358 \newcount\xwebLopIndentMaxLevel
359  \xwebLopIndentMaxLevel=4   % group level <= max level

360 ⟨/main⟩

15.4 The group level is specified within the entry name, i.e., in the first argument to \l@starred. If this argument is evaluated, \xwebGroupLevel might be set to the respective value. If it is not set, an explicit invocation of \addcontentsline is responsible for this entry. Then we assume that the group level is 0.

361 ⟨∗main⟩

362 \def\l@starred#1{%             % page will be processed later
363  \xwebGroupLevel\z@         % default value of group level
364  \begingroup
365  \let\numberline\@gobble        % width not known yet
366  \setbox\z@ \hbox{#1}%
367  \endgroup
368  \ifnum \xwebGroupLevel=\z@
369  \let\next\xweb_BoldTocLine
370  \else
371  \let\next\xweb_NormalTocLine
372  \fi
373  \next{#1}}

374 ⟨/main⟩

A \next assignment is needed here, because the macro is actually called with 2 arguments; the second is used by \@dottedtocline and such, so a \fi after the expansion is not allowed.

15.5 A normal line has an indentation of (l − 1) · toc indent, where l = min(group level, max level).

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! So we always specify level 1, as the level doesn’t matter to L^{A}TEX and no entry is to be discarded.

375 ⟨∗main⟩

376 \def\xweb_NormalTocLine#1{%     % page will be processed later
377  \ifnum \xwebGroupLevel>\xwebLopIndentMaxLevel
378  \xwebGroupLevel\xwebLopIndentMaxLevel
379  \fi
380  \advance\xwebGroupLevel\m@ne        % group level -= 1
381  \@dottedtocline
382  % \xwebGroupLevel                   % level (old)
383  1                                   % level
384  {\xwebGroupLevel\xwebLopIndent}%    % basic indent
385  \xwebLopIndent                      % numwidth
386  {#1}%                               % entry

387 } 388 ⟨/main⟩

15.6 A bold line is typeset like a normal line, only the entry is typeset in bold.

389 ⟨∗main⟩

390 \def\xweb_BoldTocLine#1{%
391  \@dottedtocline
392  1                                   % level
393  {\xwebGroupLevel\xwebLopIndent}%    % basic indent
394  \xwebLopIndent                      % numwidth
395  {{\bf #1}}%                         % entry

396 } 397 ⟨/main⟩

15.7 A xweb@tt_lop_line is like a cweb@bold_toc_line in the cweb style: It has no dots, but the entry is typeset in large typewriter type, instead of bold roman.

398 ⟨∗main⟩

399 \def\xweb_TTLopLine#1#2{%
400  \addpenalty{\@secpenalty}%
401  \addvspace{2em plus\p@}%
402  \begingroup
403  \noindent
404  \hangindent\xwebLopIndent
405  \rightskip\@tocrmarg  \parfillskip -\rightskip
406  \interlinepenalty\@M
407  \@tempdima\xwebLopIndent        % for \numberline
408  {\large\bf\tt #1}\nobreak\hfill \hbox to\@pnumwidth{\hss #2}%
409  \par
410  \endgroup
411  \addvspace{.5em plus\p@}%

412 } 413 ⟨/main⟩

30 §16 TYPESETTING PROGRAMS.

16 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 section will go to another state. Since we have to do more for the material after \B, we define this cseq later.

414 ⟨∗main⟩

415 \def\PB#1{%
416  \begingroup
417  \xweb_Rprogram
418  \leavevmode
419  #1%
420  \endgroup}

421 ⟨/main⟩

16.1 Note, that \Y cannot just be \smallskip, as in the plain version. We must assert that the current paragraph is ended before the vertical glue is inserted, and that’s not done by the L^{A}TEX 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 section break penalty—of course a section start is an even better place for a page break …

It might be that \Y is the very first token in a “normal” section. Then the section number isn’t set already since it is to be run-in. In that case we don’t set the vertical skip but simply start the section with the program part.

TEXnical note: The flag @noskipsec may be used to test if we’re immediately after a run-in section heading.

422 ⟨∗main⟩

423 \newcount\xwebProgPenalty
424  \xwebProgPenalty=\@secpenalty
425  \divide\xwebProgPenalty by 2
426 \def\Y{%
427  \if@noskipsec
428  \else
429  \par
430  \penalty\xwebProgPenalty
431  \smallskip
432  \fi}

433 ⟨/main⟩

16.2 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 \xweb_UserBindings for this case, it will be redefined then.

434 ⟨∗main⟩

435 \def\xweb_CweaveBindings{%
436  \ifx \xweb_UserBindings\relax
437  \xweb_rebind
438  % indentation and paragraph layout
439  \xweb_IncrIndent    \1%
440  \xweb_DecrIndent    \2%
441  \xweb_ExprBreak     \3%
442  \xweb_backup        \4%
443  \xweb_OptBreak      \5%
444  \xweb_break         \6%
445  \xweb_BigBreak      \7%

446  \xweb_noindent      \8%
447  % C/C++ tokens
448  \xwebRel               \?%
449  \xwebAddress           \AND
450  \xwebComplement        \CM
451  \xwebScope             \DC
452  \xwebEquiv             \E
453  \xwebGe                \G
454  \xwebRightShift        \GG
455  \xwebNe                \I
456  \xwebAssign            \K
457  \xwebLeftShift         \LL
458  \xwebMod               \MOD
459  \xwebNull              \NULL
460  \xwebNot               \R
461  \xwebBinOr             \OR
462  \xwebMemberRef         \PA
463  \xwebThis              \this
464  \xwebOr                \V
465  \xwebAnd               \W
466  \xwebXor               \XOR
467  \xwebLE                \Z
468  \xwebPointer           \MG
469  \xwebPointerMemberRef  \MGA
470  \xwebDecr              \MM
471  \xwebIncr              \PP
472  % more tokens
473  \xwebId             \\%
474  \xwebIdLetter       \|%
475  \xwebRes            \&%
476  \xwebString         \.%             %% ( ...Emacs...
477  \xwebStringBreak    \)%
478  \xwebNumber         \T
479  \xwebCombinedOp     \MRL
480  % goes to TeX state
481  \xwebComment        \C
482  \xwebCxxComment     \SHC
483  \xwebRefName        \X
484  % CWEB tokens
485  \xwebMacrosHere     \ATH
486  \xwebDefine         \D
487  \xwebFormat         \F
488  \xwebIdCat          \J
489  \xwebVerbString     \vb
490  % cross reference tags
491  \xwebChangeFlag     \*%
492  \xwebCRAlso         \A
493  \xwebCRsAlso        \As
494  \xwebCRCite         \Q
495  \xwebCRsCite        \Qs
496  \xwebCRUse          \U
497  \xwebCRsUse         \Us
498  \xwebCREt           \ET
499  \xwebCRsEt          \ETs
500  % finish the list
501  \stop\stop
502  \def\xweb_UserBindings{%
503  \xweb_RestoreBindings
504  \let\xweb_UserBindings\relax

505 }%

506  \fi

508 ⟨/main⟩

16.3 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 \xweb_SaveParskip. A few other layout parameters from the document layout must be saved as well.

509 ⟨∗main⟩

510 \newskip\xweb_SaveParskip
511 \newskip\xweb_SaveRightskip
512 \newcount\xweb_SaveSemSFCode
513 \newcount\xweb_SavePretolerance
514 \newcount\xweb_SaveHyphenpenalty
515 \newcount\xweb_SaveExhyphenpenalty

516

517 \def\xweb_SaveDocLayout{%
518  \xweb_SaveParskip\parskip
519  \xweb_SaveRightskip\rightskip
520  \xweb_SaveSemSFCode\sfcode`; % changed by \xweb_ProgramLayout
521  \xweb_SavePretolerance\pretolerance
522  \xweb_SaveHyphenpenalty\hyphenpenalty
523  \xweb_SaveExhyphenpenalty\exhyphenpenalty

524 }

525 \def\xweb_RestoreDocLayout{%
526  \parskip\xweb_SaveParskip
527  \rightskip\xweb_SaveRightskip
528  \sfcode`;=\xweb_SaveSemSFCode
529  \pretolerance\xweb_SavePretolerance
530  \hyphenpenalty\xweb_SaveHyphenpenalty
531  \exhyphenpenalty\xweb_SaveExhyphenpenalty

532 } 533 ⟨/main⟩

16.4 When \xweb_ProgramLayout 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 that might be changed by the user in the preamble. This setup is done in \xweb_LayoutInit.

If the program layout is already active, we must not switch it on another time. This can be tested by the current binding of \xweb_DocLayout.

534 ⟨∗main⟩

535 \def\xweb_ProgramLayout{%
536  \ifx \xweb_DocLayout\relax
537  \xweb_LayoutInit
538  \xweb_SaveDocLayout
539  \def\xweb_DocLayout{%
540  \xweb_RestoreDocLayout
541  \let\xweb_DocLayout\relax

542 }%

543  % set new values
544  \parskip\z@skip
545  \rightskip\z@ plus 100\p@ minus 10\p@
546  \sfcode`;=3000          % same stretch factor as period.
547  \pretolerance\@M
548  \hyphenpenalty 9999     % strings can be broken this way
549  \exhyphenpenalty\@M
550  \fi

551 } 552 ⟨/main⟩

16.5 The unit of the basic indentation is stored in \xwebIndentUnit. Continuation lines are indented two units further, i.e., the initial hanging indentation is 3 units. The current hanging indentation is kept

in \xweb_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 \xwebIndentUnit, it’s done in the program state initialization.

553 ⟨∗main⟩

554 \newdimen\xwebIndentUnit   \xwebIndentUnit=1em
555 \newdimen\xweb_indent
556 \newbox\xweb_bak        % backspace one unit
557 \newbox\xweb_bakk       % backspace two units
558 \def\xweb_LayoutInit{%
559  \global\setbox\xweb_bak \hbox to -1\xwebIndentUnit{}%
560  \global\setbox\xweb_bakk \hbox to -2\xwebIndentUnit{}%
561  \global\let\xweb_LayoutInit\relax

562 } 563 ⟨/main⟩

16.6 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.

If the code line is the very first text to be typeset in this section, we don’t add the basic indentation— we’re already indented from the run-in section number. But we must not start our section with \noindent, the section number would be typeset in the left margin then. So we just emulate an empty documentation part, the section number is now correctly set. \B can test for this case: @noskipsec is still true then.

564 ⟨∗main⟩

565 \def\B{%
566  \if@noskipsec \hskip 1em \fi
567  \xweb_program
568  \xweb_indent 3\xwebIndentUnit  \hangindent\xweb_indent
569  \ifvmode
570  \if@noskipsec
571  \indent             % add an empty documentation part
572  \else
573  \noindent \kern\xwebIndentUnit
574  \fi
575 \fi

576 } 577 ⟨/main⟩

16.7 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.

578 ⟨∗main⟩

579 \def\xweb_break{%       % forced break, between statements
580  \ifmmode\else
581  \endgraf        % in LaTeX it isn't sure what \par is really...
582  \noindent
583  \hangindent\xweb_indent  \kern\xweb_indent
584  \copy\xweb_bakk % go back to basic indentation
585  \ignorespaces
586  \fi

588 \def\xweb_OptBreak{%    % optional break between statements
589  \hfil \penalty\m@ne
590  \hfilneg  \kern .5em  \kern 2\xwebIndentUnit   % discarded on line break
591  \copy\xweb_bakk
592  \ignorespaces

593 }

594 \def\xweb_BigBreak{%    % forced break and a little extra space

595 \Y

596  \xweb_break

597 }

598 \def\xweb_ExprBreak#1{% % break with penalty #1 * 10
599  \hfil \penalty#10
600  \hfilneg            % discarded on line break

601 } 602 ⟨/main⟩

16.8 When we increment the indentation, we must not forget to set the hanging indentation immediately since \xweb_OptBreak 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.

Shouldn’t the hanging indentation be set anew at the end of \xweb_DecrIndent as well?

603 ⟨∗main⟩

604 \def\xweb_IncrIndent{%
605  \global\advance\xweb_indent\xwebIndentUnit
606  \hangindent\xweb_indent

607 }

608 \def\xweb_DecrIndent{\global\advance\xweb_indent -\xwebIndentUnit}
609 \def\xweb_backup{\copy\xweb_bak}
610 \def\xweb_noindent{%                            % no indentation
611  \hskip -\xweb_indent \hskip 2\xwebIndentUnit

612 } 613 ⟨/main⟩

§17 PROGRAM (C OR C^{++}) TOKENS. 35

17 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.

614 ⟨∗main⟩

615 \let\xwebAnd=\land              % logical and, &&
616 \let\xwebEquiv=\equiv           % equiv sign, for ==
617 \let\xwebGe=\ge                 % greater or equal
618 \let\xwebLE=\le                 % less or equal
619 \let\xwebNe=\ne                 % unequal, !=
620 \let\xwebNull=\Lambda           % NULL pointer
621 \let\xwebNot=\lnot              % logical not, !
622 \let\xwebOr=\lor                % logical or, ||
623 \let\xwebXor=\oplus             % bitwise exclusive or, ^

624 ⟨/main⟩

17.1 Some symbols have to be shifted around, to save computation time we put them in boxes.

The amount of the shifting depends on the used fonts. Particularly, it depends on the usage of 10 pt

fonts. We use the plain TEX names for these fonts since we need them especially, it’s not possible to substitute them without changing these macros. If the NFSS is used with L^{A}TEX the font names are not available, we have to assert that they exist and that they are preloaded.

But there is one exception where we try to define a general look: the increment operator ++. We might want to use it for different logos, nowadays it’s en vogue to attach ++ to all kinds of product names. We choose to use the plus sign from script size (whatever this is currently), but we must be careful that it is not used as a binary operation. Instead we convert it to an ordinary symbol and set a back-kern in between.

625 ⟨∗main⟩

626 \font\teni=cmmi10
627 \font\sevensy=cmsy7

628

629 \newbox\xweb_pointer            % pointer to struct component, ->
630 \setbox\xweb_pointer=\hbox{\kern-2pt\lower3pt\hbox{\teni\char'176}\kern1pt}

631

632 \newbox\xweb_decr               % decrement, --
633 \setbox\xweb_decr=\hbox{%
634  \kern .5pt
635  \raise 1pt \hbox{\sevensy\char0 \kern-1pt\char0}%
636  \kern .5pt

637 }

638 \newbox\xweb_incr               % increment, ++
639 \setbox\xweb_incr=\hbox{%
640  \kern .05em
641  \raise .1em \hbox{$\scriptstyle {+}\kern -.1em{+}$}%
642  \kern .05em

643 } 644 ⟨/main⟩

17.2 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 \xweb_rebind for assigning them to their names while we switch to program state …).

Must fix the comment on \xwebMod: Is C a “modulo language” or a “remainder language.” Well, IMHO n % i with n < 0 shouldn’t be used anyhow …

645 ⟨∗main⟩

646 \mathchardef\xwebAddress="2026  % `&', as binary op
647 \let\xwebAssign==               % assignment
648 \let\xwebBinOr=\mid             % binary or
649 \def\xwebComplement{{\sim}}     % `~', as ordinary symbol
650 \def\xwebDecr{\copy\xweb_decr}  % decrement
651 \def\xwebIncr{\copy\xweb_incr}  % increment
652 \let\xwebLeftShift=\ll          % left shift, <<
653 \def\xwebMod{\mathbin{\hbox{\footnotesize\rm\%}}}       % modulo/remainder, %
654 \def\xwebMemberRef{\mathbin{.*}}        % ptr to member (on object)
655 \def\xwebPointer{\copy\xweb_pointer}
656 \def\xwebPointerMemberRef{\mathbin{\xwebPointer*}} % ptr to member (on ptr)
657 \def\xwebRel{\mathrel?}         % relation operator
658 \let\xwebRightShift=\gg         % right shift, >>
659 \def\xwebScope{\kern.1em{::}\kern.1em}  % scope resolution

660

661 \def\xwebThis{\xwebRes{this}}   % reserved identifier `this'

662 ⟨/main⟩

17.3 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.

The definition of the underscore in \xwebRes depends on a 10 pt type. Particularly, the height is

0.6 pt and therefore 1.5 times as high as the usual height (to get a bold impression). This height must be adapted if another size is used. Is there a font dimension which can be used as the default value for a rule?

663 ⟨∗main⟩

664 \def\xwebCombinedOp#1{\mathrel{\let\K==#1}}  % eg, += operator
665 \def\xwebId#1{\hbox{\it#1\/\kern.05em}} % identifier, more than one char
666 \def\xwebIdLetter#1{\hbox{$#1$}}        % identifier, one letter
667 \def\xwebRes#1{%                        % reserverd words and type names
668  \hbox{\bf
669  \def\_{\kern.04em\vbox{\hrule width.3em height .6pt}\kern.08em}%
670  #1\/\kern .05em

671 }% 672 } 673 ⟨/main⟩

17.4 In the plain version 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.

Within strings certain cseqs have a special meaning; this is introduced by \xweb_StringSetup. The cseqs within strings are mostly accessible by their ASCII code.

Every once in a while we have discretionary breaks in a string, denoted by \xwebStringBreak. This break is shown with the C convention of escaped newlines.

674 ⟨∗main⟩

675 \def\xwebString#1{%
676  \hbox{\tt
677  \xweb_StringSetup
678  #1\kern .05em

679 }% 680 }

681 \def\xweb_StringSetup{%
682  \chardef\ =`\  %            % <-- two spaces !
683  \chardef\&=`\&
684  \chardef\\=`\\
685  \chardef\^=`\^
686  \chardef\_=`\_
687  \chardef\{=`\{
688  \chardef\}=`\}
689  \chardef\~=`\~
690  \def\`{`}%

691 }

692 \def\xwebStringBreak{\discretionary{\hbox{\tt\char`\\}}{}{}}

693 ⟨/main⟩

17.5 Numbers are typeset in different ways. We use the definition of the plain macros.

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.

Zdeněk Wagner notes that with NFSS \rm in math mode is a noop. Have to check a clean work-around.

694 ⟨∗main⟩

695 \def\xweb_oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}
696 \def\xweb_hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}}

697

698 \def\xwebNumber#1{%             % octal, hex, or decimal constant
699  \hbox{%

700 $%

701  \def\?{\kern.2em}%
702  \def\$##1{\egroup\sb{\,\rm##1}\bgroup}% suffix to constant
703  \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
704  \let\~\xweb_oct \let\^\xweb_hex
705  {#1}%
706  $}%

707 } 708 ⟨/main⟩

17.6 Comments are typeset in TEX state. We add a hook, the user shall be able to change the layout (eg, he might want another font).

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 …

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.

709 ⟨∗main⟩

710 \def\xwebComment#1{%
711  \5%                         % 0.5em will be discarded on line break
712  \hskip 1.5em
713  $/\ast\,$%
714  {\xweb_tex
715  \xwebCommentHook
716  #1%

717 }%

718  $\,\ast/$%

719 }

720 \let\xwebCommentHook\relax
721 \let\xwebCxxComment\xwebComment

722 ⟨/main⟩

§18 CWEB TOKENS. 39

18 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.

18.1 CWEB tokens which expand in a constant string are the identifier catenation operator (‘@&’) and the macro placement directive (‘@h’).

723 ⟨∗main⟩

724 \def\xwebIdCat{\xwebString{@\&}}
725 \def\xwebMacrosHere{%
726  \begingroup
727  \def\xwebRefNumber##1{}%
728  \xwebRefName :\xwebRefMacrosHere\X
729  \endgroup

730 }

731 \def\xwebRefMacrosHere{Preprocessor Definitions}

732 ⟨/main⟩

18.2 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.

733 ⟨∗main⟩

734 \def\xwebVerbString#1{{\fboxsep\tw@\p@ \fbox{\xwebString{#1}}}}

735 ⟨/main⟩

18.3 The refinement names are typeset in angles, this has a long tradition. We bury the typesetting of the section number (which is the first parameter) in a macro call; the user may change this to achieve special effects.

One could think about handling special values of the section numbers differently. Eg, an empty argument is not typeset at all, a 0 triggers a marginal note about a missing definition, etc.

18.4 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 \xweb_ToggleText.

TEXnical note: If we’re in math mode \xweb_ToggleText must be defined globally, as it will turn off math mode and the definition would be un-made then. The second invocation of \xweb_ToggleText would be undefined then.

A refinement may also consist of the file name the expansion of this refinement shall be written to. 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 \xwebString. 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 it’s documented in the user’s manual)

I took the implementation strategy (i.e., the math mode toggle) from the plain version. But I don’t

understand why it was done this way. Why isn’t it just an hbox? Isn’t that much simpler? Would it break something?

736 ⟨∗main⟩

737 \def\xwebRefName#1:#2\X{%
738  \ifmmode  \gdef\xweb_ToggleText{\null$\null}%
739  \else  \let\xweb_ToggleText\relax
740  \fi
741  \xweb_ToggleText
742  $\langle\,${\xweb_tex \xweb_CheckDot{#2}\xwebRefNumber{#1}}$\,\rangle$%
743  \xweb_ToggleText

744 } 745 ⟨/main⟩

18.5 The \xwebRefNumber macro is used in the module names in program text; It switches to footnotesize and calls \xwebSetModuleNumber to create the reference text.

746 ⟨∗main⟩

747 \def\xwebRefNumber#1{%
748  {\reset@font \footnotesize \kern .5em%
749  \xwebSetModNrList#1.}}

750 ⟨/main⟩

18.6 There are two macros to typeset module numbers: \xwebSetModuleNumber takes one number, and \xwebSetModNrList takes a comma-separated list that is terminated by a period. These macros must employ \thexwebModule to get consistent numbers with nonstandard definitions of \thexwebModule. The value of the xwebModule counter must be set with low-level code; we cannot use \setcounter because it does a global set, and we want to keep the change local, just for one-shot use. (Else the number of the current module would be wrong after the use of a module name.)

In hypertext, every section number becomes a link to the corresponding section.

751 ⟨∗main⟩

752 \def\xwebSetModuleNumber#1{{\edef\tmpnr{#1}%
753 \c@xwebModule=\tmpnr\relax
754 \xweb_hlink{\thexwebModule}}}

755 ⟨/main⟩

18.7 If we want to handle a comma-separated list of numbers, a control sequence must be inserted before each element. The following macros, essentially copied from pdfcwebmac.tex (plain cweb macros modified by Andreas Scherer), insert \xweb_TagSec before each number, filter things like \ET, and then expand the list.

756 ⟨∗main⟩

757 \newtoks\xweb_toksA
758 \newtoks\xweb_toksB
759 \newtoks\xweb_toksC
760 \newtoks\xweb_toksD
761 \newcount\xweb_countA
762 \xweb_countA=0
763 \def\xweb_AddTokens#1#2{%
764  \edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
765 \def\xweb_adn#1{\xweb_AddTokens{\xweb_toksC}{#1}%
766  \global\xweb_countA=1\let\next=\maketoks}
767 \def\xweb_poptoks#1#2|ENDTOKS|{%
768  \let\first=#1\xweb_toksD={#1}\xweb_toksA={#2}}
769 \def\maketoks{%
770  \expandafter\xweb_poptoks\the\xweb_toksA|ENDTOKS|
771  \ifx\first0\xweb_adn0

772  \else\ifx\first1\xweb_adn1 \else\ifx\first2\xweb_adn2
773  \else\ifx\first3\xweb_adn3 \else\ifx\first4\xweb_adn4
774  \else\ifx\first5\xweb_adn5 \else\ifx\first6\xweb_adn6
775  \else\ifx\first7\xweb_adn7 \else\ifx\first8\xweb_adn8
776  \else\ifx\first9\xweb_adn9
777  \else
778  \ifnum0=\xweb_countA\else\xweb_makenote\fi
779  \ifx\first.\let\next=\xweb_tdone\else
780  \let\next=\maketoks
781  \xweb_AddTokens{\xweb_toksB}{\the\xweb_toksD}
782  \ifx\first,\xweb_AddTokens{\xweb_toksB}{\space}\fi
783  \fi
784  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
785  \next

786 }

787 \def\xweb_makenote{\xweb_AddTokens{\xweb_toksB}%
788  {\noexpand\xweb_TagSec{\the\xweb_toksC}}%
789  \xweb_toksC={}\global\xweb_countA=0}
790 \def\xweb_tdone{\edef\st{\global\noexpand\xweb_toksA={\the\xweb_toksB}}\st}

791 ⟨/main⟩

18.8 By defining \xweb_TagSec to \xwebSetModuleNumber we can now employ \maketoks in

\xwebSetModNrList to typeset a list of references.

792 ⟨∗main⟩

793 \def\xweb_TagSec#1{\xwebSetModuleNumber{#1}}
794 \def\xwebSetModNrList#1.{%
795 \setbox0=\hbox{\xweb_toksA={#1.}\xweb_toksB={}\maketoks}%
796 \the\xweb_toksA}

797 ⟨/main⟩

18.9 The next macro, \xweb_CheckDot 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 @< 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 circumvent them by adding \protect.

798 ⟨∗main⟩

799 \def\xweb_CheckDot#1{%
800  \begingroup
801  \let\.\@gobble
802  \let\PB\relax
803  \expandafter\def \expandafter\next \expandafter{#1}%
804  \ifx \next\empty
805  \gdef\next##1{\xwebString}%

806  \else
807  \global\let\next\relax
808  \fi
809  \endgroup
810  \next #1

811 } 812 ⟨/main⟩

18.10 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.

813 ⟨∗main⟩

814 \def\xwebDefine{\xweb_macro{\#define}}
815 \def\xwebFormat\\#1\\#2\par{\ifxwebHideFormats\else
816 \xweb_macro{format}\\{#1} \\{#2}\par\fi}
817 \def\xweb_macro#1{%
818  \global\advance\xweb_indent \tw@\xwebIndentUnit
819  \xweb_IncrIndent
820  \xwebRes{#1 }%              % <-- blank!

821 } 822 ⟨/main⟩

§19 SECTION CROSS REFERENCES AND CHANGES. 43

19 Section cross references and changes.

At the end of sections with refinements, cweave may output cross reference information: In which sections 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 section 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 section 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 section is changed by the changefile, a changeflag (‘\*’) is appended to its number. The list is eventually terminated by a full stop.

19.1 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 \xwebNumberListHangindent. But beware: This isn’t a dimension register, it’s a macro. This way one can use ems as dimensions.

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. The list must be passed to \xwebSetModNrList to typeset (and hyperreference) them correctly.

823 ⟨∗main⟩

824 \def\xwebNumberListHangindent{2em}
825 \def\xwebCrossRef#1#2.{%
826  \par\smallskip% (= \Y)
827  \xweb_CR%
828  \begingroup%
829  \reset@font \footnotesize%
830  \noindent \hangindent\xwebNumberListHangindent%
831  #1~\xwebSetModNrList #2..\par%
832  \endgroup%

833 }% 834 ⟨/main⟩

19.2 Well, let’s define all introducing tags, which in fact start the cross reference information unit. The number list is gathered by \xwebCrossRef.

835 ⟨∗main⟩

836 \def\xwebCRAlso{\xwebCrossRef{See also section}}
837 \def\xwebCRsAlso{\xwebCrossRef{See also sections}}

838

839 \def\xwebCRCite{\xwebCrossRef{This code is cited in section}}
840 \def\xwebCRsCite{\xwebCrossRef{This code is cited in sections}}

841

842 \def\xwebCRUse{\xwebCrossRef{This code is used in section}}
843 \def\xwebCRsUse{\xwebCrossRef{This code is used in sections}}

844 ⟨/main⟩

19.3 The changeflag is set as a star.

845 ⟨∗main⟩

846 \let\xwebChangeFlag=*
847 \def\xwebCREt{ and~}
848 \def\xwebCRsEt{, and~}

849 ⟨/main⟩

44 §20 INCLUDING THE WEB FILE.

20 Including the web file.

Because the web document is included by the \webfile command, we have an easy way to handle the index and list of refinements at the end; this is done by the \webfile command itself.

20.1 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 \xwebJobname.idx, the latter in the file \xwebJobname.scn. For each of these files exists a flag named xweb_extEntries (where ext ∈ {idx, scn} is the extension of the appropriate file) which tells if there are any entries of the respective category.

850 ⟨∗main⟩

851 \newif\ifxweb_idxEntries
852 \newif\ifxweb_scnEntries

853 ⟨/main⟩

20.2 We consider a file as “without entries” if (1) the file does not exist, (2) is empty, or (3) has an empty line at the very front. (In fact, case (3) means that there should not be anything behind it—but we can’t test this portably.)

\xweb_HasEntries tests the property, it’s parametrized by the extension. As a result, it sets the respective flag.

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 L^{A}TEX kernel already provides a macro for an empty line, \@defpar.) 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.

854 ⟨∗main⟩

855 \newread\xweb_TmpFile
856 \def\xweb_HasEntries#1{%
857  \openin\xweb_TmpFile \xwebJobname.#1\relax
858  \ifeof \xweb_TmpFile
859  \let\next\@defpar
860  \message{No #1 file present for \xwebJobname !}
861  \else
862  \read\xweb_TmpFile to \next
863  \fi
864  \csname xweb_#1Entries%
865  \ifx \next\@defpar  false%
866  \else  true%
867  \fi
868  \endcsname
869  \closein\xweb_TmpFile

870 } 871 ⟨/main⟩

20.3 Every web document can have its own table of contents. It is stored in a file that has the web name as basename, and extension .con. The control sequence \ZZ is used to tag the entries. \xwebContents typesets the table of contents. \xwebSetModuleNumber is used here to typeset the section number and possibly create a hyperlink.

872 ⟨∗main⟩

873 \newwrite\xweb_cont
874 \let\ZZ=\let % now you can \write the control sequence \ZZ
875 \def\xweb_contentsline#1#2#3#4{%
876  \ifnum#2=0 \smallbreak\fi
877  \hbox to \textwidth{\xweb_consetup{#2}#1

878  \rm\leaders\hbox to .5em{.\hfil}\hfil\ %
879  \xwebSetModuleNumber{#3}
880  \hbox to3em{\hss#4}}}
881 \def\xweb_consetup#1{\ifcase#1 \bf % depth -1 (@**)
882 \or % depth 0 (@*)
883 \or \hskip2em % depth 1 (@*1)
884 \or \hskip4em % depth 2 (@*2)
885 \or \hskip6em % depth 3 (@*3)
886 \or \hskip8em % depth 4 (@*4)
887 \or \hskip10em % depth 5 (@*5)
888 \else \hskip12em \fi} % depth 6 or more

889 ⟨/main⟩

20.4 PDFTEX will add an outline entry referring to the table of contents.

890 ⟨∗main⟩

891 \def\xwebContents#1{
892  \def\readcontents{\IfFileExists{#1.con}{\input #1.con}{}}
893  \begingroup
894  \xwebContentsTop
895  \ifnum\xweb_hypertype=2
896  \pdfdest name{#1:contents} fith
897  \pdfoutline goto name{#1:contents}{#1}
898  \fi
899  \hbox to \textwidth{\hfil
900  \xwebSectionName\hbox to3em{\hss \xwebPageName}}
901  \let\ZZ=\xweb_contentsline
902  \readcontents\relax % read the contents info
903  \xwebContentsBot    % print the contents page(s) and terminate
904  \endgroup

905 }

906 \def\xwebSectionName{Section}
907 \def\xwebPageName{Page}

908 ⟨/main⟩

20.5 The \xweb_InputWebfile macro disables \inx etc., adds a List Of Programs entry, inputs the web document and finishes it with some code that was stolen from \cweb@end_document and \cweb@finish. We don’t need these macros themselves as there should be no \end{document} in the web file.

Note that there are two ‘jobnames’: the \jobname of the main document and the \xwebJobname of the included web document.

To get the jobname, we strip off the optional filename extension with \setname, using its special parameter syntax. ##1 will be the basename of the file; ##2 will be the extension, if present. ##3 will only be set if the extension has mutltiple parts; it also makes it possible to eat up the second dot, that must be there to delimit the parameter text in case there is no extension. We assume that there are no forward slashes in the filename, so the forward slash can be used to delimit the third parameter.

The flag \xweb_FirstModule is made true so we can find out later if we are typesetting the first module (the table of contents is set then).

909 ⟨∗main⟩

910 \def\xwebContentsTop{\vskip.2in}
911 \def\xwebContentsBot{\par\bigskip}
912 \def\xweb_InputWebfile#1{
913  \def\setname##1.##2.##3/{\gdef\xwebJobname{##1}}
914  \setname #1../
915  \ifnum\c@xwebLopDepth > -10       % entry to the list of programs:
916  \addcontentsline{lop}{program}{\xwebJobname}
917  \fi
918  \def\xwebContentsTop{\centerline{\textbf{\xwebJobname}}\vskip.2in}

919  \def\xwebContentsBot{\par\bigskip}
920  \global\xweb_FirstModuletrue
921  \begingroup
922  \let\inx\relax
923  \let\fin\relax
924  \let\con\relax
925  \let\ch\xwebCRChanged
926  \input{#1}
927  \ifon \end{xwebModule} \fi % end the last module (if it is on).
928  \endgroup
929  % process the index and list of refinements ...
930  \ifxwebIndex\xweb_HasEntries{idx}%
931  \ifxweb_idxEntries  \xwebIdIndex{\xwebJobname.idx}\fi\fi
932  \ifxwebRef\xweb_HasEntries{scn}%
933  \ifxweb_scnEntries  \xwebRefList{\xwebJobname.scn}\fi\fi
934  % clean up:
935  \closeout\xweb_cont
936  \onfalse % don't end the last section when starting the first section of
937  % the next web.
938  \xweb_UserBindings % back to the main document

939 } 940 ⟨/main⟩

20.6 \xwebIdIndex and \xwebRefList have a filename argument, so that they can also be employed by the user to create an index or refinement list for any web document in any place, or to combine the indexes of several documents by processing them with the sort program an including the result. This can be particularly worthwile for authors of large, multi-file software packages who want to have a global index of their global variables, but they should almost certainly hack the faked index file with a perl script or something alike to mention also the filenames, because section numbers are not unique through a set of web documents.

We add two special macros for this purpose, however, to take care of things that are necessary to handle an index or reflist outside the context of a web document.

941 ⟨∗main⟩

942 \def\xwebInputIndex#1{{
943 \def\setname##1.##2\\{%
944  \edef\xwebJobname{##1}
945  \ifx\\##2\\%
946  \edef\ext{idx}
947  \else
948  \edef\ext{\chop##2\\}%
949  \fi}
950 \def\chop##1.\\{##1}
951 \expandafter\setname#1.\\
952 \xwebIdIndex{\xwebJobname.\ext}

953 }}

954 \def\xwebInputReflist#1{{
955 \def\setname##1.##2\\{%
956  \edef\xwebJobname{##1}
957  \ifx\\##2\\%
958  \edef\ext{scn}
959  \else
960  \edef\ext{\chop##2\\}%
961  \fi}
962 \def\chop##1.\\{##1}
963 \expandafter\setname#1.\\
964 \xwebRefList{\xwebJobname.\ext}

965 }} 966 ⟨/main⟩

20.7 The \ifstr macro compares its first and second arguments; if they are equal it executes the third argument. It is necessary that \edef is used here to expand the arguments!

967 ⟨∗main⟩

968 \def\ifstr#1#2#3{%
969 \edef\xweb_tempa{#1}%
970 \edef\xweb_tempb{#2}%
971 \ifx\xweb_tempa\xweb_tempb #3\fi

972 } 973 ⟨/main⟩

20.8 The \webfile macro has an optional argument, that may contain a comma-separated list of options. \webfile expands into \xweb_file, with the optional argument always present, but possibly empty.

974 ⟨∗main⟩

975 \def\webfile{\@ifnextchar[%
976 {\xweb_file}{\xweb_file[]}}

977 ⟨/main⟩

20.9 The square-braced argument is mandatory for \xweb_file. The comma-separated list of options is processed using a \@for loop. The macro will complain if an unknown option is encountered. After that, \xweb_InputWebfile is called to do the real work. Default values for all options will be copied from their global equivalents (specified with the \usepackage command).

978 ⟨∗main⟩

979 \newif\if@opt
980 \def\xweb_off{\let\maybe=\iffalse}
981 \def\xweb_on{\let\maybe=\iftrue}
982 \def\xweb_file[#1]#2{
983 \ifxweb_GlobalIndex\xwebIndextrue\else\xwebIndexfalse\fi
984 \ifxweb_GlobalRef\xwebReftrue\else\xwebReffalse\fi
985 \ifxweb_GlobalRagged\xwebRaggedtrue\else\xwebRaggedfalse\fi
986 \ifxweb_GlobalOC\xweb_off\else\xweb_on\fi
987 \ifxweb_GlobalCon\xwebContrue\else\xwebConfalse\fi
988 \ifxweb_GlobalHideFormats\xwebHideFormatstrue\else
989  \xwebHideFormatsfalse\fi
990 \xweb_hypertype=\xweb_GlobalHypertype
991 \@for\xweb_opt:=#1\do{
992  \typeout{webfiles option: \xweb_opt}
993  \@optfalse
994  \ifstr{\xweb_opt}{index}{\xwebIndextrue\@opttrue}
995  \ifstr{\xweb_opt}{noindex}{\xwebIndexfalse\@opttrue}
996  \ifstr{\xweb_opt}{reflist}{\xwebReftrue\@opttrue}
997  \ifstr{\xweb_opt}{noreflist}{\xwebReffalse\@opttrue}
998  \ifstr{\xweb_opt}{raggedbottom}{\xwebRaggedtrue\@opttrue}
999  \ifstr{\xweb_opt}{flushbottom}{\xwebRaggedfalse\@opttrue}
1000  \ifstr{\xweb_opt}{onlychanges}{\xweb_off\@opttrue}
1001  \ifstr{\xweb_opt}{allsections}{\xweb_on\@opttrue}
1002  \ifstr{\xweb_opt}{nocon}{\xwebConfalse\@opttrue}
1003  \ifstr{\xweb_opt}{contents}{\xwebContrue\@opttrue}
1004  \ifstr{\xweb_opt}{hideformats}{\xwebHideFormatstrue\@opttrue}
1005  \ifstr{\xweb_opt}{showformats}{\xwebHideFormatsfalse\@opttrue}
1006  \ifstr{\xweb_opt}{hyperref}{\xweb_hypertype=1\@opttrue}
1007  \ifstr{\xweb_opt}{pdftex}{\xweb_hypertype=2\@opttrue}
1008  \ifstr{\xweb_opt}{nohype}{\xweb_hypertype=0\@opttrue}
1009  \if@opt\else\PackageError{webfiles}{%
1010  Unknown option for the \protect\webfile\space command

1011  }{Possible options are: index, noindex,
1012  reflist, noreflist, \MessageBreak
1013  raggedbottom, flushbottom, onlychanges,
1014  allsections,\MessageBreak
1015  nocon, contents, hideformats, showformats,
1016  hyperref, pdftex, nohype}

1017 \fi 1018 }

1019 \xweb_SetupHrefs
1020 \xweb_InputWebfile{#2}}
1021 \let\cwebfile\webfile

1022 ⟨/main⟩

20.10 The list of changed sections is a cross reference list, (nearly) like all others at the end of a section. The only difference is that we do not show changeflags any more—each section number in this list carries a change flag by definition.

TEXnical note: The redefinition of \* is part of the second argument of \xwebCrossRef. It is not a global redefinition.

1023 ⟨∗main⟩

1024 \def\xwebCRChanged{%
1025  \xwebCrossRef{The following sections were changed by the change file:}%
1026  \let\*\relax

1027 } 1028 ⟨/main⟩

20.11 The identifier index is available in the file \xwebJobname.idx. The setup for the index is a mixture of the theindex environment of the article style and DEK’s index macros. It’s typeset in two columns; the user may specify an introductionary text for the index by \xwebIndexIntro. If there is any introductionary text we add a medium skip below.

The paragraph layout is taken from the plain version: Each index entry is a paragraph, nearly no skip between the paragraphs (just a bit to prevent underfull vboxes), no paragraph indentation, ragged right—but the \parfillskip set in such a way that almost empty lines are avoided. Overfull hboxes in the index doesn’t make sense, so we prevent them. And we don’t allow hyphenation in the index, it’s an identifier index after all.

Before we read in this file, we have to bind the special cseqs used therein.

1029 ⟨∗main⟩

1030 \newtoks\xwebIndexIntro
1031  \xwebIndexIntro={}
1032 \def\xwebIndexName{Index of \texttt{\xwebJobname}}

1033 ⟨/main⟩

20.12 The following text is set as the header of the index.

1034 ⟨∗main⟩

1035 \def\xweb_IndexTop{
1036  \xweb_tex
1037  \par\vskip 1cm plus 10mm minus 5mm\noindent
1038  {\bf \xwebIndexName}%\nopagebreak\par\medskip\nopagebreak
1039  %% skip already inserted by xweb_twocolumn env.
1040  \edef\intro{\the\xwebIndexIntro}% % is a local def
1041  \ifx \intro\empty
1042  \else
1043  \noindent\the\xwebIndexIntro\unskip
1044  \par\medskip

1045 \fi 1046 } 1047 ⟨/main⟩

20.13 If the multicol package is available, it will be used to typeset the identifier index. The \RequirePackage command must however be placed after \ProcessOptions, at the end of the package file.

If the twocolumn class option is in effect, multicols cannot be used; in particular, the title (ieee.cls) would be set in one column. It isn’t necessary too, we are in two columns already.

1048 ⟨∗main⟩

1049 \newif\ifxweb_multicol \xweb_multicolfalse
1050 \IfFileExists{multicol.sty}{
1051 \if@twocolumn\else\xweb_multicoltrue\fi

1052 }{}

1053 \ifxweb_multicol
1054 \newenvironment{xweb_twocolumn}{\begin{multicols}{2}}{\end{multicols}}
1055 \else
1056 \newenvironment{xweb_twocolumn}{
1057  \if@twocolumn\else
1058  \columnseprule\z@
1059  \columnsep 35\p@          % value is from article.sty

1060 \fi

1061  \twocolumn%

1062 }{

1063  \onecolumn}

1064 \fi 1065 ⟨/main⟩

20.14 Now \xwebIdIndex itself. PDFTEX will add an outline entry for the index.

vfil before \xweb_IndexTop is still not strong enough! A pagebreak can occur just after it.

1066 ⟨∗main⟩

1067 \def\xwebJobName{noname}
1068 \def\xweb_SetupIndex{%
1069  \begin{xweb_twocolumn}[\xweb_IndexTop]
1070  \ifnum\xweb_hypertype=2
1071  \pdfdest name{\xwebJobname:index} fith
1072  \pdfoutline goto name{\xwebJobname:index}{Index}

1073 \fi

1074  % go to CR mode
1075  \xweb_CR
1076  \message{*index: }% % tell the user what we're doing
1077  % paragraph layout
1078  \begingroup
1079  \parskip \z@ plus .5\p@
1080  \parindent\z@
1081  \rightskip \z@ plus 2.5em
1082  \parfillskip \z@ plus .6\hsize
1083  \tolerance\@M \hyphenpenalty\@M
1084  % bindings
1085  \let\I\xwebIndexEntry
1086  \let\[\xwebIndexDeclared
1087  \let\*\xwebLapStar

1088 }

1089 \def\xweb_FinishIndex{
1090  \endgroup

1091  \end{xweb_twocolumn}

1092 }

1093 \def\xwebIdIndex#1{%
1094  \xweb_SetupIndex
1095  \@input{#1}
1096  \xweb_FinishIndex

1097 } 1098 ⟨/main⟩

20.15 An index entry is typeset with the same hanging indentation as‘ 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 we had at the refinement names (see section 18.4), where we introduced \xweb_CheckDot 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.)

1099 ⟨∗main⟩

1100 \def\xwebIndexEntry#1,#2.{%
1101  \par
1102  \hangindent\xwebNumberListHangindent
1103  \leavevmode
1104  \xweb_CheckDot{#1}:\quad\xwebSetModNrList #2.

1105 } 1106 ⟨/main⟩

20.16 The sections 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.

1107 ⟨∗main⟩

1108 \def\xwebIndexDeclared#1]{\underline{#1}}
1109 \def\9#1{}

1110 ⟨/main⟩

20.17 The list of the refinement names is available in the file \xwebJobname.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 restore \parfillskip and \* since it was changed in the index.

1111 ⟨∗main⟩

1112 \def\xwebReflistName{List of Refinements in \texttt{\xwebJobname}}
1113 \def\xwebRLCite{\xwebCrossRef{Cited in section}}
1114 \def\xwebRLsCite{\xwebCrossRef{Cited in sections}}
1115 \def\xwebRLUse{\xwebCrossRef{Used in section}}
1116 \def\xwebRLsUse{\xwebCrossRef{Used in sections}}

1117 ⟨/main⟩

1118 ⟨∗main⟩

1119 \def\xweb_SetupReflist{%
1120  \vskip 3ex plus 7ex minus 1ex
1121  \xweb_tex
1122  \noindent
1123  {\bf \xwebReflistName}\nopagebreak\par\bigskip\nopagebreak
1124  \ifnum\xweb_hypertype=2
1125  \pdfdest name{\xwebJobname:reflist} fith
1126  \pdfoutline goto name{\xwebJobname:reflist} {Refs}

1127 \fi

1128  \xweb_CR
1129  \message{*list of refinements: }%
1130  % paragraph layout: like in index, but
1131  \parfillskip\@flushglue
1132  \begingroup    % different bindings...
1133  \def\I{\par \hangindent\xwebNumberListHangindent}%
1134  \def\xwebCrossRef##1##2.{\quad {\reset@font\footnotesize
1135  ##1~\xwebSetModNrList ##2..}}%
1136  \def\Q {\xwebRLCite}%
1137  \def\Qs{\xwebRLsCite}%
1138  \def\U {\xwebRLUse}%
1139  \def\Us{\xwebRLsUse}%
1140  \let\*\xwebChangeFlag

1141 }

1142 \def\xwebRefList#1{%
1143  \xweb_SetupReflist
1144  \@input{#1}
1145  \endgroup

1146 } 1147 ⟨/main⟩

The redefinition of \xwebCrossRef etc. must be done locally to prevent troubles with trailing web files: Crossref info in these files would be indented!

52 §21 BELLS AND WHISTLES.

21 Bells and whistles.

Just copied from the plain version. 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.

1148 ⟨∗main⟩

1149 \def\ATL{\par\noindent\bgroup\catcode`\_=12 \postATL} % print @l in limbo
1150 \def\postATL#1 #2 {\bf letter \\{\uppercase{\char"#1}}
1151 tangles as \tentex "#2"\egroup\par}
1152 \def\noATL#1 #2 {}
1153 \def\noatl{\let\ATL=\noATL} % suppress output from @l

1154 ⟨/main⟩

21.1 Option processing will be done at the end of the package file. We must restore our catcode and are finished.

1155 ⟨∗main⟩

1156 \ProcessOptions
1157 \ifxweb_multicol
1158  \RequirePackage{multicol}

1159 \fi

1160 \catcode`\_=\xwebCatUsCode
1161 %\endinput

1162 ⟨/main⟩

§22 SPIDERY WEBS. 53

22 Spidery Webs.

The file swebbind.sty redefines some macros to let the above things work with web systems generated with Spider. This file is input by webkernel.tex, as provided with the webfiles distribution. As it is eventually input by the \webfile command, it is inside a group that encloses the entire web document, so the scope of these redefinements is automatically limited to a single web: we need no “cwebbind.sty” or such.

22.1 First, make the underscore usable in private control sequences, as in webfiles.sty:

1163 ⟨∗spider⟩

1164 \catcode`\_=\xwebCatLetter
1165 \catcode`\@=\xwebCatLetter

1166 ⟨/spider⟩

22.2 Some miscellaneous…

1167 ⟨∗spider⟩

1168 \let\amp\&    % ampersand
1169 \let\SS\S     % section sign
1170 \let\PP\P     % paragraph sign

1171 ⟨/spider⟩

22.3 The main section tag will be a mixture of webfiles and webkernel.tex:

#1 = number

#2 = (level and) title

1172 ⟨∗spider⟩

1173 \def\N#1.#2.{%
1174 \ifon\end{xwebModule}\fi   % webfiles
1175 \global\xwebGroupLevel 0% default value for group level
1176 \xweb_headcheck#2\xweb_headcheck     % spider: get group level and title
1177 {\let\*=\empty%
1178  \xdef\xweb_secno{#1}% webfiles: get the section number

1179 }%

1180  \message \expandafter{*\xweb_secno}%
1181  \xweb_PrepareSection{#1}%
1182  \ifon\begin{xwebModule}{\bf\xweb_ModTitle.}%
1183  % \xweb_ModTitle is generated by \xweb_headcheck.
1184  %\hskip 1em plus.1em minus.1em%
1185  \xweb_SpiderLopEntry{\xwebGroupLevel}%

1186 } 1187 ⟨/spider⟩

22.4 The entries in the list of programs and the web’s own table of contents are handled by

  \xweb_SpiderLopEntry. We have to use \@unexpandable@protect; else there will be trouble with

insertion of \xweb_ModTitle in the contents file.

1188 ⟨∗spider⟩

1189 \def\xweb_SpiderLopEntry#1{%
1190  \ifnum\c@xwebLopDepth > \xwebGroupLevel
1191  \addcontentsline{lop}{starred}{%
1192  \protect\global\xwebGroupLevel #1 \thexwebModule.~\xweb_ModTitle}%
1193  {   \let\protect\@unexpandable@protect
1194  \edef\next{\write\xweb_cont{%
1195  \ZZ{\xweb_ModTitle}{\the\xwebGroupLevel}%

1196  {\xweb_secno}{\noexpand\thepage}}}%
1197  \next
1198  }% write "\ZZ{title}{depth}{sec}{page}" to .con file

1199 \fi

1200  \ifnum\c@xwebOutlineDepth > \xwebGroupLevel
1201  \xwebPDFOutline{\xweb_secno}{\xweb_ModTitle}% args: nr, title
1202  \fi}

1203 ⟨/spider⟩

22.5 The following is from webkernel, with small additions for webfiles. This stuff is to allow inital =, 1, 2, 3, 4 in starred modules. = means “part”, don’t skip page. Normal starred module is 1. 2–4 are submodules, and are indented.

@*=  bold name in table of contents

causes page eject

suppresses page eject following

@*1,2 first level of indentation
@*3,4 second level of indentation
@*1,3 cause page eject
@*2,4 don’t cause page eject

1204 ⟨∗spider⟩

1205 \newif\ifxweb_cancel\xweb_canceltrue
1206 \def\xweb_ifnextchar#1#2#3{\let\@tempe=#1\def\@tempa{#2}\def\@tempb{#3}%
1207 \xweb_ifnch}
1208 \def\xweb_ifnch{%
1209  \ifx \@tempc \@tempe\let\@tempd\@tempa
1210  \else\let\@tempd\@tempb\fi
1211  \@tempd}
1212 \def\xweb_makethechar#1{\let\@tempc=#1}

1213

1214 \def\xweb_headcheck#1#2\xweb_headcheck{%
1215  \xweb_makethechar{#1}%
1216  \def\theskipper{\vskip 3pt}%
1217  % extra skip before new starred module
1218  \def\xweb_ModTitle{{#2}}%
1219  \xweb_ifnextchar={%                                % @*= title.
1220  \global\xwebGroupLevel 0% webfiles
1221  \ifnum \xwebGroupLevel<\c@xwebSecNoEject
1222  \def\theskipper{\xwebMainSecSkip}%

1223 \fi

1224  \xweb_canceltrue
1225  }{\xweb_ifnextchar1{%                              % @*1 title.
1226  \global\xwebGroupLevel 1% webfiles
1227  \xweb_cancelfalse
1228  \ifnum \xwebGroupLevel<\c@xwebSecNoEject
1229  \def\theskipper{\xwebMainSecSkip}%

1230 \fi

1231  }{\xweb_ifnextchar2{%                              % @*2 title.
1232  \global\xwebGroupLevel 2% webfiles
1233  \xweb_cancelfalse
1234  }{\xweb_ifnextchar3{%                              % @*3 title.
1235  \global\xwebGroupLevel 3% webfiles
1236  \xweb_cancelfalse
1237  \ifnum \xwebGroupLevel<\c@xwebSecNoEject
1238  \def\theskipper{\xwebMainSecSkip}%

1239 \fi

1240  }{\xweb_ifnextchar4{%                              % @*4 title.
1241  \global\xwebGroupLevel 4% webfiles
1242  \xweb_cancelfalse

1243  }{% else                                           % @* title.
1244  \global\xwebGroupLevel 0% webfiles
1245  \ifxweb_cancel\else
1246  \ifnum \xwebGroupLevel<\c@xwebSecNoEject
1247  \def\theskipper{\xwebMainSecSkip}%

1248 \fi 1249 \fi

1250  \xweb_cancelfalse
1251  \def\xweb_ModTitle{#1{#2}}%
1252  }}}}}%
1253  \theskipper

1254 } 1255 ⟨/spider⟩

22.6 Surround text in vertical bars: (already tagged with \PB in Spider 3.0)

1256 ⟨∗spider⟩

1257 \def\CD#1\DC{#1}

1258 ⟨/spider⟩

22.7 Go into program mode: this is \P in spider and \B in cweb.

1259 ⟨∗spider⟩

1260 \def\P{\B}
1261 %\let\P\B

1262 ⟨/spider⟩

22.8 Spidery WEAVE Bindings: these are a little different from the CWEAVE bindings.

1263 ⟨∗spider⟩

1264 \def\xweb_CweaveBindings{%
1265  \ifx \xweb_UserBindings\relax
1266  \xweb_rebind
1267  % indentation and paragraph layout
1268  \xweb_break            \0%           % SPIDER
1269  \xweb_IncrIndent       \1%
1270  \xweb_DecrIndent       \2%
1271  \xweb_ExprBreak        \3%
1272  \xweb_backup           \4%
1273  \xweb_OptBreak         \5%
1274  \xweb_break            \6%
1275  \xweb_BigBreak         \7%
1276  \xweb_noindent         \8%
1277  % C/C++ tokens
1278  \xwebRel               \?%
1279  \xwebAddress           \AND
1280  \xwebComplement        \CM
1281  \xwebScope             \DC
1282  \xwebEquiv             \S             % SPIDER
1283  \xwebGe                \G
1284  \xwebRightShift        \GG
1285  \xwebNe                \I
1286  \xwebAssign            \K
1287  \xwebLeftShift         \LL
1288  \xwebMod               \MOD
1289  \xwebNull              \NULL
1290  \xwebNot               \R

1291  \xwebBinOr             \OR
1292  \xwebMemberRef         \PA
1293  \xwebThis              \this
1294  \xwebOr                \V
1295  \xwebAnd               \W
1296  \xwebXor               \XOR
1297  \xwebLE                \L             % SPIDER
1298  \xwebPointer           \MG
1299  \xwebPointerMemberRef  \MGA
1300  \xwebDecr              \MM
1301  \xwebIncr              \PP
1302  % more tokens
1303  \xwebId                \\%
1304  \xwebIdLetter          \|%
1305  \xwebRes               \&%
1306  \xwebString            \.%        %% ( ...Emacs...
1307  \xwebStringBreak       \)%
1308  \xwebNumber            \O              % SPIDER
1309  \xwebCombinedOp        \MRL
1310  % goes to TeX state
1311  \xwebComment           \C
1312  \xwebCxxComment        \SHC
1313  \xwebRefName           \X
1314  \xwebSpiderOutputFileName \XF
1315  % CWEB tokens
1316  \xwebMacrosHere        \ATH
1317  \xwebDefine            \D
1318  \xwebFormat            \F
1319  \xwebIdCat             \J
1320  \xwebVerbString        \=           % SPIDER
1321  % cross reference tags
1322  \xwebChangeFlag        \*%
1323  \xwebCRAlso            \A
1324  \xwebCRsAlso           \As
1325  \xwebCRCite            \Q
1326  \xwebCRsCite           \Qs
1327  \xwebCRUse             \U
1328  \xwebCRsUse            \Us
1329  \xwebCREt              \ET
1330  \xwebCRsEt             \ETs
1331  % finish the list
1332  \stop\stop
1333  \def\xweb_UserBindings{%
1334  \xweb_RestoreBindings
1335  \let\xweb_UserBindings\relax

1336 }% 1337 \fi 1338 } 1339 ⟨/spider⟩

22.9 \B in spider is Begin controlled comment. But there are no controlled comments in Spider, so we can leave it out.

    \def\B{\mathopen{\.{@\commentbegin}}}

22.10 In spider, the argument of \M is ended by a period. The meaning of the tag is the same.

1340 ⟨∗spider⟩

1341 \def\M#1.{%
1342  \ifon\end{xwebModule}\fi

1343  \xweb_PrepareSection{#1}%
1344  \ifon\begin{xwebModule}
1345  \ifnum\c@xwebLopDepth>9
1346  \addcontentsline{lop}{xwebsection}{%
1347  \protect\global\xwebGroupLevel 4 \thexwebModule.}%
1348  \edef\next{\write\xweb_cont{\ZZ{}{4}{\xweb_secno}%
1349  {\thepage}}}\next % \ZZ{title}{depth}{sec}{page}%
1350  {   \let\protect\@unexpandable@protect
1351  \edef\next{\write\xweb_cont{%
1352  \ZZ{}{4}{\xweb_secno}{\thepage}}}%
1353  \next
1354  }% write "\ZZ{title}{depth}{sec}{page}" to .con file

1355 \fi 1356 } 1357 ⟨/spider⟩

22.11 The index and the list of refinements are not given in .inx and .scn files, but in the .tex file itself. Furthermore, they are tagged a little differently:

      \inx

⟨index⟩

      \fin

⟨reflist⟩

      \con

1358 ⟨∗spider⟩

1359 \def\inx{
1360 \ifxwebIndex
1361  \xweb_SetupIndex
1362  \def\:{\I}
1363 \else
1364  \def\:##1.{}  % gobble \:\\{foo} 1, 2, 3.

1365 \fi 1366 }

1367 \def\fin{
1368 \ifxwebIndex
1369  \xweb_FinishIndex

1370 \fi

1371 \ifxwebRef
1372  \xweb_SetupReflist
1373  \def\:{\I}
1374 \else
1375  \def\:{}
1376  \def\XF##1\XF{}
1377  \def\X##1\X{}
1378  \def\U##1.{}
1379  \def\Us##1.{}
1380  \def\ET##1.{}
1381  \def\ETs##1.{}

1382 \fi 1383 }

1384 \def\con{
1385 \ifxwebRef
1386  \endgroup

1387 \fi 1388 } 1389 ⟨/spider⟩

22.12 Comments in Spider are not fixed; rather, the cseqs \commentbegin and \commentend are set in

  xweb.tex.

1390 ⟨∗spider⟩

1391 \def\xwebComment#1{%
1392  \5%                % 0.5em will be discarded on line break
1393  \hskip 1.5em
1394  \commentbegin%
1395  {\xweb_tex
1396  \xwebCommentHook

1397 #1% 1398 }%

1399  \commentend%

1400 }

1401 \let\xwebCommentHook\relax
1402 \let\xwebCxxComment\xwebComment

1403 ⟨/spider⟩

22.13 Macro definitions are not translated into preprocessor directives; Spidery webs expand these themselves. Therefore they should not look like preprocessor directives: the ‘#’ must be left out.

1404 ⟨∗spider⟩

1405 \def\xwebDefine{\xweb_macro{define}}
1406 %\def\xwebFormat{\4\xweb_macro{format}}
1407 \def\xwebFormat\\#1\\#2\par{\ifxwebHideFormats\else
1408 \4\xweb_macro{format}\\{#1} \\{#2}\par\fi}

1409 ⟨/spider⟩

22.14 The sequence \XF#1:#2\XF tags output files, instead of \X#1:\.{#2}\X. (\XF is bound to

\xwebSpiderOutputFileName )

1410 ⟨∗spider⟩

1411 \def\xwebSpiderOutputFileName#1:#2\XF{\xwebRefName{#1}:\.{#2}\X}

1412 ⟨/spider⟩

22.15 Restore catcodes:

1413 ⟨∗spider⟩

1414 \catcode`\_=\xwebCatUsCode
1415 \catcode`\@=\xwebCatOther

1416 ⟨/spider⟩

References

[1] Sylvio Levy. The CWEB System of Structured Documentation.

[2] Norman Ramsey. The Spidery WEB system of Structured Documentation.

[3] Mark Potse. The MWEB System of Structured Documentation, 1994, 1997.

[4] Sebastian Rahtz. Hypertext marks in L^{A}TEX, the hyperref package, October 1997.

[5] Leslie Lamport. MakeIndex: An Index Processor for L^{A}TEX, February 1987.

[6] Mark Potse. The webfiles package., December 1997.

Index

The italic numbers denote the code lines where the corresponding entry is described, underlined numbers point to the definition, all others indicate the places where it is used.

Symbols

\# . . . . . . . . . . . . . . . . 696, 814 \$ . . . . . . . . . . . . . . . . . 22, 702 \% . . . . . . . . . . . . . . . . . . . . 653 \& …. \underline{434}, 683, 724, 1168, \underline{1263} \) . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \* . . . . . . . . . \underline{221}, 277, \underline{434},

1026, 1087, 1140, 1177, \underline{1263} \, . . . . . . . . . 702, 713, 718, 742 \. . . . . . . . \underline{434}, 801, \underline{1263}, 1411 \/ . . . . . . . . . . . . . . . . 665, 670 \: . . . . . . 1362, 1364, 1373, 1375 \= . . . . . . . . . . . . . . . . . . . \underline{1263} \? . . . . . . . . \underline{434}, 695, 701, \underline{1263} \@M . . . . . . . 406, 547, 549, 1083

\@currentlabel . . . . . . . . . . 256

\@defpar . . . . . . . . . . . 859, 865

\@dottedtocline . . . . . 381, 391

\@flushglue . . . . . . . . . . . . 1131 \@for . . . . . . . . . . . . . . . . . . 991 \@gobble …. 339, 349, 365, 801 \@ifnextchar . . . . . . . . . . . . 975 \@input . . . . . . . . . . 1095, 1144 \@mkboth . . . . . . . . . . . 327, 330

\@noskipsecfalse . . . . . . . . 260
\@noskipsectrue . . . . . . . . . 263

\@optfalse . . . . . . . . . . . . . 993 \@opttrue . . . . . . . . . 994–1008 \@pnumwidth . . . . . . . . . . . . . 408 \@secpenalty . . . . . . . . 400, 424 \@starttoc . . . . . . . . . 328, 331 \@tempa . . . . . . . . . . 1206, 1209 \@tempb . . . . . . . . . . 1206, 1210 \@tempc . . . . . . . . . . 1209, 1212 \@tempd . . . . . . . . . . . 1209–1211 \@tempdima . . . . . . . . . . . . . 407 \@tempe . . . . . . . . . . 1206, 1209 \@tocrmarg . . . . . . . . . . . . . 405

\@unexpandable@protect . . .

. . . . . 295, 314, 1193, 1350 \[ . . . . . . . . . . . . . . . . . . . 1086 \\ . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \{ . . . . . . . . . . . . . . . . . . . . 687 \} . . . . . . . . . . . . . . . . . . . . 688 \^. . . . . . . . . . . . . . . . 685, 704 \` . . . . . . . . . . . . . . . . . . . . 690 \| . . . . . . . \underline{434}, 474, \underline{1263}, 1304 \~ . . . . . . . . . . . . . . . . 689, 704

Numbers

\0 . . . . . . . . . . . . . . . . . . . \underline{1263} \1 . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \2 . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \3 . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \4 . . . . . . . \underline{434}, \underline{1263}, 1406, 1408 \5 . . . . . . . \underline{434}, 711, \underline{1263}, 1392 \6 . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \7 . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \8 . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \9 . . . . . . . . . . . . . . . . . . . \underline{1107}

\␣ . . . . . . . . . . . . . . . . 682, 878

A \A . . . . . . . . . . . . . . . \underline{434}, \underline{1263}

                                 \addcontentsline . . . . . . . .

. 292, 312, 916, 1191, 1346 \addpenalty . . . . . . . . . . . . . 400 \addtoks . . . . . . . . . . . . . . . 764 \addvspace . . . . . . . . . 401, 411 \aftergroup . . . . . . 695, 696, 703 \amp . . . . . . . . . . . . . . . . . . \underline{1167} \anchor . . . . . . . . . . . . 198, 199 \AND . . . . . . . . . . . . . . \underline{434}, \underline{1263} \arabic . . . . . . . . . . . . 176, 242 \As . . . . . . . . . . . . . . \underline{434}, \underline{1263} \ast . . . . . . . . . . . . . . . 713, 718 \ATH . . . . . . . . . . . . . . \underline{434}, \underline{1263} \ATL . . . . . . . . . . . . . . . . . . \underline{1148}

B \B . . . . . . . . . . . \underline{564}, 1260, 1261 \bgroup . . . . . . . . 255, 702, 1149 \Black . . . . . . . . . . . . . . . . . 207

C \C . . . . . . . . . . . . . . . \underline{434}, \underline{1263}

                                 \c@xwebLopDepth . . . . . . 95,

96, 291, 311, 915, 1190, 1345 \c@xwebModule . . . . . . . 196, 753

                                 \c@xwebOutlineDepth . 301, 1200
                                 \c@xwebSecNoEject . . . . . . .

281, 1221, 1228, 1237, 1246 \CD . . . . . . . . . . . . . . . . . . \underline{1256} \centerline . . . . . . . . . . . . . 918 \ch . . . . . . . . . . . . . . . . . . . 925 \chapter . . . . . . . . . . . 326, 330 \chop . . . . . . . 948, 950, 960, 962 \circ . . . . . . . . . . . . . . . . . . 695 \clearpage . . . . . . . . . . . . . 273 \CM . . . . . . . . . . . . . . \underline{434}, \underline{1263}

                                 \CodelineIndex . . . . . . . . . . 12

\columnsep . . . . . . . . . . . . 1059

                                 \columnseprule . . . . . . . . . 1058

\commentbegin . . . . . . . . . . 1394 \commentend . . . . . . . . . . . . 1399 \con . . . . . . . . . . . . . . 924, \underline{1358} \cwebfile . . . . . . . . . . . . . . \underline{978}

D \D . . . . . . . . . . . . . . . \underline{434}, \underline{1263}

\DC . . . . . . . . . . \underline{434}, 1257, \underline{1263}

                                                                  \DeclareOption . . . . . . . . . .

. . . . . 74–85, 89–91, 95, 96

                                                                  \discretionary . . . . . . . . . . 692

\divide . . . . . . . . . . . . . . . . 425 \do . . . . . . . . . . . . . . . . . . . 991 \DocInput . . . . . . . . . . . . . . 34

                                                                  \documentclass . . . . . . . . . 2, 64

E \E . . . . . . . . . . . . . . . . . . . . \underline{434} \egroup . . . . . . . . 268, 702, 1151

                                                                  \EnableCrossrefs . . . . . . . . 11

\end . . . . . . . . . 37, 275, 308,

927, 1054, 1091, 1174, 1342 \endgraf . . . . . . . . . . . . . . . 581 \endinput . . . . . . . . . . . . . 1161 environments:

xwebModule . . . . . . . . . . . \underline{241} \equiv . . . . . . . . . . . . . . . . . 616 \ET . . . . . . . . . . \underline{434}, \underline{1263}, 1380 \ETs . . . . . . . . . . \underline{434}, \underline{1263}, 1381 \everypar . . . . . . . . . . 258, 261

                                                                  \ExecuteOptions . . . . . . . . . 97
                                                                  \exhyphenpenalty . 523, 531, 549

\ext . 946, 948, 952, 958, 960, 964

F \F . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \fbox . . . . . . . . . . . . . . . . . . 734 \fboxsep . . . . . . . . . . . . . . . 734 \filbreak . . . . . . . . . . . . . . 253 \fin . . . . . . . . . . . . . . 923, \underline{1358} \first … 768, 771–776, 779, 782 \font . . . . . . . . . . . . . . 626, 627 \footnotesize 653, 748, 829, 1134

G \G . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \ge . . . . . . . . . . . . . . . . . . . 617 \GG . . . . . . . . . . . . . . \underline{434}, \underline{1263} \gg . . . . . . . . . . . . . . . . . . . 658

H \hangindent . . . . . . 404, 568,

583, 606, 830, 1102, 1133 \hfil . . . . . . . 589, 599, 878, 899 \hfill . . . . . . . . . . . . . . . . . 408 \hfilneg . . . . . . . . . . . 590, 600 \hrule . . . . . . . . . . . . . . . . . 669 \hsize . . . . . . . . . . . . . . . . 1082 \hskip … 267, 290, 566, 611,

712, 883–888, 1184, 1393 \hspace . . . . . . . . . . . . . . . . 264 \hss . . . . . . . . . . . . 408, 880, 900 \hyperlink . . . . . . . . . . . . . 182 \hypertarget . . . . . . . . . . . . 183 \hyphenpenalty 522, 530, 548, 1083

I

\I . . . . . . . . . . . . . . . . \underline{434},

1085, 1133, \underline{1263}, 1362, 1373 \if@noskipsec 259, 427, 566, 570 \if@opt . . . . . . . . . . . 979, 1009 \if@twocolumn . . . . . 1051, 1057 \ifcase . . . . . . . . . . . . . . . . 881 \iffalse . . . . . . . . . . . 225, 980 \IfFileExists . . . . . . 892, 1050 \ifmmode . . . . . . . . . . . 580, 738 \ifnum 178, 181, 184, 197, 280,

281, 291, 301, 311, 368, 377, 778, 876, 895, 915, 1070, 1124, 1190, 1200, 1221, 1228, 1237, 1246, 1345

\ifon \underline{221}, 275, 287, 308, 310,

927, 1174, 1182, 1342, 1344 \ifstr . . . . . . . . . \underline{967}, 994–1008 \iftrue . . . . . . . . . . . . 225, 981 \ifvmode . . . . . . . . . . . . . . . 569

\ifxweb_cancel . . . . . . . . . \underline{1204}
\ifxweb_FirstModule . . . . . . \underline{241}
\ifxweb_GlobalCon . . . . 73, 987
\ifxweb_GlobalHideFormats .

. . . . . . . . . . . . . . 72, 988

\ifxweb_GlobalIndex . . . 68, 983
\ifxweb_GlobalOC . . . . . 71, 986
\ifxweb_GlobalRagged . . 70, 985
\ifxweb_GlobalRef . . . . 69, 984
\ifxweb_idxEntries . . . \underline{850}, 931
\ifxweb_multicol . . \underline{1048}, 1157
\ifxweb_scnEntries . . . \underline{850}, 933

\ifxwebCon . . . . . . . . . . \underline{67}, 247

\ifxwebHideFormats  \underline{67}, 815, 1407

\ifxwebIndex \underline{67}, 930, 1360, 1368 \ifxwebRagged . . . . . . . . \underline{67}, 252 \ifxwebRef . \underline{67}, 932, 1371, 1385 \ignorespaces . . . . . . . 585, 592 \indent . . . . . . . . . . . . . . . . 571

\IndexPrologue . . . . . . . . . . . 6

\input . . . . . . . . . . 90, 892, 926

\interlinepenalty . . . . . . . 406

\intro . . . . . . . . . . . 1040, 1041 \inx . . . . . . . . . . . . . . 922, \underline{1358} \it . . . . . . . . . . . . . . . 665, 695

J

\J . . . . . . . . . . . . . . . \underline{434}, \underline{1263}

K

\K . . . . . . . . . . . . \underline{434}, 664, \underline{1263} \kern 573, 583, 590, 630, 634–

636, 640–642, 659, 665, 669, 670, 678, 695, 701, 748

L

\L . . . . . . . . . . . . . . . . . . . \underline{1263} \l@program . . . . . . . . . . . . . \underline{335} \l@starred . . . . . . . . . . . . . \underline{361}

\l@xwebSection . . . . . . . . . . \underline{345}

\Lambda . . . . . . . . . . . . . . . . 620 \land . . . . . . . . . . . . . . . . . . 615 \langle . . . . . . . . . . . . . . . . 742 \large . . . . . . . . . . . . . . . . . 408 \le . . . . . . . . . . . . . . . . . . . 618 \leaders . . . . . . . . . . . . . . . 878 \leavevmode . . . . . . . . 418, 1103

\listofprograms . . . . . . . . . \underline{322}

\LL . . . . . . . . . . . . . . \underline{434}, \underline{1263} \ll . . . . . . . . . . . . . . . . . . . 652 \lnot . . . . . . . . . . . . . . . . . . 621 \lor . . . . . . . . . . . . . . . . . . . 622 \lower . . . . . . . . . . . . . . . . . 630

M

\M . . . . . . . . . . . . . . . \underline{306}, \underline{1340}

\makeatletter . . . . . . . . . . . . 5
\MakePrivateLetters . . . . . . . \underline{1}

\maketoks . . . . . . . . . . \underline{756}, 795 \markboth . . . . . . . . . . . . . . . 7 \mathbin . . . . . . . . 653, 654, 656 \mathchardef . . . . . . . . . . . . 646 \mathrel . . . . . . . . . . . 657, 664 \maybe . . . . . . . . . . \underline{221}, 980, 981 \mbox . . . . . . . . . . . . . . . . . . 264 \medskip . . . . . . . . . 1038, 1044 \MessageBreak … 62, 1012, 1014 \MG . . . . . . . . . . . . . . \underline{434}, \underline{1263} \MGA . . . . . . . . . . . . . . \underline{434}, \underline{1263} \mid . . . . . . . . . . . . . . . . . . . 648 \MM . . . . . . . . . . . . . . \underline{434}, \underline{1263} \MOD . . . . . . . . . . . . . . \underline{434}, \underline{1263} \MRL . . . . . . . . . . . . . . \underline{434}, \underline{1263}

N

\N . . . . . . . . . . . . . . . \underline{272}, \underline{1172} \name . . . . . . . . . . . . . . 195, 199 \ne . . . . . . . . . . . . . . . . . . . 619 \newbox 243, 556, 557, 629, 632, 638 \newcommand . . . . . . . . . . . . . 330 \newcounter …. 93, 94, 218, 222 \newdimen . . . . . . . 356, 554, 555

\newenvironment 245, 1054, 1056

\newskip . . . . . . . . . . . 510, 511 \next . . . . . . . 127, 131, 133,

155, 158, 160, 166, 170, 172, 296, 298, 315, 317, 369, 371, 373, 766, 779, 780, 785, 803–805, 807, 810, 859, 862, 865, 1194, 1197, 1348, 1349, 1351, 1353

\noATL . . . . . . . . . . . . . . . . \underline{1148} \noatl . . . . . . . . . . . . . . . . \underline{1148} \nobreak . . . . . . . . . . . . . . . 408 \noindent … 403, 573, 582,

830, 1037, 1043, 1122, 1149 \nopagebreak . . . . . . 1038, 1123 \NULL . . . . . . . . . . . . . \underline{434}, \underline{1263} \null . . . . . . . . . . . . . . . . . . 738 \numberline . . 339, 349, 365, 407

O

\O . . . . . . . . . . . . . . . . . . . \underline{1263} \onecolumn . . . . . . . . . . . . 1063 \onfalse . . . . . . . . . . . . . . . 936

\OnlyDescription . . . . . . . . 13

\onmaybe . . . . . . . . . . . . . . . \underline{221} \ontrue . . . . . . . . . . . . 224, 234 \openin . . . . . . . . . . . . . . . . 857 \openout . . . . . . . . . . . . 28, 249 \oplus . . . . . . . . . . . . . . . . . 623 \OR . . . . . . . . . . . . . . \underline{434}, \underline{1263} \or . . . . . . . . . . . . . . . 882–887

P

\P . . . . . . . . . . . . . . 1170, \underline{1259} \p@ 401, 411, 545, 734, 1059, 1079 \PA . . . . . . . . . . . . . . \underline{434}, \underline{1263} \PackageError …. 59, 187, 1009 \pagestyle . . . . . . . . . . . . . . 4 \parfillskip … 405, 1082, 1131 \parindent . . . . . . . . 264, 1080 \parskip … 518, 526, 544, 1079 \PB . . . . . . . . . . . . . . . \underline{414}, 802 \pdfannotlink . . . . . . . . . . . 204 \pdfdest . . 210, 896, 1071, 1125 \pdfendlink . . . . . . . . . . . . . 208 \pdfoutline 199, 897, 1072, 1126 \penalty . . . . . . . . . . . . . . .

252, 254, 261, 430, 589, 599 \postATL . . . . . . . . . . . . . . \underline{1148} \PP . . . . . . . . . . \underline{434}, \underline{1167}, \underline{1263} \pretolerance …. 521, 529, 547

\PrintChanges . . . . . . . . . . . 36

\PrintIndex . . . . . . . . . . . . . 35

\ProcessOptions . . . . . . . . 1156

\protect . . . . . . . . . . . . 63, 64, 293, 295, 313, 314, 1010, 1192, 1193, 1347, 1350

\ProvidesPackage . . . . . . . . 52

Q

\Q . . . . . . . . . . . \underline{434}, 1136, \underline{1263} \Qs . . . . . . . . . . \underline{434}, 1137, \underline{1263} \quad . . . . . . . . . . . . 1104, 1134

R

\R . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \raise . . . . . . . . . . . . . 635, 641 \rangle . . . . . . . . . . . . . . . . 742 \readcontents . . . . . . . 892, 902

\RecordChanges . . . . . . . . . . 12

\Red . . . . . . . . . . . . . . . . . . . 207

\renewcommand . . . . . . . . . . . . 5
\RequirePackage . . . . . . . . 1158

\reset@font . . . . . 748, 829, 1134 \rightskip 405, 519, 527, 545, 1081 \rlap . . . . . . . . . . . . . . . . . . 214 \rm . . . . . . . . . . . . 653, 702, 878

S

\S . . . . . . . . . . . . . . 1169, \underline{1263} \sb . . . . . . . . . . . . . . . . . . . 702

\scriptscriptstyle . . . . . . . 696

\scriptstyle . . . . . . . . . . . . 641 \secstar . . . . . . . . . . . 227, 230 \section . . . . . . . . . . 6, 58, 327 \setbox . . 255, 340, 350, 366,

559, 560, 630, 633, 639, 795 \setcounter …. 93, 94, 219, 237 \setdate . . . . . . . . . . . . . 26, 27 \setname . . . . . . . . . . . . . . .

913, 914, 943, 951, 955, 963 \setversion . . . . . . . . . . . 24, 25 \sevensy . . . . . . . . . . . . . . . \underline{625} \sfcode . . . . . . . . . 520, 528, 546 \SHC . . . . . . . . . . . . . . \underline{434}, \underline{1263} \sim . . . . . . . . . . . . . . . . . . . 649 \smallbreak . . . . . . . . . . . . . 876 \smallskip . . . . . . . . . 431, 826 \SS . . . . . . . . . . . . . . . . . . \underline{1167} \st . . . . . . . . . . . . . . . . . . . 790 \stop . . . . . . . . . . . . . . 126,

148, 150, 154, 165, 501, 1332 \string . . . . . . . . . 141, 168, 169

T

\T . . . . . . . . . . . . . . . . . . . . \underline{434} \teni . . . . . . . . . . . . . . . . . . \underline{625} \tentex . . . . . . . . . . . . . . . 1151 \textbf . . . . . . . . . 266, 289, 918 \texttt . . . . . . . . . . 1032, 1112 \textwidth . . . . . . . . . 877, 899 \thepage 297, 316, 1196, 1349, 1352 \theskipper . . . . . . . . . 1216,

1222, 1229, 1238, 1247, 1253

\thexwebModule . . . . . . \underline{241},

294, 313, 754, 1192, 1347 \this . . . . . . . . . . . . . \underline{434}, \underline{1263} \tmpnr . . . . . . 194, 196, 752, 753 \tolerance . . . . . . . . . . . . 1083 \tt . . . . . . . . 408, 676, 692, 696 \tw@ . . . . . . . . . . . . . . . 734, 818 \twocolumn . . . . . . . . . . . . 1061 \typeout . . . . . . . . . . . . 54, 992

U

\U . . . . . . . \underline{434}, 1138, \underline{1263}, 1378 \underline . . . . . . . . . . . . 1108 \unskip . . . . . . . . . . . . . . . 1043 \unvbox . . . . . . . . . . . . . . . . 268 \uppercase . . . . . 328, 331, 1150 \Us . . . . . . \underline{434}, 1139, \underline{1263}, 1379 \usepackage . . . . . . . . . . . . 3, 63

V

\V . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \vb . . . . . . . . . . . . . . . . . . . \underline{434} \vbox . . . . . . . . . . . . . . 255, 669 \vf . . . . . . . . . . . . . . . . . 28, 29 \vfil . . . . . . . . . . . . . . . . . . 252 \vfilneg . . . . . . . . . . . . . . . 252 \vskip 910, 918, 1037, 1120, 1216

W

\W . . . . . . . . . . . . . . . \underline{434}, \underline{1263} \webfile . . . . . . \underline{974}, 1010, 1021

X

\X \underline{434}, 728, 737, \underline{1263}, 1377, 1411 \XF . . . . . . . . . \underline{1263}, 1376, 1411 \XOR . . . . . . . . . . . . . . \underline{434}, \underline{1263}

\xweb_AddTokens . . . . . . . . .

… 763, 765, 781, 782, 787 \xweb_adn . . . . . . . 765, 771–776 \xweb_anchor . . . . . . . . \underline{175}, 198 \xweb_backup …. 442, \underline{603}, 1272 \xweb_bak . . . . . . . . . . \underline{553}, 609 \xweb_bakk . . . . . . \underline{553}, 584, 591

\xweb_BigBreak . . 445, \underline{578}, 1275
\xweb_BoldTocLine . . . 369, \underline{389}

\xweb_break 444, \underline{578}, 1268, 1274

\xweb_cancelfalse . . . . . . .

1227, 1233, 1236, 1242, 1250

\xweb_canceltrue . . 1205, 1224
\xweb_CheckDot . . 742, \underline{798}, 1104
\xweb_consetup . . . . . . . . . . \underline{872}

\xweb_cont 249, 250, 296, 315,

\underline{872}, 935, 1194, 1348, 1351

\xweb_contentsline . . . \underline{872}, 901
\xweb_countA . . . . . . . . . . . .

… 761, 762, 766, 778, 789 \xweb_CR . . \underline{100}, 827, 1075, 1128

\xweb_CweaveBindings . . . . .

. . 107, 109, 114, \underline{434}, \underline{1263} \xweb_decr . . . . . . . . . \underline{625}, 650

\xweb_DecrIndent 440, \underline{603}, 1270
\xweb_DocLayout . . . . . \underline{100}, \underline{534}
\xweb_documentation . . \underline{100}, 238
\xweb_DoRebind . . . . . . . . . . \underline{117}
\xweb_ExprBreak . 441, \underline{578}, 1271

\xweb_file . . . . . . . . . 976, \underline{978}

\xweb_FinishIndex . \underline{1066}, 1369
\xweb_FirstModulefalse 244, 248
\xweb_FirstModuletrue . . . . 920
\xweb_GlobalConfalse . . . . . 82
\xweb_GlobalContrue . . . . . . 83
\xweb_GlobalHideFormatsfalse

. . . . . . . . . . . . . . . . . . 85

\xweb_GlobalHideFormatstrue 84
\xweb_GlobalHypertype . . . .

. . . . . . . . . . . . 88–91, 990

\xweb_GlobalIndexfalse . . . 75
\xweb_GlobalIndextrue . . . . 74
\xweb_GlobalOCfalse . . . . . . 81
\xweb_GlobalOCtrue . . . . . . . 80
\xweb_GlobalRaggedfalse . . 79
\xweb_GlobalRaggedtrue . . . 78
\xweb_GlobalReffalse . . . . . 77
\xweb_GlobalReftrue . . . . . . 76
\xweb_HasEntries . \underline{854}, 930, 932
\xweb_headcheck 1176, 1183, \underline{1204}

\xweb_hex . . . . . . . . . . . . . . \underline{694} \xweb_hlink . . . . . . . . . \underline{175}, 754 \xweb_htarget . . . . . . . \underline{175}, 266

\xweb_hypertype . . . . . . \underline{67},

178, 181, 184, 197, 895, 990, 1006–1008, 1070, 1124

\xweb_ifnch . . . . . . . . . . . . \underline{1204}

\xweb_ifnextchar . . . . . . . \underline{1204}

\xweb_incr . . . . . . . . . \underline{625}, 651

                                 \xweb_IncrIndent . . . . . . . .

. . . . . . 439, \underline{603}, 819, 1269 \xweb_indent . . . . . \underline{553}, 568,

583, 605, 606, 608, 611, 818

                                 \xweb_IndexTop . . . . \underline{1034}, 1069
                                 \xweb_InputWebfile . . \underline{909}, 1020
                                 \xweb_LayoutInit . . . . 537, \underline{553}

\xweb_macro \underline{813}, 1405, 1406, 1408

                                 \xweb_makenote . . . . . . 778, 787
                                 \xweb_makethechar . . . . . . \underline{1204}

\xweb_ModBox . . . . . . . . . . . . \underline{241}

                                 \xweb_ModTitle . . . . . . . . . .

. . . . . 288, 1182, 1183, 1192, 1195, 1201, 1218, 1251

                                 \xweb_multicolfalse . . . . . 1049
                                 \xweb_multicoltrue . . . . . . 1051
                                 \xweb_noindent . . 446, \underline{603}, 1276
                                 \xweb_NormalTocLine . . . . . .

. . . . . . . . . . 352, 371, \underline{375} \xweb_oct . . . . . . . . . . . . . . \underline{694} \xweb_off . . . . . . . . . . . . . . \underline{978} \xweb_on . . . . . . . . . . . . . . . \underline{978} \xweb_opt . . 991, 992, 994–1008

                                 \xweb_OptBreak . . 443, \underline{578}, 1273

\xweb_pdflink . . . . . . . 185, \underline{202}

                                 \xweb_pdftarget . . . . . 186, \underline{202}

\xweb_pointer . . . . . . . \underline{625}, 655 \xweb_poptoks . . . . . . . 767, 770

                                 \xweb_PrepareSection . . . . .

. \underline{221}, 286, 309, 1181, 1343 \xweb_program . . . . . . . \underline{100}, 567

                                 \xweb_ProgramLayout . . . . . .

. . . . . . . . . . 110, 520, \underline{534} \xweb_rebind …. \underline{117}, 437, 1266

                                 \xweb_RestoreBinding . 150, \underline{163}
                                 \xweb_RestoreBindings . . . .

. . . . . . . . . \underline{146}, 503, 1334

                                 \xweb_RestoreDocLayout  \underline{509}, 540
                                 \xweb_Rprogram . . . . . . \underline{100}, 417
                                 \xweb_SaveBinding . . . 129, \underline{136}
                                 \xweb_SaveDocLayout . . \underline{509}, 538
                                 \xweb_SaveExhyphenpenalty . \underline{509}
                                 \xweb_SaveHyphenpenalty . . \underline{509}
                                 \xweb_SaveParskip . . . . . . . \underline{509}
                                 \xweb_SavePretolerance . . . \underline{509}
                                 \xweb_SaveRightskip . . . . . . \underline{509}
                                 \xweb_SaveSemSFCode . . . . . . \underline{509}

\xweb_secno . . . . . . \underline{221}, 278, 280, 285, 297, 302, 1178, 1180, 1196, 1201, 1348, 1352

                                 \xweb_SetupHrefs . . . \underline{175}, 1019
                                 \xweb_SetupIndex . . \underline{1066}, 1361
                                 \xweb_SetupReflist . \underline{1118}, 1372
                                 \xweb_SpiderLopEntry 1185, \underline{1188}

\xweb_star . . . . . . . . . \underline{221}, 266

                                 \xweb_StringSetup . . . . . . . \underline{674}

\xweb_TagSec . . . . . . . . 788, \underline{792} \xweb_tdone . . . . . . . . . 779, 790 \xweb_tempa . . . . . . . . . 969, 971 \xweb_tempb . . . . . . . . . 970, 971 \xweb_tex . . . . . . . . . . \underline{100},

714, 742, 1036, 1121, 1395 \xweb_TmpFile . . . . . . . . . . . \underline{854}

\xweb_ToggleText . . . . . . . .

. . . . . . . 738, 739, 741, 743 \xweb_toksA . . . . . . . . . . . . .

757, 768, 770, 790, 795, 796 \xweb_toksB . . . . . . . . . . . . .

758, 781, 782, 787, 790, 795 \xweb_toksC . . 759, 765, 788, 789 \xweb_toksD . . . . . . 760, 768, 781

\xweb_ToRestore \underline{117}, 142, 150, 151
\xweb_TTLopLine . . . . . 342, \underline{398}
\xweb_undefine . . . . . . . . . . \underline{146}
\xweb_undefined \underline{117}, 139, 148, 149
\xweb_UserBindings . . . . . . .

. . . . . . \underline{100}, \underline{434}, 938, \underline{1263} \xwebAddress …. 449, \underline{645}, 1279 \xwebAnd . . . . . . . 465, \underline{614}, 1295 \xwebAssign . . . . . 456, \underline{645}, 1286 \xwebBinOr . . . . . 461, \underline{645}, 1291

\xwebCatActive . . . . . . . . . . \underline{39}
\xwebCatClose . . . . . . . . . . . \underline{39}
\xwebCatEscape . . . . . . . . . . \underline{39}
\xwebCatIgnore . . . . . . . . . . \underline{39}
\xwebCatLetter . . \underline{39}, 1164, 1165

\xwebCatOpen . . . . . . . . . . . . \underline{39} \xwebCatOther . . . . . . . \underline{39}, 1415

\xwebCatUsCode . . \underline{39}, 1160, 1414
\xwebChangeFlag . . . . . . . . .

. . . . . 491, \underline{845}, 1140, 1322

\xwebCombinedOp . 479, \underline{663}, 1309

\xwebComment 481, \underline{709}, 1311, \underline{1390}

\xwebCommentHook . . . \underline{709}, \underline{1390}
\xwebComplement . 450, \underline{645}, 1280

\xwebConfalse . . . . . . 987, 1002 \xwebContents . . . . . . . 247, \underline{890}

\xwebContentsBot . . . . 903, \underline{909}
\xwebContentsTop . . . . 894, \underline{909}

\xwebContrue . . . . . . . 987, 1003 \xwebCRAlso . . . . . 492, \underline{835}, 1323

\xwebCRChanged . . . . . 925, \underline{1023}

\xwebCRCite . . . . . 494, \underline{835}, 1325 \xwebCREt . . . . . . 498, \underline{845}, 1329

\xwebCrossRef . . . . . . . \underline{823},

836, 837, 839, 840, 842, 843, 1025, 1113–1116, 1134

\xwebCRsAlso …. 493, \underline{835}, 1324 \xwebCRsCite …. 495, \underline{835}, 1326 \xwebCRsEt . . . . . 499, \underline{845}, 1330 \xwebCRsUse . . . . . 497, \underline{835}, 1328 \xwebCRUse . . . . . 496, \underline{835}, 1327

\xwebCxxComment . . . . . . . . .

. . . . . 482, \underline{709}, 1312, \underline{1390} \xwebDate . . . . . . . . . . . . \underline{15}, 54 \xwebDecr . . . . . . 470, \underline{645}, 1300 \xwebDefine 486, \underline{813}, 1317, \underline{1404} \xwebEquiv . . . . . 452, \underline{614}, 1282 \xwebFormat 487, \underline{813}, 1318, \underline{1404} \xwebGe . . . . . . . . 453, \underline{614}, 1283

                                 \xwebGroupLevel . . . . . . . . .

\underline{216}, 276, 281, 293, 313, 337, 347, 363, 368, 377, 378, 380, 382, 384, 393, 1175, 1185, 1190, 1192, 1195, 1200, 1220, 1221, 1226, 1228, 1232, 1235, 1237, 1241, 1244, 1246, 1347

                                 \xwebHideFormatsfalse 989, 1005
                                 \xwebHideFormatstrue 988, 1004

\xwebId . . . . . . . . 473, \underline{663}, 1303 \xwebIdCat . . . . . 488, \underline{723}, 1319 \xwebIdIndex …. 931, 952, \underline{1066} \xwebIdLetter … 474, \underline{663}, 1304 \xwebIncr . . . . . . 471, \underline{645}, 1301

                                 \xwebIndentUnit . . \underline{553}, 568,

573, 590, 605, 608, 611, 818

                                 \xwebIndexDeclared . 1086, \underline{1107}
                                 \xwebIndexEntry . . . 1085, \underline{1099}
                                 \xwebIndexfalse . . . . . 983, 995
                                 \xwebIndexIntro  \underline{1029}, 1040, 1043
                                 \xwebIndexName . . . . \underline{1029}, 1038
                                 \xwebIndextrue . . . . . . 983, 994
                                 \xwebInputIndex . . . . . . . . . \underline{941}
                                 \xwebInputReflist . . . . . . . \underline{941}

\xwebJobName . . . . . . . . . . . \underline{1066}

                                 \xwebJobname . . . . . . . . 176,

247, 249, 323, 857, 860, 913, 916, 918, 931, 933, 944, 952, 956, 964, 1032, 1071, 1072, \underline{1111}, 1125, 1126

\xwebLapStar . . . . . . . \underline{213}, 1087 \xwebLE . . . . . . . . 467, \underline{614}, 1297

                                 \xwebLeftShift . . 457, \underline{645}, 1287

                                 \xwebLopIndent . . . . . . \underline{355},

384, 385, 393, 394, 404, 407

                                 \xwebLopIndentMaxLevel . . .

. . . . . . . . . . \underline{355}, 377, 378 \xwebLopName . . . . . . . . . . . . \underline{322}

                                 \xwebMacrosHere . 485, \underline{723}, 1316
                                 \xwebMainSecSkip . . . . . . . .

\underline{272}, 1222, 1229, 1238, 1247 \xwebMajor . . . . . . . . . . . . . \underline{15} \xwebMajorNr . . . . . . . . . . 23, 24

                                 \xwebMemberRef . . 462, \underline{645}, 1292

\xwebMod . . . . . . . 458, \underline{645}, 1288 \xwebModule . . . . . . . . . . . . . \underline{221} xwebModule (environment) … \underline{241}

                                 \xwebModuleHook . . . . . . . . . \underline{241}

\xwebNe . . . . . . . . 455, \underline{614}, 1285 \xwebNot . . . . . . . 460, \underline{614}, 1290 \xwebNull . . . . . . 459, \underline{614}, 1289 \xwebNumber . . . . . 478, \underline{694}, 1308

                                                                  \xwebNumberListHangindent .

. . . . . . . . \underline{823}, 1102, 1133 \xwebOr . . . . . . . . 464, \underline{614}, 1294 \xwebPageName . . . . . . . . . . . \underline{890}

                                                                  \xwebPDFOutline . \underline{192}, 302, 1201

\xwebPointer …. 468, \underline{645}, 1298

                                                                  \xwebPointerMemberRef . . . .

. . . . . . . . . 469, \underline{645}, 1299

                                                                  \xwebProgPenalty . . . . . . . . \underline{422}
                                                                  \xwebRaggedfalse . . . . 985, 999
                                                                  \xwebRaggedtrue . . . . . 985, 998

\xwebReffalse . . . . . . . 984, 997 \xwebRefList …. 933, 964, \underline{1118}

                                                                  \xwebReflistName . . \underline{1111}, 1123
                                                                  \xwebRefMacrosHere . . . . . . . \underline{723}
                                                                  \xwebRefName . . . . . . . . . . . .

. 483, 728, \underline{736}, 1313, 1411

                                                                  \xwebRefNumber . . . 727, 742, \underline{746}

\xwebReftrue . . . . . . . . 984, 996 \xwebRel . . . . . . . 448, \underline{645}, 1278 \xwebRes 475, 661, \underline{663}, 820, 1305

                                                                  \xwebRightShift . 454, \underline{645}, 1284

\xwebRLCite . . . . . . . \underline{1111}, 1136 \xwebRLsCite . . . . . . \underline{1111}, 1137 \xwebRLsUse . . . . . . . \underline{1111}, 1139 \xwebRLUse . . . . . . . \underline{1111}, 1138 \xwebScope . . . . . 451, \underline{645}, 1281

                                                                  \xwebSecNoEject . . . . . . . . . \underline{216}
                                                                  \xwebSectionName . . . . . . . . \underline{890}
                                                                  \xwebSetModNrList . . . . . . .

. 749, \underline{792}, 831, 1104, 1135

                                                                  \xwebSetModuleNumber . . . . .

. . . . . . . . . . \underline{751}, 793, 879

                                                                  \xwebSpiderOutputFileName .

. . . . . . . . . . . . 1314, 1411

                                                                  \xwebSpiderOutputFilename  \underline{1410}

\xwebString . . . . . . . . . . . . .

476, \underline{674}, 724, 734, 805, 1306

                                                                  \xwebStringBreak 477, \underline{674}, 1307

\xwebThis . . . . . . 463, \underline{645}, 1293 \xwebTocName . . . . . . . . . . . . \underline{322}

                                                                  \xwebVerbString . 489, \underline{733}, 1320

\xwebVersion . . . . . . . . . . \underline{15}, 54 \xwebXor . . . . . . . 466, \underline{614}, 1296

Y \Y . . . . . . . . . . . . . \underline{422}, 595, 826

Z \Z . . . . . . . . . . . . . . . . . . . . \underline{434} \z@skip . . . . . . . . . . . . . . . . 544 \ZZ . . . . . . . . . . . . 297, 299,

316, 318, \underline{872}, 901, 1195, 1198, 1348, 1349, 1352, 1354