我正在创建一个用于绘制序列图的包,并使用 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}