我正在编写一个expl3
用于排版氨基酸残基的软件包,并且仍在努力掌握 LaTeX3 和接口文档。我查看了nicematrix
注释代码寻找灵感,因为它是一个精心组合的包,但它也是一份很长的文档,我并不完全理解它。我有可以在包加载时设置的选项,但我还希望它们在调用特定命令时可自定义。在这种情况下可以做什么,我应该使用在包选项中设置的相同变量,并放入
\group_begin:
\keys_set:nn { AminoSymb / resid } { #1 }
...
\group_end:
\l_aminosymbols_text_font_size_tl
阻止不覆盖全局包选项,或者对包选项和\l_aminosymbols_resname_text_font_size_tl
特定命令使用不同的变量是否是好的做法?
我意识到这个问题可能会被视为主观臆断,我同意这一点,但我在这个网站上没有看到任何类似的东西(如果我错过了,我也不介意重复),所以希望它能对未来的读者有所帮助。对于有经验的用户来说,这可能相当基础,但我希望我的第一个软件包能够尽我所能做到最好,所以我希望这样没问题。
电流输出:
使用不同变量的代码如下所示:
\begin{filecontents}[overwrite]{aminosymbols.sty}
\ProvidesExplPackage
{aminosymbols}
{}
{}
{Typesetting amino acid abbreviations with residue numbers and symbols}
\NewDocumentCommand { \aasp } { O{} }
{
\IfValueTF { #1 }
{
\group_begin:
\keys_set:nn { AminoSymb / resid } { #1 }
\cs_if_exist_use:c { \l_aminosymbols_resname_text_font_size_tl }
This \c_space_tl is \c_space_tl a \c_space_tl MWE
\group_end:
}
{
This \c_space_tl is \c_space_tl a \c_space_tl MWE
}
}
\keys_define:nn { AminoSymb / resid }
{
fontsize .tl_set:N = \l_aminosymbols_resname_text_font_size_tl,
fontsize .initial:n = normalsize,
}
\tl_new:N \l_aminosymbols_text_font_size_tl
\keys_define:nn { AminoSymb / Package }
{
fontsize .tl_set:N = \l_aminosymbols_text_font_size_tl,
fontsize .initial:n = normalsize,
}
\cs_if_exist:NTF \ProcessKeyOptions
{
\ProcessKeyOptions [ AminoSymb / Package ]
}
{
\RequirePackage{l3keys2e}
\ProcessKeysOptions { AminoSymb / Package }
}
\end{filecontents}
\documentclass{article}
\usepackage[fontsize=scriptsize]{aminosymbols}
\begin{document}
\noindent\aasp{}
\noindent\aasp[fontsize=huge]{}
\end{document}
答案1
我对这方面只是个业余爱好者expl3
,所以这个答案绝对不具权威性。
买者自负 ...
如果您使用为同一事物设置的键变量(例如,用于特定类型元素的字体大小),我会保持它们相同并使用本地组,前提是您使用它们的方式不需要全局设置它们。
为同一事物引入两组键和两组变量只会使您的代码复杂化,并使您和其他人更难理解,这不是一件好事。虽然可能可以忽略不计,但它也是对内存等资源的不必要使用。
由于将变量设置为某些默认值是很常见的,因此通过包选项配置该默认值似乎是完全合理的,这基本上就是您要做的事情。
clsguide.pdf
说
.usage
– 定义选项是否仅在加载时给出(load
),在序言中给出(preamble
)或者对范围没有限制(general
)(第 16 页)
因此,类和包作者的键值接口明确设计为允许一次定义一个键,既可用作包选项,又可在文档中需要它的任何其他地方使用。只需以general
这种方式为您想要发挥作用的键设置范围即可。
我倾向于在定义新函数时使用\group_begin:
and \group_end:
,除非我有特殊原因不这样做,或者该函数只会由执行分组的程序在内部调用。所以我可能会写
\NewDocumentCommand { \aasp } { o }
{
\group_begin:
\IfValueTF { #1 }
{
\keys_set:nn { AminoSymb / resid } { #1 }
\cs_if_exist_use:c { \l_aminosymbols_resname_text_font_size_tl }
This ~ is ~ an ~ MWE
}
{
This ~ is ~ an ~ MWE
}
\group_end:
}
在我看来,默认将内容保留在本地是明智的。但我不知道这是否是正确的方法。