% $Id: cwebx.sty,v 3.1 1995/11/21 00:42:49 schrod Exp $ %---------------------------------------------------------------------- % % LaTeX2e package cwebx % extra stuff for cweb bundle, to be added there sometimes % % [LaTeX2e] % (history at end) % Identification. The code below is explained in the implementation % documentation of the rcs package. \begingroup \def\RCSPackage#1#2 $#3: #4 #5\endRCS $#6: #7 #8\endRCS{% \def\date{#4}\def\id{v#7}% \ProvidesPackage{#1}[\date\space\id\space #2]% } \RCSPackage{cwebx}{extra stuff for cweb bundle} $Date: 1995/11/21 00:42:49 $: 9999/00/00 \endRCS $Revision: 3.1 $: 0.0 \endRCS \endgroup % % What's this package for? % % Additional macros for cweb.cls or cwebpart.sty, to be added there % sometimes. % % requires that cweb base is loaded \ifx \cwbb@loaded\undefined \PackageError{cwebx}{cweb base is not loaded} {This package requires the usage of either cweb.cls or cwebparts.sty.} \fi % This style is supported. Send bug reports, comments and repairs. % % The reference version may be retrieved via anonymous ftp from % |ftp.th-darmstadt.de| [130.83.47.112], directory |pub/tex/latex|. It's % placed there as a gzipped tar file. (The information on the % IP~number is dated 27 Sep 95. It might have changed, also % this is very unlikely. Use your friendly nameserver.) \catcode`\_=\CatLetter %%% ====================================================================== %% %% Errors in cwebbase.doc %% % As \4 follows \B always, the \kern\CwebIndentUnit to neutralize that % backspace must be made after run-in section, too. Between the chunk % marker and the program code start is 1em then (inserted by LaTeX % section start). % FIXME: \4 does _not_ follow \B all the time. Check when it is % issued. The code below was introduced to repair a problem that gets % visible if one uses \cwebNoChunk with an indentation unit of 2em, % obviously I have to look for a better repair possibility. \CheckCommand*\B{% \cwbb@program \cwbb@indent 3\CwebIndentUnit \hangindent\cwbb@indent \ifvmode \if@noskipsec \indent % add an empty documentation part \else \noindent \kern\CwebIndentUnit \fi \fi \CwebNumberProgramPart } \renewcommand\B{% \cwbb@program \cwbb@indent 3\CwebIndentUnit \hangindent\cwbb@indent \ifvmode \if@noskipsec \indent % add an empty documentation part \else \noindent \fi \fi \kern\CwebIndentUnit \CwebNumberProgramPart } %%% ------------------------------------------------------------ %% %% Macros from cwebparts.doc, to be moved to cwebbase.doc. %% % They are partly repaired and improved, where noted with `CHANGE'. % \sect Now we can typeset pieces of \cweave{} output -- in principle. % If these pieces have sections in them, they'll write entries to the % |TOC| file. These entries will either mess up the structure of the % document's table of contents or lead to \TeX{} error messages. That's % because either toc entries for section types |part|, |chapter|, or % |section| are written (causing the conflict); or toc entries for % section types |chunk| and `|section|$i$' are written (being % undefined). % The best way seems to stop the included source to add anything to the % table of contents or to do any mark processing. For that, we provide a % macro |\CwebNoLists| that will locally redefine the \LaTeX{} cseqs % that cause such actions to happen. That macro will be used at the % start of the environment. % CHANGE: Discard try code that redefines |\markboth| and |\markright|. % \beginprog \def\CwebNoLists{% \let\addtocontents\@gobbletwo \let\mark\@gobble } % \endprog % \sect Furthermore, section divisions should not start a new page. % % % \begin{fixme} % Currently, sections in the included parts are typeset exactly the % same way as they're typeset in the main document. That should be % different -- but how do I change it in a general way? % \end{fixme} % % CHANGE: Moved to Cweb environment. % CHANGE: Improved question. % % \sect OK, what gets destroyed by the environment? We need to save % and restore counters that are changed globally by section commands. % \beginprog \ifx \chapter\undefined \let\cweb@save_c@chapter\@gobble \let\c@chapter\@gobble \else \newcount\cweb@save_c@chapter \fi \newcount\cweb@save_c@part \newcount\cweb@save_c@section \newcount\cweb@save_c@chunk \def\cweb@save_for_env{% %% save values changed globally by cwebbase macros \cweb@save_c@chapter\c@chapter \cweb@save_c@part\c@part \cweb@save_c@section\c@section \cweb@save_c@chunk\c@chunk \let\cweb@save_thechapter\thechapter \let\cweb@save_thesection\thesection %% set up typesetting of CWEB source \@nobreaktrue % don't add space from first chunk } \def\cweb@restore_env{% \global\c@chapter\cweb@save_c@chapter \global\c@part\cweb@save_c@part \global\c@section\cweb@save_c@section \global\c@chunk\cweb@save_c@chunk \global\let\thechapter\cweb@save_thechapter \global\let\thesection\cweb@save_thesection } % \endprog % \sect For the moment, we use list spacing around a |cweb| environment. % \LaTeX{} supplies the |trivlist| environment for such purposes. % But the environment content itself must not be typeset in a list % context. Two problems exist: There must be at least one |\item|, it % will actually add the vertical space and must therefore not be % discarded. And list environments redefine |\par|, but the % \pkg{cwebbase} macros need a more `normal' definition. % An item label is stored by |\item| in the |\everypar| register. The % label is only typeset if |@inlabel| is true. The flag |@newlist| tells % most other \LaTeX{} macros, that there was no item yet; typically % they'll add an empty paragraph if necessary. As the content will % start with a \LaTeX{} section division, or even with document markup, % we don't want that empty paragraph and should skip the empty item % label. (Often enough, due to the initialisation of |\everypar| in % |\@startsection|, it will be thrown away anyhow). So we establish its % postconditions, the next macro won't notice that the item hasn't been % set actually. % CHANGE: Added \CwebNoLists, as I consider it part of the env layout. % CHANGE: Added paragraph below. % % Furthermore, section divisions should not start a new page. % % % \begin{fixme} % Currently, sections in the included parts are typeset exactly the % same way as they're typeset in the main document. That should be % different -- but how do I change it in a general way? % \end{fixme} % \begin{fixme} % Experimentally, we reduce the skip in front of a chunk to 1\,pc, % otherwise the distance between two chunks is far too wide compared % to other vertical distances in the text around the included stuff. % \end{fixme} % \beginprog \def\CwebBeginEnvLayout{% %% use spacing of list, but switch off list handling afterwards \trivlist \@inlabelfalse % don't go in horizontal mode \item\relax \global\@newlistfalse \global\@inlabelfalse\the\everypar \@setpar{\@@par}% %% now change cweb base layout, meant for classes \CwebNoLists \let\CwebEjectSection\@gobble \CwebChunkPreSkip 1pc plus 6pt minus 3pt } \let\CwebEndEnvLayout=\endtrivlist % \endprog % \sect The environment gets trivial now. We supply a hook for a whole % document and also environment-specific ones (as an optional % environment argument). % CHANGE: Renamed to `Cweb'. Lusers should actually not call that env % directly, it's too dangerous. % CHANGE: Added forgotten evaluation of \cweb@restore_env. % \beginprog \newenvironment{Cweb}[1][]% {% \CwebBeginEnvLayout \cweb@save_for_env \csname CwebEnvHook\endcsname #1 }{% \cweb@restore_env \CwebEndEnvLayout } % \endprog % CHANGE: Have to improve the introduction of |cwebInput|. Now it has % an additional optional parameter, where instance specific cseqs may % be passed (like the cweb env). % \sect An a convenience tag to include a complete \cweave{} file. Since % we want to test the typesetting of our included \cweb{} program alone, % we allow but ignore most kinds of document markup. Many of them have % two arguments, one is optional. % In the preambel, only |\documentclass| and |\usepackage| may appear. % Titlepage material is handled, table of contents is discarded. The % document environment does nothing, i.e., unlike the \cls{cweb} class, % material behind |\end{document}| is not ignored. % An |\end| tag is inserted by \cweave{} and must be redefined, we don't % end an environment there. We'll open a group and will use that tag to % close it again, as we know that we'll have reached the end of our % \cweb{} file. Of course, |\end| must not be redefined during % processing the actual program source -- environments are valid there. % The redefinition is best be triggered by material inserted from % \cweave{} at the very end, e.g., from |\inx|. But |\inx| may not be % there (when \cweave{} is called with the `|-x|' option), we'll use % |\enddocument| to add a |\inx| tag for safety reason. If the user % didn't add an |\end{document}| to his file and used `|-x|', we're % going to loose. % CHANGE: Added handling of empty chunk. (@noskipsec was set after the % environment, what messed up later invocations of program code if % used with \cwebCodeExample.) % \TeX{}nical note: |\document| must not have the same binding as % |\relax|, as this would be interpreted as a non-existing environment % by \LaTeX{}. (That's due to the |\csname| lossage.) % \TeX{}nical note: Evaluating |\inx| in |\enddocument| will not have % any effect, we're inside a group. That evaluation must be postponed % after the group has been closed. % \beginprog \providecommand\cweb@doc_markup_gobble[2][]{} \let\cwebInput\undefined \newcommand*\cwebInput[2][]{% \begin{Cweb} [% \begingroup \let\documentclass\cweb@doc_markup_gobble \let\usepackage\cweb@doc_markup_gobble \let\title\@gobble \let\author\@gobble \let\date\@gobble \let\maketitle\relax \let\tableofcontents\relax \let\document\empty \def\inx{\let\end\endgroup}% \let\fin\relax \let\con\relax \def\enddocument{% \if@noskipsec % empty chunk \global\@noskipsecfalse \global\everypar{}% \fi \aftergroup\inx }% #1% ]% \input{#2}% \end{Cweb}% } % \endprog %%% ------------------------------------------------------------ %% %% New macros for cwebbase.doc. %% % For production of code examples in CWEB documents. It's expected % that the document consists of only \emph{one} chunk that has no % documentation. Just the code is of interest. Neither chunk markers, % nor chunk numbers, nor refinement numbers are typeset. % % But one may change that with the optional parameter. \providecommand*\cwebCodeExample[2][]{% \cwebInput[% \def\CwebChunkHeading##1{\kern -1em}% \let\cwbb@marginal_chunkno\relax \let\CwebRefNumber\@gobble \CwebChunkPreSkip\z@skip #1% ]{#2}% } % Often one has an explanation for more than one refinement. (E.g., % when there's needed a definition and a declaration.) Then the % documentation of the follow-up refinements shall consist solely of % |\cwebNoChunk|. Then no chunk marker is set, and the refinement % is typeset nearer to the previous refinement. Optically, we create % one chunk with many refinements this way. % \TeX{}nical note: No chunk marker is created by redefining macro % |\@svsechd| that creates header for run-in \LaTeX{} section. Every % header is followed by 1\,em space, we have to annulate that skip. % (The refinement shall start at the beginning of the line.) One must % not use |\hskip| to backup, an |\unskip| comes after the header and % would discard that skip. \providecommand\cwebNoChunk{% \vskip -\lastskip \bigskip % discard LaTeX's inter-section skip \def\@svsechd{\kern -1em}% } \catcode`\_=\CatUsCode \endinput %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % $Log: cwebx.sty,v $ % Revision 3.1 1995/11/21 00:42:49 schrod % version 1.1 % %%%------------------------------------------------------------ % Local Variables: % mode: LaTeX % TeX-brace-indent-level: 4 % indent-tabs-mode: t % TeX-auto-untabify: nil % page-delimiter: "^%%%" % End: