我想制作带有子代 AVM 的树,这些子代 AVM 带有下标。下标会导致 AVM 滑向一侧。我该如何防止这种情况发生?
这是我的代码:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[]{avm}
\usepackage[]{tensor}
\usepackage[]{tikz}
\usepackage[]{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree [.N
\node { $\tensor[]{
\begin{avm} \[ X \\ Y \] \end{avm}}
{_{}}$};
\node { $\tensor[]{
\begin{avm} \[ X \\ Y \] \end{avm}}
{_{123}}$}; ]
\end{tikzpicture}
\end{document}
答案1
avm
这是我在回答您之前的问题时提供的风格的改编版本。
与以前一样,每个节点的内容应采用以下形式之一:
<regular content>
:<avm spec>
<regular content>:<avm spec>
此外,
sub left=<subscript>
sub right=<subscript>
可用于在 avm 的左侧和右侧附加下标。
要使用此功能,请将其放入avm
森林树的序言中。其余的事情应该会在顺风顺水和当地神灵的青睐下自动完成。
例如,
\begin{forest}
avm,
[N:\[X\\Y\]
[:\[X\\Y\], sub right=123
]
[:\[X\\Y\], sub left=123
]
]
\end{forest}
\begin{forest}
avm,
[N:\[X\\Y\]
[:\[X\\Y\]
]
[:\[X\\Y\], sub left=123
]
]
\end{forest}
\begin{forest}
avm,
[N:\[X\\Y\]
[:\[X\\Y\], sub left=1235, sub right=18743
]
[:\[X\\Y\]
]
]
\end{forest}
\begin{forest}
avm,
[N
[:\[X\\Y\], sub right=456
]
[:\[X\\Y\], sub left=123
]
]
\end{forest}
将产生以下4棵树:
请注意,这里有一个与需求有关的问题。如果你增加兄弟节点之间的距离,你可以让分支在分支角度方面保持对称。但是,如果你在一侧有一个大下标,而在另一侧没有,这可能会看起来很奇怪。它还会很快增加树的宽度,具体取决于下标的大小和分布。
如果不这样做,边缘将不会与 avm 的顶部重合(默认位置),或者树枝上的边缘可能与树的生长方向成不同的角度。
如果您将下标置于节点之外,这不是问题。但您需要全局增加兄弟节点之间的距离或手动进行调整。
这意味着对任何一棵树或一组树来说最好的方法可能并不是对另一棵树或一组树来说最好的方法。
也就是说,您的公里数可能会有所不同。
完整代码:
\documentclass[border=10pt]{standalone}
\usepackage[linguistics]{forest}
\usepackage{avm,tensor,array}
\forestset{%
declare toks={sub left}{},
declare toks={sub right}{},
declare dimen={sub shift}{0pt},
Autoforward={sub left}{%
sub shift+/.pgfmath={.5*(width(#1))},
},
Autoforward={sub right}{%
sub shift+/.pgfmath={-.5*(width(#1))},
},
avm/.style={%
TeX={\setlength\extrarowheight{-10pt}},
before typesetting nodes={%
for tree={%
split option={content}{:}{content,make ss avm},
},
},
before packing={%
for tree={%
edge path'/.process={Ow{sub shift}{(!u.parent anchor) -- ([xshift=##1].child anchor)}},
},
},
},
make ss avm/.style={%
if content={}{
content=#1,
make pure ss avm,
}{
content+/.process={%
OOw2{sub left}{sub right}{%
\\
$\tensor[_{##1}]{%
\begin{avm}#1\end{avm}%
}{_{##2}}$%
}%
},
},
},
make pure ss avm/.style={%
if={%
> O_= O_= & {sub right}{}{sub left}{}
}{%
content/.wrap value={%
\begin{avm}##1\end{avm}
},
plain content,
}{
content/.process={%
OOOw3{content}{sub left}{sub right}{%
\tensor[_{##2}]{%
\begin{avm}##1\end{avm}%
}{_{##3}}%
}%
},
math content,
},
},
}
\begin{document}
\begin{forest}
avm,
[N:\[X\\Y\]
[:\[X\\Y\], sub right=123
]
[:\[X\\Y\], sub left=123
]
]
\end{forest}
\begin{forest}
avm,
[N:\[X\\Y\]
[:\[X\\Y\]
]
[:\[X\\Y\], sub left=123
]
]
\end{forest}
\begin{forest}
avm,
[N:\[X\\Y\]
[:\[X\\Y\], sub left=1235, sub right=18743
]
[:\[X\\Y\]
]
]
\end{forest}
\begin{forest}
avm,
[N
[:\[X\\Y\], sub right=456
]
[:\[X\\Y\], sub left=123
]
]
\end{forest}
\end{document}
答案2
您可以\mathrlap
从mathtools
包中使用。\mathrlap{123}
将使123
延伸到右侧(因此r
在宏的名称中)而不占用空间。缺点是此延伸对周围的任何其他材料都是不可见的,因此您可能需要采取预防措施以确保没有重叠。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[]{avm}
\usepackage[]{tensor}
\usepackage[]{tikz}
\usepackage[]{tikz-qtree}
\usepackage{mathtools}
\begin{document}
\begin{tikzpicture}
\Tree[.N
{$\tensor[]%
{\begin{avm} \[ X \\ Y \] \end{avm}}%
{_{}}%
$%
}
{$\tensor[]%
{\begin{avm} \[ X \\ Y \] \end{avm}}%
{_{\mathrlap{123}}}%
$%
}
]
\end{tikzpicture}
\begin{tikzpicture}[sibling distance=5mm]
\Tree[.N
{$\tensor[]%
{\begin{avm} \[ X \\ Y \] \end{avm}}%
{_{\mathrlap{123}}}%
$%
}
{$\tensor[]%
{\begin{avm} \[ X \\ Y \] \end{avm}}%
{_{\mathrlap{123}}}%
$%
}
]
\end{tikzpicture}
\end{document}
使用 node/child 的另一种解决方案tikz
:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[]{avm}
\usepackage[]{tensor}
\usepackage[]{tikz}
\usepackage{mathtools}
\begin{document}
\begin{tikzpicture}
\node{N}
child
{node{$\tensor[]%
{\begin{avm} \[ X \\ Y \] \end{avm}}%
{_{\mathrlap{123}}}%
$%
}
}
child
{node{$\tensor[]%
{\begin{avm} \[ X \\ Y \] \end{avm}}%
{_{\mathrlap{123}}}%
$%
}
};
\end{tikzpicture}
\end{document}