Latex3 Token-List 命令无法按预期工作

Latex3 Token-List 命令无法按预期工作

让我们看一个简单的例子:获取一个标记列表的头和尾并反转顺序:

\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,这是内核保留的。

相关内容