%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Comment.sty version 3.5, August 1998 % % Purpose: % selectively in/exclude pieces of text: the user can define new % comment versions, and each is controlled separately. % Special comments can be defined where the user specifies the % action that is to be taken with each comment line. % % Author % Victor Eijkhout % Department of Computer Science % University of Tennessee % 107 Ayres Hall % Knoxville TN 37996 % USA % % victor@eijkhout.net % % This program is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License % as published by the Free Software Foundation; either version 2 % of the License, or (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % For a copy of the GNU General Public License, write to the % Free Software Foundation, Inc., % 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, % or find it on the net, for instance at % http://www.gnu.org/copyleft/gpl.html % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This style can be used with plain TeX or LaTeX, and probably % most other packages too. % % Usage: all text included between % \comment ... \endcomment % or \begin{comment} ... \end{comment} % is discarded. % % The opening and closing commands should appear on a line % of their own. No starting spaces, nothing after it. % This environment should work with arbitrary amounts % of comment, and the comment can be arbitrary text. % % Other `comment' environments are defined by % and are selected/deselected with % \includecomment{versiona} % \excludecoment{versionb} % % These environments are used as % \versiona ... \endversiona % or \begin{versiona} ... \end{versiona} % with the opening and closing commands again on a line of % their own. % % LaTeX users note: for an included comment, the % \begin and \end lines act as if they don't exist. % In particular, they don't imply grouping, so assignments % &c are not local. % % Special comments are defined as % \specialcomment{name}{before commands}{after commands} % where the second and third arguments are executed before % and after each comment block. You can use this for global % formatting commands. % To keep definitions &c local, you can include \begingroup % in the `before commands' and \endgroup in the `after commands'. % ex: % \specialcomment{smalltt} % {\begingroup\ttfamily\footnotesize}{\endgroup} % You do *not* have to do an additional % \includecomment{smalltt} % To remove 'smalltt' blocks, give \excludecomment{smalltt} % after the definition. % % Processing comments can apply processing to each line. % \processcomment{name}{each-line commands}% % {before commands}{after commands} % By defining a control sequence % \def\Thiscomment##1{...} in the before commands the user can % specify what is to be done with each comment line. % BUG this does not work quite yet BUG % % Trick for short in/exclude macros (such as \maybe{this snippet}): %\includecomment{cond} %\newcommand{\maybe}[1]{} %\begin{cond} %\renewcommand{\maybe}[1]{#1} %\end{cond} % % Basic approach of the implementation: % to comment something out, scoop up every line in verbatim mode % as macro argument, then throw it away. % For inclusions, in LaTeX the block is written out to % a file \CommentCutFile (default "comment.cut"), which is % then included. % In plain TeX (and other formats) both the opening and % closing comands are defined as noop. % % Changes in version 3.1 % - updated author's address % - cleaned up some code % - trailing contents on \begin{env} line is always discarded % even if you've done \includecomment{env} % - comments no longer define grouping!! you can even % \includecomment{env} % \begin{env} % \begin{itemize} % \end{env} % Isn't that something ... % - included comments are written to file and input again. % Changes in 3.2 % - \specialcomment brought up to date (thanks to Ivo Welch). % Changes in 3.3 % - updated author's address again % - parametrised \CommentCutFile % Changes in 3.4 % - added GNU public license % - added \processcomment, because Ivo's fix (above) brought an % inconsistency to light. % Changes in 3.5 % - corrected typo in header. % - changed author email % - corrected \specialcomment yet again. % - fixed excludecomment of an earlier defined environment. % % Known bugs: % - excludecomment leads to one superfluous space % - processcomment leads to a superfluous line break % \def\makeinnocent#1{\catcode`#1=12 } \def\csarg#1#2{\expandafter#1\csname#2\endcsname} \def\latexname{lplain}\def\latexename{LaTeX2e} \newwrite\CommentStream \def\CommentCutFile{comment.cut} \def\ProcessComment#1% start it all of {\begingroup \def\CurrentComment{#1}% \let\do\makeinnocent \dospecials \makeinnocent\^^L% and whatever other special cases \endlinechar`\^^M \catcode`\^^M=12 \xComment} %\def\ProcessCommentWithArg#1#2% to be used in \leveledcomment % {\begingroup % \def\CurrentComment{#1}% % \let\do\makeinnocent \dospecials % \makeinnocent\^^L% and whatever other special cases % \endlinechar`\^^M \catcode`\^^M=12 \xComment} {\catcode`\^^M=12 \endlinechar=-1 % \gdef\xComment#1^^M{% \expandafter\ProcessCommentLine} \gdef\ProcessCommentLine#1^^M{\def\test{#1} \csarg\ifx{End\CurrentComment Test}\test \edef\next{\noexpand\EndOfComment{\CurrentComment}}% \else \ThisComment{#1}\let\next\ProcessCommentLine \fi \next} } % 3.1 change: in LaTeX and LaTeX2e prevent grouping \if 0% \ifx\fmtname\latexename 0% \else \ifx\fmtname\latexname 0% \else 1% \fi \fi %%%% %%%% definitions for LaTeX %%%% \def\AfterIncludedComment {\immediate\closeout\CommentStream \input{\CommentCutFile}\relax }% \def\TossComment{\immediate\closeout\CommentStream} \def\WriteCommentLine#1{\immediate\write\CommentStream{#1}} \def\BeforeIncludedComment {\immediate\openout\CommentStream=\CommentCutFile \let\ThisComment\WriteCommentLine} \def\includecomment #1{\message{Include comment '#1'}% \csarg\let{After#1Comment}\AfterIncludedComment \csarg\def{#1}{\BeforeIncludedComment \ProcessComment{#1}}% \CommentEndDef{#1}} \long\def\specialcomment #1#2#3{\message{Special comment '#1'}% % note: \AfterIncludedComment does \input, so #2 goes here! \csarg\def{After#1Comment}{#2\AfterIncludedComment#3}% \csarg\def{#1}{\BeforeIncludedComment\relax \ProcessComment{#1}}% \CommentEndDef{#1}} \long\def\processcomment #1#2#3#4{\message{Lines-Processing comment '#1'}% \csarg\def{After#1Comment}{#3\AfterIncludedComment#4}% \csarg\def{#1}{\BeforeIncludedComment#2\relax \ProcessComment{#1}}% \CommentEndDef{#1}} \def\leveledcomment #1#2{\message{Include comment '#1' up to level '#2'}% %\csarg\newif{if#1IsStreamingComment} %\csarg\newif{if#1IsLeveledComment} %\csname #1IsLeveledCommenttrue\endcsname \csarg\let{After#1Comment}\AfterIncludedComment \csarg\def{#1}{\BeforeIncludedComment \ProcessCommentWithArg{#1}}% \CommentEndDef{#1}} \else %%%% %%%%plain TeX and other formats %%%% \def\includecomment #1{\message{Including comment '#1'}% \csarg\def{#1}{}% \csarg\def{end#1}{}} \long\def\specialcomment #1#2#3{\message{Special comment '#1'}% \csarg\newif{if#1IsStreamingComment} \csarg\def{#1}{\def\ThisComment{}\def\AfterComment{#3}#2% \ProcessComment{#1}}% \CommentEndDef{#1}} \fi %%%% %%%% general definition of skipped comment %%%% \def\excludecomment #1{\message{Excluding comment '#1'}% \csarg\def{#1}{\let\AfterComment\relax \def\ThisComment####1{}\ProcessComment{#1}}% \csarg\let{After#1Comment}\TossComment \CommentEndDef{#1}} \if 0% \ifx\fmtname\latexename 0% \else \ifx\fmtname\latexname 0% \else 1% \fi \fi % latex & latex2e: \def\EndOfComment#1{\endgroup\end{#1}% \csname After#1Comment\endcsname} \def\CommentEndDef#1{{\escapechar=-1\relax \csarg\xdef{End#1Test}{\string\\end\string\{#1\string\}}% }} \else % plain & other \def\EndOfComment#1{\endgroup\AfterComment} \def\CommentEndDef#1{{\escapechar=-1\relax \csarg\xdef{End#1Test}{\string\\end#1}% }} \fi \excludecomment{comment} \endinput