在奇怪的参数中使用:冒号字符 — expl3

在奇怪的参数中使用:冒号字符 — expl3

由于\ExplSyntaxOncatcode 的改变,:在外部使用宏时会导致带有奇怪参数的命令中断。

\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

相关内容