买者自负 ...

买者自负 ...

我正在编写一个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:
}

在我看来,默认将内容保留在本地是明智的。但我不知道这是否是正确的方法。

相关内容