我想使用 在 TikZ 中声明一个新形状\pgfdeclareshape
。此形状将由多个部分组成,但通常,在调用形状时,我不希望显示所有部分。如果我可以在调用形状时传递一些参数或选项,并根据传递的\backgroundpath
参数以不同的方式绘制形状,那就太理想了。这可能吗?
锚点不依赖于参数,只依赖于绘制背景路径的哪些部分。
答案1
这就是\pgfkeys
目的!您可以在\pgfdeclareshape
查看各个键的设置并采取相应措施的片段中设置各种选项。
例如,在我的TQFT 封装,我有一些键可以设置传入和传出的边界组件的数量,并据此绘制形状。其他键控制各个部分的样式,并确定哪些部分可以绘制,哪些部分不可以绘制。
为了做您想做的事情,您可以定义一个新的条件键。
\newif\ifdrawnodepieces
\pgfkeys{/tikz/my shape/drawnodepieces/.is if=drawnodepieces}
然后在\pgfdeclareshape
代码中你有:
\ifdrawnodepieces
Code if set
\else
Code if not set
\fi
更复杂的事情也是可能的,比如根据设置改变路径的样式。你可以保存一种样式(确保在序言中初始化它):
\node[my shape,my shape/path/.style={fill,draw,red,line width=5cm}] {};
然后在形状中调用它:
\pgfsys@beginscope
\tikzset{my shape/path}
\tikz@mode
\tikz@options
draw path (using \pgfpath commands)
\edef\tikz@temp{\noexpand\pgfusepath{%
\iftikz@mode@fill fill,\fi%
\iftikz@mode@draw draw\fi%
}}%
\tikz@temp
\pgfsys@endscope
如果您在形状中使用 TikZ 类型的命令(不是推荐),那么您可以直接调用样式:
\path[my shape/path] (0,0) -- (2,0);
甚至可以根据参数改变节点的锚点——我在前面提到的 TQFT 包中这样做了,但我偷了这个想法,即pgflibraryshapes.geometric.code.tex
正多边形的边数取决于一个参数,而且因为每条边都获得一个锚点,所以它也必须变化。