森林:如何自动对齐层级并让父级锚点 = 南

森林:如何自动对齐层级并让父级锚点 = 南

我正在尝试在 Forest 中制作基本的语言树,它们可以做两件事:1) 将底部叶子对齐到单个层上,2) 父级锚点为南。(实际上我还有第三个要求:能够在叶子中使用换行符,但那是另一个问题。)目前,我可以通过根据需要为每个叶子指定层来强制将它们组合在一起(对于偶尔出现的小树来说没问题,但对于许多或更大的树来说就很烦人了)。

森林文档(http://mirrors.ibiblio.org/CTAN/graphics/pgf/contrib/forest/forest-doc.pdf) 确实提供了一种自动进行这种对齐的技术(第 7 页,示例 12),但如果我在指定父锚点的同时尝试此操作,则会出现此错误:

!软件包 pgfkeys 错误:我不知道您传递了“0{tier=word}{}”的密钥“/tikz/{parent anchor=south} whe re n children”,我将忽略它。也许您拼错了。

我对 Forest 还很陌生,所以也许我忽略了一些显而易见的东西。下面是我的 MWE,首先是暴力破解版本 A,它给出了正确的输出:

enter image description here

接下来是产生正确对齐的自动版本,但没有指定任何父锚定(我已经包含了中断它的行,但已注释掉):

![enter image description here

我希望能够使用自动对齐,如在 B 中一样,但以 A 为锚点。谢谢。

\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\usepackage{forest}

\begin{document}

A) Correct tree, but brute-forced:

\begin{forest}{parent anchor=south}
[
[strong
    [strong[Cant,tier=word]]
    [weak[wara,tier=word]]
]
[weak
    [byrig,tier=word]
]
]   
    \end{forest}

B) Automated tree, but with wrong parent anchor:

\begin{forest}%{parent anchor=south}
where n children=0{tier=word}{}
[
[strong
    [strong[Cant]]
    [weak[wara]]
]
[weak
    [byrig]
]
]   
\end{forest}

\end{document}

答案1

您只是使用了不完全正确的语法。选项/指令需要用逗号分隔(不需要括号)。编辑:已添加for tree。非常感谢@cfr,他对这个问题有唯一真正的答案。我发帖只是为了让这个问题保持活跃。(有点像在真正的明星开始之前演奏的不知名乐队。;-)

\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\usepackage{forest}

\begin{document}

A) Correct tree, but brute-forced:

\begin{forest}
parent anchor=south
[
[strong
    [strong[Cant,tier=word]]
    [weak[wara,tier=word]]
]
[weak
    [byrig,tier=word]
]
]   
    \end{forest}

B) Automated tree and correct parent anchor:

\begin{forest}
for tree={parent anchor=south},
where n children=0{tier=murmel}{}
[
[strong
    [strong[Cant]]
    [weak[wara]]
]
[weak
    [byrig]
]
]   
\end{forest}

\end{document}

enter image description here

当@cfr 上线时我会很乐意删除它。;-)

答案2

使用当前的 Forest 来实现这一点的简单方法是使用库linguistics

\usepackage[linguistics]{forest}

适用于多线、中心节点parent anchor=children以及其它好东西。

如果你没有当前的 Forest 并且无法更新,你可以手动进行。正如 marmot 所说,你需要用逗号来分隔 Tiparent anchorZ 选项,但您也只为根设置。相反,使用类似这样的

  for tree={% sets things for the whole tree
    parent anchor=children,%  children is better than south unless you really mean south or can't use current forest
%     align=center,% if you want multi-line nodes for the whole tree 
  },
  where n children=0{tier=twrllaod, align=center,% mulit-line nodes
  }{}

manual result

使用当前的 Forest,您可以加载库,然后只需说

  where n children=0{tier=twrllaod}{}

auto result

您还可能发现nice empty nodes和/或roof对您有用。

\documentclass[border=5pt]{standalone}
% \usepackage[linguistics]{forest}% use this to apply the library settings globally
\usepackage{forest}
\useforestlibrary{linguistics}
\begin{document}

\begin{forest}%{parent anchor=south}% this only sets the parent anchor for the root node - not the whole tree
  for tree={% sets things for the whole tree
    parent anchor=children,%  children is better than south unless you really mean south or can't use current forest
%     align=center,% if you want multi-line nodes for the whole tree 
  },
  where n children=0{tier=twrllaod, align=center,% mulit-line nodes
  }{}
  [
  [strong
      [strong[Cant]]
      [weak[wara]]
  ]
  [weak
      [byrig]
  ]
  ]   
\end{forest}

\forestapplylibrarydefaults{linguistics}

\begin{forest}% multi-line nodes, parent anchor=children etc.
  where n children=0{tier=twrllaod}{}
  [
  [strong
      [strong[Cant]]
      [weak[wara]]
  ]
  [weak
      [byrig]
  ]
  ]   
\end{forest}


\end{document}

相关内容