与 TikZ 结合的键值选项

与 TikZ 结合的键值选项

我正在尝试创建一些使用键值选项的 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

相关内容