我正在制作一棵树,它反映了许多不同的顺序选择。树的下半部分将被重复,因此我希望先将它们存储在一些较短的定义中,以便可以修改它们并保持代码整洁。
梅威瑟:
\documentclass[11pt]{article}
\usepackage{qtree}
\title{Map}
\begin{document}
\maketitle
\Tree[.O.2-30Hz [.{Raw Stats} [.Ensemble Bag
[.Boost Ada Total LP ] ]
[.LDA [.SWLDA ]]]
[.PCA [.Ensemble Bag
[.Boost Ada Total LP ] ]
[.LDA [.SWLDA ]]]]
\end{document}
我怎样才能将树的冗余部分单独存储在 TeX 中?
答案1
该手册qtree
涵盖了我认为您所想到的情况:
5.2 将一棵树嵌入另一棵树
qtree 的内部实现仅支持一次构建一棵树;因此它不允许将完整的树递归嵌入到另一棵树中。实际上这并不经常需要这样做(毕竟树已经是递归的);对于大多数似乎需要这样做的构造,有一种更简单的方法可以达到相同的效果。但是,例如,如果您需要将子树放在屋顶下,那么这可能是必要的。
幸运的是,使用 TEX 的工具可以直接将一棵树嵌入到另一棵树中,而无需递归调用 qtree。我们可以通过将第一棵树保存在命名框中,然后将其用作较大树的一部分来实现这一点。
就是这样:
\newsavebox{\partbox} % Declare this only once, in your preamble! % Build the subtree and save it in the box \setbox\partbox=\hbox{\Tree [.DP my pony ]} % Use the subtree in the containing tree \Tree [ how \qroof{about \usebox{\partbox} ...}.PP ].S
显然你不想使用屋顶,但原理应该是一样的。将树木保存在盒子中,然后在树的适当位置使用这些盒子:
\documentclass[11pt]{article}
\usepackage{qtree}
\title{Map}
\begin{document}
\maketitle
\newsavebox{\ldabox}
\sbox{\ldabox}{\hbox{\Tree [.LDA [.SWLDA ]]}}
\newsavebox{\boostbox}
\sbox{\boostbox}{\hbox{\Tree [.Boost Ada Total LP ]}}
\Tree[.O.2-30Hz [.{Raw Stats} [.Ensemble Bag
\usebox{\boostbox} ]
\usebox{\ldabox} ]
[.PCA [.Ensemble Bag
\usebox{\boostbox} ]
\usebox{\ldabox} ]]
\end{document}
生成:
编辑
为了更方便一些,您可以定义一个宏来动态创建和填充框。以下代码是生成上述输出的另一种方法:
\documentclass[11pt]{article}
\usepackage{qtree}
\title{Map}
\newcommand{\myTree}[2]{%
\def\tempa{#1box}%
\expandafter\newsavebox\csname\tempa\endcsname%
\expandafter\sbox\csname\tempa\endcsname{\hbox{\Tree [#2]}}%
}
\begin{document}
\maketitle
\myTree{lda}{ .LDA [.SWLDA ] }
\myTree{boost}{ .Boost Ada Total LP }
\Tree[.O.2-30Hz [.{Raw Stats} [.Ensemble Bag
\usebox{\boostbox} ]
\usebox{\ldabox} ]
[.PCA [.Ensemble Bag
\usebox{\boostbox} ]
\usebox{\ldabox} ]]
\end{document}
\myTree
接受两个参数。第一个是构成框名称前缀的字母字符串。第二个是树的“内部”。
假设您想重用以下树:
\Tree [ .a b c ]
你可以写:
\myTree{abc}{ .a b c }
然后您就可以单独使用相应的树或者在其他树中使用:
\usebox{\abcbox}
答案2
这对有权有势的人来说是件轻松的事forest
没有任何用户定义的框的包(请参阅第节3.3.8 动态树包文档,其中介绍了树的动态变化的键):
\documentclass[11pt]{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={parent anchor=south},
copy name template={copy of #1}
[O.2-30Hz
[Raw Stats,delay={prepend'=ensamble}
[LDA,name=lda
[SWLDA ]
]
]
[PCA,delay={append'=lda}
[Ensemble,name=ensamble
[Bag]
[Boost
[Ada]
[Total]
[LP]
]
]
]
]
\end{forest}
\end{document}
答案3
\documentclass[11pt]{article}
\usepackage{qtree}
\title{Map}
\begin{document}
\maketitle
\newsavebox\boxA
\sbox{\boxA}{\Tree[.Ensemble Bag
[.Boost Ada Total LP ] ]}
\newsavebox\boxB
\sbox{\boxB}{\Tree[.LDA [.SWLDA ]]}
\Tree[.O.2-30Hz [.{Raw Stats} \usebox{\boxA}
\usebox{\boxB} ]
[.PCA \usebox{\boxA}
\usebox{\boxB} ]]
\end{document}