我尝试了两种解决方案原始帖子,没有用。-NoValue-
破坏了输出。
\documentclass{report}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Nn \__erw_foo:nnn
{%
(#1)(#2)(#3)%
}
\NewDocumentCommand{\Foo}
{>{\SplitArgument{3}{;}}mm}
{
\__erw_foo:nnn #1 [#2]
}
%https://tex.stackexchange.com/questions/197390/splitargument-on-colon-doesnt-work-under-expl3-syntax#comment457616_197390
\group_begin:
\char_set_lccode:nn { `? } { `; }
\tex_lowercase:D {
\group_end:
\NewDocumentCommand\Qux{>{\SplitArgument{3}{?}}mm}
}{
\__erw_foo:nnn #1 [#2]
}
\group_begin:
\use:x{
\group_end:
\NewDocumentCommand\exp_not:N\Blah{>{\SplitArgument{3}{\tl_to_str:n { ; } }}mm}
}{
\__erw_foo:nnn #1 [#2]
}
\ExplSyntaxOff
\begin{document}
% WANTED: (a,b)(c,d)(e)[f]
\Foo{a,b;c,d;e}{f}
\Qux{a,b;c,d;e}{f}
\Blah{a,b;c,d;e}{f}
\end{document}
更新:
但这有效:
\NewDocumentCommand{\Baz}
{>{\SplitList{;}}mm}
{
\__erw_foo:nnn #1 [#2]
}
也许检查列表中是否有 3 个元素?
答案1
您误用了 的第一个参数\SplitArgument
。第一个参数给出了分隔符在输入中,而不是项目。由于您想要有三个项目,因此需要两个分隔符,而不是三个。因此,只需将 替换\SplitArgument{3}{...}
为\SplitArgument{2}{...}
。
顺便说一下,原始帖子之所以需要 ,是因为:
后面的类别代码为 11(字母)\ExplSyntaxOn
,而 后面的类别代码通常为 12(其他)\ExplSyntaxOff
,因此 TeX 不会将它们视为相同的字符。但是 的情况并非如此;
,因此至少在您的 MWE 中不需要这些复杂性,其中 一直具有类别代码 12(其他)。这就是为什么在固定示例中和一样好用的;
原因。\Foo
\Qux
\Blah
此外,在 régime 下,典型的行尾百分号是不需要的\ExplSyntaxOn
,因为空格会被忽略。最后,我应用了符合xparse
手册的格式。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Nn \__erw_foo:nnn
{
(#1)(#2)(#3)
}
\NewDocumentCommand \Foo { >{ \SplitArgument { 2 } { ; } } m m }
{
\__erw_foo:nnn #1 [#2]
}
\group_begin:
\char_set_lccode:nn { `? } { `; }
\tex_lowercase:D
{
\group_end:
\NewDocumentCommand \Qux { >{ \SplitArgument { 2 } { ? } } m m }
}
{ \__erw_foo:nnn #1 [#2] }
\group_begin:
\use:x
{
\group_end:
\NewDocumentCommand \exp_not:N \Blah
{ >{\SplitArgument { 2 } { \tl_to_str:n { ; } } } m m }
}
{ \__erw_foo:nnn #1 [#2] }
\ExplSyntaxOff
\begin{document}
\Foo{a,b;c,d;e}{f}
\Qux{a,b;c,d;e}{f}
\Blah{a,b;c,d;e}{f}
\end{document}