向 TikZ/pgf 形状添加自省

向 TikZ/pgf 形状添加自省

在深入研究\tracingmacros=1一段时间后,我会在这里问...我正在尝试对形状添加一些内省pgf。这个想法是为了能够“提取”\savedmacro形状的。

更具体地说:是否可以定义以下\whatamI宏,使其扩展为形状(作为参数传递)内部\Iam

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\pgfdeclareshape{myA}{
    \savedmacro{\Iam}{\edef\Iam{A}}
    \anchor{center}{\pgfpointorigin}
    \behindbackgroundpath{
        \pgfnode{circle}{center}{\Iam}{}{\pgfusepath{stroke}}
    }
}
\pgfdeclareshape{myB}{
    \savedmacro{\Iam}{\edef\Iam{B}}
    \anchor{center}{\pgfpointorigin}
    \behindbackgroundpath{
        \pgfnode{rectangle}{center}{\Iam}{}{\pgfusepath{stroke}}
    }
}
\def\whatamI#1{%
    % extract the saved macro \Iam definition
    % return \relax or -NoItem- or whatever if not defined in the shape
    % ???
}
\begin{document}
    They works: \begin{tikzpicture}
        % \tracingmacros=1
        \node [myA](A) at(0,0) {};
        % \tracingmacros=1
        \node [myB](B) at(1,0) {};
        % ...more code
        \edef\nodeAis{\whatamI{A}} % so now I can do different things dinamically
        \node [draw, rectangle,red,right] at (2,0) {%
            Node A is \nodeAis};
    \end{tikzpicture}

\end{document}

上述 MWE 的输出

请注意,我实际上不需要savedmacro通过其标签/名称检索形状的特定实例。即使能够检索最后一个指定的实例或检索值在形状文本中对我来说就足够了。

答案1

看来主要问题是你不知道保存的东西在哪里。对于宏,它们在\pgf@sh@ma@NAMEOFNODE哪里NAMEOFNODE被替换为节点的名称。

例如,如果我插入\show\pgf@sh@ma@A你的代码,我会得到

> \pgf@sh@ma@A=macro:
->\def \Iam {A}.

如果我插入\show\pgf@sh@ma@B,我会得到

> \pgf@sh@ma@B=macro:
->\def \Iam {B}.

如果有多个保存的宏,则会有多个内容。例如,对于regular polygon来自的形状shapes.geometric,有其保存的宏

> \pgf@sh@ma@NAMEOFPOLYGON=macro:
->\def \sides {5}\def \anglestep {72.0}\def \calculateradii {\def \radius {5.82619pt}\def \anchorradius {6.07338pt}}\def \startangle {90.0}.

回到你的问题。要提取\Iam节点的(A),只需执行\pgf@sh@ma@A,然后\Iam将被定义为A。同样,如果你执行\pgf@sh@ma@B,那么\Iam将被定义为B

因此以下工作

\begin{tikzpicture}
    \node [myA](A) at(0,0) {};
    \node [myB](B) at(1,0) {};
    \node [draw, rectangle,red] at (3,0) {%
        Node A is \pgf@sh@ma@A\Iam};
    \node [draw, rectangle,green,right] at (5,0) {%
        Node B is \pgf@sh@ma@B\Iam};
\end{tikzpicture}

PS 这是一个列表

  • pgf@sh@ns@#1:”节点形状”,例如rectanglecircle
  • pgf@sh@np@#1:保存的锚点和尺寸。
  • pgf@sh@nt@#1:应用于节点的转换;这会影响锚点的位置,因此值得记住。
  • pgf@sh@pi@#1:图片id,用于记住图片等。
  • pgf@sh@ma@#1:像在这个答案中一样保存了宏。

相关内容