%%% ==================================================================== %%% @TeX-file{ %%% author = "W\l{}odek Bzyl", %%% version = "1.03", %%% date = "10 July 1995", %%% time = "23:30:58 MET", %%% filename = "Bzyl.tex", %%% checksum = "14630 396 2096 14305", %%% address = "Instytut Matematyki, %%% Uniwersytet Gda\'nski %%% Wita Stwosza 57 %%% 80--952 Gda\'nsk, Poland", %%% email = "matwb@halina.univ.gda.pl (Internet)", %%% abstract = "Paper for TUG '95 meeting", %%% } %%% ==================================================================== %%% %%% TeXing this file requires the following files: %%% -------------------------------------------------------------------- %%% TUGPROC.STY %%% TUGBOAT.STY %%% TUGBOAT.CMN %%% -------------------------------------------------------------------- \input tugproc.sty %%% %%% Local macros: %%% \def \footnoterule% footnote rule was to close to main text {\kern-2pt \hrule width 5pc \kern 1.6pt } \def \nl {\hfill\break} \let \mc=\ninerm \font \xivss = cmss10 at 14pt \def\UNIX{{\smc u\kern-.05em nix}\spacefactor1000 } \def\MSDOS{{\smc MSDOS}\spacefactor1000 } \def \CWEB {{\smc cweb}\spacefactor1000 } \def \FWEB {{\smc fweb}\spacefactor1000 } \def \NOWEB {{\tt noweb}\spacefactor1000 } \def \TANGLE {{\tt T\kern-.025em ANGLE}\spacefactor1000 } \def \WEAVE {{\tt WEA\kern-.05em VE}\spacefactor1000 } \def \TWEB {{\tt \TeX-WEB}\spacefactor1000 } \def \AWK {{\smc awk}\spacefactor1000 } \def \C {{\smc c}\spacefactor1000 } \def \flex {{\smc flex}\spacefactor1000 } \def \Fortran {{\smc fortran}\spacefactor1000 } \def \icon {{\smc icon}\spacefactor1000 } \def \perl {{\smc perl}\spacefactor1000 } \def \plain {{\tt plain}\spacefactor1000 } \def \RCS {{\smc rcs}\spacefactor1000 } \let \( = ( \let \) = ) {\makeactive\( \gdef \enablemetacode {\AddToSpecialsGetOther{\catcode`\(=\other}% \makeactive\(% \def(##1)% {{\it\makeCtrlMspace\makespacespace##1\/}}}} \enablemetacode \everyverbatim = {\makeescape\!\enablemetacode\parindent=0pt} \frenchspacing \normalbottom \nopunctuation \def\mtgyear{1995} %%%-------------------------------------------------------------------- \title * Literate plain source is available! * \author * W\l{}odek Bzyl * \netaddress * matwb@halina.univ.gda.pl * \abstract When introduced, literate programming was synonymous with \WEB, a system for writing literate Pascal programs. Since then many different \WEB's, aimed on particular programming language, were created. Each \WEB\ is constructed of two separate parts. One is called \TANGLE, the other \WEAVE. Typically each part consists of just one program performing many tasks---expands macros, prettyprints code, generates and sorts an index etc. This makes adaptation of the existing \WEB\ to another language extremely difficult. Other approach to literate programming is presented by Norman Ramsey, the author of \NOWEB. He designed and realized \TANGLE/\WEAVE\ pair as \UNIX\ pipes. By extending and/or replacing parts of pipes with programs, written in \AWK, \icon, \flex, \perl, \C, \TeX, \mf, new tool could be created with relatively small effort. %%%new profession: plumber %%%see also: plume For example, with \NOWEB, it was possible to create simple \TWEB\ system by writing \AWK\ script and new \TeX\ format. New system was applied for creation of literate \plain\ source. Although the resulted file is principally {\tt plain.tex} code interleaved with documentation, borrowed mainly from \TB, it presents the whole code from the different perspective. The documentation is organized around the macros as they appear in the {\tt plain.tex} rather than around the topics as in \TB. This means that \WEB\ source is {\it not\/} a user manual, even though many notions are explained there. \endabstract \article \head * WEB for everyone? * \subhead * \WEB\ is a powerful tool. * \nl The strength of literate programs lies in their ability to produce high-quality typeset documentation. The strength of literate programming lies in allowing you to write code where you are telling to humans what computer should do, instead of telling to computer what should be done. Obviously we are more efficient and precise when communicate with humans than computers. Thus literate programs are more easily written and maintained than ordinary ones. %%% \TeX/\mf/and friends were ported to every possible %%% platform \subhead * \WEB\ is a complex tool. * \nl A literate program consists of pieces of documentation and named chunks containing code and references to other chunks. The pieces are arranged in order which helps to explain \(and understand\) the program as a whole. \WEB\ consists of two processors: \TANGLE\ and \WEAVE. \TANGLE\ is used for extracting a program by replacing one named chunk by its definition. The process of replacement is recursive. It continues until no named chunks remain. From one \WEB\ source many programs could be extracted \(this is achieved by presenting \TANGLE\ with different chunks\). \WEAVE\ is used for converting \WEB\ markup into \TeX\ markup as described and coded in a separate format file which handles numerous typographical details of typeset documentation and provide support for typical tasks as cross-referencing, preparation of indexes, bibliography. Formats for long and short documents will be different. To typeset converted file you will need \TeX\ running on your system. Errors can creep in \TeX\ code. To get \TeX\ code working with other formats could end with a short trip into \TeX\ language \(this will be needed if you plan your literate program to form a part of article, report, or book\). \bigskip We learn by reading. Why not to read `literate books'. There are a few such books already and more will appear. We learn by writing too. Why not to try one of finished tools. \C/\C++/\Fortran\ programmer could try \CWEB\ or \FWEB. Programmers which write in other languages could check {\tt CTAN:/tex-archive/web} directory. If your language is not on the list, or you are not able to express yourself with the style offered then you are welcome in the province of those who build their own tools. This territory is growing fast due to efforts of Norman Ramsey who established a base for creating simple and extensible literate tools. \head * Presenting a new tool \TeX-WEB * N.~Ramsey was the first who attempted to create generic --- not aimed for particular language --- literate tool. Such a tool would be useless because its generality. Key to usefulness of \NOWEB\ lies in extendibility. The tasks for \TANGLE/\WEAVE\ were divided among stand-alone programs. To simplify tangling and weaving a front end was introduced. It performs a kind of lexical analysis of the source, task previously performed by both processors separately. The front end provided with \NOWEB\ is called {\tt markup} because it marks each line of source as line of text, as beginning/end of code/documentation, as definition/use of named chunks, etc.%%% \footnote{$^1$}{%%%----------------------------------------- There is {\tt unmarkup} which works in opposite way. I borrowed from \NOWEB\ two more programs: {\tt nt} \(tangle\) and {\tt mnt} \(multiple tangle\).} \subhead * \WEAVE * \verbatim markup foo.tw | web2tex > foo.tex markup foo.tw | awk -f web2tex > foo.tex \endverbatim where the second command line is used on \MSDOS\ systems. With {\tt markup} as front end, \WEAVE\ was build as \AWK\ script {\tt web2tex}%%% \footnote{$^2$}{%%%---------------------------------------- To allow tangling many files at once {\tt web2tex} is actually shell wrapper for the \AWK\ script.} which reads marked source line by line and performs actions attached to line type. Most of the time it inserts a bunch of \TeX\ macros. The format |tweb.sty| provides support for cross references, indexes, and multicolumn output. There you find macros |\chapter|, |\[sub[sub]]section|, |\paragraph|,%%% \footnote{$^3$}{%%%--------------------------------------- These macros should not be overused. Usually the chunk name alone is a better choice.} |\printcontents|, |\title|. Index macros are inserted by |web2tex|. \subhead * \TANGLE * \verbatim markup foo.tw | nt > foo.sty markup foo.tw | nt -R'Chunk B' > foo.sty markup foo.tw | mnt 'Chunk B' 'Chunk A' \endverbatim Here we have several possibilities. We can extract code beginning from the chunk named `|<<*>>|', or from the `|Chunk A|' \(see template file below\). Finally, `|Chunk A|' and `|Chunk B|' could be simultaneously extracted to the files with the same names. \subhead * \tt\TeX * \verbatim tex foo.tex makeindex -s dnd.ist -o foo.dnd foo.ddx makeindex -s und.ist -o foo.und foo.udx makeindex -s chn.ist -o foo.chn foo.chk tex foo.tex \endverbatim Indexes are sorted by |makeindex|. Three very short style files are provided due to different formatting of indexes. \MSDOS\ |makeindx| breaks on large indexes. \subhead * Sample {\tt Makefile} * \nl To ease work with tools a simple |Makefile| is provided. Write |make| on the command line, press {\tt Enter} key, and, assuming that only one \TWEB\ file named |foo.tw| resides in the current directory, the following lines will appear on a terminal \verbatim[\ruled] Weaving: make foo.tex Tangling: make foo.sty Texing: make foo.dvi Making archive: make archive Cleaning: make clean or veryclean \endverbatim Many different conventions are used where to store files in a file system. In the |Makefile| three variables are defined: |SCRIPTDIR| -- place for |web2awk| and other scripts \(defaults to |BIN|\), |INDEXDIR| -- place for index styles \(defaults to |IDXSTY|\), |MAKEINDEX| -- the name of makeindex program \(defaults to |makeindex|\). \subhead * Template of \TWEB\ source * \nl The structure of \TWEB\ file will be shown on the example. \medskip \noindent File name: {\tt foo.tw} \verbatim[\ruled] \title{foo.tw -- template file} \printcontents % if you want TOC @ The skeleton of the file foo.tw <<*>>= <> <> @ Documentation for Chunk A. <>= (!TeX! code / references to other chunks) @ Documentation for Chunk B. <>= (!TeX! code / references to other chunks) \endverbatim Documentation chunks begin with the line that starts with |@| followed by space or newline. Code chunks begin with |<<|Chunk name|>>=| on a line by itself. Chunks are terminated by the beginning of another chunk or end of file. \subhead * Making changes/updates * \nl The change file mechanism is not needed in case of \TeX\ language. Change files are used to incorporate system dependent code into source file, but \TeX\ code is already system independent. \TeX\ code could be only `format dependent'. Another feature of format file is that it evolves with time, yet some intermediate versions are used for preparation of books, articles etc. All these versions and configurations must be kept well organized, otherwise you are bound to be lost. The Revision Control System is the tool that assists with these tasks. With the \RCS\ it is possible, with small overhead, to preserve {\it all revisions} which evolved from given text document, merge changes made by others, compare different versions, keep log of changes. \subhead * \RCS * \verbatim ci foo.tw !hfill (check-in last version!kern 1.25em) co foo.tw !hfill (check-out last version!kern 1.25em) co -r(rev) foo.tw rlog foo.tw rcsdiff -r(rev) foo.tw rcsmerge -r(later!_rev) -r(earlier!_rev) foo.tw \endverbatim \medskip \noindent When the first command is executed |foo.tw| is stored in a {\it group file\/} \(with default name |foo.tw,v| on \UNIX\ machines, or |foo.tw%| on \MSDOS\) as new revision. For each deposited revision |ci| prompts for log message. The file |foo.tw| is deleted unless you say |ci -l foo.tw|. The message |ci error: no lock set by (login)| means that \RCS\ was configured with `strict locking feature' enabled. Locking prevents overlapping modifications if several users are working on the same file. This feature is disabled with |rcs -U foo.tw|; it is unnecessary if only owner of the file is expected to deposit revisions into it. The next two commands are used to extract the latest, or the specified revision from the group file. |rlog| is used to print log messages. With |rcsdiff| different revisions are compared. |rcs foo.tw| compares the latest revision with the contents of the working file. Differences between files are found by the program |diff|; if you do not like the |diff| default output, change it by passing appropriate switches to |rscdiff|. The last command undoes the changes between revisions; the file |foo.tw| will be overwritten. |rcsmerge| incorporates changes between two revisions into the working file. Similar effect could be achieved with a stand-alone program called |merge|. If files to compare are |mine|, |older|, |yours| then with the command \verbatim merge mine older yours \endverbatim |merge| tries to add to |main| the result of subtracting |older| from |yours|; if overlap occurs i.e. both files |mine| and |yours| have changes to the same segment of lines in |older| then |merge| delimits the alternatives with \verbatim <<<<<<< mine (lines in) mine ======= (lines in) yours >>>>>>> yours \endverbatim and writes above to |mine|. Now is up to you wich set of changes you adopt. |merge -p ... | sends the result of merging to the standard output. To keep working directory uncluttered, all \RCS\ files are usually stored in the subdirectory with the name |RCS|. \RCS\ commands look first into this directory when searching for files. %%%\subhead * Errors * %%%|\inputlineno = (number)| %%%does not work in horizontal nor vertical mode. \head * Concluding remarks * It seems that \TeX\ language constitutes a good starting point for exploring the idea of literate programming. The system is simple, because many features present in other \WEB's are not needed. The system is extensible, which means that it possible to try different styles and features. And finally, programs written in \TeX\ are not too long --- {\tt plain.tex} is about 1000 lines of code --- which means that you can print the documentation of real programs yourself and share it with others. For those who are convinced by the analysis above I included literate source of {\tt plain.tex} -- a basic set of macros for \TeX. Please read and enjoy. \endarticle Local Variables: *** mode: text *** fill-column: 60 *** End: ***