我有一个关于变量命名的问题。在 中expl3
,变量命名约定如下:\<scope>_<module>_<description>_<type>
。<scope>
可以是l
、g
或c
,这表示变量是局部变量、全局变量还是常量变量(尽管这在技术上不是强制的;这只是一种约定)。
我目前正在编写一个包,在其中使用 设置变量l3keys
。这些变量具有由键设置的初始值.initial:
。在这种情况下,我不确定是否应该使用g
或c
作为变量范围。有人可能会认为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 运行设置一次”,而且是“为同一设置(引擎、平台等)上所有使用此代码的用途设置”。