cwebman.tex
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:74k
源码类别:

通讯编程

开发平台:

Visual C++

  1. % This file generates the user manual; TeX it, don't read it!
  2. deftangref{3} % where the main explanation of CTANGLing is given
  3. input cwebmac
  4. defpage{box255 } normalbottom
  5. parskip 0pt plus 1pt
  6. defRA{char'31 } % right arrow
  7. defhang{hangindent 4emignorespaces}
  8. fonteightrm=cmr8
  9. fontninerm=cmr9
  10. fontninett=cmtt9
  11. fonteighttt=cmtt8
  12. fonttwelvett=cmtt12
  13. fontquoterm=cmssq8
  14. fontquoteit=cmssqi8
  15. fontauthorfont=cmr12
  16. fontsectionfont=cmbx12
  17. defpb{.{|...|}}
  18. defv{.{char'174}} % vertical (|) in typewriter font
  19. deflpile{defcr{hfillendline}matrix} % I only use lpile by itself
  20. abovedisplayskip=.5abovedisplayskip
  21. belowdisplayskip=.5belowdisplayskip
  22. abovedisplayshortskip=.5abovedisplayshortskip
  23. belowdisplayshortskip=.5belowdisplayshortskip
  24. advancebaselineskip by -.5pt
  25. advancepageheight by baselineskip % the manual just got a bit longer
  26. advancefullpageheight by baselineskip
  27. setpage
  28. outerdefsection #1.{penalty-500bigskip
  29.         centerline{sectionfontdef.##1{{twelvett##1}} #1}nobreakvskip 6pt
  30.         everypar{hskip-parindenteverypar{}}}
  31. deflheader{mainfontthepagenohfillscrunningheadhfill}
  32. defrheader{hfillscrunningheadhfillmainfontthepageno}
  33. defrunninghead{{tentt CWEB} USER MANUAL (VERSION 3.0)}
  34. % This verbatim mode assumes that ! marks are !! in the text being copied.
  35. defverbatim{begingroup
  36.   defdo##1{catcode`##1=12 } dospecials
  37.   parskip 0pt parindent 0pt let!=!
  38.   catcode` =13 catcode`^^M=13
  39.   tt catcode`!=0 verbatimdefs verbatimgobble}
  40. {catcode`^^M=13{catcode` =13gdefverbatimdefs{def^^M{ par}let = }} %
  41.   gdefverbatimgobble#1^^M{}}
  42. nullvfill
  43. centerline{titlefont The {ttitlefont CWEB} System of
  44.     Structured Documentation}
  45. vskip 18ptcenterline{(Version 3.0)}
  46. vskip 24pt
  47. centerline{authorfont Donald E. Knuth and Silvio Levy}
  48. vfill
  49. noindent
  50. TeX is a trademark of the American Mathematical Society.
  51. bigskipnoindent
  52. The printed form of this manual is copyright copyright 1994
  53.   by Addison-Wesley Publishing Company, Inc.  All rights reserved.
  54. smallskipnoindent
  55. The electronic form is copyright copyright 1987, 1990, 1993
  56.   by Silvio Levy and Donald E. Knuth.
  57. bigskipnoindent
  58. Permission is granted to make and distribute verbatim copies of the
  59. electronic form of this document provided that the electronic copyright
  60. notice and this permission notice are preserved on all copies.
  61. smallskipnoindent
  62. Permission is granted to copy and distribute modified versions of the
  63. electronic form of this document under the conditions for verbatim copying,
  64. provided that the entire resulting derived work is distributed under the terms
  65. of a permission notice identical to this one.
  66. smallskipnoindent
  67. Individuals may make copies of the documentation from the electronic files
  68. for their own personal use.
  69. pageno=0 titletrueeject
  70. titletrue
  71. centerline{titlefont The {ttitlefont CWEB} System of
  72.     Structured Documentation}
  73. vskip 15pt plus 3pt minus 3pt
  74. centerline{authorfont Donald E. Knuth and Silvio Levy}
  75. vskip 24pt plus 3pt minus 3pt
  76. noindent
  77. This document describes a version of Don Knuth's .{WEB} system,
  78. adapted to CEE/ by Silvio Levy.  Since its creation in 1987, .{CWEB}
  79. has been revised and enhanced in various ways, by both Knuth and Levy.
  80. We now believe that its evolution is near an end; however, bug
  81. reports, suggestions and comments are still welcome, and
  82. should be sent to Levy (.{levy@geom.umn.edu}).
  83. Readers who are familiar with Knuth's memo ``The .{WEB} System of Structured
  84. Documentation'' will be able
  85. to skim this material rapidly, because .{CWEB} and .{WEB} share
  86. the same philosophy and (essentially) the same syntax.  In some respects
  87. .{CWEB} is a simplification
  88. of .{WEB}: for example, .{CWEB} does not need .{WEB}'s features
  89. for macro definition and string handling, because CEE/ and its
  90. preprocessor already take care of macros and strings. Similarly, the .{WEB}
  91. conventions of denoting octal and hexadecimal constants by .{@'77}
  92. and .{@"3f} are replaced by CEE/'s conventions .{077} and
  93. .{0x3f}. All other features of .{WEB} have been
  94. retained, and new features have been added.
  95. We thank all who contributed suggestions and criticism to
  96. the development of .{CWEB}. We are especially grateful to Steve
  97. Avery, Nelson Beebe, Hans-Hermann Bode, Klaus Guntermann, Norman Ramsey and
  98. Joachim Schnitter, who contributed code, and to Cameron Smith, who
  99. made many suggestions improving the manual.  Ramsey has made
  100. literate programming accessible to users of yet other languages by means of
  101. his .{SPIDER} system [see {sl Communications of the ACM/ bf32} (1989),
  102. 1051--1055].  Bode adapted .{CWEB} so that it works for CPLUSPLUS/ as
  103. well, so in the text below you can read CPLUSPLUS/ for CEE/ if you so desire.
  104. section Introduction.
  105. The philosophy behind .{CWEB} is
  106. that programmers who want to provide the best
  107. possible documentation for their programs need two things
  108. simultaneously:  a language like TEX/ for formatting, and a language like
  109. CEE/ for programming. Neither type of language can provide the
  110. best documentation by itself. But when both are appropriately combined, we
  111. obtain a system that is much more useful than either language separately.
  112. The structure of a software program may be thought of as a ``web'' that is
  113. made up of many interconnected pieces. To document such a program, we want
  114. to explain each individual part of the web and how it relates to its
  115. neighbors. The typographic tools provided by TEX/ give us an opportunity
  116. to explain the local structure of each part by making that structure
  117. visible, and the programming tools provided by CEE/ make it possible
  118. for us to specify the algorithms formally and unambiguously. By combining
  119. the two, we can develop a style of programming that maximizes our ability
  120. to perceive the structure of a complex piece of software, and at the same
  121. time the documented programs can be mechanically translated into a working
  122. software system that matches the documentation.
  123. The .{CWEB} system consists of two programs named .{CWEAVE} and .{CTANGLE}.
  124. When writing a .{CWEB} program the user keeps the
  125. CEE/ code and the documentation in the same file, called the .{CWEB}
  126. file and generally named .{something.w}.  The command
  127. `.{cweave} .{something}' creates an output file .{something.tex}, which
  128. can then be fed to TEX/, yielding a ``pretty printed'' version of
  129. .{something.w} that correctly handles
  130. typographic details like page layout and the use of indentation,
  131. italics, boldface, and mathematical symbols. The typeset output also
  132. includes extensive cross-index
  133. information that is gathered automatically.  Similarly, if you run the
  134. command `.{ctangle} .{something}' you will get a CEE/ file .{something.c},
  135. which can then be compiled to yield executable code.
  136. Besides providing a documentation tool, .{CWEB} enhances the CEE/
  137. language by providing the
  138. ability to permute pieces of the program text, so that a large system can
  139. be understood entirely in terms of small sections and their local
  140. interrelationships.  The .{CTANGLE} program is so named because it takes a
  141. given web and moves the sections from their web structure into the order
  142. required by CEE/; the advantage of programming in .{CWEB} is that the
  143. algorithms can be expressed in ``untangled'' form, with each section
  144. explained separately.  The .{CWEAVE} program is so named because it takes
  145. a given web and intertwines the TEX/ and CEE/ portions contained in
  146. each section, then it knits the whole fabric into a structured document.
  147. (Get it? Wow.)  Perhaps there is some deep connection here with the fact
  148. that the German word for ``weave'' is ``{it webe/}'', and the
  149. corresponding Latin imperative is ``{it texe/}''!
  150. A user of .{CWEB} should be fairly familiar with the CEE/
  151. programming language.  A minimal amount of acquaintance with TEX/ is also
  152. desirable, but in fact it can be acquired as one uses .{CWEB}, since
  153. straight text can be typeset in TEX/ with virtually no knowledge of
  154. that language.  To someone familiar with both CEE/ and TEX/ the amount of
  155. effort necessary to learn the commands of .{CWEB} is small.
  156. section Overview.
  157. Two kinds of material go into .{CWEB} files: TEX/ text and CEE/ text.
  158. A programmer writing in .{CWEB} should be thinking both of the
  159. documentation and of the CEE/ program being created;
  160. i.e., the programmer should be instinctively aware of the different
  161. actions that .{CWEAVE} and .{CTANGLE} will perform on the .{CWEB} file.
  162. TEX/ text is essentially copied without change by .{CWEAVE}, and it is
  163. entirely deleted by .{CTANGLE}; the TEX/ text is ``pure
  164. documentation.'' CEE/ text, on the other hand, is formatted by
  165. .{CWEAVE} and it is shuffled around by .{CTANGLE}, according to rules that
  166. will become clear later. For now the important point to keep in mind is
  167. that there are two kinds of text. Writing .{CWEB} programs is something
  168. like writing TEX/ documents, but with an additional ``CEE/ mode''
  169. that is added to TEX/'s horizontal mode, vertical mode, and math mode.
  170. A .{CWEB} file is built up from units called {sl sections/} that are more
  171. or less self-contained.  Each section has three parts:
  172. yskipitem{$bullet$} A TEX/ part, containing explanatory material about what
  173. is going on in the section.
  174. item{$bullet$} A middle part, containing macro definitions that serve as
  175. abbreviations for CEE/ constructions that would be less comprehensible
  176. if written out in full each time. They are turned by .{CTANGLE} into
  177. preprocessor macro definitions.
  178. item{$bullet$} A CEE/ part, containing a piece of the program that
  179. .{CTANGLE} will produce. This CEE/ code should ideally be about a
  180. dozen lines long, so that it is easily comprehensible as a unit and so
  181. that its structure is readily perceived.
  182. yskipnoindent The three parts of each section must appear in this order;
  183. i.e., the TEX/ commentary must come first, then the middle part, and
  184. finally the CEE/ code. Any of the parts may be empty.
  185. A section begins with either of the symbols `.{@ }' or `.{@*}', where
  186. `.{ }' denotes a blank space. A section ends
  187. at the beginning of the next section (i.e., at the next
  188. `.{@ }' or `.{@*}'), or at the end of the file, whichever comes first.
  189. The .{CWEB} file may also contain material that is not part of any section
  190. at all, namely the text (if any) that occurs before the first section.
  191. Such text is said to be ``in limbo''; it is ignored by .{CTANGLE}
  192. and copied essentially verbatim by .{CWEAVE}, so its function is to
  193. provide any additional formatting instructions that may be desired in the
  194. TEX/ output. Indeed, it is customary to begin a .{CWEB} file with
  195. TEX/ code in limbo that loads special fonts, defines special macros,
  196. changes the page sizes, and/or produces a title page.
  197. Sections are numbered consecutively, starting with 1. These numbers appear
  198. at the beginning of each section of the TEX/ documentation output by
  199. .{CWEAVE}, and they appear
  200. as bracketed comments at the beginning and end of the code generated by that
  201. section in the CEE/ program output by .{CTANGLE}.
  202. section Section Names.
  203. Fortunately, you never mention these numbers yourself when you are writing
  204. in .{CWEB}. You just say `.{@ }' or `.{@*}' at the beginning of each
  205. new section, and the numbers are supplied automatically by .{CWEAVE} and
  206. .{CTANGLE}. As far as you are concerned, a section has a
  207. {sl name/} instead of a number; its name is specified by writing
  208. `.{@<}' followed by TEX/ text followed by `.{@>}'. When .{CWEAVE}
  209. outputs a section name, it replaces the `.{@<}' and `.{@>}' by
  210. angle brackets and inserts the section number in small type. Thus, when you
  211. read the output of .{CWEAVE} it is easy to locate any section that is
  212. referred to in another section.
  213. For expository purposes, a section name should be a good description of the
  214. contents of that section; i.e., it should stand for the abstraction
  215. represented by the section. Then the section can be ``plugged into'' one or
  216. more other sections in such a way
  217. that unimportant details of its inner workings
  218. are suppressed.  A section name therefore ought to be long enough to convey
  219. the necessary meaning.
  220. Unfortunately, it is laborious to type
  221. such long names over and over again, and it is also difficult to specify a
  222. long name twice in exactly the same way so that .{CWEAVE} and .{CTANGLE}
  223. will be able to match the names to the sections. To ameliorate this situation,
  224. .{CWEAVE} and .{CTANGLE} let you abbreviate a section name, so long as
  225. the full name appears somewhere in the .{CWEB} file; you can type simply
  226. `.{@<$alpha$...@>}', where $alpha$ is any string that is a prefix of
  227. exactly one section name appearing in the file. For example, `.{@<Clear
  228. the arrays@>}' can be abbreviated to `.{@<Clear...@>}' if no other section
  229. name begins with the five letters `.{Clear}'.  Elsewhere
  230. you might use the abbreviation `.{@<Clear t...@>}', and so on.
  231. Section names must otherwise match character for character, except
  232. that consecutive characters of white space (spaces, tab marks, newlines, and/or
  233. form feeds) are treated as equivalent to a single space, and such spaces are
  234. deleted at the beginning and end of the name. Thus, `.{@< Clear { }the
  235. arrays @>}' will also match the name in the previous example.
  236. Spaces following the ellipsis in abbreviations are ignored as well, but
  237. not those before, so that `.{@<Clear t ...@>}' would not match
  238. `.{@<Clear the arrays@>}'.
  239. section What .{CTANGLE} Does.
  240. We have said that a section begins with `.{@ }' or `.{@*}', but we
  241. didn't say how it gets divided up into a TEX/ part, a middle part,
  242. and a CEE/ part. The middle part begins with the first appearance of
  243. `.{@d}' or `.{@f}' in the section, and the CEE/ part begins with
  244. the first appearance of `.{@c}' or `.{@<section name@>=}'.  In the
  245. latter case you are saying, in effect, that the section name stands
  246. for the CEE/ text that follows. Alternatively, if the CEE/ part
  247. begins with `.{@c}' instead of a section name, the current section is
  248. said to be {sl unnamed}.
  249. The construct `.{@<section name@>}' can appear
  250. any number of times in the CEE/ part of a section:
  251. subsequent appearances indicate that the named section is being
  252. ``used'' rather than ``defined'', that is, that the
  253. CEE/ code for the named section, presumably defined elsewhere, should be
  254. spliced in at this point in the CEE/ program.  Indeed,
  255. the main idea of .{CTANGLE} is to make a CEE/ program out of
  256. individual sections, named and unnamed.  The exact way in which this is done
  257. is this: First all the macro definitions
  258. indicated by `.{@d}' are turned into CEE/ preprocessor macro definitions
  259. and copied at the beginning.
  260. Then the CEE/ parts of unnamed sections are copied down,
  261. in order; this constitutes the first-order
  262. approximation to the text of the program. (There should be at least
  263. one unnamed section, otherwise there will be no program.) Then all section
  264. names that appear in the first-order approximation are replaced by the CEE/
  265. parts of the corresponding sections, and this substitution process
  266. continues until no section names remain. All comments are removed, because
  267. the CEE/ program is intended only for the eyes of the CEE/ compiler.
  268. If the same name has been given to more than one section, the CEE/ text
  269. for that name is obtained by putting together all of the CEE/ parts in
  270. the corresponding sections. This feature is useful, for example, in a
  271. section named `Global variables', since one can then
  272. declare global variables in whatever sections those variables are
  273. introduced. When several sections have the same name, .{CWEAVE} assigns the
  274. first section number as the number corresponding to that name, and it
  275. inserts a note at the bottom of that section telling the reader to `See
  276. also sections so-and-so'; this footnote gives the numbers of all the other
  277. sections having the same name as the present one. The CEE/ text
  278. corresponding to a section is usually formatted by .{CWEAVE} so that the
  279. output has an equivalence sign in place of the equals sign in the .{CWEB}
  280. file; i.e., the output says `$langle,$section
  281. name$,rangleequivnull$CEE/ text'. However, in the case of the second
  282. and subsequent appearances of a section with the same name, this `$equiv$'
  283. sign is replaced by `$mathrel+equiv$', as an indication that the
  284. following CEE/ text is being appended to the CEE/ text of another section.
  285. As .{CTANGLE} enters and leaves sections, it inserts preprocessor
  286. .{#line} commands into the CEE/ output file.  This means that
  287. when the compiler gives you error messages, or when you debug your program,
  288. the messages refer to line numbers in the .{CWEB} file, and not in the
  289. CEE/ file.  In most cases you can therefore
  290. forget about the CEE/ file altogether.
  291. section What .{CWEAVE} Does.
  292. The general idea of .{CWEAVE} is to make a .{.tex} file from the .{CWEB}
  293. file in the following way: The first line of the .{.tex} file
  294. tells TEX/ to input a file with macros that
  295. define .{CWEB}'s documentation conventions. The next lines of the file
  296. will be copied from whatever TEX/ text is in limbo before the first
  297. section.  Then comes the output for each section in turn, possibly
  298. interspersed with end-of-page marks.  Finally, .{CWEAVE} will generate a
  299. cross-reference index that lists each section number in which each CEE/
  300. identifier appears, and it will also generate an alphabetized list
  301. of the section names, as well as a table of contents that
  302. shows the page and section numbers for each ``starred'' section.
  303. What is a ``starred'' section, you ask? A section that begins with `.{@*}'
  304. instead of `.{@ }' is slightly special in that it denotes a new major
  305. group of sections. The `.{@*}' should be followed by the title of this
  306. group, followed by a period. Such sections will always start on a new page
  307. in the TEX/ output, and the group title will appear as a running headline
  308. on all subsequent pages until the next starred section. The title will also
  309. appear in the table of contents, and in boldface type at the beginning of
  310. its section. Caution:  Do not use TEX/ control sequences in such titles,
  311. unless you know that the .{cwebmac} macros will do the right thing with
  312. them. The reason is that these titles are converted to uppercase when
  313. they appear as running heads, and they are converted to boldface when they
  314. appear at the beginning of their sections, and they are also written out to
  315. a table-of-contents file used for temporary storage while TEX/ is
  316. working; whatever control sequences you use must be meaningful in all
  317. three of these modes.
  318. The TEX/ output produced by .{CWEAVE} for each section consists of
  319. the following: First comes the section number (e.g., `.{\M123.}'
  320. at the beginning of section 123, except that `.{\N}' appears in place of
  321. `.{\M}' at the beginning of a starred section). Then comes the
  322. TEX/ part of the section, copied almost verbatim except as noted
  323. below. Then comes the middle part and the CEE/ part, formatted
  324. so that there will be a little extra space between them if both are
  325. nonempty. The middle and CEE/ parts are obtained by inserting
  326. a bunch of funny-looking TEX/ macros into the CEE/ program; these
  327. macros handle typographic details about fonts and proper math spacing,
  328. as well as line breaks and indentation.
  329. section C Code in TEX/ Text and Vice Versa.
  330. When you are typing TEX/ text, you will probably want to make frequent
  331. reference to variables and other quantities in your CEE/ code, and you
  332. will want those variables to have the same typographic treatment
  333. when they appear in your text as when they appear in your
  334. program.  Therefore the .{CWEB} language allows you to get the effect of
  335. CEE/ editing within TEX/ text, if you place `.|' marks before and
  336. after the CEE/ material. For example, suppose you want to say something
  337. like this:
  338. $$hbox{ If \{pa} is declared as `&{int} ${}{*}\{pa}$',
  339. the assignment $\{pa}K{AND}|a[T{0}]$ makes \{pa}
  340. point to the zeroth element of |a.}$$
  341. The TEX/ text would look like this in your .{CWEB} file:
  342. $$lpile{.{If |pa| is declared as `|int *pa|', the}cr
  343. .{assignment |pa=&a[0]| makes |pa| point
  344. to the zeroth element of |a|.}cr}$$
  345. And .{CWEAVE} translates this into something you are glad you didn't have
  346. to type:
  347. $$lpile{.{If \\{pa} is declared as
  348.   `\&{int} ${}{*}\\{pa}$',}cr
  349. .{the assignment $\\{pa}\K{\AND}\|a[\T{0}]$}cr
  350. .{makes \\{pa} point to the zeroth element of \|a.}cr}$$
  351. Incidentally, the cross-reference index that .{CWEAVE} would make, in
  352. the presence of a comment like this, would include
  353. the current section number as one of the index entries for \{pa},
  354. even though \{pa} might not appear in the CEE/ part of
  355. this section. Thus, the index covers references to identifiers in
  356. the explanatory comments as well as in the program itself; you will
  357. soon learn to appreciate this feature. However, the identifiers
  358. &{int} and |a would not be indexed,
  359. because .{CWEAVE} does not make index entries for reserved words or
  360. single-letter identifiers. Such identifiers are felt to be so ubiquitous
  361. that it would be pointless to mention every place where they occur.
  362. Although a section begins with TEX/ text and ends with CEE/ text, we
  363. have noted that the dividing line isn't sharp, since CEE/ text can be
  364. included in TEX/ text if it is enclosed in `pb'.  Conversely, TEX/ text
  365. appears frequently within CEE/ text, because everything in
  366. comments (i.e., between .{/*} and .{*/}, or following .{//})
  367. is treated as TEX/ text.
  368. Likewise, the text of a section name consists of TEX/ text, but
  369. the construct .{@<section name@>} as a whole is is expected to be found
  370. in CEE/ text; thus, one typically goes back and forth
  371. between the CEE/ and TEX/ environments in a natural way, as in these
  372. examples:
  373. $$
  374. displaylines{
  375. hbox{.{if} .{(x==0)} .{@<Empty} .{the} .{|buffer|} .{array@>}} cr
  376. hbox{.{...} .{using}  .{the} .{algorithm}
  377. .{in} .{|@<Empty} .{the} .{|buffer|} .{array@>|.}} }
  378. $$
  379. The first of these excerpts
  380. would be found in the CEE/ part of a section, into which the code
  381. from the section
  382. named ``Empty the \{buffer} array'' is being spliced. The second excerpt
  383. would be found in the TEX/ part of the section, and the named section
  384. is being ``cited'', rather than defined or used.
  385. (Note the `pb' surrounding the section name in this case.)
  386. section Macros.
  387. The control code .{@d} followed by
  388. $$\{identifier}.{ }hbox{CEE/ text}qquadhbox{or by}qquad
  389. \{identifier}.(\{par}_1,ldots,\{par}_n.{) }hbox{CEE/ text}$$
  390. (where there is no blank between the
  391. \{identifier} and the parentheses in the second case) is
  392. transformed by .{CTANGLE} into a preprocessor command, starting with
  393. .{#define}, which is printed at the top of the CEE/ output file
  394. as explained earlier.
  395. A `.{@d}' macro definition can go on for several lines, and the
  396. newlines don't have to be protected by backslashes, since .{CTANGLE}
  397. itself inserts the backslashes.   If
  398. for any reason you need a .{#define} command at a specific spot in
  399. your CEE/ file, you can treat it as CEE/ code, instead of as a
  400. .{CWEB} macro; but then you do have to protect newlines yourself.
  401. section Strings and constants.
  402. If you want a string to appear in the CEE/ file, delimited by pairs of
  403. .' or ." marks as usual, you can type it exactly so in the .{CWEB} file,
  404. except that the character `.@' should be typed `.{@@}' (it becomes a
  405. control code, the only one that can appear in strings; see below).
  406. Strings should end on the same line as they begin, unless there's a
  407. backslash at the end of lines within them.
  408. TEX/ and CEE/ have different ways to refer to octal and hex constants,
  409. because TEX/ is oriented to technical writing while CEE/ is oriented to
  410. computer processing.  In TEX/ you
  411. make a constant octal or hexadecimal by prepending .' or .",
  412. respectively, to it; in CEE/ the constant should be preceded by .0
  413. or .{0x}.  In .{CWEB} it seems reasonable to let each convention hold
  414. in its respective realm; so in CEE/ text you get $40_8$ by typing
  415. `.{040}', which .{CTANGLE} faithfully copies into the CEE/ file (for
  416. the compiler's benefit) and which .{CWEAVE} prints as $T{~40}$.
  417. Similarly, .{CWEAVE} prints the hexadecimal CEE/ constant `.{0x20}'
  418. as T{^20}. The use of italic font for octal digits and typewriter font
  419. for hexadecimal digits makes the meaning of such constants clearer in
  420. a document. For consistency, then, you
  421. should type `.{|040|}'  or `.{|0x20|}'
  422. in the TEX/ part of the section.
  423. section Control codes.
  424. A .{CWEB} {sl control code/}
  425. is a two-character combination of which the first is `.@'.
  426. We've already seen the meaning of several control codes; it's time to
  427. list them more methodically.
  428. In the following list,
  429. the letters in brackets after a control code indicate in what contexts that
  430. code is allowed.  $L$ indicates that the code is allowed in limbo; $T$
  431. (for TEX/), $M$ (for middle) and $C$ mean that the code is allowed in
  432. each of the three parts of a section, at top level---that is, outside
  433. such constructs as `pb' and section names.  An arrow $to$ means
  434. that the control code terminates the present part of the .{CWEB}
  435. file, and inaugurates the part indicated by the letter following the
  436. arrow.  Thus $[LTMCto T]$ next to .{@ } indicates that this control
  437. code can occur in limbo, or in any of the three parts of a section, and
  438. that it starts the (possibly empty) TEX/ part of the following
  439. section.
  440. Two other abbreviations can occur in these brackets: The letter $r$ stands for
  441. {it restricted context}, that is, material inside CEE/ comments, section
  442. names, CEE/ strings and control texts (defined below); the letter
  443. $c$ stands for {it inner CEE/ context}, that is, CEE/ material
  444. inside `pb' (including `pb's inside comments, but not those
  445. occurring in other restricted contexts).  An asterisk $*$ following
  446. the brackets means
  447. that the context from this control code to the matching .{@>} is
  448. restricted.
  449. Control codes involving letters are case-insensitive: thus .{@d} and
  450. .{@D} are equivalent. Only the lowercase versions are mentioned
  451. specifically below.
  452. gdef@#1[#2] {penalty-50yskiphangindent 2emnoindent.{@#1unskip
  453.   spacefactor1000{ }}$[#2]$quad}
  454. defmore{hangindent 2em hangafter0}
  455. defsubsec{penalty-300medskipnoindent}
  456. @@ [LTMCrc] A double .@ denotes the single character `.@'. This is
  457. the only control code that is legal everywhere.
  458. Note that you must use this convention if you are giving an internet
  459. email address in a .{CWEB} file (e.g., .{levy@@geom.umn.edu}).
  460. subsec
  461. Here are the codes that introduce the TEX/ part of a section.
  462. @ [LTMCto T] This denotes the beginning of a new (unstarred)
  463. section. A tab mark or form feed or
  464. end-of-line character is equivalent to a space when it follows an .@
  465. sign (and in most other cases).
  466. @* [LTMCto T] This denotes the beginning of a new starred
  467. section, i.e., a section that begins a new major group. The title of the new
  468. group should appear after the .{@*}, followed by a period. As explained
  469. above, TEX/ control sequences should be avoided in such titles unless
  470. they are quite simple. When .{CWEAVE} and .{CTANGLE} read a .{@*}, they
  471. print an asterisk on the terminal
  472. followed by the current section number, so that the user
  473. can see some indication of progress. The very first section should be starred.
  474. more You can specify the ``depth'' of a starred section by typing .* or a
  475. decimal number after the .{@*}; this indicates the relative ranking
  476. of the current group of sections in the program hierarchy. Top-level
  477. portions of the program, introduced by .{@**}, get their names typeset
  478. in boldface type in the table of contents; they are said to have
  479. depth~$-1$. Otherwise the depth is a nonnegative number, which governs
  480. the amount of indentation on the contents page. Such indentation helps
  481. clarify the structure of a long program. The depth is assumed to be 0
  482. if it is not specified explicitly; when your program is short, you
  483. might as well leave all depths zero.  A starred section always begins
  484. a new page in the output, unless the depth is greater than~1.
  485. subsec
  486. The middle part of each section consists of any number of
  487. macro definitions (beginning with .{@d}) and format definitions (beginning
  488. with .{@f} or .{@s}), intermixed in any order.
  489. @d [TMto M] Macro definitions begin with .{@d}, followed by
  490. an identifier and optional parameters and CEE/ text as explained earlier.
  491. @f [TMto M] Format definitions begin with .{@f}; they cause
  492. .{CWEAVE} to treat identifiers in a special way when they appear in
  493. CEE/ text. The general form of a format definition is `.{@f} |l
  494. |r', followed by an optional comment enclosed between
  495. .{/*} and .{*/}, where |l and |r
  496. are identifiers; .{CWEAVE} will subsequently treat identifier |l as it
  497. currently treats |r. This feature allows a .{CWEB} programmer to invent
  498. new reserved words and/or to unreserve some of CEE/'s reserved
  499. identifiers. If |r is the special identifier `\{TeX}', identifier |l
  500. will be formatted as a TEX/ control sequence; for example,
  501. `.{@f foo TeX}' in the .{CWEB} file will cause identifier \{foo} to
  502. be output as .{\foo} by .{CWEAVE}. The programmer should define
  503. .{\foo} to have whatever custom format is desired, assuming TEX/
  504. math mode. (Each underline
  505. character is converted to .{x} when making the TEX/ control sequence;
  506. thus \{foo_bar} becomes .{\fooxbar}. Other characters, including digits,
  507. are left untranslated, so TEX/ will consider them as macro parameters,
  508. not as part of the control sequence itself. For example,
  509. $$.{\def\x#1{x_{#1}} @f x1 TeX @f x2 TeX}$$
  510. will format .{x1} and .{x2} not as \{x1} and \{x2} but as $x_1$ and $x_2$.
  511. more .{CWEAVE} knows that identifiers being
  512. defined with a &{typedef} should become reserved words; thus you
  513. don't need format definitions very often.
  514. @s [TMto M;;L] Same as .{@f}, but .{CWEAVE} does not show the format
  515. definition in the output, and the optional CEE/ comment is not
  516. allowed. This is used mostly in .{@i} files.
  517. subsec
  518. Next come the codes that govern the CEE/ part of a section.
  519. @{c @p} [TMto C] The CEE/ part of an unnamed section begins with .{@c}
  520. (or with .{@p} for ``program''; both control codes do the same thing).
  521. This causes .{CTANGLE} to append the following CEE/ code
  522. to the first-order program text, as explained on page~tangref.
  523. Note that .{CWEAVE} does not print a `.{@c}' in the TEX/
  524. output, so if you are creating a .{CWEB} file based on a TEX/-printed
  525. .{CWEB} documentation you have to remember to insert .{@c} in the
  526. appropriate places of the unnamed sections.
  527. @< [TMto C;; C;; c] $*$ This control code introduces a
  528. section name (or unambiguous prefix, as discussed above), which
  529. consists of TEX/ text and extends to the matching .{@>}.
  530. The whole construct .{@<...@>} is conceptually a CEE/ element.
  531. The behavior is different depending on the context:
  532. more A .{@<} appearing in contexts $T$ and $M$ attaches the
  533. following section name to the current section, and inaugurates the
  534. CEE/ part of the section.  The closing .{@>} should be followed by
  535. .{=} or .{+=}.
  536. more
  537. In context $C$, .{@<} indicates that the named
  538. section is being used---its CEE/ definition is spliced in by
  539. .{CTANGLE}, as explained on page~tangref.
  540. As an error-detection measure,
  541. .{CTANGLE} and .{CWEAVE} complain if such a section name is followed
  542. by .=, because most likely this is meant as the definition of a new
  543. section, and so should be preceded by .{@ }.  If you really want to
  544. say $langle,$foo$,rangle=\{bar}$, where $langle,$foo$,rangle$
  545. is being used and not defined, put a newline before the .=.
  546. more
  547. Finally, in inner CEE/ context (that is, within `pb' in the TEX/ part
  548. of a section or in a comment), .{@<...@>}
  549. means that the named section is being
  550. cited.  Such an occurrence is ignored by .{CTANGLE}. Note that
  551. even here we think of the section name as being a CEE/ element, hence the pb.
  552. @( [TMto C;;C;;c] $*$ A section name can begin with .{@(}.
  553. Everything works just as for .{@<}, except that the CEE/ code
  554. of the section named .{@(foo@>} is written by .{CTANGLE}
  555. to file .{foo}. In this way you can get multiple-file output from
  556. a single .{CWEB} file. (The .{@d} definitions are not output
  557. to such files, only to the master .{.c} file.) One use of this feature
  558. is to produce header files for other program modules that will be loaded
  559. with the present one. Another use is to produce a test routine that
  560. goes with your program. By keeping the sources for a program and its
  561. header and test routine together, you are more likely to keep
  562. all three consistent with each other. Notice that the output of a named
  563. section can be incorporated in several different output files, because
  564. you can mention .{@<foo@>} in both .{@(bar1@>} and .{@(bar2@>}.
  565. @h [Cc] Causes .{CTANGLE}
  566. to insert at the current spot the .{#define} statements
  567. from the middle parts of all sections,
  568. and {it not/} to write them at the beginning of the CEE/ file.
  569. Useful when you want the macro definitions to come after the include files,
  570. say. (Ignored by .{CTANGLE} inside `pb'.)
  571. subsec
  572. The next several control codes introduce ``control
  573. texts'', which end with the next `.{@>}'.  The closing `.{@>}' must be on
  574. the same line of the .{CWEB} file as the line where the control text began.
  575. The context from each of these control codes to the matching .{@>} is
  576. restricted.
  577. @^ [TMCc] $*$ The control text that follows, up to the next
  578. `.{@>}', will be entered into the index together with the identifiers of
  579. the CEE/ program; this text will appear in roman type. For example, to
  580. put the phrase ``system dependencies'' into the index that is output by
  581. .{CWEAVE}, type
  582. `.{@^system dependencies@>}' in each section
  583. that you want to index as system dependent.
  584. @. [TMCc] $*$ The control text that follows will be entered into the index
  585. in .{typewriter} .{type}.
  586. @: [TMCc] $*$ The control text that follows will be entered into the index
  587. in a format controlled by the TEX/ macro `.{\9}', which you
  588. should define as desired.
  589. @t [MCc] $*$ The control text that follows will
  590. be put into a TEX/ .{\hbox} and formatted along with the neighboring
  591. CEE/ program. This text is ignored by .{CTANGLE}, but it can be used
  592. for various purposes within .{CWEAVE}. For example, you can make comments
  593. that mix CEE/ and classical mathematics, as in `$\{size}<2^{15}$', by
  594. typing `.{|size < 2@t$^{15}$@>|}'.
  595. @= [MCc] $*$ The control text that follows will
  596. be passed verbatim to the CEE/ program.
  597. @q [LTMCc] $*$ The control text that follows will
  598. be totally ignored---it's a comment for readers of the .{CWEB} file only.
  599. A file intended to be included in
  600. limbo, with .{@i}, can identify itself with .{@q} comments.
  601. Another use is to balance unbalanced parentheses in C strings,
  602. so that your text editor's parenthesis matcher doesn't go into a tailspin.
  603. @! [TMCc] $*$
  604. The section number in an index entry will be underlined if `.{@!}'
  605. immediately precedes the identifier or control text being indexed. This
  606. convention is used to distinguish the sections where an identifier is
  607. defined, or where it is explained in some special way, from the sections
  608. where it is used. A~reserved word or an identifier of length one will not
  609. be indexed except for underlined entries. An `.{@!}' is implicitly inserted
  610. by .{CWEAVE} when an identifier is being defined or declared in CEE/
  611. code; for example, the definition
  612. $$hbox{&{int} \{array}[\{max_dim}], \{count}${}=\{old_count};$}$$
  613. makes the names \{array} and \{count} get an underlined entry in the
  614. index.  Statement labels, function definitions like
  615. \{main}(&{int}~\{argc},,&{char}~$*$\{argv}[,]),
  616. and &{typedef} definitions also
  617. imply underlining. An old-style
  618. function definition (without prototyping) doesn't define its arguments;
  619. the arguments will, however, be considered to be defined
  620. (i.e., their index entries will be underlined) if their types are
  621. declared before the body of the function in the usual way
  622. (e.g., `&{int}~\{argc}; &{char}~${*}\{argv}[,]$; ${,ldots,}$').
  623. subsec
  624. We now turn to control codes that affect only the operation of
  625. .{CTANGLE}.
  626. @' [MCc] This control code is dangerous because it has quite different
  627. meanings in .{CWEB} and the original .{WEB}. In .{CWEB} it produces the
  628. decimal constant corresponding to the ASCII code for a string of length~1
  629. (e.g., .{@'a'} is .{CTANGLE}d into .{97} and .{@'\t'} into
  630. .9). You might want to use this if you need to work in ASCII on a
  631. non-ASCII machine; but in most cases the CEE/ conventions of
  632. .{<ctype.h>} are adequate for character-set-independent programming.
  633. @& [MCc] The .{@&} operation causes whatever is on its left to be
  634. adjacent to whatever is on its right, in the CEE/ output. No spaces or
  635. line breaks will separate these two items.
  636. @l [L] .{CWEB} programmers have the option of using any 8-bit character
  637. code from the often-forbidden range 128--255 within TEX/ text; such
  638. characters are also permitted in strings and even in identifiers of the
  639. CEE/ program.
  640. Under various extensions of the basic
  641. ASCII standard, the higher 8-bit codes correspond
  642. to accented letters, letters from non-Latin alphabets,
  643. and so on. When such characters occur in identifiers, .{CTANGLE} must replace
  644. them by standard ASCII alphanumeric characters or
  645. .{_}, in order to generate legal CEE/ code.  It does this by means
  646. of a transliteration table, which by default associates the string
  647. .{Xab} to the character with ASCII code T{^}$ab$ (where $a$ and $b$ are
  648. hexadecimal digits, and $age8$).  By placing the
  649. construction .{@l ab newstring} in limbo, you are telling
  650. .{CTANGLE} to replace this character by .{newstring} instead.
  651. For example, the ISO Latin-1 code for the letter `"u' is T{^FC}
  652. (or .{'char`\374'}),
  653. and .{CTANGLE} will normally change this code to the
  654. three-character sequence .{XFC} if it
  655. appears in an identifier. If you say .{@l} .{fc} .{ue}, the code will
  656. be transliterated into .{ue} instead.
  657. more
  658. .{CWEAVE} passes 8-bit characters straight through to TEX/ without
  659. transliteration; therefore TEX/ must be prepared to receive them.
  660. If you are formatting all your nonstandard identifiers as ``custom''
  661. control sequences, you should
  662. make TEX/ treat all their characters as letters. Otherwise you should either
  663. make your 8-bit codes ``active'' in TEX/, or load fonts that
  664. contain the special characters you need in the correct positions.
  665. (The font selected by TEX/ control sequence .{\it} is used for
  666. identifiers.)
  667. Look for special macro packages designed for .{CWEB} users in your language;
  668. or, if you are brave, write one yourself.
  669. subsec
  670. The next eight control codes (namely `.{@,}', `.{@/}', `.{@|}', `.{@#}',
  671. `.{@+}', `.{@;}', `.{@[}', and `.{@]}') have no effect on the CEE/
  672. program output by .{CTANGLE}; they merely help to improve the readability
  673. of the TEX/-formatted CEE/ that is output by .{CWEAVE}, in unusual
  674. circumstances. .{CWEAVE}'s built-in formatting method is fairly good
  675. when dealing with syntactically correct CEE/ text, but
  676. it is incapable of handling all possible cases, because it must deal with
  677. fragments of text involving macros and section names; these fragments do
  678. not necessarily obey CEE/'s syntax. Although .{CWEB} allows you to
  679. override the automatic formatting, your best strategy is not to worry
  680. about such things until you have seen what .{CWEAVE} produces automatically,
  681. since you will probably need to make only a few corrections when you are
  682. touching up your documentation.
  683. @, [MCc] This control code inserts a thin space in .{CWEAVE}'s output.
  684. Sometimes you need this extra space if you are using
  685. macros in an unusual way, e.g., if two identifiers are adjacent.
  686. @/ [MC] This control code causes a line break to occur within a CEE/
  687. program formatted by .{CWEAVE}. Line breaks
  688. are chosen automatically by TEX/ according to a scheme that works 99%
  689. of the time, but sometimes you will prefer to force a line break so that
  690. the program is segmented according to logical rather than visual
  691. criteria. If a comment follows, say `.{@/@,}' to break the line
  692. before the comment.
  693. @| [MC] This control code specifies an optional line break in the midst of
  694. an expression. For example, if you have
  695. a long expression on the right-hand side of an assignment
  696. statement, you can use `.{@|}' to specify breakpoints more logical than
  697. the ones that TEX/ might choose on visual grounds.
  698. @# [MC] This control code forces a line break, like .{@/} does,
  699. and it also causes a little extra white space to appear between the lines at
  700. this break. You might use it, for example,
  701. between groups of macro definitions that are logically separate but within
  702. the same section. .{CWEB} automatically inserts this extra space
  703. between functions, between external declarations and functions, and
  704. between declarations and statements within a function.
  705. @+ [MC] This control code cancels a line break that might otherwise be
  706. inserted by .{CWEAVE}, e.g., before the word `&{else}', if you want to
  707. put a short if--else construction on a single line.
  708. If you say `.{{@+}' at the beginning of a compound statement
  709. that is the body of a function, the first declaration or
  710. statement of the function will appear on the same line as the
  711. left brace, and it will be indented by the same amount as the
  712. second declaration or statement on the next line.
  713. @; [MC] This control code is treated like a semicolon, for formatting
  714. purposes, except that it is invisible. You can use it, for example, after
  715. a section name or macro when the CEE/ text represented by that section or macro
  716. is a compound statement or ends
  717. with a semicolon. Consider constructions like
  718. $$lpile{.{if (condition) macro @;}cr
  719. .{else break;}cr}$$
  720. where \{macro} is defined to be a compound statement (enclosed in braces).
  721. This is a well-known infelicity of CEE/ syntax.
  722. @{[} [MC] See .{@]}.
  723. @] [MC] Place .{@[...@]} brackets around program text that .{CWEAVE} is
  724. supposed to format as an expression, if it doesn't already do so. (This
  725. occasionally applies to unusual macro arguments.) Also
  726. insert `.{@[@]}' between a simple type name and a left parenthesis
  727. when declaring a pointer to a function, as in
  728. $$.{int @[@] (*f)();}$$
  729. otherwise .{CWEAVE} will confuse the first part of that declaration with
  730. the CPLUSPLUS/ expression `&{int}($*f$)'.
  731. subsec
  732. The remaining control codes govern the input that .{CWEB} sees.
  733. @{x @y @z}[\{change_file}]
  734. .{CWEAVE} and .{CTANGLE} are designed to work with two input files,
  735. called \{web_file} and \{change_file}, where \{change_file} contains
  736. data that overrides selected portions of \{web_file}. The resulting merged
  737. text is actually what has been called the .{CWEB} file elsewhere in this
  738. report.
  739. more Here's how it works: The change file consists of zero or more ``changes,''
  740. where a change has the form `.{@x}$langle$old lines$rangle$.{@y}$langle$%
  741. new lines$rangle$.{@z}'. The special control codes .{@x}, .{@y}, .{@z},
  742. which are allowed only in change files, must appear at the beginning of a line;
  743. the remainder of such a line is ignored.
  744. The $langle$old lines$rangle$ represent material that exactly matches
  745. consecutive lines of the \{web_file}; the $langle$new lines$rangle$
  746. represent zero or more lines that are supposed to replace the old. Whenever
  747. the first ``old line'' of a change is found to match a line in the
  748. \{web_file}, all the other lines in that change must match too.
  749. more Between changes, before the first change, and after the last change,
  750. the change file can have any number of lines that do not begin with
  751. `.{@x}', `.{@y}', or~`.{@z}'. Such lines are bypassed and not used for
  752. matching purposes.
  753. more This dual-input feature is useful when working with a master .{CWEB}
  754. file that has been received from elsewhere (e.g., .{tangle.w} or
  755. .{weave.w} or .{tex.web}), when changes are desirable to customize the
  756. program for your local computer system. You will be able to debug your
  757. system-dependent changes without clobbering the master web file; and once
  758. your changes are working, you will be able to incorporate them readily
  759. into new releases of the master web file that you might receive from time
  760. to time.
  761. @i [\{web_file}]
  762. Furthermore the \{web_file} itself can be a combination of
  763. several files.  When either .{CWEAVE} or .{CTANGLE} is reading a file and
  764. encounters the control code .{@i} at the beginning of a line, it
  765. interrupts normal reading and starts looking at the file named after the
  766. .{@i}, much as the CEE/ preprocessor does when it encounters an .{#include}
  767. line.  After the included file has been entirely read, the program
  768. goes back to the next line
  769. of the original file.  The file name following .{@i} can be
  770. surrounded by ." characters, but such delimiters are
  771. optional. Include files can nest.
  772. more
  773. Change files can have lines starting with .{@i}. In this way
  774. you can replace one included file with another. Conceptually, the
  775. replacement mechanism described above does its work first, and
  776. its output is then checked for .{@i} lines. If .{@i} .{foo}
  777. occurs between .{@y} and .{@z} in a change file, individual lines
  778. of file .{foo} and files it includes are not changeable; but changes
  779. can be made to lines from files that were included by unchanged input.
  780. more On UNIX systems (and others that support environment variables),
  781. if the environment variable .{CWEBINPUTS} is set, or if the compiler flag
  782. of the same name was defined at compile time,
  783. .{CWEB} will look for include files in the directory thus named, if
  784. it cannot find them in the current directory.
  785. section Additional features and caveats.
  786. 1. In certain installations of .{CWEB} that
  787. {def\#1#2{`{tentexchar'#1#2}'}%
  788. have an extended character set, the characters
  789. \13, \01, \31, \32, \34, \35,
  790. \36, \37, \04, \20, and \21}
  791. can be typed as abbreviations for `.{++}', `.{--}', `.{->}',
  792. `.{!=}', `.{<=}', `.{>=}', `.{==}', `.{vv}', `.{&&}',
  793. `.{<<}', and `.{>>}',
  794. respectively.
  795. 2. If you have an extended character set, you can use it with only minimal
  796. restrictions, as discussed under the rules for .{@l} above. But you should
  797. stick to standard ASCII characters if you want to write programs that will
  798. be useful to all the poor souls out there who don't have extended
  799. character sets.
  800. 3. The TEX/ file output by .{CWEAVE} is broken into lines having at most
  801. 80 characters each. When
  802. TEX/ text is being copied, the existing line breaks are copied as well.
  803. If you aren't doing anything too tricky, .{CWEAVE} will recognize when
  804. a TEX/ comment is being split across two or more lines, and it will
  805. append `.%' to the beginning of such continued comments.
  806. 4. CEE/ text is translated by a ``bottom up'' procedure that
  807. identifies each token as a ``part of speech'' and combines parts of speech
  808. into larger and larger phrases as much as possible according to a special
  809. grammar that is explained in the documentation of .{CWEAVE}. It is easy to
  810. learn the translation scheme for simple constructions like single
  811. identifiers and short expressions, just by looking at a few examples of
  812. what .{CWEAVE} does, but the general mechanism is somewhat complex because
  813. it must handle much more than CEE/ itself. Furthermore the output
  814. contains embedded codes that cause TEX/ to indent and break lines as
  815. necessary, depending on the fonts used and the desired page width. For
  816. best results it is wise to avoid enclosing long CEE/ texts in pb, since the
  817. indentation and line breaking codes are omitted when the pb text is
  818. translated from CEE/ to TEX/. Stick to simple expressions or
  819. statements.  If a CEE/ preprocessor command is enclosed in pb,
  820. the .# that introduces it must be at the beginning of a line,
  821. or .{CWEAVE} won't print it correctly.
  822. 5. Comments are not permitted in pb text. After a `.|'
  823. signals the change from TEX/ text to CEE/ text, the next `.|' that is
  824. not part of a string or control text or section name ends the CEE/ text.
  825. 6. A comment must have properly nested occurrences of left and right
  826. braces, otherwise .{CWEAVE} will complain. But it
  827. does try to balance the braces, so that TEX/ won't foul up too much.
  828. 7. When you're debugging a program and decide to omit some of your
  829. CEE/ code, do NOT simply ``comment it out.'' Such comments are not
  830. in the spirit of .{CWEB} documentation; they will appear to readers
  831. as if they were explanations of the uncommented-out instructions.
  832. Furthermore, comments of a program must be valid TEX/ text; hence
  833. .{CWEAVE} will get confused if you enclose CEE/ statements in
  834. .{/*...*/} instead of in .{/*|...|*/}.  If you must comment out
  835. CEE/ code, you can surround it with preprocessor commands
  836. like .{#if 0==1} and .{#endif}.
  837. 8. The .{@f} feature allows you to define one identifier to act like
  838. another, and these format definitions are carried out sequentially.
  839. In general, a given identifier has only one printed format
  840. throughout the entire document, and this format is used even before
  841. the .{@f} that defines it. The reason is that .{CWEAVE} operates in two
  842. passes; it processes .{@f}'s and cross-references on the first pass and
  843. it does the output on the second.  (However, identifiers that
  844. implicitly get a boldface format, thanks to a .{typedef} declaration,
  845. don't obey this rule: they are printed differently before and after
  846. the relevant .{typedef}.  This is unfortunate, but hard to fix. You can
  847. get around the restriction by using .{@s}, before or after the .{typedef}.)
  848. 9. Sometimes it is desirable to insert spacing into formatted CEE/ code that
  849. is more general than the thin space provided by `.{@,}'. The .{@t} feature
  850. can be used for this purpose; e.g., `.{@t\hskip 1in@>}' will
  851. leave one inch of blank space. Furthermore, `.{@t\4@>}' can be
  852. used to backspace by one unit of indentation, since the control sequence
  853. .{\4} is defined in .{cwebmac} to be such a backspace. (This
  854. control sequence is used, for example, at the beginning of lines that
  855. contain labeled statements, so that the label will stick out a little at
  856. the left.) You can also use `.{@t}\3{-5@>}' to force a break
  857. in the middle of an expression.
  858. 10. Each identifier in .{CWEB} has a single formatting convention. Therefore
  859. you shouldn't use the same identifier to denote, say, both a type name and
  860. part of a .{struct}, even though CEE/ does allow this.
  861. section Running the programs.
  862. The UNIX/ command line for .{CTANGLE} is
  863. $$.{ctangle [options] web_file[.w] [{change_file[.ch]|-} [out_file]]}$$
  864. and the same conventions apply to .{CWEAVE}. If `.-' or no change file is
  865. specified, the change file is null. The extensions .{.w} and .{.ch}
  866. are appended only if the given file names contain no dot. If the
  867. web file defined in this way cannot be found, the extension .{.web}
  868. will be tried. For example, `.{cweave} .{cob}' will try to read
  869. .{cob.w}; failing that, it will try .{cob.web} before giving up.
  870. If no output file name is specified, the name of the CEE/ file output by
  871. .{CTANGLE} is obtained by appending the extension .{.c};
  872. the name of the TEX/ file output by .{CWEAVE} gets the extension .{.tex}.
  873. Index files output by .{CWEAVE} replace .{.tex} by .{.idx} and .{.scn}.
  874. Programmers who like terseness might choose to set up their
  875.  operating shell so that `.{wv}' expands to
  876. `.{cweave -bhp}'; this will suppress most terminal output from .{CWEAVE}
  877. except for error messages.
  878. Options are introduced either by a .- sign, to turn an option off,
  879. or by a .+ sign to turn one on. For example, `.{-fb}' turns off
  880. options .f and .b; `.{+s}' turns on option .s. Options can be
  881. specified before the file names, after the file names, or both. The following
  882. options are currently implemented:
  883. yskip
  884. defoption#1 {textindent{.#1}hangindent2parindent}
  885. option b Print a banner line at the beginning of execution. (On
  886. by default.)
  887. option f Force line breaks after each CEE/ statement formatted
  888. by .{CWEAVE}. (On by default; .{-f} saves paper but looks less CEE/-like
  889. to some people.) (Has no effect on .{CTANGLE}.)
  890. option h Print a happy message at the conclusion of a successful
  891. run. (On by default.)
  892. option p Give progress reports as the program runs. (On by default.)
  893. option s Show statistics about memory usage after the program
  894. runs to completion. (Off by default.)
  895. If you
  896. have large .{CWEB} files or sections, you may need to see
  897. how close you come to exceeding the capacity of .{CTANGLE} and/or .{CWEAVE}.
  898. option x Include indexes and a table of contents in the TEX/ file
  899. output by .{CWEAVE}. (On by default.) (Has no effect on .{CTANGLE}.)
  900. section Further details about formatting.
  901. You may not like the way .{CWEAVE} handles certain
  902. situations. If you're desperate, you can customize .{CWEAVE}
  903. by changing its grammar.  This means changing the source code,
  904. a task that you might find amusing. A table of grammar rules
  905. appears in the .{CWEAVE} source listing, and you can make a separate
  906. copy of that table by copying the file .{prod.w} found in the .{CWEB}
  907. sources and saying `.{cweave}~.{-x}~.{prod}', followed by
  908. `.{tex}~.{prod}'.
  909. You can see exactly
  910. how .{CWEAVE} is parsing your CEE/ code by preceding
  911. it with the line `.{@ @c @2}'. (The control code `.{@2}'
  912. turns on a ``peeping'' mode, and `.{@0}' turns it off.)
  913. For example, if you run .{CWEAVE} on the file
  914. medskip
  915. begingroup
  916. verbatim
  917. @ @c @2
  918. main (argc,argv)
  919. char **argv;
  920. { for (;argc>0;argc--) printf("%sn",argv[argc-1]); }
  921. !endgroup
  922. endgroup
  923. medskipnoindent
  924. you get the following gibberish on your screen:
  925. medskip
  926. begingroup
  927. verbatim
  928. [...]
  929. 4:*exp ( +exp+ )...
  930. 11:*exp +exp+ int...
  931. 5:*+exp+ int +unorbinop+...
  932. [...]
  933. 60: +fn_decl+*+{+ -stmt- +}-
  934. 55:*+fn_decl+ -stmt-
  935. 52:*+function-
  936. [...]
  937. !endgroup
  938. endgroup
  939. medskip
  940. The first line says that grammar rule 4 has just been applied, and .{CWEAVE}
  941. currently has in its memory a sequence of chunks of TEX/ code (called
  942. ``scraps'') that are respectively
  943. of type \{exp} (for expression), open-parenthesis,
  944. \{exp} again, close-parenthesis, and further scraps that haven't yet
  945. been considered by the parser.  (The .+ and .- signs stipulate that
  946. TEX/ should be in or out of math mode at the scrap boundaries. The .* shows
  947. the parser's current position.)
  948. Then rule 11 is applied, and
  949. the sequence $(,exp,)$ becomes an \{exp} and so on.  In the
  950. end the whole CEE/ text has become one big scrap of type \{function}.
  951. Sometimes things don't work as smoothly, and you get a bunch of
  952. lines lumped together.  This means that .{CWEAVE} could not
  953. digest something in your CEE/ code.  For instance, suppose
  954. `.{@<Argument definitions@>}' had appeared instead of
  955. `.{char **argv;}' in the program above. Then .{CWEAVE} would have
  956. been somewhat mystified, since it thinks that section names
  957. are just \{exp}s.  Thus it would tell TEX/ to format
  958. `X2:Argument declarationsX' on the same line as
  959. `$\{main}(\{argc},39\{argv}{}$)'.
  960. In this case you should help .{CWEAVE} by putting `.{@/}' after
  961. `.{main(argc,argv)}'.
  962. .{CWEAVE} automatically inserts a bit of extra space between declarations
  963. and the first apparent statement of a block. One way to defeat this
  964. spacing locally is
  965. $$vbox{halign{#hfilcr
  966. .{int x;@+@t}\6{@>}cr
  967. .{@<Other locals@>@;@#}cr}}$$
  968. the `.{@#}' will put extra space after `$langle,$Other locals$,rangle$'.
  969. section Appendices.
  970. As an example of a real program written in .{CWEB}, Appendix~A
  971. contains an excerpt from the .{CWEB} program itself.  The reader who
  972. examines the listings in this appendix carefully will get a good
  973. feeling for the basic ideas of .{CWEB}.
  974. Appendix B is the file that sets TEX/ up to accept
  975. the output of .{CWEAVE}, and Appendix~C discusses how to use some of those
  976. macros to vary the output formats.
  977. A ``long'' version of this manual, which can be produced from the .{CWEB}
  978. sources via the UNIX/ command .{make} .{fullmanual}, also contains
  979. appendices D, E, and~F, which exhibit the complete source code for
  980. .{CTANGLE} and .{CWEAVE}.
  981. vfilejecttitletrue
  982. defrunninghead{APPENDIX A --- {tentt CWEB} FILE FORMAT}
  983. section Appendix A: Excerpts from a .{CWEB} Program.
  984. This appendix consists
  985. of four listings.  The first shows the .{CWEB} input that
  986. generated sections 12--15 of the file .{common.w}, which contains
  987. routines common to .{CWEAVE} and .{CTANGLE}.
  988. Note that some of the lines are indented to show the program structure;
  989. the indentation is ignored by .{CWEAVE} and .{CTANGLE}, but users find
  990. that .{CWEB} files are quite readable if they have some such indentation.
  991. The second and third listings
  992. show corresponding parts
  993. of the CEE/ code output by .{CTANGLE} and of
  994. the corresponding TEX/ code output by .{CWEAVE}, when run on .{common.w}.
  995. The fourth listing shows how that output looks when printed out.
  996. vskip 6pt
  997. begingroup deftt{eighttt} baselineskip9pt
  998. verbatim
  999. @ Procedure |prime_the_change_buffer|
  1000. sets |change_buffer| in preparation for the next matching operation.
  1001. Since blank lines in the change file are not used for matching, we have
  1002. |(change_limit==change_buffer && !!changing)| if and only if
  1003. the change file is exhausted. This procedure is called only when
  1004. |changing| is 1; hence error messages will be reported correctly.
  1005. @c
  1006. void
  1007. prime_the_change_buffer()
  1008. {
  1009.   change_limit=change_buffer; /* this value is used if the change file ends */
  1010.   @<Skip over comment lines in the change file; |return| if end of file@>;
  1011.   @<Skip to the next nonblank line; |return| if end of file@>;
  1012.   @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>;
  1013. }
  1014. @ While looking for a line that begins with .{@@x} in the change file, we
  1015. allow lines that begin with .{@@}, as long as they don't begin with .{@@y},
  1016. .{@@z} or .{@@i} (which would probably mean that the change file is fouled up).
  1017. @<Skip over comment lines in the change file...@>=
  1018. while(1) {
  1019.   change_line++;
  1020.   if (!!input_ln(change_file)) return;
  1021.   if (limit<buffer+2) continue;
  1022.   if (buffer[0]!!='@@') continue;
  1023.   if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
  1024.   if (buffer[1]=='x') break;
  1025.   if (buffer[1]=='y' || buffer[1]=='z' || buffer[1]=='i') {
  1026.     loc=buffer+2;
  1027.     err_print("!! Missing @@x in change file");
  1028. @.Missing @@x...@>
  1029.   }
  1030. }
  1031. @ Here we are looking at lines following the .{@@x}.
  1032. @<Skip to the next nonblank line...@>=
  1033. do {
  1034.   change_line++;
  1035.   if (!!input_ln(change_file)) {
  1036.     err_print("!! Change file ended after @@x");
  1037. @.Change file ended...@>
  1038.     return;
  1039.   }
  1040. } while (limit==buffer);
  1041. @ @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>=
  1042. {
  1043.   change_limit=change_buffer-buffer+limit;
  1044.   strncpy(change_buffer,buffer,limit-buffer+1);
  1045. }
  1046. !endgroup
  1047. endgroup
  1048. vfilleject
  1049. defrunninghead{APPENDIX A  --- TRANSLATION BY {tentt CTANGLE}}
  1050. Here's the portion of the CEE/ code generated by .{CTANGLE} that corresponds
  1051. to the source on the preceding page.  Notice that sections~13, 14 and~15
  1052. have been tangled into section~12.
  1053. vskip6pt
  1054. begingroup deftt{eighttt} baselineskip9pt
  1055. verbatim
  1056. /*:9*//*12:*/
  1057. #line 247 "common.w"
  1058. void
  1059. prime_the_change_buffer()
  1060. {
  1061. change_limit= change_buffer;
  1062. /*13:*/
  1063. #line 261 "common.w"
  1064. while(1){
  1065. change_line++;
  1066. if(!!input_ln(change_file))return;
  1067. if(limit<buffer+2)continue;
  1068. if(buffer[0]!!='@')continue;
  1069. if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  1070. if(buffer[1]=='x')break;
  1071. if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
  1072. loc= buffer+2;
  1073. err_print("!! Missing @x in change file");
  1074. }
  1075. }
  1076. /*:13*/
  1077. #line 252 "common.w"
  1078. ;
  1079. /*14:*/
  1080. #line 278 "common.w"
  1081. do{
  1082. change_line++;
  1083. if(!!input_ln(change_file)){
  1084. err_print("!! Change file ended after @x");
  1085. return;
  1086. }
  1087. }while(limit==buffer);
  1088. /*:14*/
  1089. #line 253 "common.w"
  1090. ;
  1091. /*15:*/
  1092. #line 288 "common.w"
  1093. {
  1094. change_limit= change_buffer-buffer+limit;
  1095. strncpy(change_buffer,buffer,limit-buffer+1);
  1096. }
  1097. /*:15*/
  1098. #line 254 "common.w"
  1099. ;
  1100. }
  1101. /*:12*//*16:*/
  1102. !endgroup
  1103. endgroup
  1104. vfilleject
  1105. defrunninghead{APPENDIX A --- TRANSLATION BY {tentt CWEAVE}}
  1106. Here is the corresponding excerpt from .{common.tex}.
  1107. vskip6pt
  1108. begingroup deftt{eighttt} baselineskip9pt
  1109. verbatim
  1110. M{12}Procedure PB{\{prime_the_change_buffer}}
  1111. sets PB{\{change_buffer}} in preparation for the next matching operation.
  1112. Since blank lines in the change file are not used for matching, we have
  1113. PB{$(\{change_limit}E\{change_buffer}WR\{changing})$} if and only if
  1114. the change file is exhausted. This procedure is called only when
  1115. PB{\{changing}} is 1; hence error messages will be reported correctly.
  1116. !vskip-.5!baselineskip
  1117. YB&{void} \{prime_the_change_buffer}(,)11226
  1118. ${}{{}$16
  1119. ${}\{change_limit}K\{change_buffer}{}$;C{ this value is used if the
  1120. change file ends }6
  1121. X13:Skip over comment lines in the change file; PB{&{return}} if end of file%
  1122. X;6
  1123. X14:Skip to the next nonblank line; PB{&{return}} if end of fileX;6
  1124. X15:Move PB{\{buffer}} and PB{\{limit}} to PB{\{change_buffer}} and %
  1125. PB{\{change_limit}}X;6
  1126. 4${}}{}$2par
  1127. fi
  1128. !vskip-.5!baselineskip
  1129. M{13}While looking for a line that begins with .{@x} in the change file, we
  1130. allow lines that begin with .{@}, as long as they don't begin with .{@y},
  1131. .{@z} or .{@i} (which would probably mean that the change file is fouled up).
  1132. !vskip-.5!baselineskip
  1133. YB4X13:Skip over comment lines in the change file; PB{&{return}} if end
  1134. of fileX${}E{}$6
  1135. &{while} (T{1})5
  1136. ${}{{}$16
  1137. ${}\{change_line}PP;{}$6
  1138. &{if} ${}(R\{input_ln}(\{change_file})){}$15
  1139. &{return};26
  1140. &{if} ${}(\{limit}<\{buffer}+T{2}){}$15
  1141. &{continue};26
  1142. &{if} ${}(\{buffer}[T{0}]I.{'@'}){}$15
  1143. &{continue};26
  1144. &{if} (\{xisupper}(\{buffer}[T{1}]))15
  1145. ${}\{buffer}[T{1}]K\{tolower}(\{buffer}[T{1}]);{}$26
  1146. &{if} ${}(\{buffer}[T{1}]E.{'x'}){}$15
  1147. &{break};26
  1148. &{if} ${}(\{buffer}[T{1}]E.{'y'}V\{buffer}[T{1}]E.{'z'}V\{buffer}[%
  1149. T{1}]E.{'i'}){}$5
  1150. ${}{{}$16
  1151. ${}\{loc}K\{buffer}+T{2};{}$6
  1152. \{err_print}(.{"!! Missing @x in cha}).{nge file"});6
  1153. 4${}}{}$26
  1154. 4${}}{}$2par
  1155. U12.fi
  1156. !vskip-.5!baselineskip
  1157. M{14}Here we are looking at lines following the .{@x}.
  1158. !vskip-.5!baselineskip
  1159. YB4X14:Skip to the next nonblank line; PB{&{return}} if end of fileX${}%
  1160. E{}$6
  1161. &{do}5
  1162. ${}{{}$16
  1163. ${}\{change_line}PP;{}$6
  1164. &{if} ${}(R\{input_ln}(\{change_file})){}$5
  1165. ${}{{}$16
  1166. \{err_print}(.{"!! Change file ended}).{ after @x"});6
  1167. &{return};6
  1168. 4${}}{}$26
  1169. 4${}}{}$25
  1170. &{while} ${}(\{limit}E\{buffer}){}$;par
  1171. U12.fi
  1172. !vskip-.5!baselineskip
  1173. M{15}BX15:Move PB{\{buffer}} and PB{\{limit}} to PB{\{change_buffer}}
  1174. and PB{\{change_limit}}X${}E{}$6
  1175. ${}{{}$16
  1176. ${}\{change_limit}K\{change_buffer}-\{buffer}+\{limit};{}$6
  1177. ${}\{strncpy}(\{change_buffer},39\{buffer},39\{limit}-\{buffer}+%
  1178. T{1});{}$6
  1179. 4${}}{}$2par
  1180. Us12ET16.fi
  1181. !endgroup
  1182. endgroup
  1183. vfileject
  1184. defrunninghead{APPENDIX A --- FINAL DOCUMENT}
  1185. And here's what the same excerpt looks like when typeset.
  1186. M{12}Procedure PB{\{prime_the_change_buffer}}
  1187. sets PB{\{change_buffer}} in preparation for the next matching operation.
  1188. Since blank lines in the change file are not used for matching, we have
  1189. PB{$(\{change_limit}E\{change_buffer}WR\{changing})$} if and only if
  1190. the change file is exhausted. This procedure is called only when
  1191. PB{\{changing}} is 1; hence error messages will be reported correctly.
  1192. YB&{void} \{prime_the_change_buffer}(,)11226
  1193. ${}{{}$16
  1194. ${}\{change_limit}K\{change_buffer}{}$;C{ this value is used if the
  1195. change file ends }6
  1196. X13:Skip over comment lines in the change file; PB{&{return}} if end of file%
  1197. X;6
  1198. X14:Skip to the next nonblank line; PB{&{return}} if end of fileX;6
  1199. X15:Move PB{\{buffer}} and PB{\{limit}} to PB{\{change_buffer}} and %
  1200. PB{\{change_limit}}X;6
  1201. 4${}}{}$2par
  1202. fi
  1203. M{13}While looking for a line that begins with .{@x} in the change file, we
  1204. allow lines that begin with .{@}, as long as they don't begin with .{@y},
  1205. .{@z} or .{@i} (which would probably mean that the change file is fouled up).
  1206. YB4X13:Skip over comment lines in the change file; PB{&{return}} if end
  1207. of fileX${}E{}$6
  1208. &{while} (T{1})5
  1209. ${}{{}$16
  1210. ${}\{change_line}PP;{}$6
  1211. &{if} ${}(R\{input_ln}(\{change_file})){}$15
  1212. &{return};26
  1213. &{if} ${}(\{limit}<\{buffer}+T{2}){}$15
  1214. &{continue};26
  1215. &{if} ${}(\{buffer}[T{0}]I.{'@'}){}$15
  1216. &{continue};26
  1217. &{if} (\{xisupper}(\{buffer}[T{1}]))15
  1218. ${}\{buffer}[T{1}]K\{tolower}(\{buffer}[T{1}]);{}$26
  1219. &{if} ${}(\{buffer}[T{1}]E.{'x'}){}$15
  1220. &{break};26
  1221. &{if} ${}(\{buffer}[T{1}]E.{'y'}V\{buffer}[T{1}]E.{'z'}V\{buffer}[%
  1222. T{1}]E.{'i'}){}$5
  1223. ${}{{}$16
  1224. ${}\{loc}K\{buffer}+T{2};{}$6
  1225. \{err_print}(.{"! Missing @x in cha}).{nge file"});6
  1226. 4${}}{}$26
  1227. 4${}}{}$2par
  1228. U12.fi
  1229. M{14}Here we are looking at lines following the .{@x}.
  1230. YB4X14:Skip to the next nonblank line; PB{&{return}} if end of fileX${}%
  1231. E{}$6
  1232. &{do}5
  1233. ${}{{}$16
  1234. ${}\{change_line}PP;{}$6
  1235. &{if} ${}(R\{input_ln}(\{change_file})){}$5
  1236. ${}{{}$16
  1237. \{err_print}(.{"! Change file ended}).{ after @x"});6
  1238. &{return};6
  1239. 4${}}{}$26
  1240. 4${}}{}$25
  1241. &{while} ${}(\{limit}E\{buffer}){}$;par
  1242. U12.fi
  1243. M{15}BX15:Move PB{\{buffer}} and PB{\{limit}} to PB{\{change_buffer}}
  1244. and PB{\{change_limit}}X${}E{}$6
  1245. ${}{{}$16
  1246. ${}\{change_limit}K\{change_buffer}-\{buffer}+\{limit};{}$6
  1247. ${}\{strncpy}(\{change_buffer},39\{buffer},39\{limit}-\{buffer}+%
  1248. T{1});{}$6
  1249. 4${}}{}$2par
  1250. Us12ET16.fi
  1251. vfilejecttitletrue
  1252. rightskip=0pt % get out of C mode (cf. B)
  1253. sfcode`;=1500 pretolerance 200 hyphenpenalty 50 exhyphenpenalty 50
  1254. defrunninghead{APPENDIX B --- MACROS FOR FORMATTING}
  1255. section Appendix B: The .{cwebmac.tex} file.
  1256. This is the file that extends ``plain TEX/'' format in order to support the
  1257. features needed by the output of .{CWEAVE}.
  1258. vskip6pt
  1259. begingroup deftt{eighttt} baselineskip9pt
  1260. defprintmacs{input cwebmac}
  1261. verbatim
  1262. !printmacs
  1263. !endgroup
  1264. endgroup
  1265. vfilleject
  1266. defrunninghead{APPENDIX C --- NOTES ON FORMATTING}
  1267. section Appendix C: How to use .{CWEB} macros.
  1268. The macros in .{cwebmac} make it possible to produce a variety of formats
  1269. without editing the output of .{CWEAVE}, and the purpose of this appendix
  1270. is to explain some of the possibilities.
  1271. defpoint#1.{yskipindent#1.quadignorespaces}
  1272. point 1. Four fonts have been declared in addition to the standard fonts of
  1273. .{PLAIN} format: You can say `.{{\mc UNIX}}' to get {mc UNIX} in
  1274. medium-size caps; you can say `.{{\sc STUFF}}' to get {sc STUFF}
  1275. in small caps; and you can select the largish fonts .{\titlefont}
  1276. and .{\ttitlefont} in the title of your document, where .{\ttitlefont}
  1277. is a typewriter style of type. There are macros .{\UNIX/} and .{\CEE/}
  1278. to refer to UNIX/ and CEE/ with medium-size caps.
  1279. point 2. When you mention an identifier in TEX/ text, you normally call
  1280. it `.{|identifier|}'. But you can also say `.{\\{identifier}}'. The
  1281. output will look the same in both cases, but the second alternative
  1282. doesn't put \{identifier} into the index, since
  1283. it bypasses .{CWEAVE}'s translation from CEE/ mode. In the second
  1284. case you have to put a backslash before each underline character
  1285. in the identifier.
  1286. point 3. To get typewriter-like type, as when referring to `.{CWEB}', you
  1287. can use the `.{\.}' macro (e.g., `.{\.{CWEB}}'). In the argument to
  1288. this macro you should insert an additional backslash before the symbols
  1289. listed as `special string characters' in the index to .{CWEAVE}, i.e.,
  1290. before backslashes and dollar signs and the like.
  1291. A `.{\ }' here will result in the visible space symbol; to get an
  1292. invisible space following a control sequence you can say `.{{ }}'.
  1293. If the string is long, you can break it up into substrings that
  1294. are separated by `.{\)}',; the latter gives a discretionary backslash
  1295. if TEX/ has to break a line here.
  1296. point 4. The three control sequences .{\pagewidth}, .{\pageheight},
  1297. and .{\fullpageheight} can be redefined in the limbo section at the
  1298. beginning of your .{CWEB} file, to change the dimensions of each page.
  1299. The default settings
  1300. $$lpile{.{\pagewidth=6.5in}cr
  1301.   .{\pageheight=8.7in}cr
  1302.   .{\fullpageheight=9in}cr}$$
  1303. were used to prepare this manual; .{\fullpageheight} is
  1304. .{\pageheight} plus room for the additional heading and page numbers at
  1305. the top of each page. If you change any of these quantities, you should
  1306. call the macro .{\setpage} immediately after making the change.
  1307. point 5. The .{\pageshift} macro defines an amount by which right-hand
  1308. pages (i.e., odd-numbered pages) are shifted right with respect to
  1309. left-hand (even-numbered) ones. By adjusting this amount you may be
  1310. able to get two-sided output in which the page numbers line up on
  1311. opposite sides of each sheet.
  1312. point 6. The .{\title} macro will appear at the top of each page
  1313. in small caps; it is the job name unless redefined.
  1314. point 7. The first page usually is assigned page
  1315. number 1. To start on page 16, with contents
  1316. on page 15, say this: `.{\def\contentspagenumber{15}}
  1317. .{\pageno=\contentspagenumber} .{\advance\pageno by 1}'.
  1318. point 8. The macro .{\iftitle} will suppress the header line if it is
  1319. defined by `.{\titletrue}'. The normal value is .{\titlefalse}
  1320. except for the table of contents; thus, the contents
  1321. page is usually unnumbered.
  1322. Two macros are provided to give flexibility to the table of
  1323. contents: .{\topofcontents} is invoked just before the contents
  1324. info is read, and .{\botofcontents} is invoked just after.
  1325. Here's a typical definition:
  1326. $$lpile{.{\def\topofcontents{\null\vfill}cr
  1327.   .{ { }\titlefalse % include headline on the contents page}cr
  1328.   .{ { }\def\rheader{\mainfont The {\tt CWEAVE}{ }processor\hfil}}cr
  1329.   .{ { }\centerline{\titlefont The {\ttitlefont CWEAVE}{ }processor}}cr
  1330.   .{ { }\vskip 15pt \centerline{(Version 3.0)}{ }\vfill}}cr}$$
  1331. Redefining .{\rheader}, which is the headline for right-hand pages,
  1332. suffices in this case to put the desired information at the top of the
  1333. contents page.
  1334. point 9. Data for the table of contents is written to a file that
  1335. is read after the indexes have been TEX/ed; there's one line of data
  1336. for every starred section. The file .{common.toc} might look like this:
  1337. $$lpile{.{\ZZ {Introduction}{0}{1}{23}}cr
  1338.   .{\ZZ {The character set}{2}{5}{24}}cr}$$
  1339. and so on. The .{\topofcontents} macro could
  1340. redefine .{\ZZ} so that the information appears in any desired format.
  1341. point 10. Sometimes it is necessary or desirable to divide the output of
  1342. .{CWEAVE} into subfiles that can be processed separately. For example,
  1343. the listing of TEX/ runs to more than 500 pages, and that is enough to
  1344. exceed the capacity of many printing devices and/or their software.
  1345. When an extremely large job isn't cut into smaller pieces, the entire
  1346. process might be spoiled by a single error of some sort, making it
  1347. necessary to start everything over.
  1348. Here's a safe way to break a woven file into three parts:
  1349. Say the pieces are $alpha$,
  1350. $beta$, and $gamma$, where each piece begins with a starred section.
  1351. All macros should be defined in the opening limbo section of $alpha$,
  1352. and copies of this TEX/ code should be placed at the
  1353. beginning of $beta$ and of $gamma$. In order to process the parts
  1354. separately, we need to take care of two things: The starting page
  1355. numbers of $beta$ and $gamma$ need to be set up properly, and
  1356. the table of contents data from all three runs needs to be
  1357. accumulated.
  1358. The .{cwebmac} macros include two control sequences .{\contentsfile} and
  1359. .{\readcontents} that facilitate the necessary processing.  We include
  1360. `.{\def\contentsfile{cont1}}' in the limbo section of $alpha$, and
  1361. we include `.{\def\contentsfile{cont2}}' in the limbo section of
  1362. $beta$; this causes TEX/ to write the contents data for $alpha$ and $beta$
  1363. into .{cont1.tex} and .{cont2.tex}. Now in $gamma$ we say
  1364. $$.{\def\readcontents{\input cont1 \input cont2
  1365.   \input \contentsfile}},;$$
  1366. this brings in the data from all three pieces, in the proper order.
  1367. However, we still need to solve the page-numbering problem. One way to
  1368. do it is to include the following in the limbo material for $beta$:
  1369. $$lpile{.{\message{Please type the last page number of part 1: }}cr
  1370.   .{\read -1 to \temp \pageno=\temp \advance\pageno by 1}cr}$$
  1371. Then you simply provide the necessary data when TEX/ requests
  1372. it; a similar construction is used at the beginning of $gamma$.
  1373. This method can, of course, be used to divide a woven file into
  1374. any number of pieces.
  1375. point 11. Sometimes it is nice to include things in the index that are
  1376. typeset in a special way. For example, we might want to have an
  1377. index entry for `TeX'. .{CWEAVE} provides two simple ways to
  1378. typeset an index entry (unless the entry is an identifier or a reserved word):
  1379. `.{@^}' gives roman type, and `.{@.}' gives typewriter type.
  1380. But if we try to typeset `TeX' in roman type by saying, e.g.,
  1381. `.{@^\TeX@>}', the backslash character gets in the way,
  1382. and this entry wouldn't appear in the index with the T's.
  1383. The solution is to use the `.{@:}' feature, declaring a macro that
  1384. simply removes a sort key as follows:
  1385. $$.{\def\9#1{}}$$
  1386. Now you can say, e.g., `.{@:TeX}{\TeX@>}' in your .{CWEB} file; .{CWEAVE}
  1387. puts it into the index alphabetically, based on the sort key, and
  1388. produces the macro call `.{\9{TeX}{\TeX}}' which will ensure that
  1389. the sort key isn't printed.
  1390. A similar idea can be used to insert hidden material into section
  1391. names so that they are alphabetized in whatever way you might wish.
  1392. Some people call these tricks ``special refinements''; others call
  1393. them ``kludges''.
  1394. point 12. The control sequence .{\secno} is set to the number of the
  1395. section being typeset.
  1396. point 13. If you want to list only the sections that have changed,
  1397. together with the index, put the command `.{\let\maybe=\iffalse}' in
  1398. the limbo section before the first section of your .{CWEB} file. It's
  1399. customary to make this the first change in your change file.
  1400. point 14. To get output in languages other than English, redefine the
  1401. macros .{\A}, .{\ET}, .{\Q}, .{\U},
  1402. .{\ch}, .{\fin}, .{\con}, .{\today}, .{\datethis}, and
  1403. .{\datecontentspage}. .{CWEAVE} itself need not be changed.
  1404. point 15. Some output can be selectively suppressed with the macros
  1405. .{\noatl}, .{\noinx}, .{\nosecs}, .{\nocon}.
  1406. point 16. All accents and special text symbols of plain TEX/ format
  1407. will work in .{CWEB} documents just as they are described in
  1408. Chapter~9 of {sl The TEX/book}, with one exception.
  1409. The dot accent (normally .{\.}) must be typed .{\:} instead.
  1410. point 17. Several commented-out lines in .{cwebmac.tex} are suggestions
  1411. that users may wish to adopt. For example, one such line inserts a blank page
  1412. if you have a duplex printer. Appendices D, E, and F of the complete
  1413. version of this manual are printed using a commented-out option that
  1414. substitutes `$gets$' for `$=$' in the program listings. Looking at those
  1415. appendices might help you decide which format you like better.
  1416. vfillend