我正在使用以下命令来为一些文本添加颜色:
{\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
在段落的开头那样,可能会产生不良后果。