Noweb Frequently Asked Questions • Problems Building Noweb • Indentation of code, especially FORTRAN • Formatting the printed documentation • Microsoft Madness • Noweb and Emacs • Other Questions Problems Building Noweb Q. The build fails because it can't find notangle. What am I doing wrong? A. Your source files have the wrong timestamps. The noweb files are carefully distributed so that the C code is more recent than the literate source code. Retrieving that noweb distribution as a compressed tar file preserves these stamps. The CTAN sites will create a compressed tar file on the fly for any directory. Your best bet is to get the tar file, unpack it, and try again, because your abortive attempt will probably have stomped on a C file that you need. I have reports that the former CTAN site ftp.shsu.edu fouled the timestamps. Don't use the site! If you get bad timestamps, you can try `make touch' as soon as you unpack the distribution, which should touch all of the derived files. This trick won't work on NeXT systems, which have a strange idea of 'touch'. Q. The system builds OK, but when I try to run noweave, I get an error in /usr/ public/pkg/noweb/lib/totex (or some similar place) complaining about being out of environment space or something equally unpleasant. A. The awk versions of the noweb scripts pass the awk programs as arguments on the command line. Some shells or systems are too broken to handle a real awk program on the command line. This problem is one of many reasons that the awk versions are officially deprecated. The Icon versions will make you happy, but if you prefer, you can edit the offending scripts so that the awk programs reside in separate files and the scripts call awk -f. Q. I'm unable to run noweb on Windows NT 4.0. The problem is that the Icon programs use a DOS extender which doesn't work in an NT console. A. Clint Jeffery, the Icon Master for Windows, says to use the NT console binaries (nticont.exe and nticonx.exe) rather than wiconx.exe with its faux console. Only applications that use the graphics facilities require wiconx.exe and its kin. The nticonx* binaries should run fine on Win95 also. Q. I'm having trouble getting noweb to work on Windows XP. A. Bad news. There used to be a distribution from literateprogramming.org, but as of January 2010, that domain is no longer registered, and I don't know where the distribution went. Indentation of code, especially FORTRAN Q. Has anyone devised a clean way of handling FORTRAN 77 using a litprog tool such as noweb? If I have the following: <>= <> @ <>= C A comment in a chunk! Z = X * + Y @ I'll get the "C" in column 7, and the continuation character "+" in column 12, neither of which is desirable. A. As noted on the man page, notangle's -L option suppresses the usual behavior with respect to indentation. Thus, a command like notangle -L'%N' pgm.nw > pgm.f should do the job. Q. I noticed the -L option to notangle turns off the usual indentation. Is there an easy way to get both -L and indentation? A. No. It was my design decision that -L should preserve the column numbers in the original source code. This behavior is extremely useful in cases where a compiler reports an error in the source by line and column number. Of course, this decision precludes changing the indentation of the input. Formatting the printed documentation Q. There's too much white space at the bottom of the pages, especially if a code chunk is followed by a section. How do I fix it? A. Noweb is set up never to break chunks across pages. You can get better results by relaxing this constraint, e.g., by \def\nwendcode{\endtrivlist \endgroup \vfil\penalty10\vfilneg} \let\nwdocspar=\smallbreak or the even less liberal \def\nwendcode{\endtrivlist \endgroup} \let\nwdocspar=\par Q. In a noweb source file, what is the difference between a line beginning with "@" followed by a space and some text versus a line with nothing but "@"? A. A line with nothing but @ begins the `documentation chunk' with a blank line. TeX thinks blank lines are new paragraphs and good places to put page breaks. By default, TeX thinks that if a new documentation chunk starts with a new paragraph, this is an especially good place for a page break. Q. I know how to switch between code and documentation via <<*>>= and @, but sometimes, after a <<*>>= section, automatically a new page is started, even if I do not want this but prefer to go on with commenting directly after the inserted programm code. How can I avoid this? A. The @ sign you use to switch back to documentation should not appear on a line by itself, but should be followed by a blank space and some text. You should then put a bare @ sign on a line by itself at the next place that is suitable for a page break. Q. I don't quite understand noweb's default page breaking. Here is some text that leads up to a chunk <>= a = b; c = d; @ and here is some more text. Sometimes this appears on a new page even though there is plenty of room on this page. Can I fix it by adding the following line (which I haven't been doing) ? @ New paragraph here. A. Sad but true. Perhaps a future version of noweb will provide better facilities for controlling page breaking. Q. I ran into a problem when trying to use several files in a single noweb project. In my project, I have a LaTeX master file (say, doc.tex) that \ include's three others: say, a.tex, b.tex, and copyright.tex. These later files are generated from a.nw, b.nw, and copyright.nw, respectively, using the command "noweave -n -index" I really want to keep these noweb files separated. In the code chunks appearing in both a.nw and b.nw a copyright notice chunk (defined in copyright.nw) is included. Tangling works fine, provided that copyright.nw appears in the notangle command. Problems arise with noweave. Copyright chunks appear as "(never defined)" in a.tex and b.tex, what is obvious, because I cannot use copyright.nw for weaving a.nw or b.nw (otherwise the copyright notice chunk would appear several times in my printed document). Does someone know how to solve this problem? A. This is a form of question that arises repeatedly, which is to say, ``what is the scope of chunk names?'' In Noweb, chunk names are in the same scope if the files in which the chunks appear are used on the same command line. Thus, the normal rule is one Noweb file per command line, and therefore each file is its own scope. You want to have chunks in the same scope for purposes of tangling, but not to weave files together. If you want files a.nw and b.nw in separate scopes, the situation is hopeless, because ``being in the same scope'' has to be a transitive property, and if a.nw and b.nw are both in the same scope as copyright.nw, they must be in the same scope as each other. However, if you want all files to be in the same scope, there is a solution, although it is a bit ugly. The solution is to weave all the files together, then use a special back end to split them into separate .tex files. This back end, called scopehack, could be used as follows: noweave -n -index -backend scopehack *.nw and this results in multiple *.tex files as required. Q. I have problems using LaTeX \ifthenelse with noweb--- code chunks inside an \ifthenelse are not typeset correctly and a %def directive causes (La)TeX groups to be unbalanced. A. Noweb code chunks are ``moving arguments'' (like \verb) and can't be arguments to macros. I suggest you combine \ifthenelse with the noweb 'elide' filter to remove the offending code chunks. Q. I embed the build instructions for a noweb-based project in a code chunk called build-script that I don't wish to have show up in the printed documentation. So, I surround the section with LaTeX \iffalse ... \fi. If I do this at the same time as using noweb's index, the \fi shows up in the generated TeX file at the end of the index information, resulting in an empty index. A. Make sure that the \fi appears before the last documentation chunk, by creating an empty documentation chunk (with @) if necessary. Then use noweave -delay to insert the index information. Incidentally, it is recommended that, in addition to using \iffalse ... \ fi, you remove unwanted code chunks by using the elide filter provided with noweb. Latex can get confused if chunk cross-reference anchors are hidden away inside \iffalse ... \fi. Q. When I write C code and use the decrement operator --, it appears in the resulting document as a single -. This unpleasantness seems to be a side effect of \usepackage[T1]{fontenc}. A. Indeed. We don't understand this behavior, but as an ill-understood workaround, you can add \catcode`\-=\active to \def\setupcode, and things may work better. Microsoft Madness Q. Using the precompiled MS-DOS and Windows binaries for noweb, many of the programs throw their output to the screen and not to whatever receiving program /file they ought to go to. A typical example: I go to /noweb/examples and type notangle wc.nw > wc.c I see the tangled program scroll by on the screen, but it isn't piped to the file wc.c as requested. Any solutions? A. This is a known COMMAND.COM problem. Try: command /c notangle wc.nw > wc.c or get a COMMAND.COM replacement such as 4DOS. Better yet, help with the noweb 3 port. Q. For Windows 95/NT systems: Why do I get the error message "This program cannot be run in DOS mode." when I run some of the programs (including noweave.bat)? A. [Thanks to Chris Harris.] The problem is that some of the files used in the noweb system (including totex.exe and tohtml.exe used by noweave.bat) are written using an old version of icon that uses a DOS extender which is incompatible with 95/NT. The solution is to rebuild all of these files that were built using icon source: 1. Go get the console ICON executables for use on 95/NT. They are the files nticont.exe, nticonx.exe, noop.bat. Put them in your noweb/bin directory. 1. The other two were available on the noweb ftp site, from the FAQ, but noop.bat wasn't... it's availbe via FTP with the icon distribution, but it's pretty easy to build yourself, it's contents are the single line: @rem this file prevents further batch processing after launching nticonx 2. So to build noop.bat, just type at the prompt "copy con noop.bat" and then paste in the above line (starting with the @) hit enter and ^Z and you're good to go. Note: This file could really be empty, the above line is a dos batch file comment, but you may want to put this in there just so you remember in 2 years why you haven't deleted this file! :) 2. Get the noweb source distribution and extract just the icon files (i.e. those located in the icon/ directory with a .icn extention) 3. Build a batch file for each one using "nticont .icn" 4. Copy all of the .bat files built in step #2 into your noweb/bin/ directory 5. For each new .bat file you have in the bin directory, delete the corresponding .exe file Additionally, do NOT rename nticont to icont or nticonx to iconx. The batch files created with nticont REQUIRE nticonx to exist. So if you rename it, it'll get very confused. Noweb and Emacs Q. Emacs noweb-mode is driving me crazy. For example, I want 4-space tabs instead of the usual 8. I put this line in my file: % -*- mode: Noweb; noweb-code-mode: c-mode; tab-width: 4 -*- Or equivalently I do M-x set-variable tab-width 4. Everything is fine until the cursor moves from one chunk to another---then whammo! Tabs are 8 spaces again. What can I do?? A. If you have GNU emacs 20.4, or perhaps some other version, an undocumented internal function of files.el will do what you want. Try adding this to your ~/.emacs file: (add-hook 'noweb-select-mode-hook '(lambda () (hack-local-variables-prop-line))) Thanks to Glenn Holloway for this discovery. Q. Emacs noweb-mode is driving me crazy. I want to use Tab or Ctl-J to handle indentation, but when I'm in the middle of a code chunk, the indentation is wrong, and the cursor jumps to a strange place. How can I make emacs behave? A. These symptoms indicate that perhaps emacs has lost track of the boundaries between noweb chunks, perhaps material in documentation chunks is confusing the auto-indenter, or perhaps both. As of Emacs 21 in 2008, you can now easily afford to fix these problems using scary Emacs macros: (defun my-newline-and-indent () "Newline and indent that works better with noweb mode" (interactive "*") (if (and (boundp 'noweb-mode) noweb-mode) (save-restriction (noweb-update-chunk-vector) (noweb-narrow-to-chunk) (newline-and-indent)) (newline-and-indent))) (defun my-tab-key () "Tab that always tabs in Fundamental mode" (interactive) (if (string= "Fundamental" mode-name) (insert "\t") (if (and (boundp 'noweb-mode) noweb-mode) (save-restriction (noweb-update-chunk-vector) (noweb-narrow-to-chunk) (indent-for-tab-command)) (indent-for-tab-command)))) (defun use-my-indent-keys () "Locally bind tab and ^J to keys that indent better" (interactive) (local-set-key "\t" 'my-tab-key) (local-set-key "\C-j" 'my-newline-and-indent)) (add-hook 'noweb-select-code-mode-hook 'use-my-indent-keys) Add these to your .emacs file and perhaps the problem will go away. Isn't Moore's law grand? Other Questions Q. What about noweb 3? A. I use the alpha version, which is alpha only because the new Hackers' Guide is not finished. But don't look for a release before I retire. Noweb 3 is definitely an improvement over noweb 2, but for most people, it's not enough of an improvement for me to go to the trouble of making a real release. Noweb 3 was started in 1996(!) in response to situations that no longer obtain, and by 2000 it was substantially complete—the last significant revisions being done when I was first drafting my textbook. Today performance is no longer an issue, and with Darwin and mingw/cygwin, portability is less of a concern as well. And with Lua 5.1 available, no sane person wants to use Lua 2.5. I believe that noweb 3 no longer fills a need. Q. I compiled and installed, and everything looks OK, but when I ran the examples, two things do not work. • Noweave can not find definitions for 'C': noweave -index -autodefs c compress.nw > compress.tex noweave: don't know how to find definitions for 'c' • Noweave can't find l2h for the -filter. A. The awk library doesn't include all the filters that the Icon library includes. To get these extra features, you'll have to get Icon from the University of Arizona and re-install noweb using the Icon library. Q. I've been playing with LP, using noweb. I put related header, source and test files into a single .nw file. But that means that if I make a change in the source component, the header file is re-extracted, with the result that many files which haven't actually changed are recompiled. Any suggestions on simplifying the process? A. notangle -Rheader foo.nw | cpif foo.h To understand why this works, see the cpif man page. Q. What are these weird Makefile targets like install-preformat-man? Why is Makefile built from a .nw file? Why is the Makefile so ugly? A. Pay no attention to the man behind the curtain. That's all trickery I use to build a Slackware-style package for Linux. Q. We often get an error from TeX asking us to have a wizard enlarge it, due to a line buffer overflow (the buffer is at 3000 bytes now). This is truly annoying, since our wizard refuses to enlarge TeX, insisting there is a problem in our LaTeX macros or the Icon programs that generate them. Unfortunately, that all comes straight from noweave. A. Starting with web2c version 7, you can increase the size up to 30000 in texmf.cnf. teTeX changed to a 30,000-byte line buffer starting in November, 1997, so if you encounter this problem you should upgrade your TeX. teTeX and web2c are both available from the TeX User's Group. Noweave emits very long lines on purpose, to preserve the desirable property that the source and TeX files have identical line numbers. This property guarantees that the line numbers in error messages from TeX refer to the lines of the source file, so that, for example, if TeX complains of an unknown control sequence on line 632, you can just refer to line 632 of your noweb file. Most very long lines are caused by long code chunks containing lots of identifier definitions, so if you cannot get a new TeX, you can fix the problem by adding more <<...>>= lines, which breaks up the big chunk into smaller chunks. For example, instead of using a single chunk definition to define a large header file, use several: <>= #define ... #define ... ... <>= #define ... #define ... ... Q. I am trying to process multiple *.nw files independently of each other with noweb, only merging the *.tex files for the final documentation (using noindex and nodefs to produce cross references). It seems that noweb uses the same labels (for TeX references) in different files. (The file names and the identifiers defined in these files are quite similar). A. Noweb uses the heuristic made famous by FORTH: names are reduced to the first three characters plus the length. Changing your file names should be sufficient. If you don't like that, you could use -filter with a sed script that adds a unique prefix to all the relevant labels (see the Hacker's Guide for info about where labels appear). Q. I have a problem with noweave's -delay option. It does not seem to prevent the program from inserting its information before the first chunk and after the last one. A. Put your first @ sign after the \begin{document} instead of at the beginning of the file, and your last @ sign just before the \end{document}. Q. How do I get an output file (root chunk) with an underscore in its name? LaTeX complains about the underscore. A. All chunk names are set in ordinary TeX mode. This means that underscore is a subscript character. Rather than use special hacks, I just avoid underscores in file names, since I prefer to use hyphens anyway. However, you can write a simple sed script to filter the underscores for use by noweave: noweave -filter 'sed "/^@use /s/_/\\\\_/g;/^@defn /s/_/\\\\_/g"' and the filter will change _ to \_ before TeX sees it. Q. Having used nuweb2noweb on a nuweb file which uses @i to include other files I find that the resulting noweb file is enormous because the included files are written directly into the noweb file. How do I emulate nuweb's @i with noweb? A. The short answer is it can't be done. (Some would say that it doesn't need to be done, because notangle and noweave can accept multiple files on the command line.) The long answer is that you can usually use LaTeX's \ include or \input commands and keep the noweb files separate. If you actually need to tangle all those files together (as opposed to just weaving them), you can usually mention all the names on the command line: notangle foo.nw bar.nw quux.nw > big.out Q. I have a problem with typesetting Mathematica's double-bracketed subscripting command using [[...]] in my documentation chunks. noweb considers [[a[[#]]&]] to mean the symbols a[[# in typewriter and then latex gets stuck on the offending & character. How can I get around this problem? A. Split the quoted code into two pieces, which you write consecutively, thus: [[a[[#]]]][[&]] Q. Why is the noweb command so slow? A. It's expensive to create a TeX file, so noweb foo is probably at least 5 times slower than noweb -t foo and in an edit/compile/debug cycle you may not need the docs and can use the faster form. Q. What is the origin of the ``no'' prefix in noweb ? A. I wrote noweb at a time when language-dependent webs were proliferating, e.g., adaweb, cweb, mweb, etc. So the "no" in noweb is a triple pun: □ A language-independent web, not limited to one programming language, hence web for no particular language or `noweb'. □ A contraction of `Norman's web' □ The third part of the pun is not suitable for publication. Q. Norman, what made you choose Lua as the implementation language for Noweb 3, rather than, say, Python? A. Lua is small and simple. I wanted not to be vulnerable to future changes in language definitions or implementations, which meant I would have to clone and maintain the implementation forever. When I was making this decision in 1997, Lua 2.5 was small enough that I could feel comfortable doing this. Q. Are there noweb comments? It would be very useful to comment parts of a noweb file that wouldn't be parsed as either TeX or code. A. I recommend that you put comments in specially named chunks and use the elide filter that comes with the distribution. For example, if the name of each comment chunk begins with comment:, you could run noweave -filter elide comment:* ... (Because chunks that are not used are ignored, there would be no need to elide when tangling.)