定义注释的宏

定义注释的宏

Wikibooks 上的 LaTeX 书籍提及为(可能是多行)注释定义宏的方式如下:

\newcommand{\comment}[2]{#2}

理由是

\newcommand{\comment}[1]{}

会产生不必要的空间。

但这真的是最好的方法吗?这个宏在所有情况下都能工作吗,即使在文件的最末尾?定义在大多数情况下都有效的注释宏的最佳方法是什么?(当然没有办法定义一个可以工作的注释宏到处

答案1

任何作为命令的定义实际上都不是注释,您不能注释掉%{ 例如,并且它对其他命令来说也不是不可见的。

\fbox
 %  \ { \hhhh
 {aaa}

盒子aaa作为真实的注释会%隐藏行中的所有垃圾,但任何宏\comment都不会在该位置起作用,即使

\fbox
 \comment{xxx}
 {aaa}

的参数\fbox只是\comment{xxx}仍然{aaa}在输入流中,并且事情变得非常错误。

! Argument of \comment has an extra }.
<inserted text> 
                \par 
l.24      \comment
                  {xxx}

如果你添加\ignorespaces以避免间距问题,那么它不会扩展为零,因此

\newcommand\comment[1]{\ignorespaces}

\typeout{aaaa\comment{bbb}ccc}

生产

aaaa\ignorespaces ccc

然而

\newcommand\comment[1]{}

\typeout{aaaa\comment{bbb}ccc}

生产

aaaaccc

使用尾随#2删除空格是危险的,除非您知道您处于一个非常受限制的环境中,并且那里没有{}组。

\newcommand\comment[2]{#2}
\comment{aaa} {\bfseries bbb} ccc

将以ccc粗体显示,因为\comment宏将采用整个{\bfseries bbb}as#2但只返回\bfseries bbb不带括号组的输入流,因此 的\bfseries范围不再仅限于bbb

答案2

对我来说更有意义的是使用

\newcommand{\comment}[1]{\ignorespaces}

因为它只接受一个参数,吞噬该参数并忽略其后的任何空格。以下是相对于其他\comments 的一些用法示例:

在此处输入图片描述

\documentclass{article}
\newcommand{\commentA}[1]{}
\newcommand{\commentB}[2]{#2}
\newcommand{\commentC}[1]{\ignorespaces}
\begin{document}
\commentA{This is a long comment and can extend over multiple lines, etc.} But it won't show. \par
\commentB{This is a long comment and can extend over multiple lines, etc.} But it won't show. \par
\commentC{This is a long comment and can extend over multiple lines, etc.} But it won't show. \par
Something before. \commentA{This is a long comment and can extend over multiple lines, etc.} But it won't show. \par
Something before. \commentB{This is a long comment and can extend over multiple lines, etc.} But it won't show. \par
Something before. \commentC{This is a long comment and can extend over multiple lines, etc.} But it won't show. \par
\end{document}

相关内容