我需要定义一个不带参数的函数,然后定义一个同名但只有一个参数的函数,并从第二个函数内部调用第一个函数。
如果不是这样做的话,我将非常感激,如果您能解释如何以类似的方式创建具有不同数量(和类型)参数的多个函数expl3
(它具有相同函数的多个版本)。
\documentclass[varwidth=50mm]{standalone}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
% no parameters needed
\cs_new:Nn\userDefined_century:{100}
\userDefined_century:
% ----------------------
% following doesn't work
% ERROR: Illegal parameter number in definition of \userDefined_century:N
% ----------------------
% create same function but with parameter this time,
% and set parameter (integer variable) to value of previous function
\cs_new:Nn\userDefined_century:N#1
{ \int_set:N#1\userDefined_century:
}
% create integer and set it with our function
\int_new:N\l_userDefined_number_int
\userDefined_century:N\l_userDefined_number_int
\ExplSyntaxOff
\end{document}
答案1
首先,它是\int_set:Nn
,不是\int_set:N
。节3 设置和增加整数模块l3int
(第 85 页左右)LaTeX3 接口
包含此功能和其他相关功能的文档。
其次,文档\cs_new:Nn
(大约在同一文档的第 12 页)指出:
强调“⟨parameters⟩
从函数签名中自动检测的数量”。这意味着你不能给出⟨parameter text⟩
for \cs_new:Nn
。所谓的⟨parameter text⟩
is 是一个p
-type 参数,当你用\cs_new:Npn
(p
is不是沉默的 :)。
此外,任何不可扩展的函数(即“在 内爆炸\edef
”)都应使用\cs_new_protected:Nn
(或\cs_new_protected:Npn
其他使用_protected
)进行定义,以确保它不会在会中断的上下文中扩展。您的\userDefined_century:N
函数不可扩展,因为它包含赋值(\int_set:Nn
),因此它必须是_protected
。
您的定义必须是:
% ↓ p is silent
\cs_new_protected:Nn \userDefined_century:N % no ⟨parameter text⟩ here
{ \int_set:Nn #1 { \userDefined_century: } }
或者
% ↓ with p
\cs_new_protected:Npn \userDefined_century:N #1 % the ⟨parameter text⟩ is '#1'
{ \int_set:Nn #1 { \userDefined_century: } }
但不存在介于两者之间的任何情况。
更改您的代码以确保其正常工作:
\documentclass[varwidth=50mm]{standalone}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_new:Nn \userDefined_century: { 100 }
\userDefined_century: \par
\cs_new_protected:Nn \userDefined_century:N
{ \int_set:Nn #1 { \userDefined_century: } }
\int_new:N \l_userDefined_number_int
\userDefined_century:N \l_userDefined_number_int
\int_use:N \l_userDefined_number_int
\ExplSyntaxOff
\end{document}