当标记列表超出 \keys_define:nn 时,为什么 \tl_gset:Nn 或 .tl_gset:N 不起作用?

当标记列表超出 \keys_define:nn 时,为什么 \tl_gset:Nn 或 .tl_gset:N 不起作用?

我想编写自己的包,当我使用我的包时,我想提供一些纸张尺寸选项。但无论我尝试什么,\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测试放在前面,测试就会成功。顺便说一句,不要使用\barin \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}

相关内容