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}
因为它只接受一个参数,吞噬该参数并忽略其后的任何空格。以下是相对于其他\comment
s 的一些用法示例:
\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}