expl3 替换 \lowercase 技巧

expl3 替换 \lowercase 技巧

给出此示例代码:

\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被使用。

此代码有两个问题:

  1. 该技巧的相关行使用了一个“不使用”函数,即\tex_lowercase:D。有没有一种更惯用的方法,使用 -only 函数替换整个模式expl3
  2. 根据 的文档\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}

在此处输入图片描述

相关内容