以下是我想做的事情:
\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}