如何定义两个具有相同基本名称和不同签名的 expl3 函数?

如何定义两个具有相同基本名称和不同签名的 expl3 函数?

我需要定义一个不带参数的函数,然后定义一个同名但只有一个参数的函数,并从第二个函数内部调用第一个函数。

如果不是这样做的话,我将非常感激,如果您能解释如何以类似的方式创建具有不同数量(和类型)参数的多个函数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 页)指出:

<code>\cs_new:Nn</code> <code>⟨function⟩</code> <code>{⟨code⟩></code> → 创建 <code>⟨function⟩</code> 以扩展为 <code>⟨code⟩</code> 作为替换文本。在 <code>⟨code⟩</code> 中,<code>⟨parameters⟩</code> 的数量会自动从函数签名中检测出来。这些 <code>⟨parameters⟩</code>(<code>#1</code>、<code>#2</code> 等)将被函数吸收的参数替换。该定义是全局的,如果 <code>⟨function⟩</code> 已定义,则会导致错误。

强调“⟨parameters⟩从函数签名中自动检测的数量”。这意味着你不能给出⟨parameter text⟩for \cs_new:Nn。所谓的⟨parameter text⟩is 是一个p-type 参数,当你用\cs_new:Npnpis不是沉默的 :)。

此外,任何不可扩展的函数(即“在 内爆炸\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}

相关内容