给出此示例代码:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\group_begin:
\char_set_catcode_active:n { `\* }
\cs_new_protected:Npn \foo #1
{
\group_begin:
\char_set_catcode_active:N \
\char_set_lccode:nn { `\* } { `\ }
\tex_lowercase:D { \cs_set:Npn * } { Y }
% \tl_lower_case:n { \cs_set:Npn * } { Y }
#1
\group_end:
}
\group_end:
\ExplSyntaxOff
\begin{document}
\begingroup
\catcode`\ \active
\gdef {X}
\gdef\fooarg{ }
\endgroup
\fooarg
\expandafter\foo\expandafter{\fooarg}
\end{document}
在活动空间的参数中,\foo
字符被重新映射到新的含义。为了不将活动空间纳入整个定义的范围\foo
,诀窍\lowercase
被使用。
此代码有两个问题:
- 该技巧的相关行使用了一个“不使用”函数,即
\tex_lowercase:D
。有没有一种更惯用的方法,使用 -only 函数替换整个模式expl3
? 根据 的文档
\char_set_lccode:nn
,\tl_lower_case:n
似乎是“官方”\tex_lowercase:D
替换函数。但在上面的代码中使用时会产生错误! Undefined control sequence. <argument> *
不仅如此,
*
其他几个角色也是如此。为什么会这样?
答案1
由于 ,无需使用\lowercase
技巧(以定义附加函数为代价)来本地设置活动字符的含义\char_set_active_eq:nN
。
但是,你不应该\foo
用参数来定义,否则参数将被收集和标记。前空间变得活跃起来。
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_protected:Npn \foo
{
\group_begin:
\cs_set:Npn \siracusa_test: { Y }
\char_set_active_eq:nN { `\ } \siracusa_test:
\char_set_catcode_active:n { `\ }
\__siracusa_foo:n
}
\cs_new_protected:Npn \__siracusa_foo:n #1
{
#1
\group_end:
}
\ExplSyntaxOff
\begin{document}
\begingroup
\catcode`\ \active
\gdef {X}
\gdef\fooarg{ }
\endgroup
\fooarg
\expandafter\foo\expandafter{\fooarg}
\end{document}