如何使用 pgfkeys 保留(覆盖)默认值?

如何使用 pgfkeys 保留(覆盖)默认值?

我正在创建一个用于绘制序列图的包,并使用 pgfkeys 来保留我需要的各种参数的默认值。但是,有时我希望为我的宏提供一个或多个 pgfkeys 键值对,以覆盖存储在 pgfkeys 中的默认值。下面的代码演示了我遇到的一个问题;它被精简到最低限度。我的原始代码中还有更多键。

\documentclass{article}
\usepackage{tikz}
\newcount\x

\pgfkeys{/std/msg/width/.code=\def\msgwidth{#1}}
\pgfkeys{/std/msg/default/.style={
    /std/msg/width=0.7,
}}
\pgfkeys{/std/msg/default} % Set the defaults

\newcommand{\msgx}[3][]{
    \pgfkeys{/std/msg/.cd,#1} % Use provided optional params (or default)
    \draw[->] (\x,#2) -- (\x+\msgwidth,#3);
    \advance\x by 1
}

\begin{document}
\begin{tikzpicture}
\msgx{1}{2} \msgx{2}{1}
\msgx[width=0.3]{1}{3}
\msgx{1}{2} \msgx{2}{1}  % Uses width=0.3 (not the default)
\end{tikzpicture}
\end{document}

该示例的问题在于,在设置 width=0.3 后,它仍然是 0.3。我确实希望能够使用初始化宏(未显示)将其设置为默认值以外的值,但我希望在 \msgx[width=0.3] 结束后保留​​默认/初始化值。

我的问题是:我应该使用什么 pgfkeys 机制来避免我的可选参数(#1)覆盖默认值?

答案1

您可以通过引入组来使值更改保持本地化{...}

\documentclass{article}
\usepackage{tikz}
\newcount\x

\pgfkeys{/std/msg/width/.code=\def\msgwidth{#1}}
\pgfkeys{/std/msg/default/.style={
    /std/msg/width=0.7,
}}
\pgfkeys{/std/msg/default} % Set the defaults

\newcommand{\msgx}[3][]{
    {
            \pgfkeys{/std/msg/.cd,#1} % Use provided optional params (or default)
            \draw[->] (\x,#2) -- (\x+\msgwidth,#3);
    }
    \advance\x by 1
}

\begin{document}
\begin{tikzpicture}
\msgx{1}{2}
\msgx{2}{1}
\msgx[width=0.3]{1}{3}
\msgx{1}{2}
\msgx{2}{1}
\end{tikzpicture}
\end{document}

相关内容