summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/cweb/contrib/wagner
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/cweb/contrib/wagner
Initial commit
Diffstat (limited to 'macros/latex/contrib/cweb/contrib/wagner')
-rw-r--r--macros/latex/contrib/cweb/contrib/wagner/cwebzw.sty323
1 files changed, 323 insertions, 0 deletions
diff --git a/macros/latex/contrib/cweb/contrib/wagner/cwebzw.sty b/macros/latex/contrib/cweb/contrib/wagner/cwebzw.sty
new file mode 100644
index 0000000000..cff2d7c254
--- /dev/null
+++ b/macros/latex/contrib/cweb/contrib/wagner/cwebzw.sty
@@ -0,0 +1,323 @@
+%% $Id: cwebzw.sty,v 1.2 1993/08/10 14:14:33 schrod Exp $
+%%----------------------------------------------------------------------
+%% Changed by Joachim Schrod <schrod@iti.informatik.th-darmstadt.de>
+%% Original received by mail:
+%% Date: Thu, 05 Aug 93 12:34:21 MDT
+%% From: Zdenek Wagner <WAGNER@CSEARN.BITNET>
+
+%% This is file ``cwebzw.sty'' written by Z. Wagner as an extension and
+%% correction of ``cweb.sty'' Revision 1.8
+
+%% This file is self-documenting. If you process this file through LaTeX,
+%% you will get the documentation. You can use MakeIndex to create an
+%% index of macros used. In your cweb documents you can either use it as
+%% is or you can remove all comment lines by your editor or the docstrip
+%% utility (or a program of your own).
+
+%% See chapter ``Introduction'' for other remarks.
+
+\def\cwebzwrevision{1.8} % Do not remove this line!
+
+% You can remove the next two lines
+\ifcat a\noexpand @\let\next\relax\else\def\next{%
+ \documentstyle[doc]{article}\MakePercentIgnore}\fi\next
+
+% \EnableCrossrefs
+% \CodelineIndex
+% \catcode`\_=12
+% \DoNotIndex{\cweb,\orig,\p} ^^A doc.sty cannot handle underscore
+% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
+% \DoNotIndex{\@ne,\tw@,\bgroup,\egroup,\endinput,\end,\kern,\hbox,\vbox,\vtop}
+% \DoNotIndex{\aftergroup,\arabic,\begin,\protect,\rm,\reset@font,\setbox}
+% \DoNotIndex{\show,\typeout,\errhelp,\unskip,\unvbox,\wd,\input,\hskip}
+% \DoNotIndex{\ifdim,\ifmmode,\ifnum,\long,\footnotesize,\newbox,\newpage}
+% \DoNotIndex{\@ifnextchar,\@ifundefined,\@namedef}
+% \DoNotIndex{\advance,\begingroup,\catcode,\closein,\closeout}
+% \DoNotIndex{\day,\def,\edef,\else,\empty,\endgroup,\errmessage}
+% \DoNotIndex{\expandafter,\fi,\futurelet,\gdef,\global,\if,\ifeof}
+% \DoNotIndex{\ifx,\immediate,\let,\loop,\m@ne,\message,\month,\newcount}
+% \DoNotIndex{\newif,\newlinechar,\newread,\newtoks,\newwrite}
+% \DoNotIndex{\noexpand,\openin,\openout,\par,\read,\relax,\repeat}
+% \DoNotIndex{\space,\the,\undefined,\write,\xdef,\year,\z@}
+% \advance\textwidth by 40pt
+% \def\pcws{{\tt cweb.sty}}
+% \def\cws{\protect\pcws}
+% \newbox\cwebincr
+% \setbox\cwebincr=\hbox{^^A
+% \kern .5pt
+% \raise .1em\hbox{$\scriptstyle{+}\kern -.1em{+}$}^^A
+% \kern .5pt}
+% \def\Cpp{C\copy\cwebincr}
+% \begin{document}
+% \MakeShortVerb\|
+% \title{Extension and correction of \cws\ revision~\cwebzwrevision}
+% \author{Zden\v{e}k Wagner\\
+% $\langle$wagner@csearn.bitnet$\rangle$ or
+% $\langle$wagner@earn.cvut.cz$\rangle$}\date{}
+% \maketitle\vspace{3ex}
+
+% \tableofcontents\thispagestyle{empty}\newpage
+
+% \section{Introduction}
+% The purpose of this file is to add new features to \cws\ and
+% correct some bugs. When doing this we intended not to make a faintest
+% change into \cws. Therefore some definitions may look strangely
+% cumbersome. However, this file should be treated as a test of new
+% features and bug fixes which should then be placed in the official
+% distribution of \cws\ and in the ideal state this file will one day
+% vanish at all.
+
+% {\bf Note by Joachim Schrod}:\quad I have incorporated most error
+% repairs and some of the enhancements into \cws{} (Revision~1.12). To
+% avoid problems, I deleted all the respective macros from this
+% option. The rest that you see here will not be incorporated (at
+% least not as-is) and is therefore provided as a contributed style
+% option for those who like it.
+
+
+% \section{Preliminaries}
+% First we make sure that this file is not input twice.
+% \begin{macrocode}
+\@ifundefined{\cweb@egroup}{}{\endinput}
+% \end{macrocode}
+
+% Throughout this file we will use tags defined in \cws. Therefore we
+% begin the file with identifying itself and displaying the revision of
+% \cws\ for which it is written. Afterwards we change catcode of
+% underscore in order to have the same conditions as \cws.
+% \begin{macrocode}
+\typeout{Extension of cweb style, revision \cwebzwrevision}
+\typeout{(if you have an older revision of cweb.sty, please upgrade)}
+\catcode`\_=\CatLetter
+% \end{macrocode}
+
+% \section{Extensions}
+% \begin{macro}{\C++}
+% \begin{macro}{\Cpp}
+% \begin{macro}{\CPLUSPLUS/}
+% The documentation of \cws\ says that |\C++| may now be used for \Cpp\
+% logo. However, |\C++| is not defined in \cws. The conservative users
+% of {\tt ccwebmac.tex} designed by Hans--Hermann Bode might be
+% accustomed to |\Cpp| while users of {\tt cwebmac.tex} from {\tt CWEB
+% 3.0} might like |\CPLUSPLUS/|. Therefore we supply all three tags and
+% moreover make them robust so that they can safely be used in moving
+% arguments.
+% \begin{macrocode}
+\def\p_cpp{C\CwebIncr}
+\def\C++{\protect\p_cpp}
+\def\Cpp{\protect\p_cpp}
+\def\CPLUSPLUS/{\protect\p_cpp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+
+% \section{Improvements}
+% \begin{macro}{\CwebScope}
+% If your program contains description of member functions as
+% |TListBox::|\-|handleEvent|, the documentation part may easily contain
+% lots of overfull boxes. Therefore we try to allow the line break after
+% the scope operator. We make the change only if it is not typeset in
+% the math mode. The following solution is not perfect. The expression
+% ``|::close|'' may be incorrectly split after the scope resolution
+% operator. To make a robust macro we should probably fiddle with
+% |\lastskip| and |\lastpenalty|.
+% \begin{macrocode}
+\def\CwebScope{\ifmmode \kern.1em::\kern.1em\else
+ \kern.1em::\hskip.1em\fi}
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Index appearance}
+% When typesetting two or more columns it is more pleasant if the
+% columns are balanced. This may easily be achieved with Frank
+% Mittelbach's {\tt multicol.sty}. We try whether the style is
+% available.
+% \begin{macrocode}
+\newif\ifhave@multicol
+\openin\@ne multicol.sty
+\ifeof\@ne \else \have@multicoltrue \fi
+\closein\@ne \relax
+% \end{macrocode}
+
+% If we found {\tt multicol.sty}, we use it. It might me nice to delay
+% this until we know that the index is really requested.
+% \begin{macrocode}
+\ifhave@multicol \input{multicol.sty} \fi
+% \end{macrocode}
+
+% \begin{macro}{\CwebIdIndex}
+% \begin{macro}{\twocolumn}
+% \begin{macro}{\onecolumn}
+% We delay the redefinitions of the twocolumn format into the definition
+% of |\CwebIdIndex|. If we made the changes globally, we could
+% eventually break something in the user's code.
+
+% I dare say that I do not like the page break in between the index and
+% the list of refinements so I do not put it into the redefinition of
+% |\onecolumn|. Notice also that the new version of |\onecolumn|
+% restores everything for the rare case it is needed somewhere later.
+% \begin{macrocode}
+\let\orig_CwebIdIndex=\CwebIdIndex
+\let\orig_twocolumn=\twocolumn
+\let\orig_onecolumn=\onecolumn
+
+\ifhave@multicol
+ \def\CwebIdIndex{%
+ \def\twocolumn{\newpage
+ \@ifnextchar[{\zw@twocol}{\begin{multicols}{2}}}
+ \long\def\zw@twocol[##1]{\setbox\cweb_tempbox=\vbox{##1}%
+ \begin{multicols}{2}[\unvbox\cweb_tempbox]}
+ \def\onecolumn{%
+ \let\onecolumn=\orig_onecolumn
+ \let\twocolumn=\orig_twocolumn}
+ \orig_CwebIdIndex\cweb@restore_end\end{multicols}}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+
+% \begin{macro}{\cweb@restore_end}
+% The index is processed after the user supplied |\end{document}| where
+% the |\end| tag has unfortunately been redefined. We would always get a
+% \LaTeX\ error informing us about unmatched |\begin| and |\end|.
+% Therefore we prepare a macro which will be used inside a group to
+% restore temporarily the original meaning of |\end|.
+% \begin{macrocode}
+\let\orig_end=\end
+\def\cweb@restore_end{\let\end=\orig_end}
+% \end{macrocode}
+% \end{macro}
+
+% \section{Crazy inventions}
+% As we can see from the documentation of \cws, it can handle two
+% versions of \LaTeX. Older versions of \LaTeX\ are unlikely to be used
+% and \LaTeX3 will handle |\end|'s in a different way so the following
+% invention does not seem useful. I wrote it mainly as an exercise so
+% that I could proudly say with the White Knight from Through the
+% Looking Glass, ``It's my own invention.''
+
+% \begin{macro}{\cweb@end_tokens}
+% When skipping around the |\end{document}| we have to catch the tokens
+% which are placed after |\endgroup|. For this purpose we establish a
+% new token register.
+% \begin{macrocode}
+\newtoks\cweb@end_tokens
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\cweb@report_error}
+% Before we start the job of catching tokens we prepare some macros. The
+% first of them will display our error message. Though we hope that the
+% catching algorithm will work with all \LaTeX's currently available, it
+% may according to Murphy's Laws happen that someone's obsolete (or
+% brand new) \LaTeX\ will break it. We do not want to bother the user
+% with strange error messages. We therefore supply ours. The text is
+% taken exactly from \cws. The macro will be issued from inside a group
+% therefore we take no care about restoring the original definitions.
+% \begin{macrocode}
+\def\cweb@report_error{\let\orig_errmsg=\errmessage
+ \def\errmessage##1{%
+ \errhelp={^^J%
+This style depends on an internal implementation detail of LaTeX.^^J%
+Sad to note, this detail has changed; you cannot use the cweb style.^^J%
+Please type "i\show\end" now. TeX will spit out a few lines of^^J%
+definitions and ask again for input. Type "x" then, this will finish TeX.^^J
+Then send the log file to the style's author, Joachim Schrod^^J%
+(Email: schrod@iti.informatik.th-darmstadt.de). He will adapt cweb.sty^^J%
+to the new LaTeX version.^^J}
+ \orig_errmsg{Sorry, you cannot use the cweb style with this LaTeX version}}
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\cweb@catch_tokens}
+% We also prepare the macro which will catch the tokens. This is an
+% incomplete assignment to the token register. Its function will be
+% explained later.
+% \begin{macrocode}
+\def\cweb@catch_tokens{\cweb@end_tokens=\bgroup}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\cweb_3_env}
+% \begin{macro}{\endcweb_3_env}
+% For catching the tokens we will invoke a very special environment with
+% the name |cweb_3_env|. \LaTeX\ would complain if the environment were
+% undefined. Therefore we place to |\cweb_3_env| everything which is
+% needed at the beginning of the catching job and similarly
+% |\endcweb_3_env| will contain the trap for the tokens. Notice that we
+% have to use |\@namedef| to define tags with such strange names.
+% \begin{macrocode}
+\@namedef{cweb_3_env}{\cweb@report_error}
+\@namedef{endcweb_3_env}{\aftergroup\cweb@catch_tokens}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+% \begin{macro}{\cweb@skip_end}
+% Now we can catch the tokens and define |\cweb@skip_end| accordingly.
+% First we write it and then explain how it works.
+% \begin{macrocode}
+\begin{cweb_3_env}
+{\egroup\end{cweb_3_env}}
+\expandafter\def\expandafter\cweb@skip_end\the\cweb@end_tokens{\cweb@check_fi}
+% \end{macrocode}
+% When we start the environment, \LaTeX\ will invoke our error reporting
+% macro. It is invoked inside a group as we have promised. The ending
+% command will tell \TeX\ that |\cweb@catch_tokens| should be carried
+% out after the end of group. When the group is closed (after some
+% checks), the tokens which stem from the expansion of |\end| are not
+% executed but stored in our token register. So we have to complete the
+% assignment. You might have temptation to just append |\egroup| after
+% the statement ending the environment. But beware! This will store
+% |\egroup| as the next token in |\cweb@end_tokens|. It will also eat up
+% the rest of the file. Fortunately we are redefining \cws\ so that the
+% official tags will do the job. We could start catching tokens with
+% |\bgroup| which is equivalent to \{ but we must put \} and nothing
+% else at the end of the assignment. We solve it by inserting an empty
+% group |{\egroup|. This is syntactically correct. In almost all
+% contexts \} and |\egroup| are interchangeable. So when \TeX\ scans the
+% text, it sees matched braces and when executing the macros it finds
+% balanced groups. The definition of |\cweb@skip_end| is now
+% straightforward. Isn't it a pretty nonsense code?
+% \end{macro}
+
+% \section{Bug corrections}
+% \begin{macro}{\egroup_}
+% A funny (and instructive) bug invaded into the definition of
+% |\CwebNumber|. This tag is defined in \cws\ where underscore is
+% recatcoded to letter. Therefore, what would work in a usual \TeX\
+% context, does not work here. We correct it by defining |\egroup_|
+% which will do the correct things. However, there is one more thing
+% which should be mentioned. When using NFSS, |\rm| has no effect in the
+% math mode. The easiest safe way for switching to roman alphabet from
+% inside math is to use |\hbox|. Placing |\,| as done in \cws\ seems
+% unpleasant to my eyes therefore I remove it. Please notice that the
+% catcode of underscore is restored to the original value within the
+% following definition.
+
+% {\bf Note from Joachim Schrod:}\quad This will not work any more
+% since the bug with the underscore has been repaired (one shouldn't
+% simply copy plain macros to \LaTeX{} code\,\dots). Nevertheless the
+% problem with NFSS remains. But I'm not (yet?)\ convinced that the
+% work-around presented here is the adequate solution. So the code is
+% here for reference, but it will not be used.
+
+% \begin{macrocode}
+\def\egroup_{\egroup\begingroup
+ \catcode`\_=\CatUsCode
+ \let\,=\relax
+ \def\rm{\reset@font\footnotesize}%
+ \cweb@egroup}
+
+\catcode`\_=\CatUsCode
+\def\cweb@egroup#1{_{\hbox{#1}}\endgroup}
+% \end{macrocode}
+% \end{macro}
+
+% \PrintIndex
+% \end{document}
+\endinput
+