我想画这样的树:
在第一个分支中,子节点通过欧几里得除法用其父节点的除数 2 计算得出。在第二个分支中,子节点通过欧几里得除法用其父节点的除数 3 计算得出。依此类推,直到除数 floor(root/2)
该代码能够绘制任意根的第一个分支。
\documentclass[border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
div2/.style={
append/.process={ Ow+PS _>? l_w2 {content}{int(floor(##1/2))}{1}{div2}{}{[##1,##2]}},
},
[10, div2]
\end{forest}
\end{document}
为了自动绘制其他分支我尝试了这个:
\documentclass[border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
divn/.style args={1} ={
append/.process={ Ow+PS _>? l_w2 {content}
{int(floor(##1/#1))}{1}{divn}{}{[##1,##2]}},
},
%
tempcounta = {1},
branches/.style={
until{2*tempcounta > content}{
divn={content},
tempcounta/.pgfmath={tempcounta+1},
},
},
%
%
[3, branches]
\end{forest}
\end{document}
编辑: 根据成本加运费,我现在有这个:
\documentclass[border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
divn/.style args={1} ={
append/.process={ Ow+PS _>? l_w2 {content}{int(floor(##1/#1))}{1}{divn={tempcounta}}{}{[##1,##2]}},
},
%
tempcounta = 1,
branches/.style={
until={<Rw+P O+P> {tempcounta}{##1*2}{content}}{
branches/.append style={divn={tempcounta}},
tempcounta'+=1,
},
},
%
%
[5, branches]
\end{forest}
\end{document}
答案1
如果您想以这种方式使用 Forest,则需要花更多时间阅读手册并阅读此处和其他地方的示例。问题中的某些代码根本没有意义:例如,它甚至没有尝试访问值,而只是将键的名称作为常规文本提供给 Forest。
如果您想使用常规计数器,我认为您需要使用递归延迟。(我在回答您之前的问题时这样做了,尽管出于不同的原因。)否则,计数器将不会具有您期望的值。
但是,如果您可以使用 PGF 数学函数,forestloopcount
那么似乎可以避免显式引入延迟。(我很惊讶,即使是第一次迭代也不需要这样做,因为它使用了content
根的。但如果我没记错的话,动态树会自动建立一些延迟(我可能记错了)。
我想你想要这样的东西:
这使用了与您给出的条件不同的条件来获得正确的结果,因为我认为循环计数在循环中只增加一次。简单地增加计数太多了。但是,我认为增加两倍的值应该会给出预期的结果。
\documentclass[border=10pt]{standalone}
\usepackage{forest}
\forestset{
div n/.style={% #1 is the value passed to the style; ##1/##2 is the child content; ##1 is another iteration, if applicable
append/.process={ Ow+PS n>? _lw2 {content}{int(floor(##1/#1))}{#1-1}{div n=#1}{}{[##2,##1]}},
},
div branches/.style={
until={% loop count is incremented only in the loop, so add 1 to compensate
> P+nO+n> {int((2*(forestloopcount))+1)}{content}
}{% we don't want a branch for 1 - the first loop should use 2 and so on
tempcounta/.pgfmath=forestloopcount,
tempcounta'+=1,
div n/.register=tempcounta,
},
}
}
\begin{document}
\begin{forest}
[3, div branches, baseline]
\end{forest}
\begin{forest}
[10, div branches, baseline]
\end{forest}
\begin{forest}
[20, div branches, baseline]
\end{forest}
\begin{forest}
[17, div branches, baseline]
\end{forest}
\end{document}