textcolor
我很好奇,发现包中定义的宏有以下定义xcolor
:
\def\textcolor#1#{\@textcolor{#1}}
\def\@textcolor#1#2#3{\protect\leavevmode{\color#1{#2}#3}}
但是,我使用的宏仅具有两个参数而不是三个参数:
\textcolor{blue}{foo}
我不明白这个定义的含义是:
- 这个语法是什么意思
\textcolor#1#
? \@textcolor
在上面的例子中,宏将获得的第三个参数是什么?
答案1
这是原始的 tex 语法,实际上不应该在 latex 包中使用。它在这里使用,因为在 1993 年,我们把这一切都装进一台 640K 的机器里真的由于空间不足,通过快捷定义来节省几十个字节是值得的。
如果你走的话
\def\foo#1#{zzz #1 zzz}
然后#1
是从\foo
第一个括号开始的所有内容,所以
\foo one two three {zzz}
那么#1
就是one two three
使用此功能可以\textcolor
获取任何可选参数而无需实际解析它们,然后重新插入它们以便\color
看到它们。
所以比较一下
\textcolor{blue}{foo}
和
\textcolor[rgb]{0,0,1}{foo}
在第一种情况下#1
是空的,所以扩展是
\@textcolor{}{blue}{foo}
即
\protect\leavevmode{\color{blue}foo}
但在第二种情况下#1
是[rgb]
(包括括号),所以第一个扩展是
\@textcolor{[rgb]}{0,0,1}{foo}
即
\protect\leavevmode{\color[rgb]{0,0,1}foo}
因此[rgb]
实际上从未被视为\textcolor
可选参数,它只是被抓取并传递给\color
。