递归或嵌套注释块

递归或嵌套注释块

\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}跟踪全局计数器中的嵌套情况。所有其他行将被完全忽略。

相关内容