我继续学习expl3
,但我不明白用户定义函数的一些行为,它返回一个整数值(正如我所想的那样)。
我想使用返回的整数\count_number_of_elements:n
进行进一步的操作。
如果我直接使用我的函数,\count_number_of_elements:n
它运行良好并输出正确的数字。但我需要将其输出分配给一个整数变量。我该怎么做?
平均能量损失
一个或多或少真实的例子:“最长的 Collatz 序列”来自欧拉计划问题(但我想避免剧透)
\documentclass[12pt]{article}
\usepackage{xparse}
\ExplSyntaxOn
\int_new:N \l_initial_number_int
\cs_new:Nn \count_number_of_elements:n
{
\int_new:N \l_number_int
\int_set:Nn \l_number_int {1}
\int_set:Nn \l_initial_number_int {#1}
\int_do_while:nn
{\l_initial_number_int != 1}
{
\int_incr:N \l_number_int
\int_if_even:nTF {\l_initial_number_int}
{\int_set:Nn \l_initial_number_int {\l_initial_number_int/2} }
{\int_set:Nn \l_initial_number_int {3*\l_initial_number_int + 1} }
}
\int_use:N \l_number_int
}
\NewDocumentCommand{\MaxNumber}{m}
{
% Code for defining starting number, produces the longest chain. According to my idea, this code should use integer number produced by \count_number_of_elements:n
% say I need get output of \count_number_of_elements:n
\int_set:Nn \l_tmpa_int {\count_number_of_elements:n {#1}}
}
\ExplSyntaxOff
\begin{document}
\end{document}
答案1
这里有两种可能的方法。如果你想允许函数在第二个参数之类的东西“内部”使用,那么\int_set:Nn
它必须是可扩展。这意味着它只能使用其他本身可扩展的函数,也就是说它们用星号expl3
标记。所以interface3
\cs_new:Npn \my_function:n #1
{
\int_eval:n {#1}
}
会起作用,但是
\cs_new:Npn \my_function:n #1 % See below: should be protected
{
\int_set:Nn \l_tmpa_tl {#1}
\int_eval:n {#1}
}
不会照\int_set:Nn
原样不是标有星号。
当您想要使用不可扩展函数时,就需要第二种方法:您必须安排设置一个用于返回的变量:
\cs_new_protected:Npn \my_function:Nn #1#2
{
\int_set:Nn \l_tmpa_int {#2}
\int_set_eq:NN #1 \l_tmpa_int
}
(当然,在实际应用中还会发生更多的事情。)
注意许多问题可以通过扩展来解决,尽管这可能会非常耗时,具体取决于手头的问题。任何涉及排版或分配的事情都是明确排除:排版没有通过扩展而产生的“结果”,而 TeX 中的赋值是不可扩展的。(如果您使用 LuaTeX,您可以在 Lua 中进行赋值,但整个问题就不同了。)
请注意不是在这里使用xparse
:这些是代码级别不是文档级别命令。因此,我习惯于\cs_new:Npn
创建可扩展的代码接口和 \cs_new_protected:Npn
不可扩展的代码接口。