expl3 键设置语法是否与 TikZ/PGF 的 .cd 等效?

expl3 键设置语法是否与 TikZ/PGF 的 .cd 等效?

该问题的形式如下:“我知道如何使用 Y 做 X。我也可以使用 Z 做 X,但不如使用 Y 那么优雅。我能否以与使用 Y 做 X 相同的方式使用 Z 做 X,以获得更优雅的基于 Z 的解决方案?”

在这种情况下,Y 是 TikZ/PGF,Z 是expl3语法。

使用 PGF 键,我可以定义和/或设置特定路径下的一组键,而无需重复指定路径。一种方法是使用.cd更改当前路径,直到另行通知。

<path specification>/.cd,
<definition of key 1>,
<definition of key 2>,
<set key 1>,
<set key 2>,

这使得提供一个简单的界面来设置一组键成为可能。

<group key name>/.code={
  \tikzset{%
    <path specification>/.cd,
    #1
  }
},

该语法是否expl3提供了等效的语法.cd,如果是,那么它是什么?

我可以通过对每个相关路径使用不同的命令来模拟我想要的效果\keys_define:nn,但这似乎是一个有点不雅的解决方案,所以我想知道我是否缺少一个更直接的功能。

MWE 展示 TikZ 案例和 Expl3 仿真:

\documentclass{article}
\usepackage{tikz,xparse}
\tikzset{%
  my keys/.code={
    \tikzset{%
      /top/middle/bottom/.cd,
      #1
    }
  },
  /top/middle/bottom/.cd,
  key 1/.store in=\keyone,
  key 2/.store in=\keytwo,
}
\ExplSyntaxOn
\keys_define:nn { top / middle / bottom }
{
  key~1 .tl_set:N = \l_module_keyone_tl,
  key~2 .tl_set:N = \l_module_keytwo_tl,
}
\keys_define:nn { top }
{
  my~keys .code:n = {
    \keys_set:nn { top / middle / bottom } { #1 }
  }
}
\NewDocumentCommand \topset { m }
{
  \keys_set:nn { top } { #1 }
}
\NewDocumentCommand \showkeyone {} { \l_module_keyone_tl }
\NewDocumentCommand \showkeytwo {} { \l_module_keytwo_tl }
\ExplSyntaxOff
\begin{document}
\tikzset{%
  my keys={%
    key 1=Arrangement,
    key 2=Ascension,
  },
}%
\topset{%
  my keys={%
    key 1=Arrangement,
    key 2=Ascension,
  },
}%
TikZ/PGF:

\keyone{}
\keytwo

Expl3:

\showkeyone{}
\showkeytwo
\end{document}

输出:

TikZ/Expl3

答案1

简短的回答:不。

使用 keyval 方法设置键本身的想法(据我所知)最早是在 中为 TeX 实现的pgfkeys。在写作的时候l3keys,我非常认真地研究了这个问题,以寻找创建键和调整其行为的最便捷方式的模型。但是,l3keys不仅仅是 的重新实现pgfkeys(事实上, 中的一些突出问题l3keys可能源于此!)。特别是,虽然pgfkeys是面向对象的,但对于 来说并非如此l3keys。在 中pgfkeys“创建键”和“设置键”之间没有区别,因此可以有 概念.cd。另一方面,在 中这两个概念是故意分开的。这遵循(和)的l3keys模型。keyval\define@key\setkeys

相关内容