有没有办法指定您希望树延伸到整个文本宽度?换句话说,让最左边的节点与左边距对齐,最右边的节点与右边距对齐,然后让中间的所有内容都相对于这些点绘制?
这是我试图拟合的树的 MWE;
\documentclass{article}
\usepackage[margin=.75in]{geometry}
\usepackage[linguistics]{forest}
\begin{document}
\begin{center}
\begin{forest}
[IP$_{<t>}$
[VP$_{<<e,t>,t>}$
[NP $_{<<<e,t>,e,t>>,t>}$
[at least five $_{<<e,t>,<<<e,t>,<e,t>>,t>>}$]
[NP $_{<e,t>}$
[students $_{<<e,t>,<e,t>>}$]
[$t_{2_{<e,t>}}$]
]
]
[arrived $_{<e,t>}$]
]
[CP$_{<e,t>}$
[who$_1$]
[CP$_{<t>}$
[$t_{1_{<e>}}$]
[VP $_{<e,t>}$
[took $_{<e,<e,t>>}$]
[semantics $_{<e>}$]
]
]
]
]
\end{forest}
\end{center}
\end{document}
答案1
如果我理解正确的话,我想我已经纠正了基本类型的表示。由于我不是语言学家,实际上也不知道这是什么意思,所以就这么理解吧。
我已经添加for tree={draw}
并showframe
只是为了演示目的。由于 Okular 有一个会破坏图像的错误,因此您必须编译它或想象它才能真正看到演示,但我已在样本上对其进行了彻底测试n树木在哪里n=1. 因为一棵树是你的树,所以它至少在这种情况下是有效的。
样式
widen tree to width=<dimension expression>
采用单个可选参数。如果未指定,则使用默认值,0pt
因此样式不会产生任何效果。
笔记
该算法试图保持保守。这意味着如果你将该样式应用于许多树,它会很慢。我推荐
memoize
。它并不保守到在极端情况下不会失效。出于这些目的,“极端情况”是指算法失败的任何情况。
请勿让其在无人看管的情况下进行编译。如果出错,可能会进入一个永恒的
forest
循环。我不思考会发生这种情况。如 (1) 中所述,我已经对其进行了详尽的测试,但您也不能太小心。我已经告诉算法当树和目标之间的差异不超过时停止
1pt
。不要将其更改为 0pt。TeX 的计算只是近似的。将允许值减少到0pt
将要触发无限循环。不允许标签、边或节点边界。如果您的树具有任何这些东西,并且它们在宽度上突出,则必须相应地调整目标宽度。
出于美观或效率方面的考虑,我不推荐这样做。我不确定你为什么特别想要一棵指定宽度的树。但也许我只是缺乏想象力。
买者自负 ...
\documentclass{article}
\usepackage[margin=.75in,showframe]{geometry}
\usepackage[linguistics]{forest}
\forestset{% ateb: https://tex.stackexchange.com/a/715314/
declare dimen register=target wd,
target wd'=0pt,
declare dimen register=needed wd,
needed wd'=0pt,
adjust tree/.style={
tempcounta'=1,
tempcountc'=0,
for tree breadth-first={%
if={ >OR> {level}{tempcountc} }{
tempcountc/.option=level,
tempcountd'=1,
}{
tempcountd'+=1,
if={ >RR> {tempcountd}{tempcounta} }{
tempcounta/.register=tempcountd,
}{},
},
},
tempcounta*/.register=tempcountc,
tempcounta'+=1,
tempdima/.process={ RRw2+d {needed wd}{tempcounta}{##1/##2} },
where={>O_<{s}{0pt}}{
s-/.register=tempdima,
}{
s+/.register=tempdima,
},
compute xy stage,
tempdima/.max={>OOw2+d{x}{max x}{##1+##2}}{tree},
tempdimb/.min={>OOw2+d{x}{min x}{##1+##2}}{tree},
tempdimc/.register=tempdima,
tempdimc-/.register=tempdimb,
needed wd/.register=target wd,
needed wd-/.register=tempdimc,
if={ >Rd>{needed wd}{1pt} }
{% pam alla i ddim ddefnyddio loop yma?
adjust tree,
}{},
},
widen tree to width/.style={
target wd=#1,
needed wd/.register=target wd,
before drawing tree={
tempdima/.max={>OOw2+d{x}{max x}{##1+##2}}{tree},
tempdimb/.min={>OOw2+d{x}{min x}{##1+##2}}{tree},
tempdimc/.register=tempdima,
tempdimc-/.register=tempdimb,
needed wd-/.register=tempdimc,
if={ >Rd>{needed wd}{1pt} }
{% pam alla i ddim ddefnyddio loop yma?
adjust tree,
}{},
},
},
}
\begin{document}
\begin{center}
\begin{forest}
widen tree to width=\linewidth,
for tree={draw},
[IP$_{t}$
[VP$_{<<e,t>,t>}$
[NP $_{<<<e,t>,e,t>>,t>}$
[at least five $_{<<e,t>,<<<e,t>,<e,t>>,t>>}$]
[NP $_{<e,t>}$
[students $_{<<e,t>,<e,t>>}$]
[$t_{2_{<e,t>}}$]
]
]
[arrived $_{<e,t>}$]
]
[CP$_{<e,t>}$
[who$_1$]
[CP$_{t}$
[$t_{1_{e}}$]
[VP $_{<e,t>}$
[took $_{<e,<e,t>>}$]
[semantics $_{e}$]
]
]
]
]
\end{forest}
\end{center}
\end{document}