|
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
2 % Comment.sty version 3.6, October 1999 |
|
3 % |
|
4 % Purpose: |
|
5 % selectively in/exclude pieces of text: the user can define new |
|
6 % comment versions, and each is controlled separately. |
|
7 % Special comments can be defined where the user specifies the |
|
8 % action that is to be taken with each comment line. |
|
9 % |
|
10 % Author |
|
11 % Victor Eijkhout |
|
12 % Department of Computer Science |
|
13 % University of Tennessee |
|
14 % 107 Ayres Hall |
|
15 % Knoxville TN 37996 |
|
16 % USA |
|
17 % |
|
18 % victor@eijkhout.net |
|
19 % |
|
20 % This program is free software; you can redistribute it and/or |
|
21 % modify it under the terms of the GNU General Public License |
|
22 % as published by the Free Software Foundation; either version 2 |
|
23 % of the License, or (at your option) any later version. |
|
24 % |
|
25 % This program is distributed in the hope that it will be useful, |
|
26 % but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
27 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
28 % GNU General Public License for more details. |
|
29 % |
|
30 % For a copy of the GNU General Public License, write to the |
|
31 % Free Software Foundation, Inc., |
|
32 % 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, |
|
33 % or find it on the net, for instance at |
|
34 % http://www.gnu.org/copyleft/gpl.html |
|
35 % |
|
36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
37 % This style can be used with plain TeX or LaTeX, and probably |
|
38 % most other packages too. |
|
39 % |
|
40 % Usage: all text included between |
|
41 % \comment ... \endcomment |
|
42 % or \begin{comment} ... \end{comment} |
|
43 % is discarded. |
|
44 % |
|
45 % The opening and closing commands should appear on a line |
|
46 % of their own. No starting spaces, nothing after it. |
|
47 % This environment should work with arbitrary amounts |
|
48 % of comment, and the comment can be arbitrary text. |
|
49 % |
|
50 % Other `comment' environments are defined by |
|
51 % and are selected/deselected with |
|
52 % \includecomment{versiona} |
|
53 % \excludecoment{versionb} |
|
54 % |
|
55 % These environments are used as |
|
56 % \versiona ... \endversiona |
|
57 % or \begin{versiona} ... \end{versiona} |
|
58 % with the opening and closing commands again on a line of |
|
59 % their own. |
|
60 % |
|
61 % LaTeX users note: for an included comment, the |
|
62 % \begin and \end lines act as if they don't exist. |
|
63 % In particular, they don't imply grouping, so assignments |
|
64 % &c are not local. |
|
65 % |
|
66 % Special comments are defined as |
|
67 % \specialcomment{name}{before commands}{after commands} |
|
68 % where the second and third arguments are executed before |
|
69 % and after each comment block. You can use this for global |
|
70 % formatting commands. |
|
71 % To keep definitions &c local, you can include \begingroup |
|
72 % in the `before commands' and \endgroup in the `after commands'. |
|
73 % ex: |
|
74 % \specialcomment{smalltt} |
|
75 % {\begingroup\ttfamily\footnotesize}{\endgroup} |
|
76 % You do *not* have to do an additional |
|
77 % \includecomment{smalltt} |
|
78 % To remove 'smalltt' blocks, give \excludecomment{smalltt} |
|
79 % after the definition. |
|
80 % |
|
81 % Processing comments can apply processing to each line. |
|
82 % \processcomment{name}{each-line commands}% |
|
83 % {before commands}{after commands} |
|
84 % By defining a control sequence |
|
85 % \def\Thiscomment##1{...} in the before commands the user can |
|
86 % specify what is to be done with each comment line. |
|
87 % BUG this does not work quite yet BUG |
|
88 % |
|
89 % Trick for short in/exclude macros (such as \maybe{this snippet}): |
|
90 %\includecomment{cond} |
|
91 %\newcommand{\maybe}[1]{} |
|
92 %\begin{cond} |
|
93 %\renewcommand{\maybe}[1]{#1} |
|
94 %\end{cond} |
|
95 % |
|
96 % Basic approach of the implementation: |
|
97 % to comment something out, scoop up every line in verbatim mode |
|
98 % as macro argument, then throw it away. |
|
99 % For inclusions, in LaTeX the block is written out to |
|
100 % a file \CommentCutFile (default "comment.cut"), which is |
|
101 % then included. |
|
102 % In plain TeX (and other formats) both the opening and |
|
103 % closing comands are defined as noop. |
|
104 % |
|
105 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
106 % Changes in version 3.1 |
|
107 % - updated author's address |
|
108 % - cleaned up some code |
|
109 % - trailing contents on \begin{env} line is always discarded |
|
110 % even if you've done \includecomment{env} |
|
111 % - comments no longer define grouping!! you can even |
|
112 % \includecomment{env} |
|
113 % \begin{env} |
|
114 % \begin{itemize} |
|
115 % \end{env} |
|
116 % Isn't that something ... |
|
117 % - included comments are written to file and input again. |
|
118 % Changes in 3.2 |
|
119 % - \specialcomment brought up to date (thanks to Ivo Welch). |
|
120 % Changes in 3.3 |
|
121 % - updated author's address again |
|
122 % - parametrised \CommentCutFile |
|
123 % Changes in 3.4 |
|
124 % - added GNU public license |
|
125 % - added \processcomment, because Ivo's fix (above) brought an |
|
126 % inconsistency to light. |
|
127 % Changes in 3.5 |
|
128 % - corrected typo in header. |
|
129 % - changed author email |
|
130 % - corrected \specialcomment yet again. |
|
131 % - fixed excludecomment of an earlier defined environment. |
|
132 % Changes in 3.6 |
|
133 % - The 'cut' file is now written more verbatim, using \meaning; |
|
134 % some people reported having trouble with ISO latin 1, or umlaute.sty. |
|
135 % - removed some \newif statements. |
|
136 % Has this suddenly become \outer again? |
|
137 % |
|
138 % Known bugs: |
|
139 % - excludecomment leads to one superfluous space |
|
140 % - processcomment leads to a superfluous line break |
|
141 % |
|
142 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
143 |
|
144 \def\makeinnocent#1{\catcode`#1=12 } |
|
145 \def\csarg#1#2{\expandafter#1\csname#2\endcsname} |
|
146 \def\latexname{lplain}\def\latexename{LaTeX2e} |
|
147 \newwrite\CommentStream |
|
148 \def\CommentCutFile{comment.cut} |
|
149 |
|
150 \def\ProcessComment#1% start it all of |
|
151 {\begingroup |
|
152 \def\CurrentComment{#1}% |
|
153 \let\do\makeinnocent \dospecials |
|
154 \makeinnocent\^^L% and whatever other special cases |
|
155 \endlinechar`\^^M \catcode`\^^M=12 \xComment} |
|
156 %\def\ProcessCommentWithArg#1#2% to be used in \leveledcomment |
|
157 % {\begingroup |
|
158 % \def\CurrentComment{#1}% |
|
159 % \let\do\makeinnocent \dospecials |
|
160 % \makeinnocent\^^L% and whatever other special cases |
|
161 % \endlinechar`\^^M \catcode`\^^M=12 \xComment} |
|
162 {\catcode`\^^M=12 \endlinechar=-1 % |
|
163 \gdef\xComment#1^^M{% |
|
164 \expandafter\ProcessCommentLine} |
|
165 \gdef\ProcessCommentLine#1^^M{\def\test{#1} |
|
166 \csarg\ifx{End\CurrentComment Test}\test |
|
167 \edef\next{\noexpand\EndOfComment{\CurrentComment}}% |
|
168 \else \ThisComment{#1}\let\next\ProcessCommentLine |
|
169 \fi \next} |
|
170 } |
|
171 |
|
172 \def\CSstringmeaning#1{\expandafter\CSgobblearrow\meaning#1} |
|
173 \def\CSstringcsnoescape#1{\expandafter\CSgobbleescape\string#1} |
|
174 {\escapechar-1 |
|
175 \expandafter\expandafter\expandafter\gdef |
|
176 \expandafter\expandafter\expandafter\CSgobblearrow |
|
177 \expandafter\string\csname macro:->\endcsname{} |
|
178 } |
|
179 \def\CSgobbleescape#1{\ifnum`\\=`#1 \else #1\fi} |
|
180 \def\WriteCommentLine#1{\def\CStmp{#1}% |
|
181 \immediate\write\CommentStream{\CSstringmeaning\CStmp}} |
|
182 |
|
183 % 3.1 change: in LaTeX and LaTeX2e prevent grouping |
|
184 \if 0% |
|
185 \ifx\fmtname\latexename |
|
186 0% |
|
187 \else \ifx\fmtname\latexname |
|
188 0% |
|
189 \else |
|
190 1% |
|
191 \fi \fi |
|
192 %%%% |
|
193 %%%% definitions for LaTeX |
|
194 %%%% |
|
195 \def\AfterIncludedComment |
|
196 {\immediate\closeout\CommentStream |
|
197 \input{\CommentCutFile}\relax |
|
198 }% |
|
199 \def\TossComment{\immediate\closeout\CommentStream} |
|
200 \def\BeforeIncludedComment |
|
201 {\immediate\openout\CommentStream=\CommentCutFile |
|
202 \let\ThisComment\WriteCommentLine} |
|
203 \def\includecomment |
|
204 #1{\message{Include comment '#1'}% |
|
205 \csarg\let{After#1Comment}\AfterIncludedComment |
|
206 \csarg\def{#1}{\BeforeIncludedComment |
|
207 \ProcessComment{#1}}% |
|
208 \CommentEndDef{#1}} |
|
209 \long\def\specialcomment |
|
210 #1#2#3{\message{Special comment '#1'}% |
|
211 % note: \AfterIncludedComment does \input, so #2 goes here! |
|
212 \csarg\def{After#1Comment}{#2\AfterIncludedComment#3}% |
|
213 \csarg\def{#1}{\BeforeIncludedComment\relax |
|
214 \ProcessComment{#1}}% |
|
215 \CommentEndDef{#1}} |
|
216 \long\def\processcomment |
|
217 #1#2#3#4{\message{Lines-Processing comment '#1'}% |
|
218 \csarg\def{After#1Comment}{#3\AfterIncludedComment#4}% |
|
219 \csarg\def{#1}{\BeforeIncludedComment#2\relax |
|
220 \ProcessComment{#1}}% |
|
221 \CommentEndDef{#1}} |
|
222 \def\leveledcomment |
|
223 #1#2{\message{Include comment '#1' up to level '#2'}% |
|
224 %\csname #1IsLeveledCommenttrue\endcsname |
|
225 \csarg\let{After#1Comment}\AfterIncludedComment |
|
226 \csarg\def{#1}{\BeforeIncludedComment |
|
227 \ProcessCommentWithArg{#1}}% |
|
228 \CommentEndDef{#1}} |
|
229 \else |
|
230 %%%% |
|
231 %%%%plain TeX and other formats |
|
232 %%%% |
|
233 \def\includecomment |
|
234 #1{\message{Including comment '#1'}% |
|
235 \csarg\def{#1}{}% |
|
236 \csarg\def{end#1}{}} |
|
237 \long\def\specialcomment |
|
238 #1#2#3{\message{Special comment '#1'}% |
|
239 \csarg\def{#1}{\def\ThisComment{}\def\AfterComment{#3}#2% |
|
240 \ProcessComment{#1}}% |
|
241 \CommentEndDef{#1}} |
|
242 \fi |
|
243 |
|
244 %%%% |
|
245 %%%% general definition of skipped comment |
|
246 %%%% |
|
247 \def\excludecomment |
|
248 #1{\message{Excluding comment '#1'}% |
|
249 \csarg\def{#1}{\let\AfterComment\relax |
|
250 \def\ThisComment####1{}\ProcessComment{#1}}% |
|
251 \csarg\let{After#1Comment}\TossComment |
|
252 \CommentEndDef{#1}} |
|
253 |
|
254 \if 0% |
|
255 \ifx\fmtname\latexename |
|
256 0% |
|
257 \else \ifx\fmtname\latexname |
|
258 0% |
|
259 \else |
|
260 1% |
|
261 \fi \fi |
|
262 % latex & latex2e: |
|
263 \def\EndOfComment#1{\endgroup\end{#1}% |
|
264 \csname After#1Comment\endcsname} |
|
265 \def\CommentEndDef#1{{\escapechar=-1\relax |
|
266 \csarg\xdef{End#1Test}{\string\\end\string\{#1\string\}}% |
|
267 }} |
|
268 \else |
|
269 % plain & other |
|
270 \def\EndOfComment#1{\endgroup\AfterComment} |
|
271 \def\CommentEndDef#1{{\escapechar=-1\relax |
|
272 \csarg\xdef{End#1Test}{\string\\end#1}% |
|
273 }} |
|
274 \fi |
|
275 |
|
276 \excludecomment{comment} |
|
277 |
|
278 \endinput |