\begin{comment}
我知道我们可以使用和命令注释掉 Latex 中的一段文本\end{comment}
。但是,当我以递归方式(或嵌套方式)调用它时(如下所示),它会失败:
\begin{comment} % block 1
some text
\begin{comment} % block 2
some text
\end{comment} % block 2
some text
\end{comment} % block 1
上述代码应该注释整个文本,但却出现错误。例如,当我后来决定删除块 1 的注释,但仍想保留块 2 的注释时,我需要上述代码。
这只是一个简单的例子。我们还可以在块 1 中再添加一个块 3,然后决定保留块 3 的注释,但删除块 1 和 2。
答案1
comment
这是一个支持嵌套的环境的简单版本:
\documentclass{article}
\makeatletter
\newcount\comment@nesting
\newenvironment{comment}{%
\begingroup
\global\comment@nesting=0
\def\do##1{\catcode`##1=12\relax}%
\dospecials
\catcode`\^^M=\active
\comment@processline
}{%
\endgroup
}
\begingroup
\escapechar=-1
\xdef\comment@begincomment{\string\\begin\string\{comment\string\}}
\xdef\comment@endcomment{\string\\end\string\{comment\string\}}
\endgroup
\begingroup
\catcode`\^^M=\active
\def\@temp{\endgroup\def\comment@processline##1^^M}%
\@temp{%
\def\comment@curline{#1}%
\let\@next=\comment@processline
\ifx\comment@curline\comment@endcomment
\ifnum\comment@nesting=0
\def\@next{\end{comment}}%
\else
\global\advance\comment@nesting by -1
\fi
\else
\ifx\comment@curline\comment@begincomment
\global\advance\comment@nesting by 1
\fi
\fi
\@next
}
\makeatother
\parindent=0pt
\begin{document}
Some
\begin{comment}
simple comment
\end{comment}
text.
\begin{enumerate}
\item First
\item Second
\begin{comment}
\item Commented out
\end{comment}
\item Third
\end{enumerate}
More
\begin{comment}
simple comment
\begin{comment}
nested comment
\begin{comment}
even deeper nested comment
\end{comment}
\begin{comment}
another deeply nested comment
\end{comment}
some odd characters: _^$%&#
unbalanced braces: }}}}{{{
ignored end of comment:
\end{comment}
\end{comment}
simple comment again
\end{comment}
text.
\end{document}
输出
\begin{comment}
启动逐行处理以下代码的逐字环境。每行内容都会根据序列进行测试\begin{comment}
,并\end{comment}
跟踪全局计数器中的嵌套情况。所有其他行将被完全忽略。