让我们看一个简单的例子:获取一个标记列表的头和尾并反转顺序:
\documentclass{article}
\usepackage{xparse}
\usepackage{expl3}
\ExplSyntaxOn
\cs_set:Npn \cs_split:n #1 {
\tl_set:Nn \l_tmpa_tl {\tl_head:n {#1}}
\tl_set:Nn \l_tmpb_tl {\tl_tail:n {#1}}
\tl_use:N \l_tmpb_tl
\tl_use:N \l_tmpa_tl
}
\NewDocumentCommand\Split { m } { \cs_split:n #1 }
\ExplSyntaxOff
\begin{document}
\Split{wXYZ}
\end{document}
我希望输出是“XYZw”,但事实上,它与输入“wXYZ”相同。
答案1
\cs_split:n
您忘记了定义中参数周围的一对括号\Split
:
\documentclass{article}
\usepackage{xparse}
\usepackage{expl3}
\ExplSyntaxOn
\cs_set:Npn \cs_split:n #1 {
\tl_set:Nn \l_tmpa_tl {\tl_head:n {#1}}
\tl_set:Nn \l_tmpb_tl {\tl_tail:n {#1}}
\tl_use:N \l_tmpb_tl
\tl_use:N \l_tmpa_tl
}
\NewDocumentCommand\Split { m } { \cs_split:n { #1 } }
\ExplSyntaxOff
\begin{document}
\Split{wXYZ}
\end{document}
答案2
您正在调用\cs_split:n wXYZ
,并且函数的参数只是w
。请记住始终用括号括住n
- 类型参数。
另一方面,您正在使用不必要的工具:
\documentclass{article}
\usepackage{expl3} % actually not needed, it's loaded by xparse
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\Split}{m}
{
\kevin_split:n { #1 }
}
\cs_new:Npn \kevin_split:n #1
{
\tl_tail:n { #1 }
\tl_head:n { #1 }
}
\ExplSyntaxOff
\begin{document}
\Split{wXYZ}
\end{document}
没有必要使用标记列表变量。此外,您应该使用\cs_new:Npn
而不是\cs_set:Npn
(不检查定义性)而不是前缀cs
,这是内核保留的。