我有以下选项
\pgfkeys{
/opts/.is family,
/opts,
name/.store in = \@@Style@Name,
property/.code = {
\expandafter\gdef\expandafter\csname @@Style@ \@@StyleName @Poperty \endcsname#1},
}
我想创建一个全局命令\@@Style@<value of the "name">@Property
,并在传递它时为其分配“property”的值。
例如,代码应创建一个值为 的\pgfkeys{/opts, name = A, property = B}
命令。我该怎么做。\@@Style@A@Propety
B
最小非工作示例:
\documentclass{article}
\usepackage{pgfkeys}
\makeatletter
\pgfkeys{
/opts/.is family,
/opts,
name/.store in = \@@Style@Name,
property/.code = {
\expandafter\gdef\expandafter\csname @@Style@ \@@StyleName @Poperty \endcsname#1},
}
\begin{document}
\pgfkeys{/opts, name = A, property = B}
\@@Style@A@Propety
\end{document}
答案1
问题的确切语法如下所示(参见使用问题的语法),但我的建议是使用稍微不同的一个,即:
\pgfkeys{/myopts={A=foo, B={bar baz\\quux}}}
以便将设置\@@Style@A@Property
为foo
和 \@@Style@B@Property
设置为bar baz\\quux
(因此本例中有两次赋值,但您可以使用我的代码执行任意多次赋值)。实际上,您要求的语法需要有状态的代码:
需要记住的是,在我们看到属性值之前,属性名称已经设置,或者在我们看到属性名称之前,属性值已经设置;
人们需要指定当有可疑输入时会发生什么,例如
\pgfkeys{/opts, name=foo, name=bar, property=whatever}
或\pgfkeys{/opts, property=whatever}
等等。
我建议的语法可以通过定义处理程序来实现,每当使用未知键时/some dir/.unknown
就会调用该处理程序。pgfkeys
/some dir
\documentclass{article}
\usepackage{pgfkeys}
\usepackage{etoolbox} % for \csgdef (syntactic sugar)
\makeatletter
\pgfkeys{
/myopts/dir/.unknown/.code={%
\csgdef{@@Style@\pgfkeyscurrentname @Property}{#1}%
},
/myopts/.code={\pgfkeys{/myopts/dir/.cd, #1}},
}
\makeatother
\begin{document}
\pgfkeys{/myopts={A=foo, B={bar baz\\quux}}}
\makeatletter
\show\@@Style@A@Property % \@@Style@A@Property=macro:->foo.
\show\@@Style@B@Property % \@@Style@B@Property=macro:->bar baz\\quux.
\makeatother
\end{document}
关于您发布的代码,请注意
\expandafter\gdef\expandafter\csname @@Style@ \@@StyleName @Property \endcsname#1}
应该是这样的:
\expandafter\gdef\csname @@Style@\@@StyleName @Property\endcsname{#1}
(不需要第二个,\expandafter
因为它\csname
需要在这里尽早扩展;注意不需要的空格;将宏替换文本包裹在花括号内)。
使用问题的语法
由于 OP 坚持使用与问题完全相同的语法,即\pgfkeys{/opts, name = A, property = B}
,因此这里是。但我不推荐这样做(可能有充分的理由,但据我所知,目前尚未透露)。必须name
在之前给出property
(如问题中所示)。
\documentclass{article}
\usepackage{pgfkeys}
\usepackage{etoolbox} % for \csgdef (syntactic sugar)
\makeatletter
\pgfkeys{
/opts/.is family,
/opts/name/.store in=\@@My@PropName,
/opts/property/.code={%
\csgdef{@@Style@\@@My@PropName @Property}{#1}%
},
}
\makeatother
\begin{document}
\pgfkeys{/opts, name = A, property = B}
\makeatletter
\show\@@Style@A@Property % \@@Style@A@Property=macro:->B.
\makeatother
\end{document}