我正在尝试创建一些使用键值选项的 TikZ 命令。使用以下链接: 如何创建带有键值的命令? 我能够声明一些命令,但现在我被卡住了。
作为 MWE,请考虑:
\documentclass{article}
\usepackage{keyval}
\usepackage{tikz}
\usepackage{pgfkeys}
\makeatletter
% using keyval package
\define@key{cutkv}{label}{\def\cutkv@label{#1}}
\define@key{cutkv}{bend}{\def\cutkv@bend{#1}}
\setkeys{cutkv}{label={},bend={}}
\newcommand{\cutkv}[3][]{
\begingroup
\setkeys{cutkv}{#1}
\draw[->] (#2) to[\cutkv@bend] node{\cutkv@label} (#3);
\endgroup
}
% using pgfkeys package
\pgfkeys{
/cutpgf/.is family, /cutpgf,
default/.style =
{label = ,
bend = },
label/.estore in = \cutpgf@label,
bend/.estore in = \cutpgf@bend,
}
\newcommand{\cutpgf}[3][]{
\pgfkeys{/cutpgf, default, #1}
\draw[->] (#2) to[\cutpgf@bend] node{\cutpgf@label} (#3);
}
\makeatother
\begin{document}
\begin{tikzpicture}
\cutkv[label=1]{0,0}{3,5}
\cutkv[label=2,bend={bend right}]{1,4}{7,2}
\cutkv[label=3,bend={bend right=10}]{6,0}{5,4}
\end{tikzpicture}
\begin{tikzpicture}
\cutpgf[label=1]{0,0}{3,5}
\cutpgf[label=2,bend={bend right}]{1,4}{7,2}
\cutpgf[label=3,bend={bend right=10}]{6,0}{5,4}
\end{tikzpicture}
\end{document}
第一次和第二次调用 \cut 命令时工作正常,但第三次调用时选项bend right=10
传递不正确。至少我不明白问题出在哪里。
pgfkeys
我也尝试了上述帖子第一个答案中提到的方法,但这并没有改变任何东西。
编辑:我将版本添加pgfkeys
到了 MWE。
任何帮助我都非常感谢。谢谢。
答案1
正如评论中所建议的,这与 keyval 方法的选择无关,而是由于 keyval 处理器不是扩展其输入(一般情况下)。您需要强制扩展,这里最简单的方法是使用\edef
:
\documentclass{article}
\usepackage{keyval}
\usepackage{tikz}
\usepackage{pgfkeys}
\makeatletter
% using keyval package
\define@key{cutkv}{label}{\def\cutkv@label{#1}}
\define@key{cutkv}{bend}{\def\cutkv@bend{#1}}
\setkeys{cutkv}{label={},bend={}}
\newcommand{\cutkv}[3][]{
\begingroup
\setkeys{cutkv}{#1}
\begingroup
\edef\x
{%
\endgroup
\noexpand\draw[->] (#2) to[\cutkv@bend] node{\cutkv@label} (#3);
}\x
\endgroup
}
% using pgfkeys package
\pgfkeys{
/cutpgf/.is family, /cutpgf,
default/.style =
{label = ,
bend = },
label/.estore in = \cutpgf@label,
bend/.estore in = \cutpgf@bend,
}
\newcommand{\cutpgf}[3][]{%
\pgfkeys{/cutpgf, default, #1}%
\begingroup
\edef\x{%
\endgroup
\noexpand\draw[->] (#2) to[\cutpgf@bend] node{\cutpgf@label} (#3);
}\x
}
\makeatother
\begin{document}
\begin{tikzpicture}
\cutkv[label=1]{0,0}{3,5}
\cutkv[label=2,bend={bend right}]{1,4}{7,2}
\cutkv[label=3,bend={bend right=10}]{6,0}{5,4}
\end{tikzpicture}
\begin{tikzpicture}
\cutpgf[label=1]{0,0}{3,5}
\cutpgf[label=2,bend={bend right}]{1,4}{7,2}
\cutpgf[label=3,bend={bend right=10}]{6,0}{5,4}
\end{tikzpicture}
\end{document}
在这两种情况下,其理念都是该\draw
行需要完全扩展您的变量:通过使用,\edef
我不必担心仔细计算标记\expandafter
。