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