我有一棵树几乎已经完成了(感谢这个论坛的帮助!),但最后几个步骤有点卡住了。以下是我想要做的更改列表:
删除标题“Versions”,同时保留列空间本身。标题“Versions”当前所在的位置将只留出一个空白位置。
在 Choir123 版本上方添加一个标题:[T1 吉他、T1 手风琴和一个名为“选项”的列] 在 T1 手风琴下方的 4 行上放置一个波浪括号,并在标题“选项”下方写上“乐器选择”,使其在中间对齐。
在 Orchestra232 版本的末尾添加一列,名为“选项”,但有一个波浪括号,并写上“乐器价格”
翻转合唱团和管弦乐队的顺序(包括标题),使合唱团首先出现。
如果所有列都与标题距离对齐(当前它们由文本长度决定)并且管弦乐队和合唱团版本之间不一致,那就太好了。
请参见下面的屏幕截图,其中我描述了更改,以及下面的代码。
提前谢谢了!!
\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 width
s 不足造成的。我没有尝试手动获取正确的值,而是编写了一个样式 ( 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}