是否可以用森林来模拟 qtree?

是否可以用森林来模拟 qtree?

这个问题实际上是由艾伦·芒恩在评论中如何创建 LCM 树状图?。我在这里重复(并自我回答)这个问题,因为答案太长,不适合页边距 :-)

qtree是一个著名且广泛使用的软件包,用于使用所谓的括号符号绘制树。(括号符号对语言学家来说尤其熟悉。)forest是我自己最近为同一工作开发的软件包。由于pgf/的强大功能tikz(特别是pgfkeys实用性),它forest是一个非常灵活的软件包。---从我迄今为止收到的反馈(包括来自本网站的反馈)来看,我似乎并不是唯一一个这么认为的人。这让我很高兴。:-)

qtree尽管和都forest使用括号表示法对树进行编码,但确切的语法有些不同。虽然forest要求每个节点(包括其子节点)都括在方括号中(如下所示[node [child node] ... [child node]]:),但qtree在终端节点(叶子)的情况下放宽了这一要求:它们可以简单地用空格分隔,如下所示:[.node leaf ... leaf ]。此外,这两个包在节点标签的编码方面有所不同:如上所述,在qtree括号中(通常是非终端)节点的标签前面必须有一个点(.)。

forest使用与相同的语法synttree;另一个使用(并扩展)qtree的语法的包是(显然)tikz-qtree。正如我在上述问题的评论中提到的,我决定使用synttree-like 语法纯粹是出于个人喜好。我想我发现它更一致。)

正如 Alan 指出的那样,语法上的差异使得从 到 的潜在过渡变得qtree更加forest困难:没有人愿意扔掉他/她精心绘制的大量树木。因此 Alan 的问题是:是否有可能同时forest支持这两种语法方言?

答案1

我很高兴地告诉大家,答案是肯定的,至少在某种程度上是这样。我创建了一个风格实现forest代码兼容性:包含树的文档qtree可以按原样使用,只需更改\usepackage{qtree}\usepackage{forest-qtree}。(请注意此语句的一个例外:节点标签中的任何逗号都必须用括号括起来;解释如下。)(为了使样式起作用,forest v1.03需要。因为我今天刚刚发布它 --- 是的,我在模拟器上工作时发现了一些错误 :-) --- 它可能还没有可在 CTAN 购买;如果是,请从 GitHub 下载:dtx插件

我已经设法处理了qtree手册(“森林化”特克斯pdf) 与模拟器一起运行,仅省略了体现qtree低级接口的树。详细地说,模拟涵盖[.label child ... [.subtree ...] child ... child ].label语法、\qroofs、通过调用\Tree、无标签节点、子标和上标和素数、钩子、转义、子树框架和居中(动态和包选项)。本质上,只有长度参数和间距调整没有被模拟;至于后者,我认为forest(由于其定位算法)实际上不需要它们。;-)

然而,这个故事也有阴暗的一面。

首先,模拟确实不是产生视觉上相同的结果。结果树的结构相同,但排版细节不同。这可以改进,但我没有这样做,因为我相信产生所需效果的最佳格式参数选择会因文档而异。

其次,模拟可能会缓解过渡,但在新代码中使用它肯定不切实际。让我解释一下。

假设我们有一个包含两片叶子的节点。forest表示:([node [child1] [child2]]节点之间的空间无关紧要);qtree表示:([.node child1 child2 ]空间相关!)。结论:qtree的版本更容易编写。然而......

... 假设我们想把第一个子节点放在框架中。在 中forest,这可以通过draw在节点上指定(这draw简单地转发到 的tikz)来实现\node,如下所示:[node [child1,draw] [child2]]。在模拟中尝试执行相同操作qtree将失败:[.node child1,draw child2 ]失败并出现“未知键draw child2”错误(child1 已排版,但未框架化)。这是因为forest使用pgfkeys来解析节点规范,并且在 中pgfkeys,键用逗号分隔。没有办法解决这个问题:必须写[.node {child1,draw} child2 ],这显然消除了 -like 语法的原始优势qtree;唯一实现的是,如果他决定为 child1 提供自己的子节点,则必须将括号更改为方括号...

顺便说一句,模拟显然也会带来性能损失,而且,由于它是通过动态改变树的几何形状来实现的(是的,forest可以这样做!),这很容易导致使用复杂样式格式化的树受到干扰。

相关内容