pgfkeyvalue 字符串未被 xkeyvalue 解析

pgfkeyvalue 字符串未被 xkeyvalue 解析

我正在尝试使用 pgfkeys 创建数据库。它运行得相当好,直到我需要执行存储在密钥中的一些参数并将其传递给使用 xkeyvalue 解析参数的某个命令。

但是,当发生这种情况时,xkeyval 包无法找到我通过 pgfkeysvalue 传递的字符串。

我用它todonotes来展示发生了什么,以简化问题。但是,我使用的是其他相当复杂的包。但错误是一样的。

\documentclass{article}
\usepackage{pgffor,pgfkeys}
\usepackage{todonotes}

\newcommand{\foo}[3][]{\missingfigure[#1]{#2, #3}}
\newcommand{\bas}[3][]{mand: #2, #3\\}

\pgfkeys{/test/.cd,
  section/.code = {\section{#1}},
  type/.initial = bas,
  options/.initial=,
  question/.code 2 args = {\csname \pgfkeysvalueof{/test/type}\endcsname[\pgfkeysvalueof{/test/options}]{#1}{#2}},
  style/.estyle={#1}
}


\def\allrecords{%
section=first,
{
  type = foo,
  question={key1}{my lng question},
},
{
  type = foo,
  options = {figwidth=8cm},% error happens here
  question={key1}{my lng question},
},
}

\pagestyle{empty}
\begin{document}
\foreach \x in \allrecords {\pgfkeys{/test/.cd,style/.expanded=\x}}

\end{document}

答案1

键值解析器将\pgfkeysvalueof{/test/options}视为选项列表。由于没有等号或逗号,因此它仅被解释为键。该示例通过首先扩展选项列表来修复,参见\expandafter示例中的 ,它扩展了\romannumeral-`\x,然后触发 的扩展,\pgfkeysvalueof{/test/options}直到\romannumeral看到不可扩展的标记或空格(被吞噬)。这样,\expandafter就不需要知道 的确切数量。

\documentclass{article}
\usepackage{pgffor,pgfkeys}
\usepackage{todonotes}

\newcommand{\foo}[3][]{\missingfigure[#1]{#2, #3}}
\newcommand{\bas}[3][]{mand: #2, #3\\}

\pgfkeys{/test/.cd,
  section/.code = {\section{#1}},
  type/.initial = bas,
  options/.initial=,
  question/.code 2 args = {%
    \csname\pgfkeysvalueof{/test/type}\expandafter\endcsname
    \expandafter[\expandafter{%
      \romannumeral-`\x\pgfkeysvalueof{/test/options}%
    }]{#1}{#2}},
  style/.estyle={#1}
}


\def\allrecords{%
section=first,
{
  type = foo,
  question={key1}{my lng question},
},
{
  type = foo,
  options = {figwidth=8cm},% error happens here
  question={key1}{my lng question},
},
}

\pagestyle{empty}
\begin{document}
\tracingmacros=1
\foreach \x in \allrecords {\pgfkeys{/test/.cd,style/.expanded=\x}}

\end{document}

结果

相关内容