在命令 \color 中使用带有 expl3 的定义函数时出错

在命令 \color 中使用带有 expl3 的定义函数时出错

在以下 MWE 中,我个人的定义是,\marco_prop_get:nn除非它不在宏内,否则它将起作用\color。代码片段如下:

\ExplSyntaxOn
\cs_new_protected:Npn \marco_prop_get:nn #1 #2
 {
  \prop_get:cn  { l_marco_ #1 _collection_prop } { #2 }
 }
\color{ \marco_prop_get:nn { color } {my-title} } My~ Title
\ExplSyntaxOff

我有点困惑,因为使用\prop_get:Nn效果很好。

\ExplSyntaxOn
\prop_new:N \l_marco_color_collection_prop
\prop_put:Nnn \l_marco_color_collection_prop {my-title} {red}
\color{ \prop_get:Nn\l_marco_color_collection_prop {my-title} } My~ Title
\ExplSyntaxOff

这里是 MWE:

\documentclass{article}
\usepackage{xcolor}
\usepackage{expl3}

\begin{document}
\def\foo{red}
\color{\foo}\foo

\ExplSyntaxOn
\cs_set:Npn \foo { blue }
\ExplSyntaxOff
\color{\foo}\foo

\ExplSyntaxOn
\prop_new:N \l_marco_color_collection_prop
\prop_put:Nnn \l_marco_color_collection_prop {my-title} {red}
\color{ \prop_get:Nn\l_marco_color_collection_prop {my-title} } My~ Title
\ExplSyntaxOff

\ExplSyntaxOn
\cs_new_protected:Npn \marco_prop_get:nn #1 #2
 {
  \prop_get:cn  { l_marco_#1_collection_prop } { #2 }
 }
\exp_after:wN \color \exp_after:wN { \marco_prop_get:nn { color } {my-title} } My~ Title

%\color {  \marco_prop_get:nn { color } {my-title} } My~ Title
\ExplSyntaxOff
\end{document}

你能解释一下为什么没有 的话我的命令就会失败吗\exp_after:wN

请注意,我正在使用 expl3 的 svn 版本。

答案1

它可以与 一起使用color,但据我所知,xcolor它用于\@onelevel@sanitize抑制扩展,因此该参数对于解析其更广泛的颜色语法而言是安全的。因此,您需要确保在\@onelevel@sanitize使用之前进行足够的扩展\meaning。因此需要\expandafter

相关内容