奇怪的参数吸收,使用 \color

奇怪的参数吸收,使用 \color

我刚刚注意到一个奇怪的行为,当用调用结束宏时\color{<color>},其净效果似乎吸收了后续的空间。我意识到最简单的做法就是构造我的宏来使用\textcolor而不是\color(出于许多原因,包括我所理解的斜体校正);然而,我只是想知道为什么以及如何出现这种行为。

这里我有一个宏\flag,它的定义以 结尾\color{black}。我这样调用它

\flag{<argument>} subsequent text

而“后续”之前的空间,奇怪的是,被吸收了。

\documentclass{article}  
\usepackage{xcolor}
\newcommand\flag[1]{\color{red}#1\color{black}}
\begin{document}
This is \flag{very unusual} behavior, using \verb|\color|.

\renewcommand\flag[1]{\color{red}#1\color{black}{}}
This is \flag{very typical} behavior, adding an empty group to \verb|\color|.

\renewcommand\flag[1]{\textcolor{red}{#1}}
This is \flag{very typical} behavior, using \verb|\textcolor|.
\end{document}

在此处输入图片描述

如您所见,我可以通过使用\textcolor或甚至在宏定义末尾添加一个空白组来避免此问题,以使\flag定义以 结尾\color{black}{}。 尽管如此,这种行为似乎违反了参数吸收的正常预期。

更新:

也许问题与论证吸收无关,因为

This is \color{red}very unusual\color{black} behavior

也表现出相同的行为。因此,egreg 的建议\ignorespaces更有意义。

因此,对于声称这是有目的的大卫来说,问题可能是,\ignorespaces作为\color定义的一部分,这样做的目的是什么?

答案1

它并不存在在第一个测试版本中,变更日志显示它\ignorespaces是在 1994/04/01 中添加的,那是很久以前了。

基本上,颜色界面的设计意图是让最终用户尽可能地感觉到它就像字体变化一样,尽管内部机制完全不同。

具体来说,在这种情况下,我想3保持原样,而不是像2

\documentclass{article}

\usepackage{color}

\begin{document}

1
{\itshape
one two three
}

2
{\let\ignorespaces\relax\color{red}
one two three
}

3
{\color{red}
one two three
}


\end{document}

在此处输入图片描述

答案2

% color.sty, line 86:
\DeclareRobustCommand\color{%
  \@ifnextchar[\@undeclaredcolor\@declaredcolor}

% color.sty, line 94:
\def\@declaredcolor#1{%
  \@ifundefined{\string\color @#1}%
    {\c@lor@error{`#1'}}%
    {\expandafter\let\expandafter\current@color
     \csname\string\color @#1\endcsname
     \set@color}%
  \ignorespaces}

现在应该清楚了:\ignorespaces使\color{black}x和完全等价。如果在定义中\color{black} x添加尾随,则查找并结束其工作。{}\ignorespaces{

答案3

我是在说建议使用是愚蠢的行为吗xspace

\documentclass{article}  
\usepackage{xcolor}
\usepackage{xspace}
\newcommand\flag[1]{\color{red}#1\color{black}\xspace}
\begin{document}
This is \flag{very unusual} behavior, using \verb|\color|.

\renewcommand\flag[1]{\color{red}#1\color{black}{}}
This is \flag{very typical} behavior, adding an empty group to \verb|\color|.

\renewcommand\flag[1]{\textcolor{red}{#1}}
This is \flag{very typical} behavior, using \verb|\textcolor|.
\end{document}

相关内容