一对宏进行注释会导致嵌套使用时出错

一对宏进行注释会导致嵌套使用时出错

我构建了一对宏 --\cmton\cmtoff-- 来评论long codes block

它们工作正常,只是\cmtoff一对中的另一个\cmton...\cmtoff导致错误,如下面的例子所示。

如何改进我的设计使其\cmton \cmtoff可以嵌套使用。

例子:

\documentclass{article}
\long\def\cmton#1\cmtoff{\ignorespaces}

\begin{document}
Usage 1:
|\cmton
This works all right
\cmtoff|

Usage 2:
pre comment\\
\cmton
outer 1
  \cmton %nested
    inner
  \cmtoff %nested. Another \cmtoff nested in \cmton...\cmtoff causes error.
outer 2
\cmtoff 
post comment
\end{document}

答案1

我认为使用 latex 语法更好。

在此处输入图片描述

\documentclass{article}
\usepackage[T1]{fontenc}
\NewDocumentEnvironment{cmt}{+b}{}{\ignorespacesafterend}

\begin{document}
Usage 1:
|\begin{cmt}
This works all right with 
\end{cmt}|

Usage 2:
pre comment\\
\begin{cmt}
outer 1
  \begin{cmt} %nested
    inner
  \end{cmt} %nested. Another \cmtoff nested in \cmton...\cmtoff causes error.
outer 2
\end{cmt}
post comment
\end{document}

答案2

很难理解为什么你想要在评论中添加评论。

有什么问题?你的\cmton定义为

\long\def\cmton#1\cmtoff{\ignorespaces}

(问题中的代码似乎被错误地复制了)将吸收所有内容,直到第一的 \cmtoff与 处于同一括号级别的标记\cmton,因为 TeX 确实对作为参数的一部分被吸收的任何标记的解释都将被提供给宏。*

您可以检查\cmton参数中是否包含。这允许一层嵌套。

但您对 TeX 使用了错误的方法。

\documentclass{article}
\usepackage[T1]{fontenc}

\ExplSyntaxOn

\cs_new_protected:Npn \cmton #1 \cmtoff
 {
  \tl_if_in:nnTF { #1 } { \cmton } { \cmton } { \ignorespaces }
 }

\ExplSyntaxOff

\begin{document}
Usage 1:
|\cmton
This works all right
\cmtoff|

Usage 2:
pre comment
\cmton
outer 1
  \cmton %nested
    inner
  \cmtoff %nested. Another \cmtoff nested in \cmton...\cmtoff causes error.
outer 2
\cmtoff 
post comment

Usage 3:
Again
\cmton
outer
 {\cmton inner\cmtoff}
outer
\cmtoff
post

\end{document}

在此处输入图片描述

现在,请不要问为什么进一步的嵌套不起作用......

脚注
*\par当作为非宏的参数的一部分进行查找时\long,或者当找到\outer标记(未在 LaTeX 中使用)时,TeX 将引发错误。

相关内容