Увеличение размера узла при разной ширине линии в дереве

Увеличение размера узла при разной ширине линии в дереве

В попытке создать изображение нижевведите описание изображения здесь Я составил следующий код:

\documentclass[11pt]{book}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{trees,graphs,calc,arrows.meta,positioning,decorations.pathreplacing,bending,decorations.markings,matrix,fit,patterns}
\usepackage{pgfplots}
\usepackage{xepersian}
\settextfont[Scale=1]{Tahoma}
\setlatintextfont[Scale=1]{Times New Roman}
\setdigitfont[Scale=1]{Tahoma}
\begin{document}
    \begin{figure}
        \centering
        \tikzset{
            solid node/.style={circle,draw,inner sep=1.2,fill=black},}
        \begin{tikzpicture}
            \tikzset{
                level 1/.style={level distance=12mm,sibling distance=20mm},
                level 2/.style={level distance=12mm,sibling distance=12mm},
                level 3/.style={level distance=12mm,sibling distance=6mm},
            }
            \node (r) [solid node, label = above: {$r\,$\rl{(ریشه)}}]{}
            child{node[solid node, label= left: {$a_{1}$}]{}
                child[edge from parent/.style={draw, line width=0.7mm}]{node[solid node, label = left: {$b_{1}$}]{}
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
            }}
            child{node[solid node, label = left:{$a_{2}$}]{}
                child[edge from parent/.style={draw, line width=0.7mm}]{node[solid node, label = left:{$b_{2}$}]{}
                    child[missing]
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
                }
            }
            child{node (a3) [solid node, label = left:{$a_{3}$}]{}
                child[edge from parent/.style={draw, line width=0.7mm}]{node (b3)[solid node, label = left:{$b_{3}$}]{}
                    child[missing]}
            }
            child{node (aq)[solid node, label = right:{$a_{q}$}]{}
                child[edge from parent/.style={draw, line width=0.7mm}]{node (bq) [solid node, label = right:{$b_{q}$}]{}
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
                    child[edge from parent/.style={draw, thin}]{node[solid node]{}}
                }   
            }
            ;
            \path (a3.east) -- (aq.west) node [midway] {$\cdots$};
            \path (b3.east) -- (bq.west) node [midway] {$\cdots$};
            \tikzset{
                solid node/.style={circle,draw,inner sep=1.2,fill=black},
                no edge from this parent/.style={
                    every child/.append style={
                        edge from parent/.style={draw=none}}},
                level 3/.style={yshift=5cm},
                level 4/.style={level distance=10mm} }
            \node[right = 5 of r,align=right] {\rl{سطح $0$ (بیرونی)}} [no edge from this parent]
            child{node {\rl{سطح $1$ (درونی)}}[no edge from this parent]
                child{node {\rl{سطح $2$ (بیرونی)}} [no edge from this parent]
                    child{node {\rl{سطح $3$ (درونی)}}}
            }};
        \end{tikzpicture}
        \caption{درخت تناوبی.}
        \label{fig:3-33}
    \end{figure}
\end{document}

Что дает следующее изображение: введите описание изображения здесь Как видите, размер узлов изменился. Как это исправить? Спасибо за ваше время.

решение1

Либо удалите drawиз определения стиля узла, либо включите стандартный line width. Поскольку вы используете solid nodeстиль на путях с разной шириной линий, нарисованные границы этих узлов имеют разную ширину линий, и некоторые из них выглядят больше других.

Ниже приведен результат минимизации вашего примера и дополнения line width=0.4ptопределения.

стандартизированная ширина

Было бы разумно использовать пакет, такой как tikz-qtreeили, еще лучше, forest, но загрузка его без его использования не принесет вам никакой пользы. Аналогично, проблема не зависит от использования нелатинского алфавита, и код не требует большинства библиотек, загруженных в вашей преамбуле.

\documentclass[11pt]{book}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\tikzset{
  solid node/.style={circle,draw,line width=0.4pt,inner sep=1.2,fill=black},}
