TikZ Mindmaps:设置节点顶点之间的角度,而不是中心

TikZ Mindmaps:设置节点顶点之间的角度,而不是中心

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{mindmap}

\tikzset{
    every node/.append style={concept, minimum size=0cm, inner sep=2mm, text width=, minimum size=0cm}
}

\begin{document}

\begin{tikzpicture}[mindmap,text=white,fill=white]
\path node {O} [clockwise from=45, level 1/.append style={sibling angle=60} ]
child { node[align=center] {AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA} }
child { node[align=center] {AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA\\AAAAAAAAAAAAAAAAAA} }
child { node {BBB} }
child { node {BBB} };
\end{tikzpicture}

\end{document}

可以看出,两个大 A 节点之间的白色空间小于两个 B 节点之间的白色空间。

插图

如何设置节点顶点之间的角度,而不是节点中心(此处用 设置sibling space),以便白色空间始终相同?

答案1

我只有悲伤的消息。

mindmap采用 TiZ 的child语法。让我们来看看 TiZ 处理child

\def\tikz@childnode[#1]#2{%
  \advance\tikznumberofcurrentchild by1\relax%
  {\tikzset{every child/.try,#1}\expandafter}%
  \iftikz@child@missing%
    \tikzgdeventcallback{node}{}%
  \else%
  \setbox\tikz@whichbox=\hbox\bgroup%
    \unhbox\tikz@whichbox%
    \hbox\bgroup\bgroup%
        \pgfinterruptpath%
          \pgfscope%
            \let\tikz@transform=\pgfutil@empty%
            \tikzset{every child/.try,#1}%
            \tikz@options%
            \tikz@transform%            
            \let\tikz@transform=\relax%
            \tikz@grow%
            % Typeset node:
            \edef\tikz@parent@node@name{[name=\tikzparentnode-\the\tikznumberofcurrentchild,style=every child node]}%
            \def\tikz@child@node@text{[shape=coordinate]{}}
            \tikz@parse@child@node#2\pgf@stop%
            \expandafter\expandafter\expandafter\node
            \expandafter\tikz@parent@node@name
              \tikz@child@node@text
              \pgfextra{\global\let\tikz@childnode@name=\tikz@last@fig@name};%
            \let\tikzchildnode=\tikz@childnode@name%
            {%
              \def\tikz@edge@to@parent@needed{edge from parent}
              \ifx\tikz@child@node@rest\pgfutil@empty%
                \path edge from parent;%
              \else%
                \path \tikz@child@node@rest \tikz@edge@to@parent@needed;%
              \fi%
            }%
        \endpgfscope%
      \endpgfinterruptpath%
    \egroup\egroup%
  \egroup%
  \fi%
}

这篇文章很长,但逻辑很清晰:

  • \tikz@grow使树生长。也就是说,它将“笔”移动到子项(或孙项、或祖父母……你知道……)的预期位置
  • \node排版一个节点,其大小尚不清楚。

因此,我们发现,没有简单的方法可以根据子节点(或孙节点,或......)的大小来移动它。也许你可以在之后做一些事情\node,但你需要处理下一个节点,因为下一个调用\tikz@grow不知道发生了什么。然后我们开始考虑\tikz@grow一劳永逸地取消。毕竟,正如@cfr 前面总结的那样:

您必须先撤消其配置,然后执行您自己的配置,否则只需要后者。

所以最后一个问题是:我们还能做什么?手册第 429 页有张图片

这应该是一个好的开始。

相关内容