\iffalse
% specification of CWEAVE/TeX interface for use in the documentation 
% of the cwebfiles style option
%        =========
%
% Based on cweave-spec.tex by Joachim Schrod.
% [LaTeX]
\fi

	\chap The interface between \cweave{} and \TeX{}.
	\label{sec:cweave-spec}



Here we present all tags output by \cweave{}\footnote{This information
	refers to \cweb{} 3.0.}
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.


\sect 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 non-empty, it's either a number listing
just how many arguments are expected; then usual argument passing is
used. Or it displays the context required.
 %
\begin{cseqtab}
|\ATL| & \verb*|#1 #2 | & \cweb{} operator: |@l|
	&& (how to output non-ASCII chars in \ctangle{})
	&& \arg1 hex code of mapped character
	&& \arg2 string output by \ctangle{}
|\M| & 1 & \cweb{} structure tag: start of a section
	&& \arg1 section number
|\N| & |#1#2#3.| & \cweb{} structure tag: start of a section group
	&& \arg1 group depth, $0 \le |#1|$
	&& \arg2 section number
	&& \arg3 section group name
|\PB| & 1 & restricted program mode material
	&& \arg1 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
	&& \arg1 text of index entry
\end{cseqtab}

|\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~\ref{sec:text-tag.priv}). 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.


\sect 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:
 %
\begin{cseqtab}
|\ch| & |#1.| & Note which sections are changed
	&& \arg1 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
\end{cseqtab}



\sect \label{sec:text-tag.priv}
 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.
 %
\begin{cseqtab}
|\*| &  & tag after section number: this section is changed.
\end{cseqtab}

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.
 %
\begin{cseqtab}
|\I| & \verb*|#1, | & start of an index entry
	&& \arg1 index entry
|\[| & |#1]| & underlined section number in index
	&& \arg1 section number
|\.| & 1 & |@.| index entry
	&& \arg1 index entry
\end{cseqtab}

In the list of refinement names the entries are marked similar to
the index entries. But note that |\I| has no arg here.
 %
\begin{cseqtab}
|\I| & & start of a new refinement name
\end{cseqtab}


\sect \label{sec:prog-tag}
 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.
 %
\begin{cseqtab}
|\?| &  & 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
\end{cseqtab}

\def\vbar{\char"7C}
Other tokens have variable parts, passed as arguments.
 %
\begin{cseqtab}
|\.| & 1 & C string
	&& \arg1 string
|\)| &  & discretionary break between string parts
|\&| & 1 & reserved identifier
	&& \arg1 identifier
|\\| & 1 & ``normal'' identifier with more than one chars
	&& \arg1 identifier
|\|{\tt\vbar} & 1 & ``normal'' identifier with one char
	&& \arg1 character
|\C| & 1 & C comment
	&& \arg1 comment text
|\MRL| & 1 & C operator: combined binary operators
	&& \arg1 operators, |\K| must print as `$=$'
|\SHC| & 1 & \C++ comment
	&& \arg1 comment text
|\T| & 1 & numeric constants
	&& \arg1 constant
|\X| & |#1: #2\X| & refinement name
	&& \arg1 section number
	&& \arg2 refinement name
\end{cseqtab}
 %
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:
 %
\begin{cseqtab}
|\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{})
	&& \arg1 string
\end{cseqtab}

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.
 %
\begingroup
 \hfuzz=22pt
\begin{cseqtab}
|\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'')
\end{cseqtab}
\endgroup

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.
 %
\begin{cseqtab}
|\1| &  & future stmts indented one more unit
|\2| &  & future stmts indented one less unit
|\3| & 1 & optional line break within a statement
	&& \arg1 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)
\end{cseqtab}


\sect Some args are designated as strings above. Within these args the
following tags are used to represent special characters:
 %
\begin{cseqtab}
\verb*|\ | &  & space
|\&| &  & ampersand
|\\| &  & backslash
|\^| &  & hat
|\_| &  & underscore
|\{| &  & left brace
|\}| &  & right brace
|\~| &  & tilde
\end{cseqtab}


\sect Last, we have tags which are used in their ``standard''
\LaTeX{} meaning. We don't have much work with them:
 %
\begin{cseqtab}
|\#| &  & 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 \LaTeX{} 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
\end{cseqtab}



