绘制 pq 树,所有数字都在底部

绘制 pq 树,所有数字都在底部

我需要在 LaTeX 中绘制 PQ 树。

使所有数字都像上图那样,位于底部的同一层级。

谢谢 !

我将现有的乳胶代码放在这里:

\documentclass[tikz,convert=false]{minimal}
\usepackage{forest}
\usetikzlibrary{shapes.geometric,patterns}
\usetikzlibrary{arrows.meta, angles}
\forestset{
  *|/.style={
    parent anchor=south,
    for descendants={
      edge path={
        \noexpand\path[\forestoption{edge}]
        (!u.parent anchor-|.child anchor) -- (.child anchor)\forestoption{edge label};
      }
    }
  },
  normal width/.initial=.5cm,
  normal height/.initial=.3cm,
  every forest node/.style={
    draw,
    minimum width=\pgfkeysvalueof{/forest/normal width},
    minimum height=\pgfkeysvalueof{/forest/normal height},
    inner sep=+0pt,
    anchor=south,
  },
  rect/.style={
    every forest node,
    shape=rectangle,
    minimum width=(#1)*(\pgfkeysvalueof{/forest/normal width})+(#1+1)*(\forestove{s sep})-(#1)*(\pgfkeysvalueof{/pgf/outer xsep}),
  },
  rect/.default=3,
   ellipse/.style={
    every forest node,
    shape=ellipse,
    minimum width=(#1)*(\pgfkeysvalueof{/forest/normal width})+(#1+1)*(\forestove{s sep})-(#1)*(\pgfkeysvalueof{/pgf/outer xsep}),
  },
  ellipse/.default=3,
  patt/.style args={#1:#2}{
    node options={
      /tikz/path picture={
        \pgfsetfillpattern{north east lines}{black}
        \pgfpathrectanglecorners
          {\pgfpointlineattime{#1}
            {\pgfpointanchor{path picture bounding box}{north west}}
            {\pgfpointanchor{path picture bounding box}{north east}}}
          {\pgfpointlineattime{#2}
            {\pgfpointanchor{path picture bounding box}{south west}}
            {\pgfpointanchor{path picture bounding box}{south east}}}
         \pgfusepath{fill}
      }
    }
  },
  patt/.default=0:1
}
\begin{document}
\begin{forest} for tree={child anchor=north}
  [,ellipse=18,*|
     [1]
    [2]
    [3]
    [,ellipse=6,*|
    [4]
    [5]
    [6]
    [7]
    [8]
    [9]
    ]
    [10]
    [11]
    [12]
    [, ellipse=6 , *|
    [13]
    [14]
    [15]
    [16]
    [17]
    [18]
    ]
    ]
\end{forest}
\end{document}

我的代码运行结果是这样的: pq tree now

我期望的数字是这样的:

pq tree expected

即使有更多的节点,所有的数字在底部都处于同一级别。

如果能控制pq树的节点和个数的大小就更好了,图形会更美观。美观我觉得我的pq树的大小不太合适。

(之后我会尝试自己每次都用python代码自动生成它)

谢谢你!

答案1

请注意,您的.defaults 没有执行任何操作,并且您的大多数定义从未使用过。如果您从未计划更改normal width等,那么您只会使计算速度比要求的慢得多。

请注意,如果您从其他人那里借用了代码,出于礼貌(有时是许可),您需要注明出处并提供链接(如果可能)。显然,我可能弄错了,但我猜代码最初不是您的,因为您没有管理的代码比您显示的代码简单得多,并且您使用的代码似乎没有使用 Forest 的当前版本,这简化了指定替代方案的edge path过程。

如果代码在 TeX SE 上,那么知道在哪里会特别有用,这样就可以更新帖子以使用当前的 Forest 并进行修改,以避免使用被视为内部实现而不是用户界面一部分的宏。

据我了解,你想要这样的东西:

pq tree

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\usetikzlibrary{shapes.geometric}
\forestset{
  *|/.style={
    parent anchor=children,
    for descendants={
      edge path'={
        (!u.parent anchor-|.child anchor) -- (.child anchor)
      }
    }
  },
  normal width/.initial=.5cm,
  normal height/.initial=.3cm,
  ellipse/.style={
    draw,
    minimum width=\pgfkeysvalueof{/forest/normal width},
    minimum height=\pgfkeysvalueof{/forest/normal height},
    inner sep=+0pt,
    anchor=children,
    shape=ellipse,
    minimum width=(#1)*(\pgfkeysvalueof{/forest/normal width})+(#1+1)*(\foresteoption{s sep})-(#1)*(\pgfkeysvalueof{/pgf/outer xsep}),
  },
  ellipse/.default=3,
}
\begin{document}
\begin{forest}
  for tree={child anchor=parent},
  where n children=0{tier=terminus}{},
  [,ellipse=18,*|
    [1]
     [2]
     [3]
     [,ellipse=6,*|
      [4]
      [5]
      [6]
      [7]
      [8]
      [9]
    ]
    [10]
    [11]
    [12]
    [, ellipse=6 , *|
      [13]
      [14]
      [15]
      [16]
      [17]
      [18]
    ]
  ]
\end{forest}
\end{document}

相关内容