l3keys 内部的变量命名

l3keys 内部的变量命名

我有一个关于变量命名的问题。在 中expl3,变量命名约定如下:\<scope>_<module>_<description>_<type><scope>可以是lgc,这表示变量是局部变量、全局变量还是常量变量(尽管这在技术上不是强制的;这只是一种约定)。

我目前正在编写一个包,在其中使用 设置变量l3keys。这些变量具有由键设置的初始值.initial:。在这种情况下,我不确定是否应该使用gc作为变量范围。有人可能会认为c是合适的,因为我希望变量的值在通过包选项加载后永远不会改变。或者也许g是最好的,因为如果我的理解是正确的,变量可以从设置的初始值更改.initial:n为用户在加载包选项时设置的值。

编辑:我已经更新了我的 MWE。

这是主文件。

\documentclass{article}
\usepackage{mypackage}
\begin{document}
Some text.

%I am aware that using \ExplSyntax is bad practice inside the document body.
%This is solely for demonstration.
\ExplSyntaxOn
\dim_use:N \c_mymodule_testdimen_dim
\par
\skip_use:N \c_mymodule_testskip_skip
\ExplSyntaxOff
\end{document}

这是名为 的包文件mypackage.sty

\ProvidesExplPackage
    {mypackage}
    {2023-07-01}
    {1.0.0}
    {Test package}
\keys_define:nn { mymodule }
{
    testdimen .dim_gset:N = \c_mymodule_testdimen_dim
    ,testdimen .initial:n = { 12pt }
    ,textskip .skip_gset:N = \c_mymodule_testskip_skip
    ,textskip .initial:n = { 12pt plus 6pt minus 3pt }
}
\ProcessKeyOptions

答案1

用户定义的值永远不会是常量,因为你环境现有的多变的不要一次性创建它们。由于您正在全局设置,因此应该使用\g_...not \l_...。(您实际上不能从键中设置常量,因为必须在键存在时创建变量,因此有一个值,然后在设置键时对其进行更改。)

当然,TeX 没有正式的常量,但惯例expl3是它们是程序员指定的全局值,不会改变。因此,\c_...对于诸如永远不会改变的数据结构的预定义大小、固定的 csname 位置等事物也是如此。(例如 l3keys例如,它本身使用一组常量tl来设置密钥的存储位置。)从这个意义上说,它们不仅仅是“为这次 TeX 运行设置一次”,而且是“为同一设置(引擎、平台等)上所有使用此代码的用途设置”。

相关内容