我有这个 MWE 尝试从\l_example_foo_int
一个函数返回一个值:
\documentclass[a4paper]{article}
\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\returnvalue}{}{
\int_new:N \l_example_foo_int
\int_add:Nn \l_example_foo_int {10}
% return value
\l_example_foo_int
}
\begin{document}
Should print value here:
\returnvalue
\int_new:N \l_example_bar_int
\int_add:Nn \l_example_bar_int \returnvalue
Should print value here:
\l_example_bar_int
\end{document}
但是它会引发一个错误。
想知道如何获取它,以便它可以从函数返回一个值,并且可以对该值进行排版或\typeout
诸如此类。
答案1
\int_add:Nn
不可扩展,即无法\int_add:Nn
再次正确送入。
我建议使用两个单独的命令,一个命令添加一个值,另一个命令是的包装器\l_example_foo_int
。
然而,真正的用例尚不清楚,因此很可能整个包装\returnvalue
并不是真正必要的。
除非确实检查,否则不要\...new:N
在文档级宏内使用调用。原始调用的下一个调用\returnvalue
将尝试\int_new:N ...
再次定义,这是一个错误。
\documentclass[a4paper]{article}
\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\int_new:N \l_example_foo_int
\int_new:N \l_example_bar_int
\NewDocumentCommand{\addvalue}{}{
\int_add:Nn \l_example_foo_int {10}
}
\NewDocumentCommand{\returnvalue}{}{
\int_use:N \l_example_foo_int
}
\begin{document}
Should print value here:
\addvalue
\returnvalue
\int_add:Nn \l_example_bar_int {\returnvalue}
Should print value here:
\int_use:N \l_example_bar_int
\end{document}
答案2
\int_add:Nn
不可扩展(文档中没有红星)。所以它不会像这样工作。但您可以使用 \int_eval:Nn:
\documentclass[a4paper]{article}
\usepackage{xparse}
\begin{document}
\ExplSyntaxOn
\int_new:N \l_example_foo_int
\int_new:N \l_example_bar_int
\NewDocumentCommand\returnvalue {} {
\int_eval:n { \l_example_foo_int + 10}
}
\returnvalue\par
\int_add:Nn \l_example_bar_int {\returnvalue}
\int_use:N \l_example_bar_int
\ExplSyntaxOff
\end{document}