我有一个以下形式的宏:
\tikzset{
foo/.style 2 args={
...
},
foo/.default={2pt}{}
}
如果我不想指定任何参数,我可以使用foo
。如果我想指定第一个参数,我可以使用foo={3pt}
(编辑:在这种情况下,第二个参数为空)。如果我想指定两个参数,我可以写foo={3pt}{green}
。
现在我想调用foo
,使用第一个参数的默认值并为第二个参数指定一个值。这可能吗?
就像是foo={default}{green}
。
答案1
这实现了一个/.default 2 args
具有所请求行为的处理程序。
\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{/handlers/.default 2 args/.code 2 args={%
\pgfkeyssetvalue{\pgfkeyscurrentpath/.@def}{{#1}{#2}}
\pgfkeyssetvalue{\pgfkeyscurrentpath/.@def1}{{#1}}
\pgfkeyssetvalue{\pgfkeyscurrentpath/.@def2}{{#2}}
\pgfkeysgetvalue{\pgfkeyscurrentpath/.@cmd}{\temp}
\pgfkeyslet{\pgfkeyscurrentpath/.@cmd@orig}{\temp}
\pgfkeysdefargs{\pgfkeyscurrentpath}{##1##2}{
\def\tempa{##1}\def\tempb{##2}\def\tempc{default}%
\ifx\tempa\tempc
\pgfkeysgetvalue{\pgfkeyscurrentpath/.@def1}{\temparga}%
\else
\def\temparga{{##1}}%
\fi
\ifx\tempb\tempc
\pgfkeysgetvalue{\pgfkeyscurrentpath/.@def2}{\tempargb}%
\else
\def\tempargb{{##2}}%
\fi
\csname pgfk@\pgfkeyscurrentpath/.@cmd@orig\expandafter\expandafter\expandafter\endcsname\expandafter\temparga\tempargb\pgfeov
}
}}
\begin{document}
\pgfkeys{
foo/.code 2 args={(#1)(#2)},
foo/.default 2 args={2pt}{1pt},
foo={a}{b},
foo={a}{default},
foo={default}{b},
foo
}
\end{document}