home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d551 / cweb.lha / CWeb / cweb2.lzh / cweb / cwebman.tex (.txt) < prev    next >
LaTeX Document  |  1990-12-14  |  65KB  |  1,217 lines

  1. \input cwebmac
  2. \parskip 0pt plus 1pt
  3. \def\RA{\char'31 } % right arrow
  4. \def\hang{\hangindent 4em\ignorespaces}
  5. \font\eightrm=cmr8
  6. \font\ninerm=cmr9
  7. \font\ninett=cmtt9
  8. \font\eighttt=cmtt8
  9. \def\Pascal{Pascal}
  10. \font\quoterm=cmssq8
  11. \font\quoteit=cmssqi8
  12. \def\pb{\.{|...|}}
  13. \def\v{\.{\char'174}} % vertical (|) in typewriter font
  14. \def\lpile{\def\cr{\hfill\endline}\matrix} % I only use \lpile by itself
  15. \abovedisplayskip=.5\abovedisplayskip
  16. \belowdisplayskip=.5\belowdisplayskip
  17. \abovedisplayshortskip=.5\abovedisplayshortskip
  18. \belowdisplayshortskip=.5\belowdisplayshortskip
  19. \outer\def\section #1.{\penalty-50\vskip 6pt plus 3pt minus 3pt
  20.   \noindent{\bf #1.}\quad\ignorespaces}
  21. \def\lheader{\mainfont\the\pageno\hfill\sc\runninghead\hfill}
  22. \def\rheader{\hfill\sc\runninghead\hfill\mainfont\the\pageno}
  23. \def\runninghead{{\tentt CWEB} USER MANUAL}
  24. % This verbatim mode assumes that ! marks are !! in the text being copied.
  25. \def\verbatim{\begingroup
  26.   \def\do##1{\catcode`##1=12 } \dospecials
  27.   \parskip 0pt \parindent 0pt \let\!=!
  28.   \catcode`\ =13 \catcode`\^^M=13
  29.   \tt \catcode`\!=0 \verbatimdefs \verbatimgobble}
  30. {\catcode`\^^M=13{\catcode`\ =13\gdef\verbatimdefs{\def^^M{\ \par}\let =\ }} %
  31.   \gdef\verbatimgobble#1^^M{}}
  32. \null\vfill
  33. \noindent
  34. Copyright \copyright\ 1987,\thinspace1990 Silvio Levy and Donald E. Knuth
  35. \bigskip\noindent
  36. Permission is granted to make and distribute verbatim copies of this
  37. document provided that the copyright notice and this permission notice
  38. are preserved on all copies.
  39. \smallskip\noindent
  40. Permission is granted to copy and distribute modified versions of this
  41. document under the conditions for verbatim copying, provided that the
  42. entire resulting derived work is distributed under the terms of a
  43. permission notice identical to this one.
  44. \pageno=0 \titletrue\eject
  45. \centerline{\titlefont The {\ttitlefont CWEB} System of
  46.     Structured Documentation}
  47. \vskip 15pt plus 3pt minus 3pt
  48. \noindent
  49. This document describes a version of Don Knuth's \.{WEB} system,
  50. adapted to \Cee\ by Silvio Levy.  Knuth's original Pascal programs have been
  51. entirely rewritten in \Cee; many changes were made to take
  52. advantage of features offered by \Cee\ but non-existent in \Pascal.
  53. Readers who are familiar with Knuth's memo ``The \.{WEB} System of Structured
  54. Documentation'' will be able
  55. to skim this material rapidly, because \.{CWEB} is essentially a
  56. simplified subset of \.{WEB}. \.{CWEB} does not need \.{WEB}'s features
  57. for macro definition and string handling, because \Cee\ and its
  58. preprocessor already take care of macros and strings. Similarly, the \.{WEB}
  59. conventions of denoting octal and hexadecimal constants by \.{@'77}
  60. and \.{@"3f} are replaced by \Cee's conventions \.{\v077\v} and
  61. \.{\v0x3f\v}, respectively. All other features of \.{WEB} have been
  62. retained, and a few new features have been added.
  63. \section Introduction.
  64. The philosophy behind \.{WEB} is
  65. that an experienced system programmer, who wants to provide the best
  66. possible documentation of software products, needs two things
  67. simultaneously:  a language like \TeX\ for formatting, and a language like
  68. \Cee\ for programming. Neither type of language can provide the
  69. best documentation by itself. But when both are appropriately combined, we
  70. obtain a system that is much more useful than either language separately.
  71. The structure of a software program may be thought of as a ``web'' that is
  72. made up of many interconnected pieces. To document such a program, we want
  73. to explain each individual part of the web and how it relates to its
  74. neighbors. The typographic tools provided by \TeX\ give us an opportunity
  75. to explain the local structure of each part by making that structure
  76. visible, and the programming tools provided by \Cee\ make it possible
  77. for us to specify the algorithms formally and unambiguously. By combining
  78. the two, we can develop a style of programming that maximizes our ability
  79. to perceive the structure of a complex piece of software, and at the same
  80. time the documented programs can be mechanically translated into a working
  81. software system that matches the documentation.
  82. The \.{WEB} system consists of two programs named \.{WEAVE} and \.{TANGLE}.
  83. More precisely, \.{CWEB} calls them \.{CWEAVE} and \.{CTANGLE}.
  84. When writing a \.{CWEB} program the user keeps the
  85. \Cee\ code and the documentation in the same file, called the \.{WEB}
  86. file and generally named \.{something.w}.  The command
  87. `\.{cweave something}' creates an output file \.{something.tex}, which
  88. can then be fed to \TeX, yielding a ``pretty printed'' version of
  89. \.{something.w} that correctly handles
  90. typographic details like page layout and the use of indentation,
  91. italics, boldface, and mathematical symbols. The typeset output also
  92. includes extensive cross-index
  93. information that is gathered automatically.  Similarly, if you run the
  94. command `\.{ctangle something}' you will get a \Cee\ file \.{something.c},
  95. with can then be compiled to yield executable code.
  96. Besides providing a documentation tool, \.{WEB} enhances the \Cee\
  97. language by providing the
  98. ability to permute pieces of the program text, so that a large system can
  99. be understood entirely in terms of small modules and their local
  100. interrelationships.  The \.{TANGLE} program is so named because it takes a
  101. given web and moves the modules from their web structure into the order
  102. required by \Cee; the advantage of programming in \.{WEB} is that the
  103. algorithms can be expressed in ``untangled'' form, with each module
  104. explained separately.  The \.{WEAVE} program is so named because it takes
  105. a given web and intertwines the \TeX\ and \Cee\ portions contained in
  106. each module, then it knits the whole fabric into a structured document.
  107. (Get it? Wow.)  Perhaps there is some deep connection here with the fact
  108. that the German word for ``weave'' is ``{\it web\/}'', and the
  109. corresponding Latin imperative is ``{\it texe\/}''!
  110. A user of \.{CWEB} should be fairly familiar with the \Cee\
  111. programming language.  A minimal amount of acquaintance with \TeX\ is also
  112. desirable, but in fact it can be acquired as one uses \.{WEB}, since
  113. straight text can be typeset in \TeX\ with virtually no knowledge of
  114. that language.  To someone familiar with both \Cee\ and \TeX\ the amount of
  115. effort necessary to learn the commands of \.{WEB} is small.
  116. \section The language.
  117. Two kinds of material go into \.{WEB} files: \TeX\ text and \Cee\ text.
  118. A programmer writing in \.{WEB} should be thinking both of the
  119. documentation and of the \Cee\ program being created;
  120. i.e., the programmer should be instinctively aware of the different
  121. actions that \.{WEAVE} and \.{TANGLE} will perform on the \.{WEB} file.
  122. \TeX\ text is essentially copied without change by \.{WEAVE}, and it is
  123. entirely deleted by \.{TANGLE}; the \TeX\ text is ``pure
  124. documentation.'' \Cee\ text, on the other hand, is formatted by
  125. \.{WEAVE} and it is shuffled around by \.{TANGLE}, according to rules that
  126. will become clear later. For now the important point to keep in mind is
  127. that there are two kinds of text. Writing \.{WEB} programs is something
  128. like writing \TeX\ documents, but with an additional ``\Cee\ mode''
  129. that is added to \TeX's horizontal mode, vertical mode, and math mode.
  130. A \.{WEB} file is built up from units called {\sl modules\/} that are more
  131. or less self-contained.  Each module has three parts:
  132. \yskip\item{1)} A \TeX\ part, containing explanatory material about what
  133. is going on in the module.
  134. \item{2)} A definition part, containing macro definitions that serve as
  135. abbreviations for \Cee\ constructions that would be less comprehensible
  136. if written out in full each time. They are turned by \.{TANGLE} into
  137. preprocessor macro definitions.
  138. \item{3)} A \Cee\ part, containing a piece of the program that
  139. \.{TANGLE} will produce. This \Cee\ code should ideally be about a
  140. dozen lines long, so that it is easily comprehensible as a unit and so
  141. that its structure is readily perceived.
  142. \yskip\noindent The three parts of each module must appear in this order;
  143. i.e., the \TeX\ commentary must come first, then the definitions, and
  144. finally the \Cee\ code. Any of the parts may be empty.
  145. A module begins with either of the symbols `\.{@\ }' or `\.{@*}', where
  146. `\.{\ }' denotes a blank space. A module ends
  147. at the beginning of the next module (i.e., at the next
  148. `\.{@\ }' or `\.{@*}'), or at the end of the file, whichever comes first.
  149. The \.{WEB} file may also contain material that is not part of any module
  150. at all, namely the text (if any) that occurs before the first module.
  151. Such text is said to be ``in limbo''; it is ignored by \.{TANGLE}
  152. and copied essentially verbatim by \.{WEAVE}, so its function is to
  153. provide any additional formatting instructions that may be desired in the
  154. \TeX\ output. Indeed, it is customary to begin a \.{WEB} file with
  155. \TeX\ code in limbo that loads special fonts, defines special macros,
  156. changes the page sizes, and/or produces a title page.
  157. Modules are numbered consecutively, starting with 1. These numbers appear
  158. at the beginning of each module of the \TeX\ documentation output by
  159. \.{WEAVE}, and they appear
  160. as bracketed comments at the beginning and end of the code generated by that
  161. module in the \Cee\ program output by \.{TANGLE}.
  162. Fortunately, you never mention these numbers yourself when you are writing
  163. in \.{WEB}. You just say `\.{@\ }' or `\.{@*}' at the beginning of each
  164. new module, and the numbers are supplied automatically by \.{WEAVE} and
  165. \.{TANGLE}. As far as you are concerned, a module has a
  166. {\sl name\/} instead of a number; its name is specified by writing
  167. `\.{@<}' followed by \TeX\ text followed by `\.{@>}'. When \.{WEAVE}
  168. outputs a module name, it replaces the `\.{@<}' and `\.{@>}' by
  169. angle brackets and inserts the module number in small type. Thus, when you
  170. read the output of \.{WEAVE} it is easy to locate any module that is
  171. referred to in another module.
  172. For expository purposes, a module name should be a good description of the
  173. contents of that module; i.e., it should stand for the abstraction
  174. represented by the module. Then the module can be ``plugged into'' one or
  175. more other modules in such a way
  176. that unimportant details of its inner workings
  177. are suppressed.  A module name therefore ought to be long enough to convey
  178. the necessary meaning. Unfortunately, however, it is laborious to type
  179. such long names over and over again, and it is also difficult to specify a
  180. long name twice in exactly the same way so that \.{WEAVE} and \.{TANGLE}
  181. will be able to match the names to the modules. To ameliorate this difficulty,
  182. \.{WEAVE} and \.{TANGLE} let you abbreviate a module name
  183. after its first appearance in the \.{WEB} file; you can type simply
  184. `\.{@<$\alpha$...@>}', where $\alpha$ is any string that is a prefix of
  185. exactly one module name appearing in the file. For example, `\.{@<Clear
  186. the arrays@>}' can be abbreviated to `\.{@<Clear...@>}' if no other module
  187. name begins with the five letters `\.{Clear}'. Module names must otherwise
  188. match character for character, except that consecutive blank spaces and/or
  189. tab marks are treated as equivalent to single spaces, and such spaces are
  190. deleted at the beginning and end of the name. Thus, `\.{@< Clear { }the
  191. arrays @>}' will also match the name in the previous example.
  192. We have said that a module begins with `\.{@\ }' or `\.{@*}', but we
  193. didn't say how it gets divided up into a \TeX\ part, a definition part,
  194. and a \Cee\ part. The definition part begins with the first appearance
  195. of `\.{@d}' or `\.{@f}' in the module, and the \Cee\ part begins with
  196. the first appearance of `\.{@c}' or `\.{@<}'. The latter option `\.{@<}'
  197. stands for the beginning of a module name, which is the name of the module
  198. itself. An equals sign (\.=) must follow the `\.{@>}' at the end of this
  199. module name; you are saying, in effect, that the module name stands for
  200. the \Cee\ text that follows, so you say `$\langle\,$module
  201. name$\,\rangle=\null$\Cee\ text'. Alternatively, if the \Cee\ part
  202. begins with `\.{@c}' instead of a module name, the current module is said
  203. to be {\sl unnamed}. Note that module names cannot appear in the
  204. definition part of a module, because the first `\.{@<}' in a module
  205. signals the beginning of its \Cee\ part.  But any number of module names
  206. might appear in the \Cee\ part, once it has started.
  207. The general idea of \.{TANGLE} is to make a \Cee\ program out of these
  208. modules in the following way: First all the macro definitions
  209. indicated by `\.{@d}' are turned into \Cee\ preprocessor macro definitions
  210. and copied at the beginning.
  211. Then the \Cee\ parts of unnamed modules are copied down,
  212. in order; this constitutes the initial
  213. approximation $T_0$ to the text of the program. (There should be at least
  214. one unnamed module, otherwise there will be no program.) Then all module
  215. names that appear in the initial text $T_0$ are replaced by the \Cee\
  216. parts of the corresponding modules, and this substitution process
  217. continues until no module names remain. All comments are removed, because
  218. the \Cee\ program is intended only for the eyes of the \Cee\ compiler.
  219. If the same name has been given to more than one module, the \Cee\ text
  220. for that name is obtained by putting together all of the \Cee\ parts in
  221. the corresponding modules. This feature is useful, for example, in a
  222. module named `Global variables in the outer block', since one can then
  223. declare global variables in whatever modules those variables are
  224. introduced. When several modules have the same name, \.{WEAVE} assigns the
  225. first module number as the number corresponding to that name, and it
  226. inserts a note at the bottom of that module telling the reader to `See
  227. also sections so-and-so'; this footnote gives the numbers of all the other
  228. modules having the same name as the present one. The \Cee\ text
  229. corresponding to a module is usually formatted by \.{WEAVE} so that the
  230. output has an equivalence sign in place of the equals sign in the \.{WEB}
  231. file; i.e., the output says `$\langle\,$module
  232. name$\,\rangle\equiv\null$\Cee\ text'. However, in the case of the second
  233. and subsequent appearances of a module with the same name, this `$\equiv$'
  234. sign is replaced by `$\mathrel+\equiv$', as an indication that the 
  235. following \Cee\ text is being appended to the \Cee\ text of another module.
  236. As \.{TANGLE} enters and leaves modules, it insert preprocessor
  237. \.{\#line} commands into the \Cee\ output file.  This means that
  238. when the compiler gives you error messages, or when you debug your program,
  239. the messages refer to line numbers in the \.{WEB} file, and not in the
  240. \Cee\ file.  In most cases you can therefore
  241. forget about the \Cee\ file altogether.
  242. The general idea of \.{WEAVE} is to make a \.{TEX} file from the \.{WEB}
  243. file in the following way: The first line of the \.{TEX} file
  244. tells \TeX\ to input a file with macros that
  245. define \.{CWEB}'s documentation conventions. The next lines of the file
  246. will be copied from whatever \TeX\ text is in limbo before the first
  247. module.  Then comes the output for each module in turn, possibly
  248. interspersed with end-of-page marks.  Finally, \.{WEAVE} will generate a
  249. cross-reference index that lists each module number in which each \Cee\
  250. identifier appears, and it will also generate an alphabetized list
  251. of the module names, as well as a table of contents that
  252. shows the page and module numbers for each ``starred'' module.
  253. What is a ``starred'' module, you ask? A module that begins with `\.{@*}'
  254. instead of `\.{@\ }' is slightly special in that it denotes a new major
  255. group of modules. The `\.{@*}' should be followed by the title of this
  256. group, followed by a period. Such modules will always start on a new page
  257. in the \TeX\ output, and the group title will appear as a running headline
  258. on all subsequent pages until the next starred module. The title will also
  259. appear in the table of contents, and in boldface type at the beginning of
  260. its module. Caution:  Do not use \TeX\ control sequences in such titles,
  261. unless you know that the \.{cwebmac} macros will do the right thing with
  262. them. The reason is that these titles are converted to uppercase when
  263. they appear as running heads, and they are converted to boldface when they
  264. appear at the beginning of their modules, and they are also written out to
  265. a table-of-contents file used for temporary storage while \TeX\ is
  266. working; whatever control sequences you use must be meaningful in all
  267. three of these modes.
  268. The \TeX\ output produced by \.{WEAVE} for each module consists of
  269. the following: First comes the module number (e.g., `\.{\\M123.}'
  270. at the beginning of module 123, except that `\.{\\N}' appears in place of
  271. `\.{\\M}' at the beginning of a starred module). Then comes the
  272. \TeX\ part of the module, copied almost verbatim except as noted
  273. below. Then comes the definition part and the \Cee\ part, formatted
  274. so that there will be a little extra space between them if both are
  275. nonempty. The definition and \Cee\ parts are obtained by inserting
  276. a bunch of funny looking \TeX\ macros into the \Cee\ program; these
  277. macros handle typographic details about fonts and proper math spacing,
  278. as well as line breaks and indentation.
  279. When you are typing \TeX\ text, you will probably want to make frequent
  280. reference to variables and other quantities in your \Cee\ code, and you
  281. will want those variables to have the same typographic treatment
  282. when they appear in your text as when they appear in your
  283. program.  Therefore the \.{WEB} language allows you to get the effect of
  284. \Cee\ editing within \TeX\ text, if you place `\.|' marks before and
  285. after the \Cee\ material. For example, suppose you want to say something
  286. like this:
  287. $$\hbox{ If \\{pa} is declared as `\&{int} ${}{*}\\{pa}$',
  288. the assignment $\\{pa}\K{\AND}\|a[\O{0}]$ makes \\{pa}
  289. point to the zeroth element of \|a.}$$
  290. The \TeX\ text would look like this in your \.{WEB} file:
  291. $$\lpile{\.{If |pa| is declared as `|int *pa|', the}\cr
  292. \.{assignment |pa=\&a[0]| makes |pa| point
  293. to the zeroth element of |a|.}\cr}$$
  294. And \.{WEAVE} translates this into something you are glad you didn't have
  295. to type:
  296. $$\lpile{\.{If \\\\\{pa\} is declared as
  297.   `\\\&\{int\} \$\{\}\{*\}\\\\\{pa\}\$',}\cr
  298. \.{the assignment \$\\\\\{pa\}\\K\{\\AND\}\\|a[\\O\{0\}]\$}\cr
  299. \.{makes \\\\\{pa\} point to the zeroth element of \\|a.}\cr}$$
  300. Incidentally, the cross-reference index that \.{WEAVE} would make, in
  301. the presence of a comment like this, would include
  302. the current module number as one of the index entries for \\{pa},
  303. even though \\{pa} might not appear in the \Cee\ part of
  304. this module. Thus, the index covers references to identifiers in
  305. the explanatory comments as well as in the program itself; you will
  306. soon learn to appreciate this feature. However, the identifiers
  307. \&{int} and \|a\ would not be indexed,
  308. because \.{WEAVE} does not make index entries for reserved words or
  309. single-letter identifiers. Such identifiers are felt to be so ubiquitous
  310. that it would be pointless to mention every place where they occur.
  311. Although a module begins with \TeX\ text and ends with \Cee\ text, we
  312. have noted that the dividing line isn't sharp, since \Cee\ text can be
  313. included in \TeX\ text if it is enclosed in `\pb'.  Conversely, \TeX\ text
  314. also appears frequently within \Cee\ text, because everything in
  315. comments (i.e., between \.{/*} and \.{*/}) is treated as \TeX\ text.
  316. Furthermore, a module name consists of \TeX\ text; thus, a \.{WEB} file
  317. typically involves constructions like `\.{if} \.{(x==0)}
  318. \.{@<Empty} \.{the} \.{|buffer|} \.{array@>}' where we go back and forth
  319. between \Cee\ and \TeX\ conventions in a natural way.
  320. \section Macros.
  321. The control code \.{@d} followed by
  322. $$\\{identifier}\.{ }\hbox{\Cee\ text}\qquad\hbox{or by}\qquad
  323. \\{identifier}\.(\\{par}_1,\ldots,\\{par}_n\.{) }\hbox{\Cee\ text}$$
  324. (where there is no blank between the
  325. \\{identifier} and the parentheses in the second case) is
  326. transformed by \.{TANGLE} into a preprocessor command, starting with
  327. \.{\#define}, which is printed at the top of the \Cee\ output file
  328. as explained earlier.
  329. A `\.{@d}' macro definition can go on for several lines, and the
  330. newlines don't have to be protected by backslashes, since \.{TANGLE}
  331. itself inserts the backslashes.   If
  332. for any reason you need a \.{\#define} command at a specific spot in
  333. your \Cee\ file, you can treat it as \Cee\ code, instead of as a
  334. \.{WEB} macro; but then you do have to protect newlines yourself.
  335. \section Strings and constants.
  336. If you want a string to appear in the \Cee\ file, delimited by pairs of
  337. \.' or \." marks as usual, you can type it exactly so in the \.{WEB} file,
  338. except that the character `\.@' should be typed `\.{@@}' (it becomes a
  339. control code, the only one that can appear in strings; see below).
  340. Strings should end on the same line as they begin, unless there's a
  341. backslash at the end of lines within them.
  342. \TeX\ and \Cee\ have different ways to refer to octal and hex constants,
  343. because \TeX\ is oriented to technical writing while \Cee\ is oriented to
  344. computer processing.  In \TeX\ you
  345. make a constant octal or hexadecimal by prepending \.' or \.",
  346. respectively, to it; in \Cee\ the constant should be preceded by \.0
  347. or \.{0x}.  In \.{WEB} it seems reasonable to let each convention hold
  348. in its respective realm; so in \Cee\ text you get $40_8$ by typing
  349. `\.{040}', which \.{TANGLE} faithfully copies into the \Cee\ file (for
  350. the compiler's benefit) and which \.{WEAVE} prints as $\O{\~40}$.
  351. Similarly, \.{WEAVE} prints the hexadecimal \Cee\ constant `\.{0x20}'
  352. as \O{\^20}. The use of italic font for octal digits and typewriter font
  353. for hexadecimal digits makes the meaning of such constants clearer in
  354. a document. For consistency, then, you
  355. should type `\.{|040|}'  or `\.{|0x20|}'
  356. in the \TeX\ part of the module.
  357. \section Control codes.
  358. A \.{WEB} {\sl control code\/}
  359. is a two-character combination of which the first is `\.@'.
  360. We've already seen the meaning of several control codes; here is a
  361. complete list of all of them.
  362. The letters $L$, $T$,
  363. $C$, $M$, $\\{Co}$, and/or $S$ following each code indicate whether or not that
  364. code is allowable in limbo, in \TeX\ text, in \Cee\ text, in module
  365. names, in comments, and/or in strings.  A bar over such a letter means
  366. that the control code terminates the present part of the \.{WEB} file; for
  367. example, $\overline L$ means that this control code ends the limbo material
  368. before the first module.
  369. \gdef\@#1[#2] {\penalty-100\yskip\hangindent 2em\noindent\.{@#1\unskip
  370.   \spacefactor1000{ }}$[#2]$\quad}
  371. \def\more{\hangindent 2em \hangafter0}
  372. \def\oP{\overline C}
  373. \def\oT{\overline T\mskip1mu}
  374. \@@ [\\{Co},L,M,C,S,T] A double \.@ denotes the single character `\.@'. This is
  375. the only control code that is legal in limbo, in comments, and in strings.
  376. Note that you must use this convention if you are giving an internet
  377. email address in a \.{WEB} file (e.g., \.{levy@@princeton}).
  378. \@\ [\overline L,\oP,\oT] This denotes the beginning of a new
  379. (unstarred) module. A tab mark or form feed or end-of-line character
  380. is equivalent to a space when it follows an \.@ sign (and in most
  381. other cases).
  382. \@* [\overline L,\oP,\oT] This denotes the beginning of a new starred
  383. module, i.e., a module that begins a new major group. The title of the new
  384. group should appear after the \.{@*}, followed by a period. As explained
  385. above, \TeX\ control sequences should be avoided in such titles unless
  386. they are quite simple. When \.{WEAVE} and \.{TANGLE} read a \.{@*}, they
  387. print an asterisk on the terminal
  388. followed by the current module number, so that the user
  389. can see some indication of progress. The very first module should be starred.
  390. \@d [\oP,\oT] Macro definitions begin with \.{@d} (or \.{@D}), followed by
  391. an identifier and optional parameters and \Cee\ text as explained earlier.
  392. \@f [\oP,\oT] Format definitions begin with \.{@f} (or \.{@F}); they cause
  393. \.{WEAVE} to treat identifiers in a special way when they appear in
  394. \Cee\ text. The general form of a format definition is `\.{@f} \|l
  395. \|r', followed by an optional comment enclosed between
  396. \.{/*} and \.{*/}, where \|l and \|r
  397. are identifiers; \.{WEAVE} will subsequently treat identifier \|l as it
  398. currently treats \|r. This feature allows a \.{WEB} programmer to invent
  399. new reserved words and/or to unreserve some of \Cee's reserved
  400. identifiers. If \|r is the special identifier `\\{TeX}', identifier \|l
  401. will be formatted as a \TeX\ control sequence; for example,
  402. `\.{@f foo TeX}' in the \.{WEB} file will cause identifier \\{foo} to
  403. be output as \.{\\foo} by \.{WEAVE}. The programmer should define
  404. \.{\\foo} to have whatever custom format is desired, assuming \TeX\
  405. math mode. (Each underline
  406. character is converted to \.{x} when making the \TeX\ control sequence;
  407. thus \\{foo\_bar} becomes \.{\\fooxbar}.)
  408. \more \.{WEAVE} knows that identifiers being
  409. defined with a \&{typedef} should become reserved words; thus you
  410. don't need format definitions very often.
  411. The definition part of each module consists of any number of
  412. macro definitions (beginning with \.{@d}) and format definitions (beginning
  413. with \.{@f}), intermixed in any order.
  414. \@c [\oP,\oT] The \Cee\ part of an unnamed module begins with \.{@c}
  415. (or \.{@C}). This causes \.{TANGLE} to append the following \Cee\ code
  416. to the initial program text $T_0$ as explained above. The \.{WEAVE}
  417. processor does not cause a `\.{@c}' to appear explicitly in the \TeX\
  418. output, so if you are creating a \.{WEB} file based on a \TeX-printed
  419. \.{WEB} documentation you have to remember to insert \.{@c} in the
  420. appropriate places of the unnamed modules.
  421. \@p [\oP,\oT] The \Cee\ part of an unnamed module may alternatively begin
  422. with \.{@p} (or \.{@P}), for compatibility with other \.{WEB} systems.
  423. \.{CWEB} treats \.{@c} and \.{@p} identically.
  424. \more Because of the rules by which every module is broken into three parts,
  425. the control codes `\.{@d}', `\.{@f}', `\.{@c}'. and `\.{@p}'
  426. are not allowed to occur once the \Cee\ part of a module has begun.
  427. \@< [C,\oT] A module name begins with \.{@<} followed by \TeX\ text followed
  428. by \.{@>}. The \TeX\ text should not contain any \.{WEB} control codes
  429. except \.{@@}, unless these control codes appear in \Cee\ text that
  430. is delimited by \pb. The module name may be abbreviated, after its first
  431. appearance in a \.{WEB} file, by giving any unique prefix followed by \.{...},
  432. where the three dots immediately precede the closing \.{@>}. Module names may
  433. not appear in \Cee\ text that is enclosed in \pb, nor may they appear
  434. in the definition part of a module (since the appearance of a module name
  435. ends the definition part and begins the \Cee\ part).
  436. \@' [C] This control code is dangerous because it has quite different
  437. meanings in \.{CWEB} and the original \.{WEB}. In \.{CWEB} it produces the
  438. decimal constant corresponding to the ASCII code for a string of length~1
  439. (e.g., \.{@'a'} is \.{TANGLE}d into \.{97} and \.{@'\\t'} into
  440. \.9). You might want to use this if you need to work in ASCII on a
  441. non-ASCII machine; but in most cases the \Cee\ conventions of
  442. \.{<ctype.h>} are adequate for character-set-independent programming.
  443. \@\& [C] The \.{@\&} operation causes whatever is on its left to be
  444. adjacent to whatever is on its right, in the \Cee\ output. No spaces or
  445. line breaks will separate these two items.
  446. \@\^ [C,T] The ``control text'' that follows, up to the next
  447. `\.{@>}', will be entered into the index together with the identifiers of
  448. the \Cee\ program; this text will appear in roman type. For example, to
  449. put the phrase ``system dependencies'' into the index, type
  450. `\.{@\^system dependencies@>}' in each module
  451. that you want to index as system dependent. A control text
  452. must end on the same line of the \.{WEB} file as it began.  Furthermore,
  453. no \.{WEB} control codes are allowed in a control text, not even
  454. \.{@@}. (If you need an \.{@} sign you can get around this restriction by
  455. typing `\.{\{\\AT\}}'.)
  456. \@. [C,T] The ``control text'' that follows will be entered into the index
  457. in \.{typewriter} \.{type}; see the rules for `\.{@\^}', which is analogous.
  458. \@: [C,T] The ``control text'' that follows will be entered into the index
  459. in a format controlled by the \TeX\ macro `\.{\\9}', which the user
  460. should define as desired; see the rules for `\.{@\^}', which is analogous.
  461. \@t [C] The ``control text'' that follows, up to the next `\.{@>}', will
  462. be put into a \TeX\ \.{\\hbox} and formatted along with the neighboring
  463. \Cee\ program. This text is ignored by \.{TANGLE}, but it can be used
  464. for various purposes within \.{WEAVE}. For example, you can make comments
  465. that mix \Cee\ and classical mathematics, as in `$\\{size}<2^{15}$', by
  466. typing `\.{|size < @t\$2\^\{15\}\$@>|}'.  A control text must end on the
  467. same line of the \.{WEB} file as it began, and it may not contain any
  468. \.{WEB} control codes.
  469. \@= [C] The ``control text'' that follows, up to the next `\.{@>}', will
  470. be passed verbatim to the \Cee\ program.
  471. \@! [C,T] The module number in an index entry will be underlined if `\.{@!}'
  472. immediately precedes the identifier or control text being indexed. This
  473. convention is used to distinguish the modules where an identifier is
  474. defined, or where it is explained in some special way, from the modules
  475. where it is used. A~reserved word or an identifier of length one will not
  476. be indexed except for underlined entries. An `\.{@!}' is implicitly inserted
  477. by \.{WEAVE} when an identifier is being defined or declared in \Cee\
  478. code; for example, the definition 
  479. $$\hbox{\&{int} \\{array}[\\{max\_dim}], \\{count}${}=\\{old\_count};$}$$
  480. makes the names \\{array} and \\{count} get an underlined entry in the
  481. index.  Statement tags, function definitions like
  482. $\\{main}(\\{argc},\39\\{argv})$ and \&{typedef} definitions also
  483. imply underlining. A function definition doesn't define its arguments;
  484. \\{argc} and \\{argv} will, however, be defined
  485. (i.e., their index entries will be underlined), if their types are
  486. declared before the body of \\{main} (e.g., `\.{int}~\\{argc};
  487. \.{char}~${**}\\{argv}$; $\{\,\ldots\,\}$').
  488. \@, [C] This control code inserts a thin space in \.{WEAVE}'s output; it is
  489. ignored by \.{TANGLE}. Sometimes you need this extra space if you are using
  490. macros in an unusual way, e.g., if two identifiers are adjacent.
  491. \@/ [C] This control code causes a line break to occur within a \Cee\
  492. program formatted by \.{WEAVE}; it is ignored by \.{TANGLE}. Line breaks
  493. are chosen automatically by \TeX\ according to a scheme that works 99\%\
  494. of the time, but sometimes you will prefer to force a line break so that
  495. the program is segmented according to logical rather than visual
  496. criteria.
  497. \@| [C] This control code specifies an optional line break in the midst of
  498. an expression. For example, if you have
  499. a long expression on the right-hand side of an assignment
  500. statement, you can use `\.{@|}' to specify breakpoints more logical than
  501. the ones that \TeX\ might choose on visual grounds.
  502. \@\# [C] This control code forces a line break, like \.{@/} does,
  503. and it also causes a little extra white space to appear between the lines at
  504. this break. You might use it, for example,
  505. between groups of macro definitions that are logically separate but within
  506. the same module. \.{CWEB} automatically inserts this extra space
  507. between functions, between external declarations and functions, and
  508. between declarations and statements within a function.
  509. \@+ [C] This control code cancels a line break that might otherwise be
  510. inserted by \.{WEAVE}, e.g., before the word `\&{else}', if you want to
  511. put a short if--else construction on a single line. It is ignored by
  512. \.{TANGLE}. If you say `\.{\{@+}' at the beginning of a compound statement
  513. that is the body of a function, the first declaration or
  514. statement of the function will appear on the same line as the
  515. left brace, and it will be indented by the same amount as the
  516. second declaration or statement on the next line.
  517. \@; [C] This control code is treated like a semicolon, for formatting
  518. purposes, except that it is invisible. You can use it, for example, after
  519. a module name or macro when the \Cee\ text represented by that module or macro
  520. is a compound statement or ends
  521. with a semicolon. Consider constructions like
  522. $$\lpile{\.{if (condition) macro @;}\cr
  523. \.{else break;}\cr}$$
  524. here \\{macro} is defined to be a compound statement (enclosed in braces).
  525. This is a well-known infelicity of \Cee\ syntax.
  526. \@{[} [C] Place this before a macro argument that isn't otherwise formatted
  527. correctly.
  528. \@] [C] Place this after a macro argument that isn't otherwise formatted
  529. correctly.
  530. \yskip\noindent
  531. The last eight control codes (namely `\.{@,}', `\.{@/}', `\.{@|}', `\.{@\#}',
  532. `\.{@+}', `\.{@;}', `\.{@[}', and `\.{@]}') have no effect on the \Cee\
  533. program output by \.{TANGLE}; they merely help to improve the readability
  534. of the \TeX-formatted \Cee\ that is output by \.{WEAVE}, in unusual
  535. circumstances. \.{WEAVE}'s built-in formatting method is fairly good
  536. when dealing with syntactically correct \Cee\ text, but
  537. it is incapable of handling all possible cases, because it must deal with
  538. fragments of text involving macros and module names; these fragments do
  539. not necessarily obey \Cee's syntax. Although \.{WEB} allows you to
  540. override the automatic formatting, your best strategy is not to worry
  541. about such things until you have seen what \.{WEAVE} produces automatically,
  542. since you will probably need to make only a few corrections when you are
  543. touching up your documentation.
  544. \@{x @y @z}[\\{change\_file}]
  545. \.{WEAVE} and \.{TANGLE} are designed to work with two input files,
  546. called \\{web\_file} and \\{change\_file}, where \\{change\_file} contains
  547. data that overrides selected portions of \\{web\_file}. The resulting merged
  548. text is actually what has been called the \.{WEB} file elsewhere in this
  549. report.
  550. \more Here's how it works: The change file consists of zero or more ``changes,''
  551. where a change has the form `\.{@x}$\langle$old lines$\rangle$\.{@y}$\langle$%
  552. new lines$\rangle$\.{@z}'. The special control codes \.{@x}, \.{@y}, \.{@z},
  553. which are allowed only in change files, must appear at the beginning of a line;
  554. the remainder of such a line is ignored.
  555. The $\langle$old lines$\rangle$ represent material that exactly matches
  556. consecutive lines of the \\{web\_file}; the $\langle$new lines$\rangle$
  557. represent zero or more lines that are supposed to replace the old. Whenever
  558. the first ``old line'' of a change is found to match a line in the
  559. \\{web\_file}, all the other lines in that change must match too.
  560. \more Between changes, before the first change, and after the last change,
  561. the change file can have any number of lines that do not begin with
  562. `\.{@x}', `\.{@y}', or~`\.{@z}'. Such lines are bypassed and not used for
  563. matching purposes.
  564. \more This dual-input feature is useful when working with a master \.{WEB} file
  565. that has been received from elsewhere (e.g., \.{tangle.w} or
  566. \.{weave.w} or \.{tex.web}), when changes are desirable to customize the
  567. program for your local computer system. You will be able to debug your
  568. system-dependent changes without clobbering the master web file; and once
  569. your changes are working, you will be able to incorporate them readily
  570. into new releases of the master web file that you might receive from time
  571. to time.
  572. \@i [\\{web\_file}] Furthermore the \\{web\_file} itself can be a combination of
  573. several files.  When either \.{CWEAVE} or \.{CTANGLE} is reading a file and
  574. encounters the control code \.{@i} at the beginning of a line, it
  575. interrupts normal reading and start looking at the file named after the
  576. \.{@i}, much as the \Cee\ preprocessor does when it encounters an \.{\#include}
  577. line.  After the included file has been entirely read, the program
  578. goes back to the next line
  579. of the original file.  The file name following \.{@i} can be
  580. surrounded by \." characters, but such delimiters are
  581. optional. Include files can nest. Change files cannot use the \.{@i} feature.
  582. \@( [C,\oT] A module name can begin with \.{@(} instead of \.{@<}.
  583. Everything works exactly as before, except that \.{@(foo@>} denotes
  584. a special module name all of whose \Cee\ code is written by \.{CTANGLE}
  585. to file \.{foo}. In this way you can get multiple file output from
  586. a single \.{WEB} file. (The \.{@d} definitions are not output
  587. to such files, only to the master \.{.c} file.)
  588. \section Additional features and caveats.
  589. 1. In certain installations of \.{CWEB} that
  590. {\def\\#1#2{`{\tentex\char'#1#2}'}%
  591. have an extended character set, the characters
  592. \\13, \\01, \\31, \\32, \\34, \\35,
  593. \\36, \\37, \\04, \\20, and \\21}
  594. can be typed as abbreviations for `\.{++}', `\.{--}', `\.{->}',
  595. `\.{!=}', `\.{<=}', `\.{>=}', `\.{==}', `\.{\v\v}', `\.{\&\&}',
  596. `\.{<<}', and `\.{>>}',
  597. respectively.
  598. 2. If you have an extended character set, all of the characters listed
  599. in Appendix~C of {\sl The \TeX book\/} can be used in strings. But you should
  600. stick to standard ASCII characters if you want to write programs that will
  601. be useful to all the poor souls out there who don't have extended
  602. character sets.
  603. 3. The \TeX\ file output by \.{WEAVE} is broken into lines having at most
  604. 80 characters each. The algorithm that does this line breaking is unaware
  605. of \TeX's convention about comments following `\.\%' signs on a line. When
  606. \TeX\ text is being copied, the existing line breaks are copied as well,
  607. so there is no problem with `\.\%' signs unless the original \.{WEB} file
  608. contains a line more than eighty characters long or a line with \Cee\
  609. text in \pb\ that expands to more than eighty characters long. Such lines
  610. should not have `\.\%' signs.
  611. 4. \Cee\ text is translated by a ``bottom up'' procedure that
  612. identifies each token as a ``part of speech'' and combines parts of speech
  613. into larger and larger phrases as much as possible according to a special
  614. grammar that is explained in the documentation of \.{WEAVE}. It is easy to
  615. learn the translation scheme for simple constructions like single
  616. identifiers and short expressions, just by looking at a few examples of
  617. what \.{WEAVE} does, but the general mechanism is somewhat complex because
  618. it must handle much more than \Cee\ itself. Furthermore the output
  619. contains embedded codes that cause \TeX\ to indent and break lines as
  620. necessary, depending on the fonts used and the desired page width. For
  621. best results it is wise to avoid enclosing long \Cee\ texts in \pb, since the
  622. indentation and line breaking codes are omitted when the \pb\ text is
  623. translated from \Cee\ to \TeX. Stick to simple expressions or
  624. statements.  If a \Cee\ preprocessor command is enclosed in \pb,
  625. the \.\# that introduces it must be at the beginning of a line,
  626. or \.{WEAVE} won't print it correctly.
  627. 5. Comments and module names are not permitted in \pb\ text. After a `\.|'
  628. signals the change from \TeX\ text to \Cee\ text, the next `\.|' that is
  629. not part of a string or control text ends the \Cee\ text.
  630. 6. A comment must have properly nested occurrences of left and right
  631. braces, otherwise \.{WEAVE} will complain. But it
  632. does try to balance the braces, so that \TeX\ won't foul up too much.
  633. 7. When you're debugging a program and decide to omit some of your
  634. \Cee\ code, do NOT simply ``comment it out.'' Such comments are not
  635. in the spirit of \.{WEB} documentation; they will appear to readers
  636. as if they were explanations of the uncommented-out instructions.
  637. Furthermore, comments of a program must be valid \TeX\ text; hence
  638. \.{WEAVE} will get confused if you enclose \Cee\ statements in
  639. \.{/*...*/} instead of in \.{/*|...|*/}.
  640. 8. The \.{@f} feature allows you to define one identifier to act like
  641. another, and these format definitions are carried out sequentially.
  642. However, a given identifier has only one printed format
  643. throughout the entire document (and this format will even be used before
  644. the \.{@f} that defines it). The reason is that \.{WEAVE} operates in two
  645. passes; it processes \.{@f}'s and cross-references on the first pass and
  646. it does the output on the second.
  647. 9. Sometimes it is desirable to insert spacing into \Cee\ code that is
  648. more general than the thin space provided by `\.{@,}'. The \.{@t} feature
  649. can be used for this purpose; e.g., `\.{@t\\hskip 1in@>}' will
  650. leave one inch of blank space. Furthermore, `\.{@t\\4@>}' can be
  651. used to backspace by one unit of indentation, since the control sequence
  652. \.{\\4} is defined in \.{cwebmac} to be such a backspace. (This
  653. control sequence is used, for example, at the beginning of lines that
  654. contain labeled statements, so that the label will stick out a little at
  655. the left.) You can also use `\.{@t\}\\3\{-5@>}' to force a break
  656. in the middle of an expression.
  657. \section Running the programs.
  658. The \UNIX\ command line for \.{CTANGLE} is
  659. $$\.{ctangle [options] web\_file[.w] [change\_file[.ch]]}$$
  660. and the same conventions apply to \.{CWEAVE}. If no change file is
  661. specified, the change file is null. The extensions \.{.w} and \.{.ch}
  662. are appended only if the given file names contain no dot. If the
  663. web file defined in this way cannot be found, the extension \.{.web}
  664. will be tried. For example, `\.{cweave} \.{cob}' will try to read
  665. \.{cob.w}; failing that, it will try \.{cob.web} before giving up.
  666. The name of the \Cee\ file output by \.{CTANGLE} is obtained by
  667. appending the extension \.{.c}; the name of the \TeX\ file output by
  668. \.{CWEAVE} gets the extension \.{.tex}.
  669. At some installations where the original Pascal-based \.{WEB} is
  670. unused, \.{CWEAVE} and \.{CTANGLE} are called simply \.{weave}
  671. and \.{tangle}. A programmer who likes terseness might choose
  672. to set up his operating shell so that `\.{wv}' expands to
  673. `\.{cweave -bhp}'; this will suppress most terminal output from \.{CWEAVE}
  674. except for error messages.
  675. Options are introduced either by a \.- sign, to turn an option off,
  676. or by a \.+ sign to turn one off. For example, `\.{-fb}' turns off
  677. options \.f and \.b; `\.{+s}' turns on option \.s. Options can be
  678. specified before the file names, after the file names, or both. The following
  679. options are currently implemented:
  680. \yskip
  681. \def\option#1 {\textindent{\.#1}\hangindent2\parindent}
  682. \option b Print a banner line at the beginning of execution. (On
  683. by default.)
  684. \option f Force line breaks after each \Cee\ statement formatted
  685. by \.{WEAVE}. (On by default; \.{-f} saves paper but looks less \Cee-like
  686. to some people.) (Has no effect on \.{TANGLE}.)
  687. \option h Print a happy message at the conclusion of a successful
  688. run. (On by default.)
  689. \option p Give progress reports as the program runs. (On by default.)
  690. \option s Show statistics about memory usage after the program
  691. runs to completion. (Off by default.) This feature works only if
  692. the programs have been compiled with the \.{-DSTAT} switch. If you
  693. have large \.{WEB} files or modules, you may need to see
  694. how close you come to exceeding the capacity of \.{TANGLE} and/or \.{WEAVE}.
  695. \option x Include indexes and a table of contents in the \TeX\ file
  696. output by \.{WEAVE}. (On by default.) (Has no effect on \.{TANGLE}.)
  697. \section Further details about formatting.
  698. You may not like the way \.{WEAVE} handles certain
  699. situations. If you're desperate, you can customize \.{WEAVE}
  700. by changing its grammar.  This means changing the source code,
  701. a task that you might find amusing. A table of grammar rules
  702. appears in the \.{WEAVE} source listing, and you can make a separate
  703. copy of that table by copying the file \.{prod.w} found in the \.{cweb}
  704. sources and saying `\.{cweave}~\.{-x}~\.{prod}'.
  705. If you compile \.{WEAVE} with the \.{-DDEBUG} option on the command
  706. line, you will be able to see exactly
  707. how \.{WEAVE} is parsing your \Cee\ code by preceding
  708. it with the line `\.{@ @c @2}'. (The control code `\.{@2}'
  709. turns on a ``peeping'' mode, and `\.{@0}' turns it off.)
  710. For example, if you run \.{WEAVE} on the file
  711. \medskip
  712. \begingroup
  713. \verbatim
  714. @ @c @2
  715. main (argc,argv)
  716. char **argv;
  717. { for (;argc>0;argc--) printf("%s\n",argv[argc-1]); }
  718. !endgroup
  719. \endgroup
  720. \medskip\noindent
  721. you get the following gibberish on your screen:
  722. \medskip
  723. \begingroup
  724. \verbatim
  725. [...]
  726. 4:*exp ( +exp+ )...
  727. 8:*exp +exp+ int...
  728. 5:*+exp+ int +unorbinop+...
  729. [...]
  730. 45: +fn_decl+*+{+ -stmt- +}-
  731. 40:*+fn_decl+ -stmt-
  732. 37:*+function-
  733. [...]
  734. !endgroup
  735. \endgroup
  736. \medskip
  737. The first line says that grammar rule 4 has just been applied, and \.{WEAVE}
  738. currently has in its memory a sequence of chunks of \TeX\ code (called
  739. ``scraps'') that are respectively
  740. of type \\{exp} (for expression), open-parenthesis,
  741. \\{exp} again, close-parenthesis, and further scraps that haven't yet
  742. been considered by the parser.  (The \.+ and \.- signs stipulate that
  743. \TeX\ should be in or out of math mode at the scrap boundaries. The \.* shows
  744. the parser's current position.)
  745. Then rule 8 is applied, and
  746. the sequence $(\,exp\,)$ becomes an \\{exp} and so on.  In the
  747. end the whole \Cee\ text has become one big scrap of type \\{function}.
  748. Sometimes things don't work as smoothly, and you get a bunch of
  749. lines lumped together.  This means that \.{WEAVE} could not
  750. digest something in your \Cee\ code.  For instance, suppose
  751. `\.{@<Argument definitions@>}' had appeared instead of
  752. `\.{char **argv;}' in the program above. Then \.{WEAVE} would have
  753. been somewhat mystified, since it thinks that module names
  754. are just \\{exp}s.  Thus it would tell \TeX\ to format
  755. `\X2:Argument declarations\X' on the same line as
  756. `$\\{main}(\\{argc},\39\\{argv}{}$)'.
  757. In this case you should help \.{WEAVE} by putting `\.{@/}' after
  758. `\.{main(argc,argv)}'.
  759. \.{CWEAVE} automatically inserts a bit of extra space between declarations
  760. and the first apparent statement of a block. One way to defeat this is
  761. $$\vbox{\halign{#\hfil\cr
  762. \.{int x;@+@t@>@;@/}\cr
  763. \.{@<Other locals@>@;@\#}\cr}}$$
  764. the `\.{@\#}' will put extra space after `$\langle\,$Other locals$\,\rangle$'.
  765. \section Acknowledgments.
  766. The authors wish to thank all who contributed suggestions and criticism to
  767. the development of \.{CWEB}. We are especially grateful to Norman Ramsey,
  768. from whom the code for multiple output files is borrowed, and who has made
  769. literate programming accessible to users of yet other languages by means of
  770. his \.{SPIDER} system [see {\sl Communications of the ACM\/ \bf32} (1989),
  771. 1051--1055].
  772. \section Appendices.
  773. The basic ideas of \.{WEB} can be understood most easily by looking at
  774. examples of ``real'' programs. Appendix~A shows the \.{CWEB} input that
  775. generated modules 17--18 of the \.{common.w} file, which contains
  776. routines common to \.{CWEAVE} and \.{CTANGLE}. 
  777. Appendix~B shows the corresponding \Cee\ code output by \.{CTANGLE}. 
  778. Appendix~C shows the
  779. corresponding \TeX\ code output by \.{CWEAVE},
  780. and Appendix~D shows how that output looks when printed out.
  781. Appendix E is the file that sets \TeX\ up to accept
  782. the output of \.{CWEAVE}, and Appendix~F discusses how to use some of those
  783. macros to vary the output formats.
  784. \vfil\eject
  785. \def\runninghead{APPENDIX A --- {\tentt WEB} FILE FORMAT}
  786. \section Appendix A.
  787. The following is an excerpt of the file \.{common.w},
  788. which contains routines shared by \.{CWEAVE} and \.{CTANGLE}.
  789. Note that some of the lines are indented to show the program structure.
  790. The indentation is ignored by \.{WEAVE} and \.{TANGLE}, but users find
  791. that \.{WEB} files are quite readable if they have some such indentation.
  792. The reader should first compare Appendix~A to Appendix~B; then the
  793. same material should be compared to Appendices~C and~D.
  794. \vskip 6pt
  795. \begingroup \def\tt{\eighttt} \baselineskip9pt
  796. \verbatim
  797. @ The following procedure is used to see if the next change entry should
  798. go into effect; it is called only when |changing| is 0.
  799. The idea is to test whether or not the current
  800. contents of |buffer| matches the current contents of |change_buffer|.
  801. If not, there's nothing more to do; but if so, a change is called for:
  802. All of the text down to the \.{@@y} is supposed to match. An error
  803. message is issued if any discrepancy is found. Then the procedure
  804. prepares to read the next line from |change_file|.
  805. This procedure is called only when |buffer<limit|, i.e., when the
  806. current line is nonempty.
  807. @<Func...@>=
  808. check_change() /* switches to |change_file| if the buffers match */
  809.   int n=0; /* the number of discrepancies found */
  810.   if (lines_dont_match) return;
  811.   while (1) {
  812.     changing=1; print_where=1; change_line++;
  813.     if (!!input_ln(change_file)) {
  814.       err_print("!! Change file ended before @@y");
  815. @.Change file ended...@>
  816.       change_limit=change_buffer; changing=0;
  817.       return;
  818.     }
  819.     if (limit>buffer+1 && buffer[0]=='@@') {
  820.       if (isupper(buffer[1])) buffer[1]=tolower(buffer[1]);
  821.       @<Check for erron...@>;
  822.       @<If the current line starts with \.{@@y},
  823.         report any discrepancies and |return|@>;
  824.     }
  825.     @<Move |buffer| and |limit|...@>;
  826.     changing=0; cur_line++;
  827.     while (!!input_ln(cur_file)) { /* pop the stack or quit */
  828.       if (include_depth==0) {
  829.         err_print("!! WEB file ended during a change");
  830. @.WEB file ended...@>
  831.         input_has_ended=1; return;
  832.       }
  833.       include_depth--; cur_line++;
  834.     }
  835.     if (lines_dont_match) n++;
  836. @ @<If the current line starts with \.{@@y}...@>=
  837. if (buffer[1]=='x' || buffer[1]=='z') {
  838.   loc=buffer+2; err_print("!! Where is the matching @@y?");
  839. @.Where is the match...@>
  840. else if (buffer[1]=='y') {
  841.   if (n>0) {
  842.     loc=buffer+2;
  843.     printf("\n!! Hmm... %d ",n);
  844.     err_print("of the preceding lines failed to match");
  845. @.Hmm... n of the preceding...@>
  846.   return;
  847. !endgroup
  848. \endgroup
  849. \vfill\eject
  850. \def\runninghead{APPENDIX B  --- TRANSLATION BY {\tentt TANGLE}}
  851. \section Appendix B.
  852. Here's the portion of the \Cee\ code generated by \.{TANGLE} that corresponds
  853. to Appendix~A.  Notice that modules~14, 16,
  854. and~18 have been tangled into module~17.
  855. \vskip6pt
  856. \begingroup \def\tt{\eighttt} \baselineskip9pt
  857. \verbatim
  858. /*:12*//*17:*/
  859. #line 292 "common.w"
  860. check_change()
  861. int n= 0;
  862. if(lines_dont_match)return;
  863. while(1){
  864. changing= 1;print_where= 1;change_line++;
  865. if(!!input_ln(change_file)){
  866. err_print("!! Change file ended before @y");
  867. change_limit= change_buffer;changing= 0;
  868. return;
  869. if(limit>buffer+1&&buffer[0]=='@'){
  870. if(isupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  871. /*14:*/
  872. #line 254 "common.w"
  873. if(buffer[1]=='i'){
  874. loc= buffer+2;
  875. err_print("!! No includes allowed in change file");
  876. /*:14*/
  877. #line 307 "common.w"
  878. /*18:*/
  879. #line 325 "common.w"
  880. if(buffer[1]=='x'||buffer[1]=='z'){
  881. loc= buffer+2;err_print("!! Where is the matching @y?");
  882. else if(buffer[1]=='y'){
  883. if(n>0){
  884. loc= buffer+2;
  885. printf("\n!! Hmm... %d ",n);
  886. err_print("of the preceding lines failed to match");
  887. return;
  888. /*:18*/
  889. #line 309 "common.w"
  890. /*16:*/
  891. #line 274 "common.w"
  892. change_limit= change_buffer-buffer+limit;
  893. strncpy(change_buffer,buffer,limit-buffer+1);
  894. /*:16*/
  895. #line 311 "common.w"
  896. changing= 0;cur_line++;
  897. while(!!input_ln(cur_file)){
  898. if(include_depth==0){
  899. err_print("!! WEB file ended during a change");
  900. input_has_ended= 1;return;
  901. include_depth--;cur_line++;
  902. if(lines_dont_match)n++;
  903. /*:17*//*19:*/
  904. !endgroup
  905. \endgroup
  906. \vfill\eject
  907. \def\runninghead{APPENDIX C --- TRANSLATION BY {\tentt WEAVE}}
  908. \section Appendix C.
  909. This excerpt from \.{common.tex} corresponds to Appendix A.
  910. \vskip6pt
  911. \begingroup \def\tt{\eighttt} \baselineskip9pt
  912. \verbatim
  913. \M17. The following procedure is used to see if the next change entry should
  914. go into effect; it is called only when \\{changing} is 0.
  915. The idea is to test whether or not the current
  916. contents of \\{buffer} matches the current contents of \\{change\_buffer}.
  917. If not, there's nothing more to do; but if so, a change is called for:
  918. All of the text down to the \.{@y} is supposed to match. An error
  919. message is issued if any discrepancy is found. Then the procedure
  920. prepares to read the next line from \\{change\_file}.
  921. This procedure is called only when $\\{buffer}<\\{limit}$, i.e., when the
  922. current line is nonempty.
  923. \Y\P\4\X4:Functions\X${}\mathrel+\S{}$\6
  924. $\\{check\_change}(\,{}$)\C{ switches to \\{change\_file} if the buffers match
  925. ${}\{{}$\1\6
  926. \&{int} \|n${}\K\O{0}{}$;\C{ the number of discrepancies found }\7
  927. \&{if} (\\{lines\_dont\_match})\1\5
  928. \&{return};\2\6
  929. \&{while} (\O{1})\5
  930. ${}\{{}$\1\6
  931. ${}\\{changing}\K\O{1};{}$\6
  932. ${}\\{print\_where}\K\O{1};{}$\6
  933. ${}\\{change\_line}\PP;{}$\6
  934. \&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\5
  935. ${}\{{}$\1\6
  936. \\{err\_print}(\.{"!!\ Change\ file\ ended}\)\.{\ before\ @y"});\6
  937. ${}\\{change\_limit}\K\\{change\_buffer};{}$\6
  938. ${}\\{changing}\K\O{0};{}$\6
  939. \&{return};\6
  940. \4${}\}{}$\2\6
  941. \&{if} ${}(\\{limit}>\\{buffer}+\O{1}\W\\{buffer}[\O{0}]\S\.{'@'}){}$\5
  942. ${}\{{}$\1\6
  943. \&{if} (\\{isupper}(\\{buffer}[\O{1}]))\1\5
  944. ${}\\{buffer}[\O{1}]\K\\{tolower}(\\{buffer}[\O{1}]);{}$\2\6
  945. \X14:Check for erroneous \.{@i}\X;\6
  946. \X18:If the current line starts with \.{@y}, report any discrepancies and %
  947. \&{return}\X;\6
  948. \4${}\}{}$\2\6
  949. \X16:Move \\{buffer} and \\{limit} to \\{change\_buffer} and \\{change\_limit}%
  950. \X;\6
  951. ${}\\{changing}\K\O{0};{}$\6
  952. ${}\\{cur\_line}\PP;{}$\6
  953. \&{while} ${}(\R\\{input\_ln}(\\{cur\_file})){}$\5
  954. ${}\{{}$\C{ pop the stack or quit }\1\6
  955. \&{if} ${}(\\{include\_depth}\S\O{0}){}$\5
  956. ${}\{{}$\1\6
  957. \\{err\_print}(\.{"!!\ WEB\ file\ ended\ du}\)\.{ring\ a\ change"});\6
  958. ${}\\{input\_has\_ended}\K\O{1};{}$\6
  959. \&{return};\6
  960. \4${}\}{}$\2\6
  961. ${}\\{include\_depth}\MM;{}$\6
  962. ${}\\{cur\_line}\PP;{}$\6
  963. \4${}\}{}$\2\6
  964. \&{if} (\\{lines\_dont\_match})\1\5
  965. ${}\|n\PP;{}$\2\6
  966. \4${}\}{}$\2\6
  967. \4${}\}{}$\2\par
  968. \M18. \P\X18:If the current line starts with \.{@y}, report any discrepancies
  969. and \&{return}\X${}\S{}$\6
  970. \&{if} ${}(\\{buffer}[\O{1}]\S\.{'x'}\V\\{buffer}[\O{1}]\S\.{'z'}){}$\5
  971. ${}\{{}$\1\6
  972. ${}\\{loc}\K\\{buffer}+\O{2};{}$\6
  973. \\{err\_print}(\.{"!!\ Where\ is\ the\ matc}\)\.{hing\ @y?"});\6
  974. \4${}\}{}$\2\6
  975. \&{else} \1\&{if} ${}(\\{buffer}[\O{1}]\S\.{'y'}){}$\5
  976. ${}\{{}$\1\6
  977. \&{if} ${}(\|n>\O{0}){}$\5
  978. ${}\{{}$\1\6
  979. ${}\\{loc}\K\\{buffer}+\O{2};{}$\6
  980. ${}\\{printf}(\.{"\\n!!\ Hmm...\ \%d\ "},\39\|n);{}$\6
  981. \\{err\_print}(\.{"of\ the\ preceding\ li}\)\.{nes\ failed\ to\ match"});\6
  982. \4${}\}{}$\2\6
  983. \&{return};\6
  984. \4${}\}{}$\2\2\par
  985. \U17.\fi
  986. !endgroup
  987. \endgroup
  988. \vfil\eject
  989. \def\runninghead{APPENDIX D --- FINAL DOCUMENT}
  990. \section Appendix D.
  991. Here's what Appendix~C looks like when typeset. Appendix G contains the
  992. entire context.
  993. \M17. The following procedure is used to see if the next change entry should
  994. go into effect; it is called only when \\{changing} is 0.
  995. The idea is to test whether or not the current
  996. contents of \\{buffer} matches the current contents of \\{change\_buffer}.
  997. If not, there's nothing more to do; but if so, a change is called for:
  998. All of the text down to the \.{@y} is supposed to match. An error
  999. message is issued if any discrepancy is found. Then the procedure
  1000. prepares to read the next line from \\{change\_file}.
  1001. This procedure is called only when $\\{buffer}<\\{limit}$, i.e., when the
  1002. current line is nonempty.
  1003. \Y\P\4\X4:Functions\X${}\mathrel+\S{}$\6
  1004. $\\{check\_change}(\,{}$)\C{ switches to \\{change\_file} if the buffers match
  1005. ${}\{{}$\1\6
  1006. \&{int} \|n${}\K\O{0}{}$;\C{ the number of discrepancies found }\7
  1007. \&{if} (\\{lines\_dont\_match})\1\5
  1008. \&{return};\2\6
  1009. \&{while} (\O{1})\5
  1010. ${}\{{}$\1\6
  1011. ${}\\{changing}\K\O{1};{}$\6
  1012. ${}\\{print\_where}\K\O{1};{}$\6
  1013. ${}\\{change\_line}\PP;{}$\6
  1014. \&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\5
  1015. ${}\{{}$\1\6
  1016. \\{err\_print}(\.{"!\ Change\ file\ ended}\)\.{\ before\ @y"});\6
  1017. ${}\\{change\_limit}\K\\{change\_buffer};{}$\6
  1018. ${}\\{changing}\K\O{0};{}$\6
  1019. \&{return};\6
  1020. \4${}\}{}$\2\6
  1021. \&{if} ${}(\\{limit}>\\{buffer}+\O{1}\W\\{buffer}[\O{0}]\S\.{'@'}){}$\5
  1022. ${}\{{}$\1\6
  1023. \&{if} (\\{isupper}(\\{buffer}[\O{1}]))\1\5
  1024. ${}\\{buffer}[\O{1}]\K\\{tolower}(\\{buffer}[\O{1}]);{}$\2\6
  1025. \X14:Check for erroneous \.{@i}\X;\6
  1026. \X18:If the current line starts with \.{@y}, report any discrepancies and %
  1027. \&{return}\X;\6
  1028. \4${}\}{}$\2\6
  1029. \X16:Move \\{buffer} and \\{limit} to \\{change\_buffer} and \\{change\_limit}%
  1030. \X;\6
  1031. ${}\\{changing}\K\O{0};{}$\6
  1032. ${}\\{cur\_line}\PP;{}$\6
  1033. \&{while} ${}(\R\\{input\_ln}(\\{cur\_file})){}$\5
  1034. ${}\{{}$\C{ pop the stack or quit }\1\6
  1035. \&{if} ${}(\\{include\_depth}\S\O{0}){}$\5
  1036. ${}\{{}$\1\6
  1037. \\{err\_print}(\.{"!\ WEB\ file\ ended\ du}\)\.{ring\ a\ change"});\6
  1038. ${}\\{input\_has\_ended}\K\O{1};{}$\6
  1039. \&{return};\6
  1040. \4${}\}{}$\2\6
  1041. ${}\\{include\_depth}\MM;{}$\6
  1042. ${}\\{cur\_line}\PP;{}$\6
  1043. \4${}\}{}$\2\6
  1044. \&{if} (\\{lines\_dont\_match})\1\5
  1045. ${}\|n\PP;{}$\2\6
  1046. \4${}\}{}$\2\6
  1047. \4${}\}{}$\2\par
  1048. \M18. \P\X18:If the current line starts with \.{@y}, report any discrepancies
  1049. and \&{return}\X${}\S{}$\6
  1050. \&{if} ${}(\\{buffer}[\O{1}]\S\.{'x'}\V\\{buffer}[\O{1}]\S\.{'z'}){}$\5
  1051. ${}\{{}$\1\6
  1052. ${}\\{loc}\K\\{buffer}+\O{2};{}$\6
  1053. \\{err\_print}(\.{"!\ Where\ is\ the\ matc}\)\.{hing\ @y?"});\6
  1054. \4${}\}{}$\2\6
  1055. \&{else} \1\&{if} ${}(\\{buffer}[\O{1}]\S\.{'y'}){}$\5
  1056. ${}\{{}$\1\6
  1057. \&{if} ${}(\|n>\O{0}){}$\5
  1058. ${}\{{}$\1\6
  1059. ${}\\{loc}\K\\{buffer}+\O{2};{}$\6
  1060. ${}\\{printf}(\.{"\\n!\ Hmm...\ \%d\ "},\39\|n);{}$\6
  1061. \\{err\_print}(\.{"of\ the\ preceding\ li}\)\.{nes\ failed\ to\ match"});\6
  1062. \4${}\}{}$\2\6
  1063. \&{return};\6
  1064. \4${}\}{}$\2\2\par
  1065. \U17.\fi
  1066. \vfil\eject
  1067. \def\runninghead{APPENDIX E --- MACROS FOR FORMATTING}
  1068. \section Appendix E: The \.{cwebmac.tex} file.
  1069. This is the file that extends ``plain \TeX'' format in order to support the
  1070. features needed by the output of \.{WEAVE}.
  1071. \vskip6pt
  1072. \begingroup \def\tt{\eighttt} \baselineskip9pt
  1073. \def\printmacs{\input cwebmac}
  1074. \verbatim
  1075. !printmacs
  1076. !endgroup
  1077. \endgroup
  1078. \vfill\eject
  1079. \def\runninghead{APPENDIX F --- NOTES ON FORMATTING}
  1080. \section Appendix F: How to use \.{CWEB} macros.
  1081. The macros in \.{cwebmac} make it possible to produce a variety of formats
  1082. without editing the output of \.{CWEAVE}, and the purpose of this appendix
  1083. is to explain some of the possibilities.
  1084. \def\point#1.{\yskip\indent#1.\quad\ignorespaces}
  1085. \point 1. Four fonts have been declared in addition to the standard fonts of
  1086. \.{PLAIN} format: You can say `\.{\{\\mc UNIX\}}' to get {\mc UNIX} in
  1087. medium-size caps; you can say `\.{\{\\sc STUFF\}}' to get {\sc STUFF}
  1088. in small caps; and you can select the largish fonts \.{\\titlefont}
  1089. and \.{\\ttitlefont} in the title of your document, where \.{\\ttitlefont}
  1090. is a typewriter style of type. There are macros \.{\\UNIX} and \.{\\Cee}
  1091. to refer to \UNIX\ and \Cee\ with medium-size caps.
  1092. \point 2. When you mention an identifier in \TeX\ text, you normally call
  1093. it `\.{|identifier|}'. But you can also say `\.{\\\\\{identifier\}}'. The
  1094. output will look the same in both cases, but the second alternative
  1095. doesn't put \\{identifier} into the index, since
  1096. it bypasses \.{WEAVE}'s translation from \Cee\ mode. In the second
  1097. case you have to put a backslash before each underline character
  1098. in the identifier.
  1099. \point 3. To get typewriter-like type, as when referring to `\.{WEB}', you
  1100. can use the `\.{\\.}' macro (e.g., `\.{\\.\{WEB\}}'). In the argument to
  1101. this macro you should insert an additional backslash before the symbols
  1102. listed as `special string characters' in the index to \.{WEAVE}, i.e.,
  1103. before backslashes and dollar signs and the like.
  1104. A `\.{\\\ }' here will result in the visible space symbol; to get an
  1105. invisible space following a control sequence you can say `\.{\{\ \}}'.
  1106. If the string is long, you can break it up into substrings that
  1107. are separated by `\.{\\)}'; the latter gives a discretionary backslash
  1108. if \TeX\ has to break a line here.
  1109. \point 4. The three control sequences \.{\\pagewidth}, \.{\\pageheight},
  1110. and \.{\\fullpageheight} can be redefined in the limbo section at the
  1111. beginning of your \.{WEB} file, to change the dimensions of each page.
  1112. The default settings
  1113. $$\lpile{\.{\\pagewidth=6.5in}\cr
  1114.   \.{\\pageheight=8.7in}\cr
  1115.   \.{\\fullpageheight=9in}\cr}$$
  1116. were used to prepare the present report; \.{\\fullpageheight} is
  1117. \.{\\pageheight} plus room for the additional heading and page numbers at
  1118. the top of each page. If you change any of these quantities, you should
  1119. call the macro \.{\\setpage} immediately after making the change.
  1120. \point 5. The \.{\\pageshift} macro defines an amount by which right-hand
  1121. pages (i.e., odd-numbered pages) are shifted right with respect to
  1122. left-hand (even-numbered) ones. By adjusting this amount you may be
  1123. able to get two-sided output in which the page numbers line up on
  1124. opposite sides of each sheet.
  1125. \point 6. The \.{\\title} macro will appear at the top of each page
  1126. in small caps.
  1127. \point 7. The first page usually is assigned page
  1128. number 1. To start on page 16, with contents
  1129. on page 15, say this: `\.{\\def\\contentspagenumber\{15\}}
  1130. \.{\\pageno=\\contentspagenumber} \.{\\advance\\pageno by 1}'.
  1131. \point 8. The macro \.{\\iftitle} will suppress the header line if it is
  1132. defined by `\.{\\titletrue}'. The normal value is \.{\\titlefalse}
  1133. except for the table of contents; thus, the contents
  1134. page is usually unnumbered.
  1135. Two macros are provided to give flexibility to the table of
  1136. contents: \.{\\topofcontents} is invoked just before the contents
  1137. info is read, and \.{\\botofcontents} is invoked just after.
  1138. Here's a typical definition, taken from the original \.{WEB} manual:
  1139. $$\lpile{\.{\\def\\topofcontents\{\\null\\vfill}\cr
  1140.   \.{ { }\\titlefalse \% include headline on the contents page}\cr
  1141.   \.{ { }\\def\\rheader\{\\mainfont The \{\\tt WEAVE\}{ }processor\\hfil\}}\cr
  1142.   \.{ { }\\centerline\{\\titlefont The \{\\ttitlefont WEAVE\}{ }processor\}}\cr
  1143.   \.{ { }\\vskip 15pt \\centerline\{(Version 2.5)\}{ }\\vfill\}}\cr}$$
  1144. Redefining \.{\\rheader}, which is the headline for right-hand pages,
  1145. suffices in this case to put the desired information at the top of the
  1146. contents page.
  1147. \point 9. Data for the table of contents is written to a file that
  1148. is read after the indexes have been \TeX ed; there's one line of data
  1149. for every starred module. Here's what the
  1150. file \.{common.toc} might look like:
  1151. $$\lpile{\.{\\Z \{{ }Introduction\}\{1\}\{2\}}\cr
  1152.   \.{\\Z \{{ }The character set\}\{5\}\{3\}}\cr}$$
  1153. and so on. The \.{\\topofcontents} macro could
  1154. redefine \.{\\Z} so that the information appears in any desired format.
  1155. \point 10. Sometimes it is necessary or desirable to divide the output of
  1156. \.{WEAVE} into subfiles that can be processed separately. For example,
  1157. the listing of \TeX\ runs to more than 500 pages, and that is enough to
  1158. exceed the capacity of many printing devices and/or their software.
  1159. When an extremely large job isn't cut into smaller pieces, the entire
  1160. process might be spoiled by a single error of some sort, making it
  1161. necessary to start everything over.
  1162. Here's a safe way to break a woven file into three parts:
  1163. Say the pieces are $\alpha$,
  1164. $\beta$, and $\gamma$, where each piece begins with a starred module.
  1165. All macros should be defined in the opening limbo section of $\alpha$,
  1166. and copies of this \TeX\ code should be placed at the
  1167. beginning of $\beta$ and of $\gamma$. In order to process the parts
  1168. separately, we need to take care of two things: The starting page
  1169. numbers of $\beta$ and $\gamma$ need to be set up properly, and
  1170. the table of contents data from all three runs needs to be
  1171. accumulated.
  1172. The \.{webmac} macros include two control sequences \.{\\contentsfile} and
  1173. \.{\\readcontents} that facilitate the necessary processing.  We include
  1174. `\.{\\def\\contentsfile\{CONT1\}}' in the limbo section of $\alpha$, and
  1175. we include `\.{\\def\\contentsfile\{CONT2\}}' in the limbo section of
  1176. $\beta$; this causes \TeX\ to write the contents data for $\alpha$ and $\beta$
  1177. into \.{CONT1.TEX} and \.{CONT2.TEX}. Now in $\gamma$ we say
  1178. $$\.{\\def\\readcontents\{\\input CONT1 \\input CONT2 \\input CONTENTS\}};$$
  1179. this brings in the data from all three pieces, in the proper order.
  1180. However, we still need to solve the page-numbering problem. One way to
  1181. do it is to include the following in the limbo material for $\beta$:
  1182. $$\lpile{\.{\\message\{Please type the last page number of part 1: \}}\cr
  1183.   \.{\\read -1 to \\temp \\pageno=\\temp \\advance\\pageno by 1}\cr}$$
  1184. Then you simply provide the necessary data when \TeX\ requests
  1185. it; a similar construction is used at the beginning of $\gamma$.
  1186. This method can, of course, be used to divide a woven file into
  1187. any number of pieces.
  1188. \point 11. Sometimes it is nice to include things in the index that are
  1189. typeset in a special way. For example, we might want to have an
  1190. index entry for `\TeX'. \.{WEAVE} provides two simple ways to
  1191. typeset an index entry (unless the entry is an identifier or a reserved word):
  1192. `\.{@\^}' gives roman type, and `\.{@.}' gives typewriter type.
  1193. But if we try to typeset `\TeX' in roman type by saying, e.g.,
  1194. `\.{@\^\\TeX@>}', the backslash character gets in the way,
  1195. and this entry wouldn't appear in the index with the T's.
  1196. The solution is to use the `\.{@:}' feature, declaring a macro that
  1197. simply removes a sort key as follows:
  1198. $$\.{\\def\\9\#1\{\}}$$
  1199. Now you can say, e.g., `\.{@:TeX\}\{\\TeX@>}' in your \.{WEB} file; \.{WEAVE}
  1200. puts it into the index alphabetically, based on the sort key, and
  1201. produces the macro call `\.{\\9\{TeX\}\{\\TeX\}}' which will ensure that
  1202. the sort key isn't printed.
  1203. A similar idea can be used to insert hidden material into module
  1204. names so that they are alphabetized in whatever way you might wish.
  1205. Some people call these tricks ``special refinements''; others call
  1206. them ``kludges''.
  1207. \point 12. The control sequence \.{\\modno} is set to the number of the
  1208. module being typeset.
  1209. \point 13. If you want to list only the modules that have changed,
  1210. together with the index, put the command `\.{\\let\\maybe=\\iffalse}' in
  1211. the limbo section before the first module of your \.{WEB} file. It's
  1212. customary to make this the first change in your change file.
  1213. \point 14. To get output in languages other than English, redefine the
  1214. macros \.{\\A}, \.{\\As}, \.{\\ET}, \.{\\ETs}, \.{\\U}, \.{\\Us},
  1215. \.{\\ch}, \.{\\fin}, and \.{\\con}. \.{WEAVE} itself need not be changed.
  1216. \vfill\end
  1217.