由于\ExplSyntaxOn
catcode 的改变,:
在外部使用宏时会导致带有奇怪参数的命令中断。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_set:Npn \my_foo:w #1:#2\q_stop {
(#1)
}
\newcommand{\foo}[1]{
\my_foo:w #1:\q_stop
}
\foo{abc:def} % works
\ExplSyntaxOff
\foo{abc:def} % doesn't work
\end{document}
是否存在类似于\c_math_subscript_token
但对于结肠而言的常数?
答案1
问题在于,在\ExplSyntaxOn
冒号的范围内有类别代码 11,但在文档中它有类别代码 12。
您可以将所需的参数文本存储在标记列表中,然后使用其值:
\documentclass{article}
\ExplSyntaxOn
\tl_set:Nx \l_tmpa_tl { ##1 \c_colon_str ##2 }
\exp_last_unbraced:NNV \cs_set:Npn \my_foo:w \l_tmpa_tl \q_stop
{
(#1)
}
\NewExpandableDocumentCommand{\foo}{m}
{
\my_foo:w #1:\q_stop
}
\ExplSyntaxOff
\begin{document}
\foo{abc:def}
\end{document}
答案2
除了更改定义中的冒号之外,您还可以在读取参数之前更改 catcode,这样做的好处是您的命令可以在 \ExplSyntax 内部和外部工作:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_set:Npn \__antshar_foo:w #1:#2\q_stop {
(#1)
}
\cs_new:Npn \foo
{
\group_begin: \char_set_catcode_letter:N :
\__anthshar_foo_aux:n
}
\cs_new:Npn \__anthshar_foo_aux:n #1
{
\group_end: \__antshar_foo:w #1:\q_stop
}
\foo{abc:def} % works
\ExplSyntaxOff
\foo{abc:def} % works
\end{document}
答案3
这是一个解决方法(但定义是全局的)。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
{
\catcode`\: = 12
\expandafter \gdef \csname my_foo:w \endcsname #1 : #2 \q_stop { (#1) }
}
\newcommand{\foo}[1]{ \my_foo:w #1:\q_stop }
\ExplSyntaxOff
\foo{abc:def} % does work
\end{document}
答案4
您可以使用 TeX 原语\def
,无需 Expl3:
\def\foo#1{\fooA#1\end}
\def\fooA#1:#2\end{(#1)}
\foo{abc:def} % works