在 expl3 语法下,冒号上的 SplitArgument 不起作用

在 expl3 语法下,冒号上的 SplitArgument 不起作用
\documentclass{article}
\usepackage{xparse}

\DeclareDocumentCommand\TestA{>{\SplitArgument{1}{:}}m}{%
  \Example #1
}

\ExplSyntaxOn
\DeclareDocumentCommand\TestB{>{\SplitArgument{1}{:}}m}{
  \Example #1
}
\ExplSyntaxOff


\DeclareDocumentCommand\Example{mm}{%
  \begin{enumerate}
  \item #1
  \item #2
  \end{enumerate}
}

\begin{document}
\TestA{one : two}
\TestB{one : two}
\end{document}

输出

答案1

解决这个问题的一种方法是使用著名的\lowercase技巧(但请注意,它使用了一个\tex_...:D函数,因此应该避免使用;如果可能的话,选择第二个版本):

\ExplSyntaxOn

\group_begin:
\char_set_lccode:nn { `? } { `: }
\tex_lowercase:D {
  \group_end:
  \NewDocumentCommand\TestB{>{\SplitArgument{1}{?}}m}
}{
  \Example #1
 }

\ExplSyntaxOff

另一种方法是使用\begingroup\edef\x技巧:

\ExplSyntaxOn

\group_begin:
\use:x{
  \group_end:
  \NewDocumentCommand\exp_not:N\TestB{>{\SplitArgument{1}{\tl_to_str:n { : } }}m}
}{
  \Example #1
 }

\ExplSyntaxOff

完整示例

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\group_begin:
\char_set_lccode:nn { `? } { `: }
\tex_lowercase:D {
  \group_end:
  \NewDocumentCommand\TestA{>{\SplitArgument{1}{?}}m}
}{
  \Example #1
 }

\group_begin:
\use:x{
  \group_end:
  \NewDocumentCommand\exp_not:N\TestB{>{\SplitArgument{1}{\tl_to_str:n { : } }}m}
}{
  \Example #1
 }

\ExplSyntaxOff

\DeclareDocumentCommand\Example{mm}{%
  \begin{enumerate}
  \item #1
  \item #2
  \end{enumerate}
}

\begin{document}
\TestA{one : two}
\TestB{one : two}
\end{document}

在此处输入图片描述

\DeclareExpandableDocumentCommand请注意,如果用 处理参数,则使用毫无意义\SplitArgument

下划线也存在此问题,但是这有点困难,因为_通常具有类别代码 8。

\ExplSyntaxOn

\group_begin:
\char_set_lccode:nn { `? } { `: }
\char_set_catcode_math_subscript:n { `? }
\tex_lowercase:D {
  \group_end:
  \NewDocumentCommand\TestB{>{\SplitArgument{1}{?}}m}
}{
  <code for the definition
 }

\ExplSyntaxOff

相关内容