我有一个通过参数引用节点的样式(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}