使用 LaTeX3 计算带有中间变量的整数的问题

使用 LaTeX3 计算带有中间变量的整数的问题

我有两个用于评估数字的代码。第一个用于评估浮点数:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\evaluate}{m}
 { \fp_set:Nn \l_myvar_fp {#1}
   \fp_eval:n { \l_myvar_fp }

 }
\ExplSyntaxOff
\begin{document}

\evaluate{2+3}

\end{document}

做得很好,我得到了正确的答案。

然后用它来评估整数:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\evaluate}{m}
 { \int_set:Nn \l_myvar_int {#1}
   \int_eval:n { \l_myvar_int }

 }
\ExplSyntaxOff
\begin{document}

\evaluate{2+3}

\end{document}

在第二个例子中我只是改为fpint但是在第二种情况下出现错误:

未定义控制序列

但如果我直接使用\int_eval:n而不使用中间变量,\l_myvar_int那就做得很好。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\evaluate}{m}
 { \int_eval:n { #1 }

 }
\ExplSyntaxOff
\begin{document}

\evaluate{2+3}

\end{document}

只有通过\int_new:N \l_myvar_int它定义变量后才能成功编译。

为什么在第一种情况下代码没有定义新变量,但第二种情况下却没有?

答案1

您尚未声明变量。由于底层实现细节,一些变量类型可能允许您在不声明的情况下设置它们。但是,这不是受支持的(因为我们保留更改事物的权利)。您可以强制expl3检查声明,因此

\documentclass{article}
\usepackage[check-declarations]{expl3}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\evaluate}{m}
 { \fp_set:Nn \l_myvar_fp {#1}
   \fp_eval:n { \l_myvar_fp }

 }
\ExplSyntaxOff
\begin{document}

\evaluate{2+3}

\end{document}

将产生

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! LaTeX error: "check/non-declared-variable"
! 
! The variable \l_myvar_fp has not been declared on line 14.
! 
! See the LaTeX3 documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

出于性能原因,检查并非标准活动:对于作为宏实现的数据类型,检查需要额外的宏代码。

对于开发工作,使用

\usepackage[check-declarations]{expl3}

建议在测试期间使用,但在“生产”代码中通常会省略该选项。

相关内容