我有一个 pgf 形状,我希望能够使用某些键来构建它,这些键会向形状添加可选部分。这些键使用 pgfkeys.code
参数绘制可选部分。问题是,当我在页面上的不同位置或使用命令绘制形状时scale
,这些可选部分无法正常移动。
我怎样才能使可选部分随形状的其余部分移动和缩放?
这是我当前的代码:
\documentclass{article}
\usepackage{tikz}
\makeatletter
\pgfkeys{/tikz/east/.code={
\color{#1}
\pgfpathcircle{\pgfpoint{1cm}{0cm}}{0.1cm}
\pgfusepath{fill}}
}
\pgfkeys{/tikz/east/.default=black}
\pgfdeclareshape{my circle}{
\savedanchor\centerpoint{
\pgf@x=0pt
\pgf@y=0pt
}
\anchor{center}{\centerpoint}
\foregroundpath{
\pgfpathcircle{\pgfpoint{0cm}{0cm}}{1cm}
\pgfusepath{stroke}
}
}
\makeatother
\begin{document}
\[
\begin{tikzpicture}
\node [my circle, scale=1, east=blue] at (0cm,1cm) {};
\end{tikzpicture}
\]
\end{document}
这里我传递了参数“east=blue”,它应该在圆的东边画一个小蓝点。我在 (0cm,1cm) 处画了节点,但这个小蓝点画得好像圆的中心在 (0cm,0cm)。输出如下:
所需的输出是在圆形的最东点绘制小斑点,而不管形状绘制在哪个坐标上,以及使用scale
和rotate
命令。
答案1
如果你真的想重新发明轮子,那就去看看 tikz 代码吧。;-) 但是,我认为这里没有必要。这里有一个建议,我认为它能满足你的要求。
\documentclass[tikz,border=3.14mm]{standalone}
\tikzset{my circle/.style={circle,draw,minimum size=2cm,alias=mycirc},
my east/.style={append after command={
\pgfextra{\fill[#1] (\tikzlastnode.east) circle (1mm);}}}}
\begin{document}
\foreach \X in {0.5,0.55,...,2} % animation just for fun
{\begin{tikzpicture}
\path[use as bounding box] (-2,-1) rectangle (2,3); % just for the animation
\node [my circle, scale=\X,my east=blue] at (0cm,1cm) {};
\end{tikzpicture}}
\end{document}
答案2
编辑
它确实不适用于scale
。但是,此解决方案可以:
\documentclass[tikz,margin=2mm]{standalone}
\usepackage{tikz}
\makeatletter
\def\blob@east{0}
\tikzset{
blob east/.code={\def\blob@east{1}\def\blob@east@color{#1}},
blob east/.default=black,
}
\pgfdeclareshape{my circle}{
\savedanchor\centerpoint{
\pgf@x=0pt
\pgf@y=0pt
}
\anchor{center}{\centerpoint}
\foregroundpath{
\pgfpathcircle{\pgfpoint{0cm}{0cm}}{1cm}
\pgfusepath{stroke}
\ifnum\blob@east=1
\pgfsetcolor{\blob@east@color}
\pgfpathcircle{\pgfpoint{1cm}{0cm}}{1mm}
\pgfusepath{fill}
\fi
}
}
\makeatother
\begin{document}
\foreach \Scale in {1,2,3,4}{
\begin{tikzpicture}
\path (-5,-4) rectangle (15,6);
\node [my circle, scale=\Scale, blob east=blue] at (0,1) {};
\node [my circle, scale=\Scale] at (10,1) {};
\end{tikzpicture}
}
\end{document}
旧答案
我不确定如何使用低级\pgf...
命令来执行此操作,但如果您只想绘制相对于节点的点,则可以很容易地使用一些更高级别的命令来完成。
\documentclass[tikz,margin=2mm]{standalone}
\usepackage{tikz}
\makeatletter
%\pgfkeys{/tikz/east/.code={
% \color{#1}
% \pgfpathcircle{\pgfpoint{1cm}{0cm}}{0.1cm}
% \pgfusepath{fill}}
%}
\tikzset{
east/.style={
append after command={
\pgfextra{
\fill[shift={(\tikzlastnode)},#1] (1cm,0) circle (0.1cm);
}
},
},
}
\pgfkeys{/tikz/east/.default=black}
\pgfdeclareshape{my circle}{
\savedanchor\centerpoint{
\pgf@x=0pt
\pgf@y=0pt
}
\anchor{center}{\centerpoint}
\foregroundpath{
\pgfpathcircle{\pgfpoint{0cm}{0cm}}{1cm}
\pgfusepath{stroke}
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node [my circle, scale=1, east=blue] at (0cm,1cm) {};
\end{tikzpicture}
\end{document}