1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
|
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{fullpage}
\usepackage{url}
\newcommand{\WEB}{\textsf{WEB}}
\newcommand{\Caml}{\textsf{Caml}}
\newcommand{\OCaml}{\textsf{Objective Caml}}
\newcommand{\ocamlweb}{\textsf{ocamlweb}}
\newcommand{\monurl}[1]{#1}
%HEVEA\renewcommand{\monurl}[1]{\ahref{#1}{#1}}
%HEVEA\newcommand{\lnot}{not}
%HEVEA\newcommand{\lor}{or}
%HEVEA\newcommand{\land}{\&}
\begin{document}
%%% titre %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{ocamlweb: a literate programming tool \\
for Objective Caml}
\author{Jean-Christophe Filli\^{a}tre and Claude March\'e \\
\normalsize\monurl{\url{http://www.lri.fr/~filliatr/ocamlweb}}}
\date{}
\maketitle
\tableofcontents
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Introduction}
Literate programming has been introduced by D.~E.~Knuth in 1984. The
main idea is to put the code and its documentation in the same file and
to produce from it a document which is readable by a human, and not
only by a machine.
Although \ocamlweb\ borrows a lot of ideas from Knuth's original tool
(called \WEB), there are big differences between them. First, \WEB\
allows you to present the pieces of your code in any order, and this
is quite useful when using poorly structured languages, like
\textsf{Pascal} or \textsf{C}. But \OCaml\ is already highly
structured, and this is no more useful. Moreover, \WEB\ requires the
use of a tool to produce the code from the \WEB\ file, which greatly
complicates the use of your favorite source-based tools (dependencies
generator, debugger, emacs mode, etc.). When using \ocamlweb, the
documentation is inserted in the code as comments (in the \Caml\
sense), and your code is not linked to the existence of \ocamlweb\ in
any way.
Currently, the task of \ocamlweb\ may be seen as:
\begin{enumerate}
\item making a nice document with the code and its documentation;
\item generating a global index of cross-references, where each
identifier is associated to the lists of sections where it is
defined or used.
\end{enumerate}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Principles}
Documentation is inserted into \Caml\ files as \emph{comments}. Thus
your files may compile as usual, whether you use \ocamlweb\ or not.
\ocamlweb\ presupposes that the given \Caml\ files are well-formed (at
least lexically, but also syntactically if you want the cross
references to be correct). \ocamlweb\ understands each \Caml\ file as
a sequence of paragraphs, each paragraph being either a piece of code or a
piece of documentation. Documentation starts and ends with \Caml\
comment's delimiters \texttt{(*} and \texttt{*)}, and is a regular
\LaTeX\ text. Code starts with any characters sequence other than
\texttt{(*} and ends with an empty line.
Two styles are available for the final document:
\begin{itemize}
\item a \WEB\ style, where the code and documentation are displayed in
\emph{sections}, numbered consecutively starting from~1. A new
section is started at the beginning of each file. You can also start
a new section manually (see the paragraph below about controls);
\item a \LaTeX\ style, where you structure your document as you like,
using the usual sectioning commands of \LaTeX.
\end{itemize}
\paragraph{Escapings: code inside documentation and vice versa.}
The first feature you will require is the ability to quote code inside
documentation and conversely. The latter, namely documentation inside
code, is simply obtained by normal \Caml\ comments filled in with a
\LaTeX\ contents. The former is obtained by quoting code between the
delimiters \texttt{[} and \texttt{]}. Square brackets may be nested,
the inner ones being understood as being part of the quoted code (thus
you can quote a list expression like $[1;2;3]$ by writing
\texttt{[[1;2;3]]}). Inside quotations, the code is pretty-printed in
the same way as it is in code parts.
\paragraph{Controls.}
In addition to the default behavior of \ocamlweb, you can control it
through a small set of commands, which are comments of a particular
shape. These commands are the following:
\begin{description}
\item[\texttt{(*s}] ~\par
Starts a new section. (Meaningless in \LaTeX\ style.)
\item[\texttt{(*i} \quad\dots\quad \texttt{i*)}] ~\par
Ignores all the text between those two delimiters. Such ``comments''
cannot be nested but any \Caml\ code and comments may appear between
them, included nested \Caml\ comments. You can use those delimiters
to enclose a comment that shouldn't appear in the document, but also
to hide some \Caml\ code, putting it between \texttt{(*i*)} and
\texttt{(*i*)} in such a way that your code still compiles but is
ignored by \ocamlweb. (Notice that if you use the delimiters
\texttt{(*i} and \texttt{i*)} directly, the text enclosed is commented
for both \Caml\ and \ocamlweb.)
\item[\texttt{(*c}] ~\par
Tells \ocamlweb\ that this is a real \Caml\ comment an not a
documentation text. Mainly useful is you want to insert comments
after empty lines. However, this is not the spirit of \ocamlweb, and
you are encouraged to put the documentation in separate \LaTeX\
paragraphs and not in traditional \Caml\ comments.
\item[\texttt{(*r}] ~\par
Justifies an end-of-line comment on the right margin.
\item[\texttt{(*p} \quad\dots\quad \texttt{*)}] ~\par
Insert some material in the \LaTeX\ preamble. See also command line
option \verb!-p!.
\end{description}
\paragraph{Pretty-printing.}
\ocamlweb\ uses different faces for identifiers and keywords, and use
mathematical symbols for some \Caml\ tokens. Here are the
correspondences.
\begin{center}
\begin{tabular}{ll@{\qquad\qquad}ll@{\qquad\qquad}ll@{\qquad\qquad}}
\verb!->! & $\rightarrow$ &
\verb!<-! & $\leftarrow$ &
\verb|*| & $\times$ \\
\verb|<=| & $\le$ &
\verb|>=| & $\ge$ &
\verb|~-| & $-$ \\
\verb|<>| & $\not=$ &
\verb|==| & $\equiv$ &
\verb|!=| & $\not\equiv$ \\
\verb|or|, \verb!||! & $\lor$ &
\verb|&|, \verb|&&| & $\land$ &
\verb|not| & $\lnot$
\end{tabular}
\end{center}
Integers and floating-point literals are pretty-printed like this:
\begin{center}
\begin{tabular}{l@{$\quad\rightarrow\quad$}l}
\verb|123| & $123$ \\
\verb|0b010011| & $010011_2$ \\
\verb|0o466| & $466_8$ \\
\verb|0x3fff| & $\mathtt{3fff}_{16}$ \\
\verb|1.2e6| & $1.2\cdot 10^6$ \\
\verb|1e-4| & $10^{-4}$
\end{tabular}
\end{center}
Characters strings are pretty-printed in fixed-width
%HEVEAfont.
%BEGIN LATEX
font, and spaces are explicitly shown as the symbol {\tt\char`\ },
as in \texttt{"a\char`\ constant\char`\ string"}.
%END LATEX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Hints to get a pretty document}
\ocamlweb\ is rather robust, in the sense that it will always succeed
in producing a document, as soon as the \Caml\ files are lexically
correct. However, you may find the result rather ugly if so were your
source files. Here are some style hints to get a pretty document.
First, \ocamlweb\ is not a real code pretty-printer: it does not
indent your code, and it
does not even cut your code lines when they are too long. The code
will always appear formatted as it is in the source files. The
indentation at the beggining of each line is output as a proportional
space (tabulations are correctly translated). In particular, if you
want your pattern-matchings to be aligned, you have to put a `\verb!|!'
also in front of the first pattern. Here is the difference:
\begin{displaymath}
\begin{array}{l}
\mathsf{let}~\mathit{f}~=~\mathsf{function} \\
\hspace*{2em}\mathit{O}~\rightarrow~\dots \\
\hspace*{1em}|~(\mathit{S}~p)~\rightarrow~\dots
\end{array}
\qquad\qquad
\begin{array}{l}
\mathsf{let}~\mathit{f}~=~\mathsf{function} \\
\hspace*{1em}|~\mathit{O}~\rightarrow~\dots \\
\hspace*{1em}|~(\mathit{S}~p)~\rightarrow~\dots
\end{array}
\end{displaymath}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Usage}
\ocamlweb\ is invoked on a shell command line as follows:
\begin{displaymath}
\texttt{ocamlweb }<\textit{options and files}>
\end{displaymath}
Any command line argument which is not an option is considered to be a
file (even if it starts with a \verb!-!). \Caml\ files are identified
by the suffixes \verb!.ml! and \verb!.mli!, and \LaTeX\ files by the
suffix \verb!.tex!. The latter will be copied `as is' in the final
document. The order of files on the command line is kept in the final
document.
\subsection*{Command line options}
%%% attention : -- dans un argument de \texttt est affich comme un
%%% seul - d'o l'utilisation de la macro suivante
\newcommand{\mm}{\symbol{45}\symbol{45}}
\begin{description}
\item[\texttt{-o }\textit{file}, \texttt{\mm{}output }\textit{file}] ~\par
Redirects the output into the file `\textit{file}'.
\item[\texttt{\mm{}noweb}] ~\par
In that case, there are no sections la WEB, and the user
structurates his document directly through \LaTeX\ commands, like
for instance \verb|\section|, \verb|\subsection|, etc. There is
still an index, in the usual \LaTeX\ sense. (Therefore, if you have
introduced \LaTeX\ sections and subsections, their numbers will
appear in the index.)
\item[\texttt{-s }, \texttt{\mm{}short}] ~\par
Do not insert titles for the files. The default behavior is to
insert a title like ``Module Foo'' or ``Interface for module Foo''
for each file.
\item[\texttt{\mm{}no-index}] ~\par
Do not output the index.
\item[\texttt{\mm{}dvi}] ~\par
Output in DVI format, instead of \LaTeX\ format. (You need \texttt{latex}
to be installed and present in your path.)
\item[\texttt{\mm{}ps}] ~\par
Output in PostScript format, instead of \LaTeX\ format. (You need
both \texttt{latex} and \texttt{dvips} to be installed and present
in your path.)
\item[\texttt{\mm{}html}] ~\par
Output in HTML format, instead of \LaTeX\ format. (You need
both \texttt{latex} and \texttt{hevea} to be installed and present
in your path.)
\item[\texttt{\mm{}hevea-option }\textit{option}] ~\par
Passes the given option to \texttt{hevea} (to be used with the
\texttt{\mm{}html} option). It is mainly useful to specify where the
file \texttt{ocamlweb.sty} is to be found, when not installed in the
\texttt{hevea} library directory, using \texttt{\mm{}hevea-option
"-I }\textit{dir}\texttt{"}.
\item[\texttt{\mm{}extern-defs}] ~\par
Keeps the external definitions in the index i.e. the identifiers
which are not defined in any part of the code. (The default behavior
is to suppress them from the index, even if they are used somewhere
in the code.)
\item[\texttt{\mm{}header}] ~\par
Does not skip the header of \Caml\ files. The default behavior is to
skip them, since there are usually made of copyright and license
informations, which you do not want to see in the final document.
Headers are identified as comments right at the beginning of the
\Caml\ file, and are stopped by any character other then a space
outside a comment or by an empty line.
\item[\texttt{\mm{}no-preamble}] ~\par
Suppresses the header and trailer of the final document. Thus, you can
insert the resulting document into a larger one.
\item[\texttt{-p} \textit{string}, \texttt{\mm{}preamble} \textit{string}]~\par
Insert some material in the \LaTeX\ preamble, right before
\verb!\begin{document}!. See also the control \texttt{(*p}.
\item[\texttt{\mm{}class-options }\textit{options}] ~\par
Sets the \LaTeX\ document class options; it defaults to \verb!12pt!.
\item[\texttt{\mm{}latex-option }\textit{option}] ~\par
Passes the given option the \LaTeX\ package \texttt{ocamlweb.sty}.
\item[\texttt{\mm{}old-fullpage}] ~ \par
Uses the old version of the \LaTeX\ \texttt{fullpage} package, i.e.
with no option. Otherwise option \texttt{headings} is used.
\item[\texttt{\mm{}impl }\textit{file}, \texttt{\mm{}intf }\textit{file},
\texttt{\mm{}tex }\textit{file}] ~\par
Considers the file `\textit{file}' respectively as a \verb!.ml! file, a
\verb!.mli! file or a \verb!.tex! file.
\item[\texttt{\mm{}files }\textit{file}] ~\par
Read file names to process in file `\textit{file}' as if they were
given on the command line. Useful for program sources splitted in
several directories. See FAQ.
\item[\texttt{\mm{}no-greek}] ~\par
Disable use of greek letters for single-letter type variables. For
example, the declaration of \verb|List.hd| is displayed as
\begin{quote}
\textit{List.hd} : $\alpha$ \textit{list} $\rightarrow$
$\alpha$
\end{quote}
but with this option, it will be displayed as
\begin{quote}
\textit{List.hd} : \textit{'a} \textit{list} $\rightarrow$
\textit{'a}
\end{quote}
\item[\texttt{-q}, \texttt{\mm{}quiet}] ~\par
Be quiet. Do not print anything on standard error output except errors.
\item[\texttt{-h}, \texttt{\mm{}help}] ~\par
Gives a short summary of the options and exits.
\item[\texttt{-v}, \texttt{\mm{}version}] ~\par
Prints the version and exits.
\end{description}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{The \texttt{ocamlweb} \LaTeX{} style file}
\label{section:ocamlweb.sty}
In case you choose to produce a document without the default \LaTeX{}
preamble (by using option \verb|--no-preamble|), then you must insert
into your own preamble the command
\begin{quote}
\verb|\usepackage[|\textit{options}\verb|]{ocamlweb}|
\end{quote}
Alternatively, you may also pass these options with the
\verb|--latex-options| option of the \verb|ocamlweb| command.
The options that you may pass to the package are the following:
\begin{description}
\item[\texttt{noweb}] ~
Tells \verb|ocamlweb.sty| that the document was generated with the
\verb|--noweb| option so that no WEB sections are used, and
the index was generated by referencing the \LaTeX\ sections,
subsections, etc.
\item[\texttt{novisiblespaces}] ~
By default, spaces in strings of CAML code parts are output as
\texttt{\char`\ }. They will be output as real spaces if you select
this option.
\item[\texttt{bypages} / \texttt{bysections}] ~
When not in WEB sectioning style, these options
specify whether the index must refer to page numbers or section numbers.
\texttt{bypages} is the default.
In WEB sectioning style, this option has no effect.
\end{description}
Additionally, you may alter the rendering of the document by
redefining some macros:
\begin{description}
\item[\texttt{ocwkw}, \texttt{ocwbt}, \texttt{ocwupperid},
\texttt{ocwlowerid}, \texttt{ocwtv}] ~
The one-argument macros to typeset keywords, base types (such
as \verb|int|, \verb|string|, etc.), uppercase identifiers (type
constructors, exception names, module names), lowercase identifiers
and type variables respectively. Defaults are sans-serif for
keywords and italic for all others. Some of the single-letter type
variables are displayed by default as greek letters, but this
behaviour can be selected by the \verb|--no-greek| option.
For example, if you would like a slanted font for base types, you
may insert
\begin{verbatim}
\renewcommand{\ocwbt}[1]{\textsl{#1}}
\end{verbatim}
anywhere between \verb|\usepackage{ocamlweb}| and
\verb|\begin{document}|.
\item[\texttt{ocwlexkw}, \texttt{ocwlexident}, \texttt{ocwyacckw},
\texttt{ocwyaccident}] ~
Analogous macros as above, to typeset lex keywords, lex identifiers,
yacc keywords and yacc identifiers respectively.
\item[\texttt{ocwinterface}, \texttt{ocwmodule},
\texttt{ocwinterfacepart}, \texttt{ocwcodepart}] ~
One-argument macros for typesetting the title of a \verb|.mli| file,
the title of a \verb|.ml| file, the interface part of a \verb|.ml|
file and the code part of a \verb|.ml| file, respectively. Defaults
are is
\begin{verbatim}
\newcommand{\ocwinterface}[1]{\section*{Interface for module #1}}
\newcommand{\ocwmodule}[1]{\section*{Module #1}}
\newcommand{\ocwinterfacepart}{\subsection*{Interface}}
\newcommand{\ocwcodepart}{\subsection*{Code}}
\end{verbatim}
and you may redefine them using \verb|\renewcommand|.
\end{description}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{FAQ}
\begin{enumerate}
\item \textbf{What about an HTML output?} ~\par
Use \textsf{hevea}, the \LaTeX\ to HTML translator written by Luc
Maranget (freely available at
\monurl{\url{http://pauillac.inria.fr/hevea/}}),
with the following command-line:
\begin{displaymath}
\texttt{hevea} ~ \texttt{ocamlweb.sty} ~ \textit{file.tex}
\end{displaymath}
where \textit{file.tex} is the document produced by \ocamlweb.
The package \texttt{ocamlweb.sty} contains the necessary support for
\textsf{hevea}.
\item \textbf{How can I customize the appearance of the final
document?} ~\par
%Make your own version of the \LaTeX\ package
%\texttt{ocamlweb.sty}. There are macros for keywords, identifiers,
%index entries, etc. with short comments explaining their role.
% jcf, tu nous fais le coup a chaque fois: tu sais bien que ce n'est
% pas la bonne manire de faire car l'utilisateur ne peut plus se
% mettre a jour !
You can redefine some of the \LaTeX{} macros of the
\verb|ocamlweb.sty| style file. See
Section~\ref{section:ocamlweb.sty}. We do not recommend to modify
the \verb|ocamlweb.sty| file directly, since you would not be able to
update easily to future versions. You should rather redefine the
macros using \verb|\renewcommand|. If you want to customize other
parameters that are not currently customizable, please contact the
developers.
\item \textbf{How can I insert `usepackage' commands, or whatever else,
in the \LaTeX\ preamble?} ~\par
Use the option \texttt{-p} or the corresponding control \texttt{(*p}.
If you really want a different \LaTeX\ preamble, for instance to use
a \LaTeX\ class other than \texttt{article}, then
use the option \texttt{\mm{}no-preamble} and catenate the result with your
own header and trailer (or use a \verb|\input| or \verb|\include|
command to insert the file generated by \ocamlweb\ in your main
\LaTeX\ file.)
\item \textbf{How can I use square brackets in \LaTeX, since they are
reserved characters for \ocamlweb?} ~\par
There is no escape sequence for the moment. But there is an easy
solution to this problem: define macros for your \LaTeX\ notations
involving square brackets and put them in the preamble or in a
\verb|.tex| file that you will provide on the \ocamlweb\ command
line. Then, there is no longer square brackets in your source
comments, but only calls to these macros.
\item \textbf{What about lexers and parsers?} ~\par
There is support for \textsf{ocamllex} lexers and \textsf{ocamlyacc}
parsers since version 0.9. They are recognized by their suffix on
the command line (do not use option \verb!--impl! anymore).
\item \textbf{I would like my pattern-matching right-hand sides to be
aligned. Is it possible?} ~\par
No, it is not, since \ocamlweb\ uses proportional fonts. But you
can still align your pattern-matching in your source files, since
\ocamlweb\ converts multiple spaces into single ones.
\item \textbf{What can I do with a large program with sources in several
directories, organised as libraries?} ~
First alternative: you can run an ocamlweb command in each
directories, producing a documentation for each library. If you want
to have the documentations alltogether in the same TeX file, run
each ocamlweb commands with option \texttt{\mm{}no-preamble} to avoid
generation of the \LaTeX\ preamble, build by hand a master document
file with the preamble you want, without forgetting the
\verb|\usepackage{ocamlweb}|, and input each file in each directory
with the \verb|\input| or the \verb|\include| macro.
Second alternative: the main problem with the first alternative is
that you will have an separate index for each libraries. If you want
a global index, you need the run only one \verb|ocamlweb| command.
If you don't want to put all source file names on one single command
line, you can use the \verb|--files| option which allows you to read
the source file names from a file. Example :
\begin{verbatim}
ocamlweb --files lib1/source-files --files lib2/source-files
\end{verbatim}
will produce documentation for files in \verb|lib1| and \verb|lib2|
provided that the files \verb|source-files| in each directory
contain the name of the documented source files.
\end{enumerate}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:
|