如何从 LaTeX3 中的函数返回值

如何从 LaTeX3 中的函数返回值

我有这个 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} 

相关内容