我正在尝试为节点定义一个 tikz 样式,其中包括标签。由于标签相对于主节点的位置需要手动控制,因此我想以某种方式设置位置,但位置应该是“可选属性”。有没有 tikz 魔术师有好的解决方案,或者至少可以解释为什么我的尝试失败了?
我到目前为止尝试过的方法以及为什么它们不是一个好的解决方案:
1)使用双参数样式
mystyle/.style 2 args={label=#2:#1},
mystyle/.default={Defalut text}{60}
通过这种方式,我可以创建一个样式,它能给我想要的输出,但使用起来非常不方便。为了使位置可选,我需要添加第二组括号,或者用三重括号括住文本参数。默认位置也不起作用,因为只有在未提供任何参数时才会使用默认值。
2)使用第二个键来存储值
mypos/.store in=\mypos,
mypos=60,
mystyle/.style={label=\mypos:#1}
似乎\mypos
宏没有正确展开,因为mypos
在节点选项中设置键不会改变位置。\pgfkeys
但是,使用手动设置键确实有效。如果用于其他用途(如内部分隔符),此方法有效,但对于标签无效...
3)使用标签位置键
mypos/.forward to={/tikz/label position},
mypos=60,
mystyle/.style={label=#1}
再次,在节点选项中设置位置不会改变任何东西。
完整 MWE:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
Using \verb+/.style 2 args+
\begin{tikzpicture}[
mystyle/.style 2 args={label=#2:#1},
mystyle/.default={Defalut text}{60}
]
\node [mystyle={{{Label A}}}] {Text A}; % This really needs tripple braces...
\node at (2,0) [mystyle={Label B}{}] {Text B};
\node at (5,0) [mystyle={Label C}{120}] {Text C};
\node at (7,0) [mystyle] {Text D};
\end{tikzpicture}
Using \verb+/.store in+
\begin{tikzpicture}[
mypos/.store in=\mypos,
mypos=60,
mystyle/.style={label=\mypos:#1}
]
\node [mystyle=Label A] {Text A};
\node at (2,0) [mystyle=Label B, mypos=120] {Text B};
\pgfkeys{tikz/mypos=120}
\node at (6,0) [mystyle=Label C, mypos=180] {Text C};
\end{tikzpicture}
Using \verb+label position+
\begin{tikzpicture}[
mypos/.forward to={/tikz/label position},
mypos=60,
mystyle/.style={label=#1}
]
\node [mystyle=Label A] {Text A};
\node at (2,0) [mystyle=Label B, mypos=120] {Text B};
\node at (4,0) [mystyle=Label C, label position=120] {Text C};
\end{tikzpicture}
\end{document}
答案1
这有帮助吗?完整的标签表达式(包括选项、位置和文本)被视为唯一参数。这样您就可以决定每个节点需要什么。
\documentclass[border=2mm,tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
mystyle/.style={
draw=red,
label={#1} %<-- Don't delete these braces
}
]
\node[draw, label=30:A] (A) {AAAA};
\node[mystyle=0:B, right=of A] (B) {BBBB};
\node[mystyle={[draw=blue, minimum size=1cm]C}, right=of B] (C) {CCCC};
\end{tikzpicture}
\end{document}