我有两个用于评估数字的代码。第一个用于评估浮点数:
\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}
在第二个例子中我只是改为fp
,int
但是在第二种情况下出现错误:
未定义控制序列
但如果我直接使用\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}
建议在测试期间使用,但在“生产”代码中通常会省略该选项。