我怎么知道在 \seq_set_map 中使用的函数中应该使用 #1 还是 ##1?

我怎么知道在 \seq_set_map 中使用的函数中应该使用 #1 还是 ##1?

在 2021-10-12 的《The LaTeX3 Interfaces (interface3.pdf)》第 148 页上,的文档\seq_set_map:Nn指出,我使用的内联函数应将序列中的每个项目接收为#1。当我按照下面的 MWE 所示执行此操作时,我显然会得到意外的输出。我终于从这个帖子我应该使用它##1

现在我明白了为什么使用#1会产生这样的结果;因为#1是外部函数的参数。所以我的问题是,我是否应该提前知道##1在映射函数中使用,如果是,我怎么知道呢?我理解##1在函数中定义函数并将参数传递给新函数时如何使用,那么这个问题与那个问题有关吗?我突然想到#1文档中提到的可能是指映射函数的参数规范,但如果是这种情况,那么对函数使用(#1)^2内联应该可以工作,但事实并非如此。

% !TEX program = lualatexmk
% !TEX encoding = UTF-8 Unicode

\documentclass{article}

\ExplSyntaxOn
\cs_new:Npn \joe_zzzz:n #1
  {
    \seq_set_from_clist:Nn \l_tmpa_seq { #1 }
    %\seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \joe_square:n { #1 } } % doesn't work
    \seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \joe_square:n { ##1 } } % works
    \seq_use:Nn \l_tmpb_seq { + }
  }
\cs_new:Npn \joe_square:n #1
  {
    (#1)^2
  }
\NewDocumentCommand{ \zzzz }{ m }
  {
    \joe_zzzz:n { #1 }
  }
\ExplSyntaxOff

\begin{document}
\( \zzzz{1,2,3} \)
\end{document}

答案1

您需要#1在映射中,但您在cs_new:Npn \joe_zzzz:n定义中的定义中已经引用了#1参数,因此\joe_zzzz:n您想要 。要在定义中#获取,请使用。###

##被替换为,#就像#1被定义命令的第一个参数替换一样。

所以你的台词

\seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \joe_square:n { ##1 } }

添加

 \seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \joe_square:n { #1 } }

正在定义的命令的替换文本。

相关内容