expl3 中的标签混淆:(公共,私人)与(全球,本地)

expl3 中的标签混淆:(公共,私人)与(全球,本地)

expl3 手册表明 LaTeX3 是基于约定的。其中包括正确标记变量和函数的约定。它们可以是民众/私人的或者全球的/当地的如果有人能说明区别(如果可能的话,通过一个例子)那就更清楚了。

答案1

变量可以是局部的,也可以是全局的;让我使用标记列表变量作为示例:两个指令

\tl_new:N \l_aloui_whatever_tl
\tl_new:N \g_aloui_whatever_tl

定义一个局部变量和一个全局变量。前者应该使用如下函数进行设置

\tl_set:Nn \l_aloui_whatever_tl {abc}

而第二个应该设置为

\tl_gset:Nn \g_aloui_whatever_tl {abc}

你可以混合使用全局变量和局部变量;例如,以下两个调用都是好的

\tl_set_eq:NN \l_aloui_whatever_tl \g_aloui_whatever_tl

\tl_gset_eq:NN \g_aloui_whatever_tl \l_aloui_whatever_tl

但相反的顺序是不好的。变量应该总是如果已声明为全局的,则可以使用全局函数进行操作;如果已声明为本地的,则可以使用本地函数进行操作。

“公共”变量和“私有”变量之间还有另一个区别,但这主要是包编写者所关心的。

如果你声明

\tl_new:N \l__aloui_whatever_tl

那么您所说的是,任何软件包开发人员(或最终用户)都不应利用此变量来谋取私用,因为它可能会在软件包的未来版本中消失或以不同的方式使用。

类似地,函数声明如下

\cs_new_protected:Nn \aloui_function:nn { ... }

被声明为“公开可用”,因此是“外部”接口的一部分,开发人员(或最终用户)可以利用它。相反,__名称开头为 的函数是“私有”的:它们在您的包中使用,但您无法保证它们会保留在未来版本中。

举个例子,内核函数\cs_if_exist:NTF目前建立在“私有”函数之上\__chk_if_exist_cs:N。“公共”函数\cs_if_exist:NTF可供任何人使用,并且在未来的版本中语法和行为不会发生变化*;内部的“私有”函数在实现中使用,但任何人都不应该依赖它,因为执行可能会改变。

* 嗯,内核还不稳定,全部列出的公共功能在未来的版本中肯定会相同,但对于当前的大部分功能来说应该是这种情况。

答案2

这里尝试解释常量、全局变量、局部变量和函数之间的区别。

  • 持续的:不应被修改,即应将其设置为特定值并始终保持该状态。

  • 全球的:应始终全局设置、清除、修改等,以便更改即使在当前组之外也有效。

  • 当地的:应始终在本地设置、清除、修改等,以便更改仅在当前组内有效。

下面的例子试图说明这一点。

为了简单起见,我做了两件事。

  1. 我使用非 expl3 语法来处理与格式无关的方面,例如minipage\hfill等,以便重点明确放在对不同类型变量的操作上。例外是\group_begin:和,\group_end:这似乎无害,不会分散注意力(希望如此)。

  2. 我选择了一种类型的东西来玩:令牌列表。所以我们有常量令牌列表、本地令牌列表、全局令牌列表等。

代码:

\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\tl_new:N \g_aloui_global_tl
\tl_new:N \l_aloui_local_tl
\tl_new:N \c_aloui_constant_tl
\tl_gset:cn \c_aloui_constant_tl { Do~not~change~me! }
Constant:~\tl_use:c \c_aloui_constant_tl
\tl_set:Nn \l_aloui_local_tl { Initial~value~for~local~token~list~variable. }
\tl_gset:Nn \g_aloui_global_tl { Initial~value~for~global~token~list~variable. }
\par
Local:~\l_aloui_local_tl
\par
Global:~\g_aloui_global_tl
\par
\group_begin:
  Start~group.
  \tl_set:Nn \l_aloui_local_tl { Within~group~value~for~local~token~list~variable. }
  \tl_gset:Nn \g_aloui_global_tl { Global~change~of~value~for~global~token~list~variable. }
  \par
  \hfill
  \begin{minipage}{.8\textwidth}
    Local:~\l_aloui_local_tl
    \par
    Global:~\g_aloui_global_tl
    \par
  \end{minipage}
  \par
  End~group.
  \par
\group_end:
\par
Local:~\l_aloui_local_tl
\par
Global:~\g_aloui_global_tl
\ExplSyntaxOff
\end{document}

常量 - 全局 - 局部

相关内容