我正在尝试使用 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}