编辑

编辑

我正在制作一棵树,它反映了许多不同的顺序选择。树的下半部分将被重复,因此我希望先将它们存储在一些较短的定义中,以便可以修改它们并保持代码整洁。

梅威瑟:

\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}

在此处输入图片描述

相关内容