使用问题的语法

使用问题的语法

我有以下选项

\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@PropetyB

最小非工作示例:

\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@Propertyfoo\@@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}

相关内容