在 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 } }
正在定义的命令的替换文本。