定义宏和空行的问题

定义宏和空行的问题

我正在使用以下命令来为一些文本添加颜色:

{\color{NavyBlue}

Text Here!

}

因为我经常使用它,所以我创建了这个宏:

\def\cl#1{{\color{NavyBlue}{#1}}}

{}当我使用第一个时,我可以在和文本之间留空行,这意味着我可以这样做:

{\color{NavyBlue}
%Blank line
%Blank line
Text!
%Blank line
%Blank line
}

另一方面,当我使用定义的宏时,我无法执行此操作,因为会出现错误“段落在 \cl 完成之前结束”。

\cl
{
%Blank line
Text Here!
%Blank line
}

这不是关于如何使用已定义的宏的解决方案的问题,因为当我不留下空行时,它工作正常。我想问的是为什么会发生这种情况,以及如何定义宏来像命令一样工作{\color{}}

平均能量损失

\documentclass{article}

\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}

\def\cl#1{{\color{NavyBlue}{#1}}}

\begin{document}

Text here

\end{document}

答案1

当你使用\def你定义的宏的参数时不能包含\par(或空白行,是一样的)。这是 Knuth 添加的一个功能,用于捕获“失控参数”,即参数周围被遗忘的右括号。

有一种解决方法,事实上,LaTeX 默认并不在其\newcommand功能中使用此功能。

所以\newcommand你没有遇到问题。但是,你的定义并不安全:

\newcommand{\cl}[1]{{\leavevmode\color{NavyBlue}#1}}

会好得多。请注意,周围的括号#1不是必需的。

故事的道德启示:\def除非您知道自己在做什么,并且已经阅读过 TeXbook 第 20 章至少两遍,否则请勿使用。;-)

答案2

\def不是 latex 命令,您应该使用\newcommand,然后\par在参数中允许空行()。\long\def也可以工作,但也不是 latex。

但你可能想使用

\textcolor{NavyBlue}{#1}

而不是

{\color{NavyBlue}{#1}}

就像\color在段落的开头那样,可能会产生不良后果。

相关内容