恐怕我仍然不明白我应该如何处理LaTeX3/expl3
上下文中包之间的选项通信。假设我有一个包pkg1
,我在其中定义了一个opt_pkg1
在文档中设置的选项,但实际上它仅用于驱动选项(opt1_pkg2
,opt2_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
中提供:可能再次是加载时选项。然后可以像往常一样将信息传递给使用。pkgA
pkgB
pkgB
\PassOptionsToPackage