标签倾斜:意外的间隙

标签倾斜:意外的间隙

我尝试以某些角度放置一些标签:

\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

我点击了克皮姆塔拉斯的链接,事实上循环空间给出了原因。

简而言之,TiZ 发明帮助您将节点放在所需的位置。在这种情况下,我们放置的是标签,它们是内部节点,缺少使用哪个锚点的信息。

显然 Ti如果 inout 角度约为 90 度,Z 会使用边缘处的锚点,否则会使用角落处的锚点。不明显的是 TiZ 实现了两种机制来实现这一点:通常情况下是\tikz@auto@anchor决定锚点;如果使用absoluteoption 则是\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无论其形状如何,它都会经过这两个节点。(对于圆形标签,距离不稳定,因为 TiZ 添加强制性使固定专为矩形标签设计。

\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

要理解为什么会出现这些间隙090您应该仔细阅读 中的“17.10.2 标签选项”一节pgfmanual。在那里您可以阅读:

然后,计算 的锚点label node。确定 的方式是 label node会“背对” 的边界main node。所选的锚点取决于所选边界点的位置及其相对于主节点中心的位置,以及是否transform shape设置了该选项。具体来说,当计算出的边界点位于 0º 时,west将使用锚点。同样,当边界点位于 90º 时,south将使用锚点,180º 和 270º 亦如此。

对于这些“主”角之间的角度,如 30º 或 110º,则使用组合锚点,如south west30º 或south east110º。但是,对于接近主角的角度(与主角相差最多 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}

相关内容