如何明确设置 TikZ 标签锚点?

如何明确设置 TikZ 标签锚点?

我想将 添加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}

相关内容