diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/cweb-latex/src/cwebx.sty')
-rw-r--r-- | Master/texmf-dist/doc/latex/cweb-latex/src/cwebx.sty | 406 |
1 files changed, 406 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/cweb-latex/src/cwebx.sty b/Master/texmf-dist/doc/latex/cweb-latex/src/cwebx.sty new file mode 100644 index 00000000000..d20db59b171 --- /dev/null +++ b/Master/texmf-dist/doc/latex/cweb-latex/src/cwebx.sty @@ -0,0 +1,406 @@ +% $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: |