森林语言学图表上的移动数字标记

森林语言学图表上的移动数字标记

我目前正在使用 forest 包制作一些语言学图表,我需要对它们进行编号。但是,编号标签与图表底部对齐,而我希望将其与顶部对齐。

使用一些虚拟示例,这是当前的代码:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Brill}
\usepackage{forest}
\forestset{syll/.style=
   {for tree={parent anchor=south,child anchor=north,
              align=center,base=bottom sep=0pt,
              where n children=0{tier=seg}{}}}}
\usepackage{multicol}
\usepackage{gb4e}
\begin{document}
\begin{exe}
\ex
\begin{forest}syll
[,phantom, s sep=1em
[σ [O [p,tier=seg ]]
      [R [μ [aː,name=aa] ] [μ,name=M [,phantom] ]]]
[σ [O [p,tier=seg ]]
      [R [μ [a] ]]]
]
\draw (M.south) -- (aa.north);
\end{forest}
\end{exe}
\begin{exe}
\ex
\begin{multicols}{2}
\begin{xlist}
\ex
\begin{forest}syll
[,phantom, s sep=1em
[σ [O [p,tier=seg ]]
      [R [μ [aː,name=aa] ] [μ,name=M [,phantom] ]]]
[σ [O [p,tier=seg ]]
      [R [μ [a] ]]]
]
\draw (M.south) -- (aa.north);
\end{forest}
\ex
\begin{forest}syll
[,phantom, s sep=1em
[σ [O [l ]]
      [R [μ [a]] [μ [l,name=LL]]]]
[σ [O,name=O [,phantom] ]
      [R [μ [a] [l]]]]
]
\draw[dashed] (O.south) -- (LL.north);
\end{forest}
\end{xlist}
\end{multicols}
\end{exe}
\end{document}

这给了我类似的东西:

当我想要更多类似的东西时:

我正在使用 TeXmaker 并使用 XeLaTeX 进行编译。

答案1

已编辑以创建新的环境newforest,以自动进行转变。

这是编辑的内容

\usepackage{xpatch,letltxmacro}
\LetLtxMacro\newforest\forest
\LetLtxMacro\endnewforest\endforest
\xpretocmd{\newforest}{\setbox\ForBox=\hbox\bgroup}{}{}
\xapptocmd{\endnewforest}{\egroup\begingroup%
  \raisebox{\dimexpr\baselineskip-\ht\ForBox}{\usebox{\ForBox}}\endgroup}{}{}
\newsavebox{\ForBox}

根据答案用颜色框修补表格环境

注意:我转换为 pdflatex,因为我没有 Brill 字体。

\documentclass{article}
%\usepackage{fontspec}
%\setmainfont{Brill}
\usepackage{forest}
\forestset{syll/.style=
   {for tree={parent anchor=south,child anchor=north,
              align=center,base=bottom sep=0pt,
              where n children=0{tier=seg}{}}}}
\usepackage{multicol}
\usepackage{gb4e}
\usepackage{xpatch,letltxmacro}
\LetLtxMacro\newforest\forest
\LetLtxMacro\endnewforest\endforest
\xpretocmd{\newforest}{\setbox\ForBox=\hbox\bgroup}{}{}
\xapptocmd{\endnewforest}{\egroup\begingroup%
  \raisebox{\dimexpr\baselineskip-\ht\ForBox}{\usebox{\ForBox}}\endgroup}{}{}
\newsavebox{\ForBox}
\begin{document}
\begin{exe}
\ex
\begin{newforest}syll
[,phantom, s sep=1em
[$\sigma$ [O [p,tier=seg ]]
      [R [$\mu$ [aː,name=aa] ] [$\mu$,name=M [,phantom] ]]]
[$\sigma$ [O [p,tier=seg ]]
      [R [$\mu$ [a] ]]]
]
\draw (M.south) -- (aa.north);
\end{newforest}
\end{exe}
\begin{exe}
\ex
\begin{multicols}{2}
\begin{xlist}
\ex
\begin{newforest}syll
[,phantom, s sep=1em
[$\sigma$ [O [p,tier=seg ]]
      [R [$\mu$ [aː,name=aa] ] [$\mu$,name=M [,phantom] ]]]
[$\sigma$ [O [p,tier=seg ]]
      [R [$\mu$ [a] ]]]
]
\draw (M.south) -- (aa.north);
\end{newforest}
\ex
\begin{newforest}syll
[,phantom, s sep=1em
[$\sigma$ [O [l ]]
      [R [$\mu$ [a]] [$\mu$ [l,name=LL]]]]
[$\sigma$ [O,name=O [,phantom] ]
      [R [$\mu$ [a] [l]]]]
]
\draw[dashed] (O.south) -- (LL.north);
\end{newforest}
\end{xlist}
\end{multicols}
\end{exe}
\end{document}

在此处输入图片描述

答案2

baselineForest 提供了在设置树时将当前节点与 TeX 基线对齐的选项。对于这种情况,我们可以在syll样式定义中包含该选项并自动设置该选项。下面的代码将根节点设置为基线(如果根节点不为空)或它的第一个子节点(否则)。

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Brill}
\usepackage{forest}
\forestset{%
  syll/.style={%
    for tree={
      parent anchor=south,
      child anchor=north,
      align=center,
      base=bottom sep=0pt,
      if n children=0{%
        tier=seg,
      }{},
    },
    where level=0{%
      delay={%
        if content={}{for n=1{baseline}}{baseline}
      }
    }{},
  },
}
\usepackage{multicol}
\usepackage{gb4e}
\begin{document}
\begin{exe}
\ex
\begin{forest}syll
[,phantom, s sep=1em
[σ [O [p,tier=seg ]]
      [R [μ [aː,name=aa] ] [μ,name=M [,phantom] ]]]
[σ [O [p,tier=seg ]]
      [R [μ [a] ]]]
]
\draw (M.south) -- (aa.north);
\end{forest}
\end{exe}
\begin{exe}
\ex
\begin{multicols}{2}
\begin{xlist}
\ex
\begin{forest}syll
[,phantom, s sep=1em
[σ [O [p,tier=seg ]]
      [R [μ [aː,name=aa] ] [μ,name=M [,phantom] ]]]
[σ [O [p,tier=seg ]]
      [R [μ [a] ]]]
]
\draw (M.south) -- (aa.north);
\end{forest}
\ex
\begin{forest}syll
[,phantom, s sep=1em
[σ [O [l ]]
      [R [μ [a]] [μ [l,name=LL]]]]
[σ [O,name=O [,phantom] ]
      [R [μ [a] [l]]]]
]
\draw[dashed] (O.south) -- (LL.north);
\end{forest}
\end{xlist}
\end{multicols}
\end{exe}
\end{document}

基线对齐

请注意,我已将where n children=0 ...其更改为,if因为它已在 a 的范围内,for tree并且where与不同if,会for tree自动插入。它在这里实际上没有任何危害,但是for tree={for tree={...}}不必要地复杂化,只会让 Forest 遍历树中的所有节点n次,其中n是树中的节点数。(至少,我是这样认为的。除非 Forest 采取一些聪明的措施来捕捉这种情况。)

如果您拥有 Forest 2+ 版本,您可能还希望查看linguistics默认应用某些选项的库,从而省去麻烦。

相关内容