\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