对齐具有可变文本长度的列,并添加没有标题的额外列?

对齐具有可变文本长度的列,并添加没有标题的额外列?

我有一棵树几乎已经完成了(感谢这个论坛的帮助!),但最后几个步骤有点卡住了。以下是我想要做的更改列表:

  1. 删除标题“Versions”,同时保留列空间本身。标题“Versions”当前所在的位置将只留出一个空白位置。

  2. 在 Choir123 版本上方添加一个标题:[T1 吉他、T1 手风琴和一个名为“选项”的列] 在 T1 手风琴下方的 4 行上放置一个波浪括号,并在标题“选项”下方写上“乐器选择”,使其在中间对齐。

  3. 在 Orchestra232 版本的末尾添加一列,名为“选项”,但有一个波浪括号,并写上“乐器价格”

  4. 翻转合唱团和管弦乐队的顺序(包括标题),使合唱团首先出现。

如果所有列都与标题距离对齐(当前它们由文本长度决定)并且管弦乐队和合唱团版本之间不一致,那就太好了。

请参见下面的屏幕截图,其中我描述了更改,以及下面的代码。

提前谢谢了!!

在此处输入图片描述

\documentclass{article}

\usepackage{forest}
\useforestlibrary{edges}

\begin{document}

\begin{figure}
\centering
\renewcommand{\thefigure}{2}
\caption{Flowchart}
\medskip

\begin{forest}
for tree={
    grow'=east,
    forked edge, 
    delay={content=#1\strut}, inner ysep=2pt,
    if level=1{no edge, minimum width=28mm}{draw, if level=2{minimum width=22mm}{if level=3{minimum width=38mm}{minimum width=32mm}}}
}
[, coordinate
    [Versions, for tree={no edge, draw}[T1 guitar[T1 accordion[T2 guitar]]]
    ]
    [Orchestra232 Version, fit=rectangle
        [Brown[responsive[{Brown (N=60)}, name=A1][{Purple (N=67)}]][unresponsive[{Brown (N=74)}][{Purple (N=84)}]]]
        [Purple[responsive[{Brown (N=80)}][{Purple (N=84)}]][unresponsive[{Brown (N=84)}][{Purple (N=73)}, name=B1]]]
    ]
    [Choir123 Version, fit=rectangle, for tree={before drawing tree={y-=7mm}}
        [Brown[{responsive(N=144)}][{unresponsive(N=171)}]]
        [Purple[{responsive(N=161)}][{unresponsive(N=133)}]]
    ]
]
\end{forest}

\end{figure}
\end{document}

答案1

我相信我得到了所有想要的更改。我冒昧地对代码进行了广泛的修改。在列出代码之前,先对实现进行一些评论。

由于需要在管弦乐版和合唱版中对齐列,但不需要两者对齐,我建议将每个列排版到单独的树中。为了避免重复树序言,我将其放在样式 ( version) 中。

对齐不足是由于某些minimum widths 不足造成的。我没有尝试手动获取正确的值,而是编写了一个样式 ( equal width within absolute level),将给定级别中的节点的 设置为该级别的最大宽度,并为标题中的每个节点触发它(包括原始代码中minimum width调用的空节点)。Versions

Styleequal width within absolute level首先使用聚合函数.max计算给定max_x()-min_x()级别 上的最大宽度 ( ) level=#1。它被存储在临时寄存器 中tempdima,然后其值被转储到该级别的所有节点上;然后重新排版节点 ( typeset node)。所有这些都需要在节点已经排版之后发生,因此before packing,并且在根节点的上下文中 ( for root),因为样式是从标题节点调用的。

tikz括号由样式 中的最后一项( )绘制version。它使用了 TikZ 的装饰库。将振幅设置为任意你喜欢的(下面是5mm),但也不要忘记更改xshift节点的 。节点的文本作为 的参数给出version。括号的端点是使用 TikZ 的构造-|(13.3.1 垂直线的交点)计算的:想法是使用节点选项的 x 坐标和最右上/最右下非标题节点的 y 坐标。这些节点由 Forest 的相对节点系统引用。例如,!{2,first leaf}在幻影根上调用 ,进入节点的“数据部分”,然后进入第一个没有子节点的节点(在第一棵树中,这是responsive(N=144))。请注意,这适用于任何长度的标题,但假设标题比树的其余部分长一个节点。

其他一些小改动包括以下内容。我偶尔for descendants会使用 而不是for tree;它们几乎相同,但前者不会将给定的选项应用于子树根。我在不可见的根节点上使用phantom而不是coordinate;那么,就没有必要在子节点上指定no edge

\documentclass{article}
\usepackage{fullpage}
\usepackage{forest}
\useforestlibrary{edges}
\usetikzlibrary{decorations.pathreplacing}

\begin{document}

\begin{figure}
\centering
\renewcommand{\thefigure}{2}
\caption{Flowchart}
\medskip

\forestset{
  version/.style={
    phantom,
    for tree={
      grow'=east,
      delay={content=##1\strut},
      inner ysep=2pt,
    },
    for first={
      for tree={
        no edge,
        draw,
        equal width within absolute level/.option=level,
      },
      draw=none,
    },
    for last={
      for descendants={
        forked edge,
        draw
      },
    },
    tikz={\draw[decoration={brace,amplitude=5mm},decorate]
      (!{2,first leaf}.north -| !{1,first leaf}.west) --
      node[right,xshift=5mm,align=center]{#1}
      (!{2,last leaf}.south -| !{1,first leaf}.west);
    },
  },
  equal width within absolute level/.style={
    for root={
      before packing={
        tempdima/.max={max_x()-min_x()}{level=#1},
        for level={#1}{
          minimum width/.register=tempdima,
          typeset node,
        },
      },
    },
  },
}

\begin{forest}
  version=instrument\\choice,
  [
    [[T1 guitar[T1 accordion[option]]]]
    [Choir123 Version,
      [Brown[{responsive(N=144)}][{unresponsive(N=171)}]]
      [Purple[{responsive(N=161)}][{unresponsive(N=133)}]]
    ]
  ]
\end{forest}

\vspace{7mm}

\begin{forest}
  version=instrument\\price,
  [
    [[T1 guitar[T1 accordion[T2 guitar[option]]]]]
    [Orchestra232 Version,
      [Brown[responsive[{Brown (N=60)}, name=A1][{Purple (N=67)}]][unresponsive[{Brown (N=74)}][{Purple (N=84)}]]]
      [Purple[responsive[{Brown (N=80)}][{Purple (N=84)}]][unresponsive[{Brown (N=84)}][{Purple (N=73)}, name=B1]]]
    ]
  ]  
\end{forest}

\end{figure}
\end{document}

结果

相关内容