使用 pgfkeys 定义的键的默认值

使用 pgfkeys 定义的键的默认值

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 的值。只有这样才会检索 的值(如果没有分配,则使用默认值)并将其存储在 中。nomnomnom\nom

因此,您的问题是您必须“执行”nomprenom键。您可以在三个不同的地方执行此操作:

  • 当调用命令时\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
    }
    

    这与第二种选择的效果相同,并且更通用,因此应该是首选。

相关内容