![森林语言学图表上的移动数字标记](https://linux22.com/image/335002/%E6%A3%AE%E6%9E%97%E8%AF%AD%E8%A8%80%E5%AD%A6%E5%9B%BE%E8%A1%A8%E4%B8%8A%E7%9A%84%E7%A7%BB%E5%8A%A8%E6%95%B0%E5%AD%97%E6%A0%87%E8%AE%B0.png)
我目前正在使用 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
baseline
Forest 提供了在设置树时将当前节点与 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
默认应用某些选项的库,从而省去麻烦。