我需要在 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树的节点和个数的大小就更好了,图形会更美观。美观我觉得我的pq树的大小不太合适。
(之后我会尝试自己每次都用python代码自动生成它)
谢谢你!
答案1
请注意,您的.default
s 没有执行任何操作,并且您的大多数定义从未使用过。如果您从未计划更改normal width
等,那么您只会使计算速度比要求的慢得多。
请注意,如果您从其他人那里借用了代码,出于礼貌(有时是许可),您需要注明出处并提供链接(如果可能)。显然,我可能弄错了,但我猜代码最初不是您的,因为您没有管理的代码比您显示的代码简单得多,并且您使用的代码似乎没有使用 Forest 的当前版本,这简化了指定替代方案的edge path
过程。
如果代码在 TeX SE 上,那么知道在哪里会特别有用,这样就可以更新帖子以使用当前的 Forest 并进行修改,以避免使用被视为内部实现而不是用户界面一部分的宏。
据我了解,你想要这样的东西:
\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}