%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Comment.sty version 3.0, 3 September 1992 % 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. % % This style can be used with plain TeX or LaTeX, and probably % most other packages too. % % Author % Victor Eijkhout % Department of Computer Science % University Tennessee at Knoxville % 104 Ayres Hall % Knoxville, TN 37996 % USA % % eijkhout@cs.utk.edu % % Usage: all text included in between % \comment ... \endcomment % or \begin{comment} ... \end{comment} % is discarded. The closing command should appear on a line % of its own. No starting spaces, nothing after it. % This environment should work with arbitrary amounts % of comment. % % 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 closing command again on a line of its own. % % Special comments are defined as % \specialcomment{name}{before commands}{after commands} % where the second and third arguments are executed before % and after each comment. By defining a control sequence % \Thiscomment##1{...} in the before commands the user can % specify what is to be done which each comment line. % % Basic approach: % to comment something out, scoop up every line in verbatim mode % as macro argument, then throw it away. % For inclusions, both the opening and closing comands % are defined as noop \def\makeinnocent#1{\catcode`#1=12 } \def\csarg#1#2{\expandafter#1\csname#2\endcsname} \def\TreatAsComment#1{\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{\def\test{#1} \csarg\ifx{PlainEnd\CurrentComment Test}\test \def\next{\endgroup\AfterComment}% \else \csarg\ifx{LolliEnd\CurrentComment Test}\test \def\next{\endgroup\AfterComment}% \else \csarg\ifx{LaLaEnd\CurrentComment Test}\test \edef\next{\endgroup\noexpand\AfterComment \noexpand\end{\CurrentComment}} \else \ThisComment{#1}\let\next\xComment \fi \fi \fi \next} } \def\includecomment #1{\message{Including comment '#1'}% \expandafter\def\csname#1\endcsname{}% \expandafter\def\csname end#1\endcsname{}} \def\excludecomment #1{\message{Excluding comment '#1'}% \csarg\def{#1}{\let\AfterComment\relax \def\ThisComment####1{}\TreatAsComment{#1}}% {\escapechar=-1\relax \csarg\xdef{PlainEnd#1Test}{\string\\end#1}% \csarg\xdef{LolliEnd#1Test}{\string\\#1Stop}% \csarg\xdef{LaLaEnd#1Test}{\string\\end\string\{#1\string\}}% }} \long\def\specialcomment #1#2#3{\message{Special comment '#1'}% \csarg\def{#1}{\def\ThisComment{}\def\AfterComment{#3}#2% \TreatAsComment{#1}}% {\escapechar=-1\relax \csarg\xdef{PlainEnd#1Test}{\string\\end#1}% \csarg\xdef{LolliEnd#1Test}{\string\\#1Stop}% \csarg\xdef{LaLaEnd#1Test}{\string\\end\string\{#1\string\}}% }} \excludecomment{comment} \endinput