使用 l3keys 访问 sub/keys

使用 l3keys 访问 sub/keys

我不确定我是否做得太过分了,但我想我见过类似的事情。这会出现错误:

\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \RULE {}
  {
    \rule{\l_tmpa_dim}{\l_tmpb_dim}
  }
\keys_define:nn { foo / bar }
  {
    tmpa .dim_set:N = \l_tmpa_dim,
    tmpb .dim_set:N = \l_tmpb_dim,
    tmpa .initial:n = 1em,
    tmpb .initial:n = 4em,
  }
\NewDocumentCommand \dimsetup { m } { \keys_set:nn { foo } { #1 } }
\ExplSyntaxOff
\dimsetup{bar={tmpa=3em,tmpb=1em}}
\begin{document}
  \RULE
\end{document}

导致

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! LaTeX error: "kernel/key-unknown"
! 
! The key 'foo/bar' is unknown and is being ignored.
! 
! See the LaTeX3 documentation for further information.
! 
! For immediate help type H <return>.
!...............................................

这是预期的结果吗?我如何才能轻松地在键内使用此键值(我是否需要定义bar以便它传递选项?)。我想我已经见过这种情况,而且我认为这是可行的。

这是我想要实现的“手动”解决方法:

\dimsetup{bar/tmpa=3em,bar/tmpb=1em}

答案1

您似乎想将bar两者都用作子路径,并将其本身用作键。例如

\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \RULE {}
  {
    \rule { \l_tmpa_dim } { \l_tmpb_dim }
  }
\keys_define:nn { foo }
  {
    bar .code:n = { \keys_set:nn { foo / bar } {#1} },
    bar / tmpa .dim_set:N = \l_tmpa_dim,
    bar / tmpb .dim_set:N = \l_tmpb_dim,
    bar / tmpa .initial:n = 1em,
    bar / tmpb .initial:n = 4em,
  }
\NewDocumentCommand \dimsetup { m } { \keys_set:nn { foo } { #1 } }
\ExplSyntaxOff
\dimsetup{bar={tmpa=3em,tmpb=1em}}
\begin{document}
  \RULE
\end{document}

会这样做。您可能还想查看l3keys文档中的键分组。

请注意,你也可以这样做

\keys_define:nn { foo }
  {
    bar .code:n = { \keys_set:nn { foo / bar } {#1} },
  }
\keys_define:nn { foo / bar }
  {
    tmpa .dim_set:N = \l_tmpa_dim,
    tmpb .dim_set:N = \l_tmpb_dim,
    tmpa .initial:n = 1em,
    tmpb .initial:n = 4em,
  }

如果你喜欢的话。(在 中l3keys, 的主要功能/是创建选择键,ETC。

相关内容