expl3:从循环中生成参数

expl3:从循环中生成参数

以下是我想做的事情:

\documentclass{minimal}
\usepackage{expl3}
\ExplSyntaxOn

\cs_new_protected:Npn \erw_loop:n #1
{
    \int_zero:N \l_tmpa_int
    \int_do_while:nNnn 
        {\l_tmpa_int} < {#1} 
        {
            \int_incr:N \l_tmpa_int
            {\int_to_Alph:n{\l_tmpa_int}} 
        }
        {}
}


\begin{document}

\use_ii:nnn{A}{B}{C}\\ % B

\erw_loop:n{3}\\ % ABC

\use_ii:nnn\erw_loop:n{3} % 3 % would like B


\ExplSyntaxOff
\end{document}

\exp_args:我之前尝试过不同的版本\use_ii,但没有成功。也许你知道一种可行的方法?

答案1

你的其它问题这是一个扩展问题。如其签名所示,它\use_ii:nnn接受三个参数并返回其中的第二个参数。在示例中

\use_ii:nnn\erw_loop:n{3}

第一个参数是\erw_loop:n,第二个参数是3,第三个参数是 ,\ExplSyntaxOff它在下面几行,但在 ExplSyntax 区域内,空格和换行符会被忽略。这会导致一种病态的情况,即您意外删除了\ExplSyntaxOff,但幸运的是,这不会造成伤害,因为下一个语句是\end{document}。您想要的是以下

\exp_last_unbraced:Nx \use_ii:nnn { \erw_loop:n { 3 } }

因为这会扩展为

\use_ii:nnn ABC

鉴于它\erw_loop:n { 3 }是完全可扩展的,而您的代码中也没有给出这一点。它不仅被\erw_loop:n标记为受保护,从一开始就禁止扩展,而且还执行永远不可扩展的分配。因此,我将主体重写为

\int_step_function:nN { #1 } \int_to_Alph:n

该函数\int_step_function:nN有条件可扩展,这意味着当且仅当其所有参数都完全可扩展时,它才是完全可扩展的。由于#1无论如何都必须可扩展(它必须扩展为有效表达式,可被 消化\int_eval:n)并且\int_to_Alph:n也是可扩展的,因此可以确保这一点。

我仍然认为这不是处理这个问题的好方法。如果\erw_loop:n只返回两个标记怎么办?如果它返回的标记远多于三个怎么办?但由于该示例看起来非常不自然,而且用例对我来说不清楚,所以我无法帮助你。

\documentclass{article}
\usepackage{expl3}

\begin{document}

\ExplSyntaxOn

\cs_new:Npn \erw_loop:n #1
  {
    \int_step_function:nN { #1 } \int_to_Alph:n
  }

\exp_last_unbraced:Nx \use_ii:nnn { \erw_loop:n { 3 } }

\ExplSyntaxOff

\end{document}

相关内容