使用 pgfkeys 的可变维度的 pgfdeclareshape

使用 pgfkeys 的可变维度的 pgfdeclareshape

我正在尝试使用 \pgfdeclareshape 为 TikZ 定义一些形状。我想使用选项来调整它们的大小,但我无法让它工作。此示例编译,但圆的大小设置不正确(或根本没有设置)。我做错了什么:?

\documentclass[oneside,12pt]{scrartcl}
\usepackage{tikz}
\usetikzlibrary{shapes}


\makeatletter
\pgfkeys{/tikz/mycirclesize/.code={\pgf@x = #1}}
\pgfkeys{/tikz/mycirclesize/.default = 0.75cm}
\pgfkeysgetvalue{/tikz/mycirclesize}{\macro}

\pgfdeclareshape{mycircle}
{
    \savedanchor\centerpoint{
        \pgf@x = .5\wd\pgfnodeparttextbox
        \pgf@y = .5\ht\pgfnodeparttextbox
    }
    \anchor{center}{\centerpoint}

    \saveddimen\circsize{ \macro }


    \backgroundpath{
        \centerpoint

        \pgfkeys{/pgf/minimum size = \circsize}
        \pgfset{inner sep=1pt}
        \pgfnode{circle}{center}{}{}{\pgfusepath{draw}}
    }

}

\makeatother

\begin{document}


\begin{tikzpicture}

    \draw (0,0) node[mycircle, mycirclesize=2cm] {};
\end{tikzpicture}

\end{document}

答案1

问题在于mycirclesize做什么以及何时做。

你可以用以下方式声明它:

\pgfkeys{/tikz/mycirclesize/.code={\pgf@x = #1}}
\pgfkeys{/tikz/mycirclesize/.default = 0.75cm}
\pgfkeysgetvalue{/tikz/mycirclesize}{\macro}

这说明了三件事:

  1. \pgfkeys{/tikz/mycirclesize=<something>}被调用时,\pgf@x=<something>立即执行。
  2. 将的默认值设置为,/tikz/mycirclesize这样0.75cm如果\pgfkeys{/tikz/mycirclsize}调用时(即没有参数),我们假定它是0.75cm
  3. 获取当前值并将/tikz/mycirclesize其存储在中\macro

这第三个至关重要。在这一点上,/tikz/mycirclesize 没有价值并且返回的内容很简单\relax(甚至还没有初始化)。因此,此时\macro将其设置为,并且其值被冻结。\relax

稍后您致电:

\draw (0,0) node[mycircle, mycirclesize=2cm] {};

/tikz/mycirclesize它执行值为的键2cm,此时将设置\pgf@x2cm。然后它很快就会被消灭,因为它\pgf@x往往会在没有任何提示的情况下从一个东西转移到另一个东西。

你可能想要做的是将参数存储mycirclesize为其价值然后在\savedimen形状内的调用中获取此值(并将其分配给,\pgf@x因为这就是\savedimen工作原理)。以下是一些代码,只需对您的代码进行最少的更改即可完成此操作。

\documentclass[oneside,12pt]{scrartcl}
%\url{http://tex.stackexchange.com/q/73877/86}
\usepackage{tikz}
\usetikzlibrary{shapes}


\makeatletter
\pgfkeys{/tikz/mycirclesize/.initial = 0.75cm}

\pgfdeclareshape{mycircle}
{
    \savedanchor\centerpoint{
        \pgf@x = .5\wd\pgfnodeparttextbox
        \pgf@y = .5\ht\pgfnodeparttextbox
    }
    \anchor{center}{\centerpoint}

    \saveddimen\circsize{\pgf@x=\pgfkeysvalueof{/tikz/mycirclesize}}


    \backgroundpath{
        \centerpoint
        \pgfkeys{/pgf/minimum size = \circsize}
        \pgfset{inner sep=1pt}
        \pgfnode{circle}{center}{}{}{\pgfusepath{draw}}
    }

}

\makeatother

\begin{document}


\begin{tikzpicture}

    \draw (0,0) node[mycircle, mycirclesize=2cm] {};
\end{tikzpicture}

\end{document}

相关内容