МВЭ

МВЭ

Следующий MWE основан на примере из forestдокументации. dotСтиль (отмеченный между %%%знаками) должен принимать аргумент, определяющий стили (в первую очередь цвета) для точек в дереве. Хотя он работает для именованных цветов, настройка dot={draw=none}не имеет никакого эффекта. Обычно настройка draw/ fillto noneдолжна рисовать/заполнять путь без цвета.

Что вызывает этот любопытный эффект? Имеет ли это какое-то отношение к тому факту, что dotопределяется с помощью \tikz+?

МВЭ

\documentclass{standalone}
\usepackage{forest}
\forestset{
  declare toks={elo}{}, % Edge Label Options
  anchors/.style={anchor=#1,child anchor=#1,parent anchor=#1},
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  dot/.style={tikz+={\draw[#1] (.child anchor) circle[radius=1.5pt];}},
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  decision edge label/.style n args=3{
    edge label/.expanded={node[midway,auto=#1,anchor=#2,\forestoption{elo}]{\strut$\unexpanded{#3}$}}
  },
  decision/.style={if n=1
    {decision edge label={left}{east}{#1}}
    {decision edge label={right}{west}{#1}}
  },
  text/.style={plain content},
  decision tree/.style={
    for tree={
      s sep=0mm,l=5mm,
      if n children=0{anchors=north}{
        if n=1{anchors=south east}{anchors=south west}},
      math content,
      /tikz/font=\footnotesize,
    },
    anchors=south, outer sep=2pt,
    dot={fill=white},for descendants={dot={fill}},
    delay={for descendants={split option={content}{;}{decision,content}}},
  }
}
\begin{document}
\begin{forest} decision tree
  [N,plain content
    [x;I,dot={draw=none,fill=red}] % 'draw=none' doesn't work here
    [x;I,dot={draw=red,fill=none}] % 'fill=none' doesn't work here
  ]
  % 'draw=none' works fine below
  \draw[draw=none](!1.anchor)--(!2.anchor)node[midway,above]{$x$};
\end{forest}
\end{document}

Выход

введите описание изображения здесь

решение1

draw=noneотлично работает в tikz+, как и в dotстиле:

\begin{forest}
  [abc, dot={draw=none, fill=red}
  ]
\end{forest}

красная точка, ничья отсутствует

Однако, tikzне то же самое, что tikz+. tikz+является кумулятивным. Следовательно, если вы говорите

for descendants={%
  dot={fill},
},

затем для всех потомков текущего узла (здесь — корневого) стиль dotвыполняется с fillаргументом и в список добавляются следующие команды для использования в дальнейшем:

\draw [fill] (.child anchor) circle [radius=1.5pt];

Если затем вы dotснова примените к определенному узлу, dotвыполняется снова с соответствующим аргументом. Например,

dot={draw=none, fill=red}

добавляет это в список команд TikZ для использования в дальнейшем:

\draw [draw=none, fill=red] (.child anchor) circle [radius=1.5pt];

Итак, теперь для этого узла обе эти команды будут использоваться одна за другой, когда дерево будет нарисовано:

\draw [fill] (.child anchor) circle [radius=1.5pt];
\draw [draw=none, fill=red] (.child anchor) circle [radius=1.5pt];

Первый рисует и заполняет круг черным цветом. Второй добавляет еще один круг, не нарисованный, но с красной заливкой, в том же самом месте. Итак, то, что вы видите на выходе, этодвакруги, один над другим.

Если вы хотите толькопоследнийиспользование dotдля эффективности измените определение на использование tikzвместо tikz+. Однако использованиеdot затем перезапишет любыедругойиспользует tikz/ tikz+/ +tikzдля узла. Если это не проблема, то решение очень простое. Если это проблема, вам нужно будет проделать еще немного гимнастики, чтобы заставить его работать так, как нужно, или убедиться, что все вызовыdot происходятдолюбые другие дополнения вносятся в список команд TikZ.

Вот измененный код для простого случая, который применяет политику «не более одной точки на узел»:

\documentclass[tikz,multi,border=10pt]{standalone}
\usepackage{forest}
\forestset{
  declare toks={elo}{}, % Edge Label Options
  anchors/.style={%
    anchor=#1,
    child anchor=#1,
    parent anchor=#1,
  },
  dot/.style={%
    tikz={%
      \draw [#1] (.child anchor) circle [radius=1.5pt];
    },
  },
  decision edge label/.style n args=3{
    edge label/.expanded={%
      node [midway, auto=#1, anchor=#2, \forestoption{elo}] {\strut$\unexpanded{#3}$}
    }
  },
  decision/.style={%
    if n=1{%
      decision edge label={left}{east}{#1},
    }{%
      decision edge label={right}{west}{#1},
    }
  },
  decision tree/.style={
    for tree={
      s sep=0mm,
      l=5mm,
      if n children=0{anchors=north}{
        if n=1{%
          anchors=south east,
        }{%
          anchors=south west,
        },
      },
      math content,
      font=\footnotesize,
    },
    anchors=south,
    outer sep=2pt,
    dot={%
      fill=white,
    },
    for descendants={%
      dot={fill},
    },
    delay={%
      for descendants={%
        split option={content}{;}{decision,content},
      },
    },
  }
}
\begin{document}
\begin{forest}
  decision tree
  [N, plain content
    [x;I, dot={draw=none, fill=red}
    ]
    [x;I, dot={draw=red, fill=none}
    ]
  ]
\end{forest}
\end{document}

только одна точка на узел!

Связанный контент