我想将一些选项定义为宏内的键值对列表,并在采用 pgfkeys 样式选项的命令中使用该宏。以下是 MWE:
\documentclass{standalone}
\usepackage{pgfkeys}
\pgfkeys{
/example/.is family, /example,
.unknown/.code = {
(\pgfkeyscurrentkeyRAW,#1)
\typeout{DEBUG \pgfkeyscurrentkeyRAW}
}
}
\newcommand{\defvalues}[2][]{
\pgfkeys{/example, #1}
}
\begin{document}
\def\mylist{c=3,d=4}
\defvalues[a=1,b=2]{}
\expandafter\defvalues\expandafter[\mylist]{}
\expandafter\defvalues\expandafter[f=6,\mylist]{}
\end{document}
在最后一行,\mylist
没有正确展开。
文档中的预期输出:
(a,1) (b,2) (c,3) (d,4) (f,6) (c,3) (d,4)
实际产量:
(a,1) (b,2) (c,3) (d,4) (f,6) (c=3,d=4)
或者,运行时pdflatex test.tex|grep DEBUG
,预期输出:
DEBUG a
DEBUG b
DEBUG c
DEBUG d
DEBUG f
DEBUG c
DEBUG d
实际产量:
DEBUG a
DEBUG b
DEBUG c
DEBUG d
DEBUG f
DEBUG c=3,d=4
\mylist
在传递给之前我该如何进行扩展pgfkeys
?
答案1
这是一个使用.style
处理程序定义两个列表的解决方案。
\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{
/example/.is family,
/example,
.unknown/.code = {
(\pgfkeyscurrentkeyRAW,#1)
\typeout{DEBUG \pgfkeyscurrentkeyRAW}
}
}
\newcommand{\defvalues}[2][]{\pgfkeys{/example,#1}}
\def\mylist{c=3,d=4}
\defvalues[mylist/.style/.expand once={\mylist}]{}
\defvalues[mylist2/.style={g=8,h=45}]{}
\begin{document}
\defvalues[a=1,b=2]{}
\defvalues[mylist]{}
\defvalues[f=6,mylist,mylist2]{}
\end{document}
输出:
(a,1)(b,2) (三,3)(四,4) (f,6)(c,3)(d,4)(g,8)(h,45)
答案2
我找到了一个解决方案:
\newcommand{\defvalues}[2][]{
\edef\opts{/example, #1}
\expandafter\pgfkeys\expandafter{\opts}
}
这按预期工作。我猜这与 不能像 那样\expandafter
工作有关。或者更确切地说,在第三种情况下,它只扩展,而不是括号中的所有内容。[]
{}
f