什么不起作用

什么不起作用

我开始相信 tikz 并不适合我......

我怎么会弄错呢:

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,calc,trees,mindmap,backgrounds,shadows}

\begin{document}

\begin{tikzpicture}
\path[mindmap,concept,concept color=red] (0,0) node (languages) {Languages} [clockwise from=90]
    child { node {Markdown} }
    child[ sibling angle=110, level distance=8cm] { node {R}  [clockwise from=130]
        child[ level distance = 4cm] { node {control structures (if, for, \mbox{while, repeat,} \mbox{next, break)}} }
        child[ sibling angle = 90, level distance=6cm] { node {data types} [clockwise from=110] 
            child { node {vectors} }
            child { node {lists} }
            child { node {matrices} }
            child { node {data frames} }
            child { node {factors} }
            child { node {dates} }
            child { node {time} }
            child { node {data.table} }
            child { node {missing values} }
        }
        child[ sibling angle = 20] { node {functions} }
    }
    child[sibling angle=130] { node {RMarkdown} }
;
\end{tikzpicture}

\end{document}

为什么“函数”与“数据类型”不是 20 度?同级角度如何工作?(阅读手册没有帮助)

什么不起作用

不起作用 1

Mark Wibrow 的回答很棒……或者对我来说会很棒。在详细介绍他的功能之前,我应该分享一个对我来说不起作用的更基本的示例:

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

\begin{document}
\begin{tikzpicture}[mindmap, concept color=blue!20, every child node/.style={concept}]

\node[concept] (languages) {O} [clockwise from=90, sibling angle=90]
  child { node {A} }
  child { node {B} }
  child { node {C}
   child { node {C1} }
   child { node {C1} }
   child { node {C1} }
  }
  child { node {D} };

\end{tikzpicture}
\end{document}

在此处输入图片描述

不起作用 2 - 奇怪的结果变化

small mindmap而 则与mindmapMark Wibrow 的结果很相似(尽管这可能是偶然的):

在此处输入图片描述

不起作用 3 - Mark Wibrow 的代码

使用 Mark Wibrow 的最后一段代码会得到他所显示的结果,但如果我将其更改[clockwise from=0, sibling angle=45][clockwise from=0, sibling angle=10]C1 节点的结果不会改变。

最好的办法

经过反复尝试,我认为最好的方法是使用类似 Mark Wibrow 的角度列表,但不使用绝对值,而是列表包含从每个节点到前一个节点的角度。例如,将(七个节点)[grow cyclic list={120,70,40,5,-30,-80,-100}]改为[grow cyclic list={120,-50,-30,-35,-35,-50,-20}]

答案1

从手册中看并不是很清楚(如果有的话),但是当使用键时,子节点的clockwise from角度基本上是:B

B = A - (n-1)*s

其中A是起始角度,n是当前子节点的编号,s是兄弟节点角度的当前值(可以全局、本地或级别设置,或每个子节点样式设置)。因此,如果起始角度为 ,而兄弟节点角度在第三个子节点的子选项中A=130设置为( ),则节点的角度为,我认为这就是您得到的结果。s=20n=3B=130-(3-1)*20=90

因此,如果您使用clockwise from键并且希望n第个子节点以特定角度出现B,则兄弟角度s应设置为:

s = (A - B) / (n-1)

令人困惑?好吧,也许吧。但在这种情况下,可能更有用的是子选项中给出的grow cyclic absolute键,其中给出了子项的绝对角度。sibling anglesibling angle 必须为每个子节点提供(否则它将是当前范围内设置的兄弟角度),但仍可以为(曾,......)孙子安装其他增长函数。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{trees,mindmap}
\tikzset{grow cyclic absolute/.style={%
  growth function=\tikzgrowcyclicabsolute}}
\def\tikzgrowcyclicabsolute{%
  \pgftransformshift{%
   \pgfpointpolar{\pgfkeysvalueof{/tikz/sibling angle}}%
    {\the\tikzleveldistance}}}
