我想编写自己的包,当我使用我的包时,我想提供一些纸张尺寸选项。但无论我尝试什么,\g__zztj_paper_size_tl
在外面都是无效的\key_define:nn
。MWE 是:
% sty file
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\ProvidesExplPackage{zztj}{}{}{}
\RequirePackage{l3keys2e}
\tl_new:N \g__zztj_paper_size_tl
% ---- \keys_define:nn ---- one ----
\keys_define:nn { zztj / option }
{
paper .choices:nn =
{ a4, a5 }
{ \tl_gset:Nn \g__zztj_paper_size_tl {#1} } ,
paper .default:n = { a4 }
}
% \tl_show:N \g__zztj_paper_size_tl % <-- \g__zztj_paper_size_tl is empty
\tl_if_eq:NnT \g__zztj_paper_size_tl { a4 }
{ \newcommand\foo{foo~a4\par}}
\tl_if_eq:NnT \g__zztj_paper_size_tl { a5 }
{ \newcommand\foo{foo~a5\par}}
% there are some other codes ... so I can't just write all commands in \keys_define:nn
\tl_if_eq:NnT \g__zztj_paper_size_tl { a4 }
{ \newcommand\bar{bar~a4\par}}
\tl_if_eq:NnT \g__zztj_paper_size_tl { a5 }
{ \newcommand\bar{bar~a5\par}}
\ProcessKeysOptions{ zztj / option }
% tex file
\documentclass{book}
\usepackage[paper=a4]{zztj}
\begin{document}
\foo
\bar
\end{document}
我也尝试另一种方法\keys_define:nn
:
% ---- \keys_define:nn ---- another ----
\keys_define:nn { zztj / option }
{
paper .tl_gset:N = \g__zztj_paper_size_tl ,
}
但两者都无法工作。我使用expl3
上发布的软件包2021-02-18
。有人能帮忙吗?谢谢!
答案1
你要
paper .initial:n = { a4 }
不是.default:n
。.default:n
如果调用的键没有值,则指定要分配的值。
看看区别:
\keys_define:nn { test }
{
foo .tl_set:N = \l_test_foo_tl,
foo .default:n = footest,
bar .tl_set:N = \l_test_bar_tl,
bar .initial:n = bartest,
}
\tl_show:N \l_test_foo_tl % empty
\tl_show:N \l_test_bar_tl % contains 'bartest'
\keys_set:nn { test } { foo }
\tl_show:N \l_test_foo_tl % contains 'footest'
\keys_set:nn { test } { foo=newtest }
\tl_show:N \l_test_foo_tl % contains 'newtest'
答案2
原因是\ProcessKeysOptions
顺序。如果把\ProcessKeysOptions
测试放在前面,测试就会成功。顺便说一句,不要使用\bar
in \newcommand
,它已经在 LaTeX 中定义过了。发布成功的 MWE:
% sty file
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\ProvidesExplPackage{zztj}{}{}{}
\RequirePackage{l3keys2e}
\tl_new:N \g__zztj_paper_size_tl
\keys_define:nn { zztj / option }
{
paper .choices:nn =
{ a4, a5 }
{ \tl_gset:Nn \g__zztj_paper_size_tl {#1} } ,
paper .default:n = { a4 }
}
\ProcessKeysOptions{ zztj / option }
\tl_if_eq:NnT \g__zztj_paper_size_tl { a4 }
{ \newcommand\zztjfoo{foo~a4\par}}
\tl_if_eq:NnT \g__zztj_paper_size_tl { a5 }
{ \newcommand\zztjfoo{foo~a5\par}}
% other codes ...
\tl_if_eq:NnT \g__zztj_paper_size_tl { a4 }
{ \newcommand\zztjbar{bar~a4\par}}
\tl_if_eq:NnT \g__zztj_paper_size_tl { a5 }
{ \newcommand\zztjbar{bar~a5\par}}
% tex file
\documentclass{book}
\usepackage[paper=a4]{zztj}
\begin{document}
\zztjfoo
\zztjbar
\end{document}