本文已加入专栏文章目录,归入「进阶使用」文章系列。
基本用法
LaTeX 的comment
宏包(https://ctan.org/pkg/comment)提供了相当于通用编程语言中多行注释的功能。以宏包默认提供的 comment
环境为例,以下输入(几乎)不会输出任何内容。
begin{
comment}
avd
fi
lipsum
end{
comment}
使用 comment
环境,比简单的 iffalse <contents> fi
形式的注释更安全和可靠。 如果 <contents>
的展开结果中包含(未与 if<xxx>
配对的) else
或 fi
,这种简单的「注释」就会失效。
使用限制
comment
环境,和用户使用该宏包提供的 includecomment
命令制定的其他(注释)环境,在用于「注释环境内容」时,受到以下限制[1]
end{comment}
独占一行,且之前(从行首开始)和之后(直到换行符前)都不包含任何其他内容
宏包文档中的原文是(从源码里反映的实际的约束条件,要稍微宽松一些)
The opening and closing commands (akabegin{comment}
andend{comment}
) should appear on a line of their own. No starting spaces, nothing after it.
以下的两种,都是错误的用法
%% 错误用法 1,"end{comment}" 之后包含额外符号 "%"
end{
comment}%
%% 错误用法 2,"end{comment}" 之前包含额外符号 " "
end{
comment}
如果还想使用 comment
宏包提供的其他功能,如在「先把环境内容输出到外部文件,之后再插入此外部文件」,begin{comment}
也需遵守类似规则。
尝试突破限制
以上的限制,使得 end{comment}
无法参与缩进,或带来不便。以「允许 end{comment}
所在行的行首包含空格」为改进目标,以下提供一种尝试。
documentclass{
article}
usepackage{
comment}
makeatletter
% helper
def@err#1{
PackageError{
COMMENT}{
#1}{}}
% new
defx@test#1#2@empty{
%
if#1 expandaftert@testelseexpandafterf@testfi{
#1}{
#2}}
deft@test#1#2{
x@test #2@empty} % true clause
deff@test#1#2{
deftest{
#1#2}} % false clause
% renew
{