如何在 pgfkeys“.code”宏中转换 pgf 命令

如何在 pgfkeys“.code”宏中转换 pgf 命令

我有一个 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)。输出如下:

在此处输入图片描述

所需的输出是在圆形的最东点绘制小斑点,而不管形状绘制在哪个坐标上,以及使用scalerotate命令。

答案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}

在此处输入图片描述

相关内容