![标签倾斜:意外的间隙](https://linux22.com/image/316752/%E6%A0%87%E7%AD%BE%E5%80%BE%E6%96%9C%EF%BC%9A%E6%84%8F%E5%A4%96%E7%9A%84%E9%97%B4%E9%9A%99.png)
我尝试以某些角度放置一些标签:
\documentclass[14pt]{extarticle}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[label distance=0.5cm]
\node[draw,circle, minimum size=10cm, thick,
label=1:a, label=2:a, label=3:a, label=4:a, label=5:a,
label=6:a, label=7:a, label=8:a, label=9:a, label=10:a,
label=44:a, label=45:a, label=46:a, label=47:a, label=48:a,
label=91:a, label=92:a, label=93:a, label=94:a, label=95:a,]
(c1) at (0,0) {};
\end{tikzpicture}
\end{document}
除了一些间隙外,标签的位置均匀,这些间隙似乎仅出现在 90*n+3 度左右的角度:
为什么会发生这种情况?我该怎么办?
答案1
我点击了克皮姆和塔拉斯的链接,事实上循环空间给出了原因。
简而言之,Ti钾Z 发明锚帮助您将节点放在所需的位置。在这种情况下,我们放置的是标签,它们是内部节点,缺少使用哪个锚点的信息。
显然 Ti钾如果 inout 角度约为 90 度,Z 会使用边缘处的锚点,否则会使用角落处的锚点。不明显的是 Ti钾Z 实现了两种机制来实现这一点:通常情况下是\tikz@auto@anchor
决定锚点;如果使用absolute
option 则是\tikz@compute@direction
。也许最晦涩的是,它们并不总是返回相同的结果:
\documentclass[border=9,tikz]{standalone}
\usetikzlibrary{shapes.misc}
\begin{document}
\def\r{100cm}\def\s{10cm}\def\t{1cm}
\tikzset{
every label/.style={draw=black,inner sep=0,minimum size=\t}
}
\begin{tikzpicture}
\clip(0,\r)+(-\s,-\s)rectangle+(\s,\s);
\draw(0,0)node[draw,circle,minimum size=\r*2,
label=90:90,label=91:91,label=92:92,label=93:93,label=94:94,label=95:95]{}
(0,0)edge(90:\r) edge(91:\r) edge(92:\r) edge(93:\r) edge(94:\r) edge(95:\r);
\end{tikzpicture}
\begin{tikzpicture}[absolute]
\clip(0,\r)+(-\s,-\s)rectangle+(\s,\s);
\draw(0,0)node[draw,circle,minimum size=\r*2,
label=90:90,label=91:91,label=92:92,label=93:93,label=94:94,label=95:95]{}
(0,0)edge(90:\r) edge(91:\r) edge(92:\r) edge(93:\r) edge(94:\r) edge(95:\r);
\end{tikzpicture}
要创建一个\tikz@whatever@called
一个连续的相对于输入角,从而防止间隙,最后\tikz@anchor
应该
- 已修复;或
- 各不相同持续地相对于输入角度。
循环空间实现第一种可能性,其中锚点center
是默认选择。
\makeatletter
\tikzset{
reset label anchor/.code={%
\let\tikz@auto@anchor=\pgfutil@empty
\def\tikz@anchor{#1}
},
reset label anchor/.default=center,
every label/.append style={reset label anchor}
}
\makeatother
\begin{tikzpicture}
\clip(0,\r)+(-\s,-\s)rectangle+(\s,\s);
\draw(0,0)node[draw,circle,minimum size=\r*2,
label=90:90,label=91:91,label=92:92,label=93:93,label=94:94,label=95:95]{}
(0,0)edge(90:\r) edge(91:\r) edge(92:\r) edge(93:\r) edge(94:\r) edge(95:\r);
\end{tikzpicture}
我实现了第二种可能性。假设输入角度为 ,则95
输出锚点为275
。一般来说,我会将输入加 180 度。
因此,如果延长连接父节点和子节点的线,center
无论其形状如何,它都会经过这两个节点。(对于圆形标签,距离不稳定,因为 Ti钾Z 添加强制性使固定专为矩形标签设计。
\tikzset{
every label/.append style={cross out},
every edge/.append style={shorten >=-1cm}
}
\makeatletter
\def\tikz@compute@direction#1{
\let\tikz@do@auto@anchor=\relax
\pgfmathsetcount{\c@pgf@counta}{#1+180}
\def\tikz@anchor{\the\c@pgf@counta}
}
\begin{tikzpicture}[absolute]
\clip(0,\r)+(-\s,-\s)rectangle+(\s,\s);
\draw(0,0)node[draw,circle,minimum size=\r*2,
label=90:90,label=91:91,label=92:92,label=93:93,label=94:94,label=95:95]{}
(0,0)edge(90:\r) edge(91:\r) edge(92:\r) edge(93:\r) edge(94:\r) edge(95:\r);
\end{tikzpicture}
答案2
要理解为什么会出现这些间隙0
,90
您应该仔细阅读 中的“17.10.2 标签选项”一节pgfmanual
。在那里您可以阅读:
然后,计算 的锚点
label node
。确定 的方式是label node
会“背对” 的边界main node
。所选的锚点取决于所选边界点的位置及其相对于主节点中心的位置,以及是否transform shape
设置了该选项。具体来说,当计算出的边界点位于 0º 时,west
将使用锚点。同样,当边界点位于 90º 时,south
将使用锚点,180º 和 270º 亦如此。对于这些“主”角之间的角度,如 30º 或 110º,则使用组合锚点,如
south west
30º 或south east
110º。但是,对于接近主角的角度(与主角相差最多 2º),则使用主角的锚点。因此,2º 边界点的标签将具有锚点west
,而 3º 边界点的标签将具有锚点south west
,从而导致锚点“跳跃”。您可以使用 键或间接键(如左键)“手动”设置锚点anchor
。
现在您可以理解为什么 2º 和 3º 处的标签之间存在间隙。前者根据其west
锚点放置,而最后一个south west
锚点则使用。请记住,默认情况下,节点是矩形的,然后下图显示了预期(虽然很奇怪)的行为
它显示了角度为 1º、2º 和 3º 的标签。您可以看到前两个标签比第三个标签更近,尽管红点保持相似的距离。标签内容之间的差距是由于解释锚点选择造成的。
如果您决定使用circle
标签,结果是类似的,原因也类似:
以前结果的代码是:
\documentclass[tikz,border=2mm]{standalone}
\begin{document}
\begin{tikzpicture}[label distance=0.5cm, every label/.style={draw}]
\node[draw, circle, minimum size=3cm, thick,
label={[name=1]1:a}, label={[name=2]2:a}, label={[name=3]3:a}]
(c1) at (0,0) {};
\foreach \i/\j in {1/west,2/west,3/south west}
\draw (0,0)--(\i.\j) node[circle, fill=red, minimum size=2pt, inner sep=0pt]{};
\end{tikzpicture}
\begin{tikzpicture}[label distance=0.5cm, every label/.style={draw, circle}]
\node[draw, circle, minimum size=3cm, thick,
label={[name=1]1:a}, label={[name=2]2:a}, label={[name=3]3:a}]
(c1) at (0,0) {};
\foreach \i/\j in {1/west,2/west,3/south west}
\draw (0,0)--(\i.\j) node[circle, fill=red, minimum size=2pt, inner sep=0pt]{};
\end{tikzpicture}\end{document}