我正在尝试使用 \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}
这说明了三件事:
- 当
\pgfkeys{/tikz/mycirclesize=<something>}
被调用时,\pgf@x=<something>
立即执行。 - 将的默认值设置为,
/tikz/mycirclesize
这样0.75cm
如果\pgfkeys{/tikz/mycirclsize}
调用时(即没有参数),我们假定它是0.75cm
。 - 获取当前值并将
/tikz/mycirclesize
其存储在中\macro
。
这第三个至关重要。在这一点上,/tikz/mycirclesize
没有价值并且返回的内容很简单\relax
(甚至还没有初始化)。因此,此时\macro
将其设置为,并且其值被冻结。\relax
稍后您致电:
\draw (0,0) node[mycircle, mycirclesize=2cm] {};
/tikz/mycirclesize
它执行值为的键2cm
,此时将设置\pgf@x
为2cm
。然后它很快就会被消灭,因为它\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}