\begin{tikzpicture}
  \tikzset{
    level 1/.style={level distance=12mm,sibling distance=20mm},
    level 2/.style={level distance=12mm,sibling distance=12mm},
    level 3/.style={level distance=12mm,sibling distance=6mm},
  }
  \node (r) [solid node, label = above: {$r\,$xxx}]{}
  child{node[solid node, label= left: {$a_{1}$}]{}
    child[edge from parent/.style={draw, line width=0.7mm}]{node[solid node, label = left: {$b_{1}$}]{}
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
    }}
  child{node[solid node, label = left:{$a_{2}$}]{}
    child[edge from parent/.style={draw, line width=0.7mm}]{node[solid node, label = left:{$b_{2}$}]{}
      child[missing]
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
    }
  }
  child{node (a3) [solid node, label = left:{$a_{3}$}]{}
    child[edge from parent/.style={draw, line width=0.7mm}]{node (b3)[solid node, label = left:{$b_{3}$}]{}
      child[missing]}
  }
  child{node (aq)[solid node, label = right:{$a_{q}$}]{}
    child[edge from parent/.style={draw, line width=0.7mm}]{node (bq) [solid node, label = right:{$b_{q}$}]{}
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
      child[edge from parent/.style={draw, thin}]{node[solid node]{}}
    }   
  }
  ;
  \path (a3.east) -- (aq.west) node [midway] {$\cdots$};
  \path (b3.east) -- (bq.west) node [midway] {$\cdots$};
  \tikzset{
    solid node/.style={circle,draw,inner sep=1.2,fill=black},
    no edge from this parent/.style={
      every child/.append style={
        edge from parent/.style={draw=none}}},
    level 3/.style={yshift=5cm},
    level 4/.style={level distance=10mm} }
  \node[right = 5 of r,align=right] {xxx} [no edge from this parent]
  child{node {xxx}[no edge from this parent]
    child{node {xxx} [no edge from this parent]
      child{node {xxx}}
    }};
\end{tikzpicture}
\end{document}

forest(или даже tikz-qtree) позволит вам использовать менее загроможденный синтаксис и более мощную настройку, включая большую автоматизацию. Даже простое определение и применение stylesс помощью простого TiкZ сделает ваш код более понятным и гибким.

Например,

\documentclass[11pt]{book}
\usepackage{forest}
\usetikzlibrary{positioning}
% ateb: https://tex.stackexchange.com/a/705271/ addaswyd o gwestiwn Arian: https://tex.stackexchange.com/q/705249/
\newcounter{forlevel}
\renewcommand* \theforlevel{\alph{forlevel}}
\forestset{%
  declare toks={level label}{},
  last level label/.style={label={right:{${#1}_{q}$}}},
  other level label/.style 2 args={label={left:{${#1}_{#2}$}}},
  fancy tree/.style={%
    for tree={
      solid node,
      tier/.option=level,
      fit=band,
    },
    before typesetting nodes={
      for nodewalk={%
        fake=root,
        last leaf,
        branch'={%
          while={%
            >On>{level}{1}%
          }{%
            parent,
            TeX={\setcounter{forlevel}{\foresteoption{level}}},
            level label/.expanded=\theforlevel,
            last level label/.option=level label,
            tikz+={\path () -- (!previous on tier) node [midway] {$\cdots$};}%
          },
          while nodewalk valid={previous on tier}{%
            previous on tier,
            TeX={\setcounter{forlevel}{\foresteoption{level}}},
            level label/.expanded=\theforlevel,
            other level label/.process={OO{level label}{n}}
          }%
        }%
      }{},
    },
    before packing={%
      tempdima/.max={> OO OO  w4+d  {s}{!u1.s}  {s sep}{!u.n children} {(##1-##2)+##3*(##4-1)} }{leaves},
      for children={minimum width=\foresteregister{tempdima},typeset node},
    },
    before drawing tree={%
      for children={minimum width=0pt,typeset node},
    },
  },
}
\tikzset{
  solid node/.style={circle,draw,line width=0.4pt,inner sep=1.2,fill=black},}
\begin{document}
\begin{forest}
  fancy tree,
  [,label={above:{${r}$ xxx}}
    [[[][][][]]]
    [[[,phantom][][]]]
    [[]]
    [[[][][]]]
  ]
  \coordinate (e) at (current bounding box.east);
  \foreach \i/\j in {!r/xxx,!rl/xxx,!rll/xxx,!rlll/xxx}
  \node [anchor=west,xshift=10pt] at (\i -| e) {\j};
\end{forest}

\end{document}

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