Лесные деревья: Уменьшить размер узла дерева.

Лесные деревья: Уменьшить размер узла дерева.

Я хочу уменьшить некоторые узлы моего дерева. Но они не становятся меньше. inner sep=0.01mmприводит к тому же размеру узла, что и inner sep=1mm. Как это возможно? Что я упускаю?

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

Мой код:

\documentclass[border=10pt]{standalone} 

\usepackage{verbatim}
\usepackage{tikz}
\usepackage{forest}
\usepackage{graphicx}

\begin{document}
\begin{forest}
for tree={delay={where content={}{content={\phantom{00}}}{}},s sep+=5mm,l+=5mm}
[,circle,fill=black,inner sep=1mm
  [,circle,fill=red,inner sep=0.5mm
    [,circle,draw,black,inner sep=0.1mm]
    []
    [,circle,draw,black,inner sep=0.1mm]
    []
  ]
  []
  [,circle,fill=red,inner sep=0.5mm
    [,circle,fill=red,inner sep=0.25mm
        [,circle,draw,black,inner sep=0.1mm]
        [,circle,draw,black,inner sep=0.1mm]
        [,circle,draw,black,inner sep=0.1mm]
        [,circle,draw,black,inner sep=0.001mm]%%% <------------- ??
    ]
        []
        []
    [,circle,draw,black,inner sep=0.1mm] 
  ]
  [,circle,fill=red,inner sep=0.5mm]
]
\end{forest}
\end{document}

решение1

КакСалим Боу указал в комментарии, причина, по которой inner sepкажется неэффективным, заключается в том, что содержимое самого узла довольно большое, относительно говоря. Поэтому разница между 0.1mmи 0.001mmне имеет большого значения, поскольку это только изменяет поле вокруг содержимого с крошечного на еще более крошечное.

Как предложил Салим Боу, один из подходов — удалить код, добавляющий содержимое к узлам дерева. В этом случае настройки inner sepфактически будут определять размер всех узлов в дереве.

Однако, если вы хотите изменить размер только одного узла, вы можете предпочесть переопределить содержимое позже. Это изменит только содержимое этого узла, если установлено в качестве аргумента для этого узла. Обратите внимание, что большинство настроек inner sepможно просто удалить в этом случае, практически не оказав визуального влияния на внешний вид.

Я бы также предложил использовать стили, чтобы избежать дублирования настроек. Как лучше это сделать, зависит от того, что вам нужно. Вот возможный пример, который также иллюстрирует два метода изменения размера, описанные выше.

\documentclass[border=10pt]{standalone}
\usepackage{forest}

\begin{document}
\begin{forest}
  for tree={
    s sep'+=5mm,
    l'+=5mm,
  },
  my circle/.style={
    circle, fill=#1,
  },
  red circle/.style={
    my circle=red, inner sep=#1mm,
  },
  black circle/.style={
    my circle=black, inner sep=#1mm,
  },
  black hole/.style={
    circle, draw=black, inner sep=#1mm,
  }
  [, black circle=1
    [, red circle=0.5
      [, black hole=0.1]
      []
      [, black hole=0.1]
      []
    ]
    []
    [, red circle=0.5
      [, red circle=0.25
          [, black hole=0.1]
          [, black hole=0.1]
          [, black hole=0.1]
          [, black hole=0.001]
      ]
          []
          []
      [, black hole=0.1]
    ]
    [, red circle=0.5]
  ]
\end{forest}
\begin{forest}
  for tree={
    delay={where content={}{content={\phantom{00}}}{}},
    s sep'+=5mm,
    l'+=5mm,
  },
  my circle/.style={
    circle, fill=#1,
  },
  red circle/.style={
    my circle=red, inner sep=#1mm,
  },
  black circle/.style={
    my circle=black, inner sep=#1mm,
  },
  black hole/.style={
    circle, draw=black, inner sep=#1mm,
  }
  [, black circle=1
    [, red circle=0.5
      [, black hole=0.1]
      []
      [, black hole=0.1]
      []
    ]
    []
    [, red circle=0.5
      [, red circle=0.25
          [, black hole=0.1]
          [, black hole=0.1]
          [, black hole=0.1]
          [, black hole=0.001, before typesetting nodes={content=}]%%% <------------- ??
      ]
          []
          []
      [, black hole=0.1]
    ]
    [, red circle=0.5]
  ]
\end{forest}
\end{document}

два дерева

Дерево слева показывает узлы с размерами, определяемыми их inner seps. Дерево справа показывает их с фантомом 00в качестве содержимого, за исключением единственного крошечного узла, где это переопределено.

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