\begin{document}
\begin{tikzpicture}[small mindmap, concept color=blue!20,  
  every child node/.style={concept}]
\node [concept] (languages) 
  {O} [grow cyclic absolute] 
    child [sibling angle=90]  { node {A} }
    child [sibling angle=0]   { node {B} }
    child [sibling angle=-45] { node {C} 
      [clockwise from=0, sibling angle=45]
      child { node {C1} }
      child { node {C1} }
      child { node {C1} }
    }
    child [sibling angle=210] { node {D} };
\end{tikzpicture}
\end{document}

在此处输入图片描述

为了避免因无尽的兄弟角度而使子代码混乱的烦恼,grow cyclic list可以使用替代增长函数来在增长函数设置时指定增长角度:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{trees,mindmap}
\tikzset{grow cyclic list/.code={%
  \def\tikzgrowthpositions{{#1}}%
  \foreach \n [count=\i,remember=\i]in {#1}{}%
  \let\tikzgrowthpositionscount=\i%
  \tikzset{growth function=\tikzgrowcycliclist}}}
\def\tikzgrowcycliclist{%
  \pgftransformshift{%
    \pgfpointpolar{\tikzgrowthpositions[mod(\the\tikznumberofcurrentchild-1,\tikzgrowthpositionscount)]}%
      {\the\tikzleveldistance}}}
\begin{document}
\begin{tikzpicture}[small mindmap, concept color=blue!20,  
  every child node/.style={concept}]
\node [concept] (languages) 
  {O} [grow cyclic list={90,0,-45,210}] 
    child { node {A} }
    child { node {B} }
    child { node {C} 
      [clockwise from=0, sibling angle=45]
      child { node {C1} }
      child { node {C1} }
      child { node {C1} }
    }
    child { node {D} };
\end{tikzpicture}
\end{document}

结果和以前一样。

绝对指定角度的优点是可以将任何角度预处理为绝对角度。下面演示了一个例子,给定一个起始角度,角度之间可以在列表中指定兄弟节点。此列表已预处理为绝对角度。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{trees,mindmap}
\makeatletter
\tikzset{%
grow clockwise/.code args={first at #1 then turning #2}{%
  \pgfmathparse{#1}%
  \let\tikzgrowthpositions=\pgfmathresult%
  \let\tikz@tmpangle=\pgfmathresult%
  \c@pgf@counta=1\relax%
  \pgfutil@for\tikz@tmp:=#2\do{%
    \advance\c@pgf@counta by1\relax%
    \pgfmathparse{Mod(\tikz@tmpangle-\tikz@tmp, 360)}%
    \let\tikz@tmpangle=\pgfmathresult%
    \edef\tikzgrowthpositions{\tikzgrowthpositions,\tikz@tmpangle}%
  }%
  \edef\tikzgrowthpositions{{\tikzgrowthpositions}}%
  \edef\tikzgrowthpositionscount{\the\c@pgf@counta}%
  \tikzset{growth function=\tikzgrowcycliclist}%
}}
\def\tikzgrowcycliclist{%
  \pgftransformshift{%
    \pgfpointpolar{\tikzgrowthpositions[mod(\the\tikznumberofcurrentchild-1,\tikzgrowthpositionscount)]}%
      {\the\tikzleveldistance}}}
\begin{document}
\begin{tikzpicture}[small mindmap, concept color=blue!20,  
  every child node/.style={concept}]
\node [concept] (languages) 
  {O} [grow clockwise={first at 90 then turning 90,45,105}] 
    child { node {A} }
    child { node {B} }
    child { node {C} 
      [clockwise from=0,  level 2/.append style={sibling angle=60}]
      child { node {C1} }
      child { node {C1} }
      child { node {C1} }
    }
    child { node {D} };
\end{tikzpicture}
\end{document}

结果和以前一样。

相关内容