nom
以下是一个带有键并用“pgfkeys”定义的简单宏prenom
。
\documentclass[a4paper]{article}
\usepackage{tikz}
\pgfkeys{
/test/pgf/.cd,
nom/.store in = \nom,
nom/.default = toto,
prenom/.store in = \prenom,
prenom/.default = titi,
}
\newcommand{\qui}[1][]{
\pgfkeys{/test/pgf/.cd,#1}
I am \prenom{} \nom{} !
}
\begin{document}
\qui[prenom = toto, nom = titi]
\end{document}
问题是,如果您\qui
在没有密钥的情况下使用宏\nom
,或者\prenom
您会收到一条错误消息,提示! Undefined control sequence.
“我认为当我使用\qui[nom = titi]
LaTeX 执行宏时,它不认识该宏\prenom
,因此会给我一条错误消息”。
我不明白为什么会出现此错误,因为我使用处理程序为所有键都赋予了默认值.default
。我也尝试了.initial
处理程序,但如果您希望宏正常工作,则必须将\prenom
和替换\nom
为\pgfkeysvalueof{prenom}
和\pgfkeysvalueof{nom}
。
PGF 键 .initial 和 .default 之间的差异
但是以下代码有效。您可以使用宏而\qui
无需任何键。但我还是不明白为什么.default
处理程序不做这项工作?
\documentclass[a4paper]{article}
\usepackage{tikz}
\pgfkeys{
/test/pgf/.cd,
nom/.store in = \nom,
nom = toto,
prenom/.store in = \prenom,
prenom = titi,
}
\newcommand{\qui}[1][]{
\pgfkeys{/test/pgf/.cd,#1}
I am \prenom{} \nom{} !
}
\begin{document}
\qui[prenom = toto, nom = titi]
\end{document}
答案1
第一个例子的问题是,尽管 keynom
实际上有一个值,但该值从未存储在 macro 中\nom
,因此 macro 仍未定义。only将在执行key 时pgfkeys
创建\nom
并存储 key 的值。只有这样才会检索 的值(如果没有分配,则使用默认值)并将其存储在 中。nom
nom
nom
\nom
因此,您的问题是您必须“执行”nom
和prenom
键。您可以在三个不同的地方执行此操作:
当调用命令时
\qui
,例如:\qui[nom, prenom]
。由于您正在执行这些键但没有为它们分配值,因此使用默认值。内部
\qui
宏定义:\newcommand{\qui}[1][]{ \pgfkeys{/test/pgf/.cd, nom, prenom, #1} I am \prenom{} \nom{} ! }
这样,您可以
\qui{}
在主程序中简单地使用。如果您使用\qui[nom=foo]
,则该值将覆盖默认值。在初始
\pgfkeys
定义中:\pgfkeys{ /test/pgf/.cd, nom/.default = toto, nom/.store in = \nom, prenom/.store in = \prenom, prenom/.default = titi, nom, prenom }
这与第二种选择的效果相同,并且更通用,因此应该是首选。