lib/texinputs/comment.sty
changeset 55224 197c36bb30ad
equal deleted inserted replaced
55214:48a347b40629 55224:197c36bb30ad
       
     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