请问如何用latex3定义一个键值列表来使用不同的封面 (引入不同的宏包命令)?
这是我傻乎乎抄的一些代码,不会用,请专家看下如何修改来达到所提问的效果
\ExplSyntaxOn
\clist_new:N \l__Beautybook_tmpa_clist
\cs_new_protected:Npn \__Beautybook_define_fn_coverstyle:nn #1#2
{ \tl_const:cn { c__Beautybook_fn_coverstyle_ #1 _tl } {#2} }
\keys_define:nn { Beautybook /coverstyle }
{
cover choose.choice:,
cover choose.value_required:n = true,
cover choose / cn.code:n={\RequirePackage{stys/cncover}}, % springer经典封面
cover choose / en.code:n={\RequirePackage{stys/Titlepage}}, % springer经典封面
cover choose / enfig.code:n={\RequirePackage{stys/imagecover} },% springer经典封面
cover choose / birkar.code:n={\RequirePackage{stys/secondtitlepage}}, % springer经典封面
}
\ExplSyntaxOff
上面是cls中定义,然后想在主文件中这样写
\coverstyle={
cover choose=enfig, % 待选值有: en,cn, birkar.
}
先读 interface3.pdf
,就算不全读也要读个大概,然后再用 LaTeX3。
定义和设置键值分别用 \keys_define:nn
和 \keys_set:nn
。如果你用 TeXLive2023,可以用 LaTeX2e 提供的接口:\DeclareKeys
和 \SetKeys
。
一般情况下,LaTeX3 的键值接口不使用空格作为单词之间的分隔符,除非需要与 pgf (tikz
、tcolorbox
、pgfplots
等)交互,而且空格是 ~
不是
。如 siunitx
宏包使用 -
。
% 为了避免多次加载,先使用 tl 保存起来,然后用 \AtBeginDocument 来实际加载它
\keys_define:nn { Beautybook / coverstyle }
{
cover-choose .choice: ,
cover-choose .value_required:n = true ,
cover-choose / cn .code:n =
{ \tl_gset:Nn \l__Beautybook_cover_choose_tl { \RequirePackage{...} } } ,
cover-choose / en .code:n =
{ \tl_gset:Nn \l__Beautybook_cover_choose_tl { \RequirePackage{...} } } ,
其它键
cover-choose .initial:n = cn , % 设置 cn 为初始值
}
\NewDocumentCommand \coverstyle { +m }
{
\keys_set:nn { Beautybook / coverstyle } { #1 }
}
\AtBeginDocument { \l__Beautybook_cover_choose_tl }
非常感谢您的指点,我明天就测试一下
老师,您好!还是有问题,请问能令这个简直对应的命令(加载宏包的命令)就在cls中前面加载吗?除此之外,就是会出现下图的错误提示,且无法切换封面:
这里是主文件
这里是cls
@u45041
\coverstyle{...}
不是\coverstyle={...}
。你在导言区用
\coverstyle
就是在导言区加载。用
\AtBeginDocument
是避免多次加载 coverstyle。如果不想要,直接写就算这样,它就是在哪里用的就在哪里加载,在导言区用就是在导言区加载,在 cls 里用就是在 cls 里加载。
@u10307 如过一定要用
\coverstyle={...}
,就这样定义:如果要同时支持
\coverstyle{}
和\coverstyle={}
,就这样定义:好的,非常感谢老师!我日后有时间一定会好好看interface3.pdf的,谢谢!
老师,非常感谢您的殷切指导,成功了!我以后一定好好向您学习!感激!!