当该节点由参数(#1)本身引用时,如何通过样式中的可选参数(#2)引用节点的锚点?

当该节点由参数(#1)本身引用时,如何通过样式中的可选参数(#2)引用节点的锚点?

我有一个通过参数引用节点的样式(POSITION)

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary
    {%
        positioning,
        shapes.geometric
    }
\tikzset
    {%
        POSITION/.style=
        {%
            below=0mm of #1.left corner,
            anchor=apex
        },
        TRIANGLE/.style=
        {%
            isosceles triangle,
            minimum width=30mm,
            line width=1mm,
            draw
        }
    }
\begin{document}
    \begin{tikzpicture}
        \path node[TRIANGLE](T1){};
        \path node
            [%
                TRIANGLE,
                POSITION={T1}
            ]   (T2){};
    \end{tikzpicture}
\end{document}

但除了节点参数(#1)之外,我还需要能够将节点的锚点单独传递给 POSITION 样式(作为#2 参数),以便left corner可以设置为锚点(#2)参数的默认值(使其成为可选的)。

以下是伪代码我正在寻找

POSITION/.style=
  {%
    below=0mm of #1.#2,
    anchor=apex
  }
POSITION/.default={#1}{left corner}

使其POSITION={T1}等于,POSITION={T1}{left corner}同时接受其他锚点值(如POSITION={T1}{right side})。

答案1

<whatever>/.style n args=2{<whatever's definition>},

或者

<whatever>/.style 2 args={<whatever's definition>},

但是,在这种情况下,您始终需要指定 2 个参数。如果这不可行,请使用单独的键来指定锚点。

在你拒绝这个建议并深入研究可选参数的复杂性之前,你应该至少阅读一下公认的答案pgfkeys 中的可选参数?。那里所支持的方法非常有意义。

如果您确实确定这是正确的用户界面,则可以使用一定程度的技巧。例如,我使用了一些与以下内容不太相似的东西chronos(尽管目的略有不同)。

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes.geometric}
\tikzset
{%
  POSITION/.style={%
    position aux/.expanded=#1.left corner.a,
  },
  position aux/.style args={#1.#2.#3}{%
    below=0pt of #1.#2, anchor=apex,
  },
  TRIANGLE/.style={%
    isosceles triangle,
    minimum width=30mm,
    line width=1mm,
    draw
  }
}
\begin{document}
\begin{tikzpicture}
  \path node [TRIANGLE] (T1) {};
  \path node [TRIANGLE, POSITION={T1}]   (T2) {};
  \path node [TRIANGLE, POSITION={T1.right corner}]   (T2) {};
\end{tikzpicture}
\end{document}

可选锚定

答案2

假设锚点参数永远不会包含.,那么以下方法可能会起作用:

\documentclass[varwidth,border=5]{standalone}
\usepackage{tikz}
\tikzset{%
  position/.style={
    .. position={#1.left corner.;}
  },
  .. position/.style args={#1.#2.#3;}{
    /utils/exec={[\#1 -> #1, \#2 -> #2]}
  }
}
\begin{document}
\ttfamily
\tikzset{position=T1}

\tikzset{position=T2.right side}
\end{document}

在此处输入图片描述

相关内容