在 LaTeX3/expl3 中从另一个包或类驱动给定包的选项

在 LaTeX3/expl3 中从另一个包或类驱动给定包的选项

恐怕我仍然不明白我应该如何处理LaTeX3/expl3上下文中包之间的选项通信。假设我有一个包pkg1,我在其中定义了一个opt_pkg1在文档中设置的选项,但实际上它仅用于驱动选项(opt1_pkg2opt2_pkg2...),另一个包pkg2从第一个()开始加载时会使用该选项pkg1。使用 执行此操作的正确方法是什么l3keys

我将尝试通过一个小例子来阐明我的观点,类似于 semiMnotWE:缺少一些布尔值的声明,此外还有其他一些细节使它成为一个不起作用的例子……它应该只是能够传达我的观点。请注意,由于语法要求,我已从 切换pkg1(2)到。pkgA(B)

其背后的基本信息是:pkgA我定义了允许我设置字体的选项,以及在主文档中选择 sans 字体的单独可能性。设置字体会导致pkgA加载一个或另一个额外的包(pkgB),在这种情况下,我选择 sans 字体会导致加载pkgB一个或另一个选项。希望我已经能够清楚地表达我的观点……

虽然pkgA.sty一般来说——就我而言——这将是一个类文件:

\ProvidesExplPackage{pkgA}{2013/08/20}{0.0} 
 {LaTeX2e/LaTeX3 package}

\RequirePackage{xparse,l3keys2e}% Needed?

\NewDocumentCommand\SetTBool { m }
 {
    \bool_set_true:c { g_pkgA_#1_bool }
 }

\keys_define:nn { pkgA }
{
    typeface .choice_code:n =
        { \SetTBool { \tl_use:N \l_keys_choice_tl } },
    typeface .generate_choices:n = { lucida, libertine },
    typeface .initial:n = libertine,

    sans-face .choice_code:n =
        { % Watch out! 
          % The next switch does not work as it is, but I guess it conveys my point
           \tl_if_eq:NnT \l_keys_choice_tl { sansbiolinum }
            {  
              % In this branch I set or pass (???) the { sansbiolinum = true } option to pkgB 
            }
        },
    sans-face .generate_choices:n = { sansbiolinum, sansmyriad }, 
} 

\DeclareDocumentCommand\DocumentSetup { +m }
 { \keys_set:nn { pkgA }{ #1 } }

\ProcessKeysOptions { pkgA }

\bool_if:NT \g_pkgA_lucida_bool { \RequirePackage{pkgB} }

接下来是pkgB.sty

\ProvidesExplPackage{pkgB}{2013/08/20}{0.0} 
 {LaTeX2e/LaTeX3 package}

\RequirePackage{lucimatx}

\keys_define:nn { pkgB }
 {
    sansbiolinum .bool_set:N = \g_pkgB_sansbiolinum_bool,
 }

\ProcessKeysOptions { pkgB }    

\bool_if:NT \g_pkgB_sansbiolinum_bool 
  { \RequirePackage[osf]{biolinum} }

最后,在“文档”(.tex 文件)中,我有类似以下内容:

\documentclass{memoir}

\usepackage{pkgA}

\DocumentSetup{
   typeface = lucida,
   sans-face = sansbiolinum,
}

 \ProcessKeysOptions { pkgA }

 \begin{document}
 Blah, blah, blah.
 \end{document}

答案1

每个包内部使用的事实l3keys根本不会影响您传递加载时选项的方式:您应该使用 的定义接口pkgB。如所述,pkgB仅在加载时提供其选项(我们没有看到文档,但代码的编写方式表明没有)。因此,您应该在仅在加载之前起作用的选项\pkgBsetup中提供:可能再次是加载时选项。然后可以像往常一样将信息传递给使用。pkgApkgBpkgB\PassOptionsToPackage

相关内容