我是 TeX 新手,正在尝试制作语法树。我的目标是:
X
/ X / \ X \ / \ \ X \ \ / \ \ \ A B C D E
a b c d e
其中底行包含一些下标。我的代码如下:
\pstree[levelsep=5ex]{ \TR{X} }{
\pstree{ \TR{X} }{
\pstree{ \TR{X} }{
\pstree{ \TR{X} }{
\TR{\shortstack{{\em A}\\a}}
\TR{\shortstack{{\em B}\\b}}
}
\TR{\shortstack{{\em C}\\c}}
}
\TR{\shortstack{{\em D}\\d}}
}
\TR{\shortstack{{\em E}\\e}}
}
两个问题:
a) 如何将叶节点对齐到底部而不是紧邻其母节点下方?
b) 中元素的垂直间距shortstack
不一致(可能是根据某种“如果合适”标准 - 如果上面的单词中有“j”或“g”,间距就会增加以适应向下的笔划)。有没有更好的方法可以将元素一个接一个地写在一起,并且始终具有相同的垂直间距?
编辑:根据要求,节点内部格式问题的最小示例:
\pstree[levelsep=5ex]{ \TR{Compare:} }{
\TR{\shortstack{h\\j}}
\TR{\shortstack{m\\n}}
}
注意“h”与“m”相比有多高(“j”和“n”为水平)。
答案1
使用\skiplevel{...}
或\skiplevels{<num>}...\endskiplevels
可以将节点向下推一层(或<num>
层),使它们与较低层的节点对齐。投影保持水平对齐,就像节点位于其原始层一样。
此外,除了使用,您还可以像下面的宏一样\substack
在 中添加内容。它将和放置在 中(顶部对齐),居中对齐(两侧没有列间距)。此外,使用 排版tabular
\stackit{<top>}{<bottom>}
<top>
<bottom>
tabular
[t]
@{}
<top>
强调 {\em ..}
。所有基线都将垂直对齐。如果您有更复杂的叶子节点标签排列,那么还有其他替代方案:
\documentclass{article}
\usepackage{pst-tree}% http://ctan.org/pkg/pst-tree
% A macro to stack leave node contents: \stackit{<top>}{<bottom>}
\newcommand{\stackit}[2]{\begin{tabular}[t]{@{}c@{}}{\em #1}\\#2\end{tabular}}
\begin{document}
\pstree[levelsep=5ex,nodesep=3pt]{ \TR{X} }{
\pstree{ \TR{X} }{
\pstree{ \TR{X} }{
\pstree{ \TR{X} }{
\TR{\stackit{A}{a}}
\TR{\stackit{B}{b}}
}
\skiplevel{\TR{\stackit{C}{c}}}
}
\skiplevels{2}\TR{\stackit{D}{d}}\endskiplevels
}
\skiplevels{3}\TR{\stackit{E}{e}}\endskiplevels
}
\end{document}
答案2
你是指类似这样的东西吗skiplevel
?
\documentclass{article}
\usepackage{pst-tree}
\begin{document}
\pstree[treesep=1.2cm,levelsep=0.5cm]{ \TR{X} }{
\pstree{ \TR{X} }{
\pstree{ \TR{X} }{
\pstree{ \TR{X} }{
\TR{\shortstack{{\em A}\\a}}
\TR{\shortstack{{\em B}\\b}}
}
\skiplevels{1}%\skiplevel{\Tn\Tn}
\TR{\shortstack{{\em C}\\c}}
\endskiplevels
}
\skiplevels{2}%\skiplevel{\Tn\Tn}
\TR{\shortstack{{\em D}\\d}}
\endskiplevels
}
\skiplevels{3}%\skiplevel{\Tn\Tn}
\TR{\shortstack{{\em E}\\e}}
\endskiplevels
}
\end{document}
答案3
\documentclass{article}
\usepackage{pst-tree}
\newcommand\Stack[2][0.8]{{\def\arraystretch{#1}\tabular{@{}c@{}}#2\endtabular}}
\begin{document}
\pstree[levelsep=10mm,nodesep=1mm]{ \TR{X} }{
\pstree[]{ \TR{X} }{
\pstree{ \TR{X} }{
\pstree[treesep=5mm]{ \TR{X} }{
\TR{\Stack{\em A\\a}}
\Tn
\TR{\Stack{\em B\\b}}
\Tn
}
\skiplevel{\TR{\Stack{\em C\\c}}}
}
\skiplevels{2}\TR{\Stack{\em D\\d}}\endskiplevels
}
\skiplevels{3}\TR{\Stack{\em E\\e}}\endskiplevels
}
\end{document}