文章目录
Forest是基于TikZ的树形图宏包,专为创建思维导图、语法树等层次结构图设计。其语法简洁直观,采用方括号嵌套结构(如[node [][]...]),支持自动布局。通过for tree命令可设置全局样式,包括节点外观(边框、颜色)、连接线样式和布局参数(生长方向、间距)。还支持分层设置,使用where level语句为不同层级节点指定不同风格(如颜色、字体)。示例展示了如何创建计算机科学知识体系的思维导图,并演示了全局和分层样式的配置方法。
Forest思维导图
Forest 是基于tikz的树形图宏包,特别擅长创建思维导图、语法树、组织结构图等层次结构图,其语法简洁直观、可读性强,且支持自动布局,其简单示例如下

源码为
latex
\documentclass{standalone}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
for tree={
draw,
rounded corners,
fill=blue!10,
edge={->},
l sep=20pt,
s sep=10pt,
}
[计算机科学
[理论
[算法]
[数据结构]
]
[应用
[人工智能]
[数据库]
]
[硬件
[计算机组成]
[体系结构]
]
]
\end{forest}
\end{document}
从示例程序可知,其代码结构极其简单,就是方括号的循环嵌套,可以递归式地写为[node [][]...],一目了然。
全局样式
【for tree】是Forest中最常用的全局样式设置命令,放在\begin{forest}后的第一个方括号内,其内部可选参数如下表所示
| 选项类型 | 键名 | 说明 | 示例 |
|---|---|---|---|
| 外观 | draw | 给节点加边框 | draw=black, thick |
| fill | 节点背景填充色 | fill=blue!20 | |
| text | 文字颜色 | text=white | |
| font | 字体设置 | font=\sffamily\bfseries | |
| shape | 节点形状 | circle, rectangle, ellipse | |
| 边线 | edge | 连接线的样式 | edge={->, thick, draw=gray} |
| 布局 | grow | 树的生长方向 | grow=east (向右), grow=south (向下) |
| l sep | 层间距 (Level Sep) | l sep=15mm | |
| s sep | 节点距 (Sibling Sep) | s sep=5mm | |
| 锚点 | anchor | 节点自身的锚点 | anchor=center |
| parent anchor | 父节点连接子节点的位置 | parent anchor=south | |
| child anchor | 子节点连接父节点的位置 | child anchor=north |
以上图为例,其全局设置如下,表示默认边框,节点形状为圆角,填充颜色为浅蓝色,连接线是顺向箭头,层级之间距离为20pt,同级节点间距离为10pt。
for tree={
draw,
rounded corners,
fill=blue!10,
edge={->},
l sep=20pt,
s sep=10pt,
}
分层设置
上面示例中,通过全局设置,将不同节点设置成了统一风格。若想为不同层级的节点设置不同的风格,可用where level语句,示例如下,其中where level等号后面的就是节点层级。
\begin{forest}
for tree={draw, rounded corners} % 全局默认
where level={0}{ % 针对根节点 (Level 0)
fill=red!30,
font=\Large\bfseries,
minimum size=1.5cm
}{}
where level={1}{ % 针对第一层子节点
fill=blue!20,
font=\normalsize
}{}
where level={2}{ % 针对第二层 (叶子)
fill=green!20,
font=\small
}{}
\end{forest}
和mindmap的区别
Forest 站在通用树形结构绘制的高度,强调语法的极简性与布局的自动化。作为基于 TikZ 的高级封装,它允许用户通过直观的嵌套括号定义层次关系,无需手动计算节点坐标,从而将精力集中于内容逻辑而非排版细节。这种设计使得 Forest 不仅适用于思维导图,还能轻松胜任语言学语法树、组织结构图等多种树形场景,其强大的 for tree 样式配置机制提供了极高的灵活性。然而,正因为其通用性,若要实现 mindmap 库那种特有的放射状美学风格,用户可能需要额外调整边线路径和节点形状,不如专用库那样"开箱即用"。