我想将 添加label
到节点,但位于节点“内部”。如下所示:
尽管没有命名实际的键,但手册似乎表明这可能是可能的。
标签节点的 ... 锚点 ... 的确定方式是标签节点将“背对”主节点的边界。所选锚点取决于所选边界点的位置及其相对于主节点中心的位置,以及是否设置了变换形状选项。一般来说,选择应该是你所期望的,但是在困难的情况下你可能必须自己设定锚点。(强调添加)
但是当我尝试这样的例子时:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz \node [circle,draw,label={[red,anchor=north]above:X}] {my circle};
\end{document}
标签节点的位置没有任何变化。它仍然在“外面”。
有任何想法吗?
答案1
这里的问题是 TikZ 应用了一些自动化功能(即\tikz@auto@anchor
宏),它将覆盖您的设置anchor
。
我们可以劫持.code
在节点中最后应用的用于标签内部的密钥(是的,甚至在我们自己的设置之后red, anchor=north
),然后调用\tikz@auto@anchor
:
\tikzset{label anchor/.style={tikz@label@post/.append style={anchor=#1}}}
或者我们让执行计算的宏稍微放松一点(不需要额外的键):
\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax}
如果anchor
现在在全球范围内更广泛地使用新的和改进的密钥(比如说\tikz[anchor=<dir>]
),它也会影响节点(并且目前没有办法恢复它)。
我还提供了一个密钥inside
(您甚至可以使用它两次来逆转效果)。
代码
\documentclass[tikz]{standalone}
\usepackage{etoolbox}
\makeatletter
\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax}
\tikzset{inside/.code=\preto\tikz@auto@anchor{\pgf@x-\pgf@x\pgf@y-\pgf@y}}
\makeatother
\begin{document}
\tikz\node [anchor=west, circle,draw,label={[red, anchor=north]above:X}] {my circle};
\tikz\node [anchor=west, circle,draw,label={[red, inside]below:X}] {my circle};
\end{document}
输出
答案2
这是利用该append after command
选项的另一种方法。要点是,通过引用锚点\tikzlastnode.center
,可以添加相对于该位置的标签。
能够完成这一任务的新风格是my label
:
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.center) node [#1] {#2}
}
}
}
阿姆韦:
\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.center) node [#1] {#2}
}
}
}
\begin{document}
\tikz \node [circle,draw,my label={red,above=0.15cm:X}] {my circle};
\tikz \node [circle,draw,my label={red,below=0.15cm:X}] {my circle};
\end{document}
结果是:
该样式在第一个参数上接受任何 TikZ 选项,因此很容易自定义颜色和位置:事实上,最好调整一点偏移量以不与文本重叠。
相反,如果知道标签始终必须放在“北边界”下方,那么最好的办法就是将样式改为my label
:
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.north) node [#1] {#2}
}
}
}
这样,只需设置:
\tikz\node [circle,draw,my label={red,below:X}] {my circle};
可以实现目标。
阿姆韦:
\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.north) node [#1] {#2}
}
}
}
\begin{document}
\begin{tikzpicture}
\node [circle,draw,my label={red,below:X}] {my circle};
\node [circle,draw,my label={red,below=0.15cm:X},xshift=2cm] {my circle};
\end{tikzpicture}
\end{document}
结果:
修订
如评论中所述,如果要引入多个标签,那么以前的方法会受到影响。但如果我们不引入节点,而是引入带有标签的坐标,那么这种方法是完全可行的。
代码:
\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={[#1]#2:#3}{
append after command={
(\tikzlastnode.center) coordinate[label={[label distance=0.1cm,#1]#2:#3}]
}
},
}
\begin{document}
\begin{tikzpicture}
\node [circle,
draw,
my label={[red]above:X},
my label={[green!70!blue]below:Y},
my label={[blue,yshift=0.3cm]above:Z}] {my circle};
\node [circle,
draw,
my label={[blue,yshift=-0.15cm]below:X},
my label={[green!70!blue]70:Z},
my label={[orange!80!red]130:Y},
xshift=2cm] {my circle};
\end{tikzpicture}
\end{document}
结果:
注意:通过使用label distance
选项定义中的,允许标签文本不重叠,只需说:
\tikz\node [circle,draw,my label={[red]below:X}] {my circle};
答案3
您还可以移动标签:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz \node [circle,draw,label={[red,yshift=-0.5cm]above:X}] {my circle};
\tikz \node [circle,draw,label={[red,label distance=-0.5cm]above:X}] {my circle};
\end{document}