我构建了一对宏 --\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 将引发错误。