图表(Mermaid)

查看指南笔记中的 Mermaid 图 指南

工作方式

Mermaid 图。写有流程图(flowchart/graph,四个方向都支持)、时序图(sequenceDiagram)或饼图(pie)的 ```mermaid 围栏,会在阅读模式、导出的文件以及询问笔记的回答中被画成图——图大多正是从那里来的。绘制遵循笔记主题(墨色、纸色与强调色),因此在两种主题下都与周围文字相配。在格式化编辑(默认模式)里图形同样会被绘制,上方带有块工具条(复制、编辑、删除)。编辑会在下方打开一条含源码的工具条:打开期间笔记处于锁定状态,图形会随着输入重新绘制;关闭即应用(没有保存也没有取消),Ctrl+Z 一步撤销整次改动,清空字段则删除该块。在分栏模式下,点击图形会把光标带到原始文本的围栏处。在文本编辑器里一切仍是文字:按 Ctrl+E 查看图形。在列表项中,图表(以及 SMILES 结构、块级公式、[files] 和 ![[笔记]])在格式化编辑中保持为文本,在阅读模式中才会绘制:在那里,列表项的标记无法写回文件。

子图(subgraph … end,包括嵌套)会画成带标题的方框,连线从真正的节点出发穿过边框;子图的 id 也可以作为连线的端点(sub --> X)。作者声明的颜色同样生效:classDef、class、:::类名 和 style(填充、描边、线宽、虚线与文字颜色)。要新建一个,请用笔记工具栏的插入 → 图表(Mermaid):会直接放入所选类型的现成骨架。菜单里直接列出最常用的六种;所有图表…会打开一个包含全部 33 种的选择器,按用途分组,带搜索(按名称,或按图表所展示的内容)和每一种的实际绘制预览——一共 33 张图,看图比读名字更快做出判断。图的前置元数据——首行之前两道 --- 之间的块——也会被读取:title 会成为画在图上方的标题(正文中的 title 优先),LightNote 认识的 config 键会传到图里(gitGraph.mainBranchName、gantt.displayMode,以及 packet 的 bitsPerRow、把整行镜像的 bitOrder: descending 和 showBits: false);不认识的键会被忽略,而不会拒绘整篇笔记。

时序、实体、类与状态

时序图支持 participant/actor(可用 as)、各种箭头(->>、-->>、-x、-))、激活(+/- 与 activate/deactivate)、备注(Note left of/right of/over)、loop/alt/else/opt/par 块,以及 autonumber。尚未支持绘制的内容——其他图种——依旧显示为代码块;子图内的 direction 和 linkStyle 会被忽略。 Mermaid v11 的节点语法(A@{ shape: rounded, label: "文字" })也能读取,并会绘制 v11 的形状目录:doc、lin-doc、docs、tag-rect、win-pane、hourglass、bolt、flag、das 等,每一个都是名称所说的符号,不会退回长方形——用长方形代替文档等于另一张图。Mermaid 没有的名称会让整张图退回代码块,并指出所在行。边 ID(A e1@--> B)和 e1@{ animate: true } 会被接受并忽略:动画不会绘制。带类型的参与者(participant DB@{ "type": "database" })会在泳道上方画出 UML 符号——boundary、control、entity、database、queue、collections——在那里声明的 "alias" 与 as 等效。

erDiagram 也会绘制:每个实体变成带属性的方框,基数显示在关系的两端(||--o{、}o--||、|o、|{);-- 是标识关系,.. 是非标识关系。别名 p[Person] 只改方框上的名称,不改关系引用的 id。subgraph … end 在这里同样有效:里面的实体会被包进带标题的框,子图可以嵌套,而框的 id 也可以做关系的一端(CLIENTE ||--o{ Vendas : faz),此时连到边界而不是同名的实体。

classDiagram 同样如此:三个分区的方框(名称、属性和方法,以方法的括号区分)、独立成行的 <<interface>>、作为方框的 namespace,以及六种关系(<|--, *--, o--, -->, ..>, ..|>)。注意方向:A <|-- B 中三角形在 A 一侧,继承的是 B。引号中的基数显示在两端("1" --> "*")。泛型 List~T~ 显示为 List<T>,成员中也一样。棒棒糖接口(bar ()-- foo)会在 () 所在的那一端的框上方画一个圆(且仅那一端),关系线接到圆上;namespace 也可以嵌套,内层 } 之后的类会回到外层命名空间。

stateDiagram-v2 绘制状态机:[*] 表示开始(实心圆)和结束(带环的圆),state X { … } 变成方框,<<fork>>/<<join>> 变成横条,<<choice>> 变成菱形。复合状态内的 -- 分隔并发区域,以虚线标示。

时间线、旅程、象限与甘特图

timeline 也会绘制:每个时期变成时间线上的一列,事件在其下方堆叠,section 用彩色横带把时代分组。多个事件的两种写法都可用——同一行用冒号分隔(2004 : Facebook : Google),或在下一行续写(: 另一个事件);这里除 title、section、direction 之外的每一行都是自由文本。direction TD(竖向时间线)尚未支持绘制,会保留代码块。

journey(用户旅程)也会绘制:每个任务变成旅程轴上的一个方框,1 到 5 的评分把它的表情上下移动——正是这些表情连成的起伏,才是这种图存在的意义。section 把阶段分组,参与者化作任务上的彩色标记,图例在左侧。这里的语法是严格的(任务: 评分: 参与者, 参与者),与 timeline 不同:没有名称和评分这一对就无处安放表情,所以格式错误的行——或超出 1 到 5 的评分——会拒绝该图并指出所在行。

而 quadrantChart 会画出四象限平面:x-axis 和 y-axis 给两条轴的两端命名(--> 右边可省略),quadrant-1 到 quadrant-4 标注各个区域,每个点写成 名称: [x, y],x 与 y 取 0 到 1。请注意编号:它用的是数学平面的顺序,而不是阅读顺序——quadrant-1 在右上角,从那里逆时针推进;y = 1 在顶部。点的颜色和半径可以直接给出(P: [0.5, 0.5] radius: 10, color: #109060),也可以来自类(P:::类名 加 classDef),直接样式优先于类。超出 0 到 1 的坐标不会被截断,而是指出所在行并拒绝该图——坐标就是平面上的位置,截断会把点放进你没写的象限。

gantt 会画出进度计划:dateFormat 说明你所写日期的格式(默认 YYYY-MM-DD),axisFormat 说明坐标轴标签的格式(%m/%d),section 把任务分组成条带。每个任务写成 文字 : 标记, id, 开始, 结束——标记 done、active、crit、milestone 放在最前面,可以组合;开始是一个日期或 after 另一个id,结束是日期、时长(5d、2w、3h、45m)或 until 另一个id。只写一项时,任务从上一个任务结束的时刻开始。

after 可以引用在笔记后面才声明的任务;而一个到处都不存在的 id,或者循环依赖,会指出所在行并拒绝该图,而不是把条形放到今天。excludes weekends(也可以是 excludes monday 或某个日期)会按被排除的天数把每个任务的结束往后推,因此改变条形的长度;includes 2026-03-07 优先于周末,用来说明那个周六照常上班。里程碑显示为菱形,todayMarker off 去掉今天那条线。把多个任务叠在同一行的 displayMode compact 也能绘制:在这里,只有任务所占的范围(包括标签)不碰到已有内容时,它才会共用同一行。vert 标记(开始 : vert, v1, 20:15, 0m)把时刻画成贯穿整张图的竖线,不占用任何行,它的标签落在坐标轴下方。dateFormat X(或 x)把日期读作以秒(或毫秒)为单位的 Unix 时间,而坐标轴上的 %s/%Q 再把它写回去。Mermaid 不认识的 tickInterval(1decade)会像在那边一样静默忽略,坐标轴回到自动。

思维导图、需求、Git 与 C4

mindmap 的层级来自缩进:一个条目的层级就是其文字开始的列,不用大括号也不用箭头(制表符按算到下一个 4 的位置计,和编辑器里一样)。第一个条目是根节点——如果在同一列再出现一个条目,那就成了第二个根,此时会指出所在行并拒绝该图。每个条目都可以声明形状:[方形]、(圆角)、((圆形))、{{六边形}}、))爆炸(( 和 )云朵(;不写分隔符就是圆角。::icon(...) 和 :::类名 会被识别并忽略(我们没有打包图标字体,而类名指向这里并不存在的外部 CSS)。图是左右两侧展开的——根节点居中,分支分到左右两边——每个分支有自己的颜色,后代继承它,枝条也随层级加深而变细。

它是一棵树,而不是 mermaid 那样的力导向模拟:在思维导图里层级就是内容,所以必须能从位置读出来;而且切换主题时图会重绘,一个从随机初始位置收敛的布局会让整张图每次都重新排过。

treeView(treeView-beta)用来画项目的目录树,并且接受两种写法:缩进(自己敲的时候)和 tree 命令本身的字符(├──、│、└──)。正是后者让你能把终端输出直接粘进笔记——那里光看缩进不够,因为 │ 和空格占同一列,而只有前者说明这一支还没结束。末尾的斜杠表示目录(src/),带空格的名称要加引号,## 文字 会在行尾挂一条注释,:::highlight 则突出名称。icon(...) 会被识别并忽略,跟思维导图的 ::icon() 一样:图标包靠 JavaScript 从 Iconify 加载,Mermaid 自己默认也不会画。

ishikawa(ishikawa-beta)用来画原因分析的鱼骨图:第一项是“结果”(右端的鱼头),下一层是类别(鱼骨),再里面两层是原因和子原因。一共三层;第四层会指出所在行并拒绘——Mermaid 里并没有这一层。鱼骨在主轴上下交替,这正是两个相邻类别能放下而文字不相互压压的原因;你书写原因的顺序,在两边都是从上到下读。

venn(venn-beta)用来画互相交叉的集合:set A["值得做"] 声明一个,union A,B["做得出来"] 给共同区域命名(并集用它所交叉的集合来称呼),紧接在它下面的 text A1["React"] 则把一条条目放进那个区域。集合最多三个,第四个会指出所在行并拒绘:四个圆没有任何摆法能凑出全部区域,而“差不多对”的图会藏掉你声明过的区域。标签后面的 :数字(set A["Alpha"]:20)缩放圆——面积随数字变化——但不缩放交集:交集也成比例的是另一种图(欧拉图),需要数值优化。style A fill:#ff6b6b 给集合上色,带逗号时(style A,B color:#333)作用于那些集合的并集。

cynefin(cynefin-beta)画的是斯诺登用来分类决策的框架:五个领域名称固定——complex、complicated、chaotic、clear、confusion——位置也固定(四个象限,中间是 confusion);你选的是每个领域里面放什么。每条条目占一行,要加引号;complex --> complicated : "发现了规律" 画出两个领域之间的迁移。不在这五个里的名称会指出所在行,并告诉你有哪些,然后拒绘。clear 与 chaotic 之间的边界画成波浪线:在模型里那是一道悬崖,形状把这件事说出来——这里的波形始终一致,笔记不会每次打开都变一个样。

swimlane(swimlane-beta)画的是按责任人分泳道的流程:语法就是流程图的(同样的形状、箭头、标签和 classDef),只是每个 subgraph 不再是框,而是一条泳道。每个节点都必须在某条泳道里——落在外面的节点会拒绘,因为说不清这件事是谁的——泳道嵌套泳道也会拒绘。LR 时泳道是行,流向向右;TB 时是列,流向向下。沿着流向的位置由到达每个任务的最长路径决定,而所在的带子属于它的主人:就算挤一挤会更紧凑,任务也绝不离开自己的泳道。

agentflow(agentflow-beta)画的是带 AI 代理的流程,实际上是流程图的另一套词汇:箭头一模一样,flow id["名称"] … end 扇演 subgraph 的角色(且可嵌套),global … end 放所有代理都要查的东西,connector id["名称"] 声明一个外部系统。真正不同的是形状,它说明每一步的角色:@{ shape: input }、task、tool(工具调用)、decision、refdoc(参考文档)和 action(最终动作)。文档用 -.- 连接,不带箭头:它是被查阅的,而不是流程的一步。用文字描述代理的键(instruction、params、returns、connectorRef、protocol、endpoint)会被读取,但绘制时忽略。这些形状名只在这里有效;在 flowchart 里会拒绘,因为 Mermaid 在那边也没有它们。

usecase(usecase-beta)画的是 UML 的用例图:用 actor 声明的会成为小人,其余全部是用例,画成椭圆——这正是这种图要展示的区分。用例可以写成 Id("标签")、Id[标签]、只写 Id,或只写引号里的文字;systemBoundary "名称" … end 是系统边界,note for X "文字" 挂上一条注释。关系就是 UML 的那几种:--> 表示关联,--|> 是泛化(空心三角在更一般的一端),A ..> : include B(目标写在冒号之后)画出虚线的「include」,extend 同理。只描述角色而不改变图形的键(type、business、icon)会被读取并忽略,<<刻板>> 则进入标签。json 节点目前还画不出来,会保留代码块:它是跨多行的数据树,而在代码块里 JSON 依然是可读的文本。

wardley(wardley-beta)画的是 Wardley 地图:纵轴是对用户的可见度(越靠上越是用户看得到的),横轴是从 Genesis 到 Commodity 的演化程度。

注意这对数字的顺序:component 茶 [0.63, 0.81] 是 [可见度, 演化程度]——第一个数字是纵轴;读反了依旧能画出来,只是在讲另一种战略。anchor 是顶部的用户,A -> B 连起价值链(名称可以带空格,加不加引号都行),A +> B 是流动(线更粗;+<> 双向,+'文字'> 带标签),evolve 烧水壶 0.62 画出通向目标位置的虚线箭头。还支持 evolution(改掉横轴阶段名)、size、(build)/(buy)/(outsource)/(market)、(inertia)(阻力条)、label [dx, dy]、pipeline X { … }、note、accelerator/deaccelerator,以及带编号的 annotation 和 annotations 图例。

eventmodeling 画的是事件建模:一条分为三条泳道的时间线——上面是界面,中间是命令(和读模型),下面是事件。每行写成 tf 02 cmd AddItem:数字是时刻(列),中间的词是类型,由它决定泳道——ui、cmd/command、pcr/processor、rmo/readmodel、view 和 evt/event(长写法等效)。泳道不用声明:它就是这套方法本身。rf(resetframe)开启新的切片,带一条虚线分隔——那里是故事重新开始的地方。帧的结构写在花括号里({ description: string }),或用 [[Data]] 引用 data Data { … } 块,而那个块可以写在后面;->> 02 ->> 03 则按编号把这个帧连到嗂养它的那些时刻。

railroad(railroad-ebnf-beta、-abnf-beta、-peg-beta 或 railroad-beta)把文法画成铁路图:每条规则都是一条可以用手指跟着走的路径,能写出来的就是能走通的。规则写作 名称 = 表达式 ;(PEG 为 名称 <- … ;),可以跨多行——它到 ; 才结束。引号里的文字是终结符(胶囊形),单独的名称是另一条规则(矩形);|(或 /)是选择,? 可选,+ 一次或多次,* 零次或多次,( )、[ ]、{ } 分别是分组、可选和重复。ABNF 把重复写在前面(1*( ALPHA / "-" )、*DIGIT),PEG 支持 !x、&x 谓词——它们不消耗输入,所以进入标签——railroad-beta 则接受函数写法(sequence(choice(terminal("+"), …)))。四种写法归到同一张图:上方的旁路是可选,下方的回路(箭头朝后)是重复。

requirementDiagram 把需求和元素画成带分区的方框:声明的类型(requirement、functionalRequirement、performanceRequirement、interfaceRequirement、physicalRequirement、designConstraint)以书名号显示在名称上方,id、text、risk、verifymethod 各字段成为一行(element 里则是 type 和 docref)。关系(satisfies、traces、derives、verifies、refines、copies、contains)写成 a - satisfies -> b,也可以写成镜像的 b <- satisfies - a,而镜像写法里先写的名字是终点。只有 contains 是实线,符号画在包含方那一侧;其余都是虚线,箭头在终点。带空格的名称要加引号。

gitGraph 画的是仓库的历史:每个 commit 让时间前进一步,branch 名称 开出一条新泳道并直接切换过去(相当于 git switch -c),checkout 回到另一条,merge 把两条合起来。属性用冒号写:commit id: "文本" tag: "v1" type: HIGHLIGHT(也可以是 REVERSE),branch 名称 order: 2 改变泳道的顺序;cherry-pick id: "…" 要求给出一个真实存在的提交 id。形状说明类型——普通提交是实心圆点,突出显示的是方块,回退的是带 X 的圆,合并是双环,cherry-pick 是带缺口的圆——因为在某些主题下调色板的两种色调看起来很接近,只有形状能把它们分开。LR:(默认)、TB: 和 BT: 会转动时间轴。对不存在的分支执行 checkout/merge 会指出所在行并拒绝绘制,而不是凭空造出一条你没要的泳道。

C4 系列(C4Context、C4Container、C4Component、C4Dynamic、C4Deployment)也会绘制,而且在它里面一切都是宏——语法里没有任何箭头。每个元素都变成一个方框:类型用书名号写在上面,名称加粗,描述在下方,例如 Person(alias, "名称", "描述")、System、Container、Component,以及 Db、Queue、_Ext 各种变体。在 Container 和 Component 里,第三个参数是技术(Container(app, "App", "C++/Qt", "它做什么"));其余的第三个参数就是描述。边界(Boundary、Enterprise_Boundary、System_Boundary、Container_Boundary,以及 C4Deployment 的 Node)会打开花括号,变成带标题的框,也可以嵌套。连线写作 Rel(a, b, "标签", "技术");BiRel 两端都有箭头,Rel_Back 指向反方向。C4Dynamic 会按出现顺序给关系编号。位置提示(Rel_U、Rel_D、Rel_L、Rel_R)和 Update…Style 会被接受并忽略——排布由与其他图相同的布局决定,颜色来自笔记主题。引用了未声明别名的关系会指出所在行并拒绝绘制,而不是凭空造出一个你没写过的方框。

看板、图表与数据包

kanban 里缩进就是语法,只有两层:外层是泳道,内层是卡片(id[标签],或者只写文字)。卡片后面的 @{ ticket: LN-9, assigned: 'ana', priority: 'High' } 不会进入卡片正文:工单号和负责人放在专门的页脚里,优先级(Very High、High、Low、Very Low)会变成左边色条的颜色,按从暖到冷排列。所有泳道都在同一条线上结束,没有卡片的泳道也照样显示——正是它告诉你那一列是空的。这是一块画出来的板,用来在笔记里讲清一个流程;真正用来干活、可以拖动卡片的板,是应用自带的任务面板。

xychart(xychart-beta)在两条轴上绘制柱形和折线:x-axis "标题" [一月, 二月, 三月] 给出分类(含空格或逗号的名称用引号括起来),y-axis "标题" 0 --> 100 固定刻度范围,每一条 bar [10, 40, 90] 或 line [20, 30, 80] 添加一个系列,每个分类一个值,顺序与分类的声明顺序一致。值的个数不符的系列会指出该行并拒绝绘制:柱形会挪到别的分类上,图表就开始说另一件事了。不写 y-axis 时刻度取自数据,只要数据不低于零就从零开始——从最小值开始会夸大柱形之间的差距,而这并不是谁选的;范围一旦声明,超出范围的值会被拒绝,而不是冲出绘图区。

x-axis 也接受连续区间(0 --> 100),不写时分类就是序号。两个柱形系列并排绘制,而不像 mermaid 那样重叠——重叠时后面那个会消失。xychart-beta horizontal 目前还画不了,仍保持为代码块,因为按纵向绘制会交给你一张轴被对调的图。系列可以有名称(bar "开放" [10, 40]、line "封闭" [20, 30]):这些名称会在图上方组成图例,并沿用各自系列的形状——实心柱、带点的线——因为单靠颜色分不开。在折线系列里,数值可以带标签([540 "PaLM", 65]),画在点的上方;柱状图则像 Mermaid 一样忽略它。

radar(radar-beta)在从中心发散的轴上绘制一条或多条曲线的轮廓:axis a["标签"], b, c 声明轴(该行可以重复),curve x["名称"]{80, 60, 90} 为每个轴给出一个值,顺序与轴的声明顺序一致;也支持具名写法({a: 80, c: 90, b: 60})。注意方向:第一个轴朝上,绕行方向为顺时针。max 和 min 固定刻度范围(不写 max 时取读到的最大值),超出范围的值不会被裁剪,而是指出该行并拒绝绘制;ticks 改变环的数量,graticule circle 让环变成圆形,showLegend false 去掉图例。值的个数与轴数不符的曲线同样会被拒绝:那不是一幅画到一半的图,而是另一幅图。

packet(packet-beta)绘制数据包的比特分布:每个字段写成 0-15: "标签",区间两端都包含在内——0-15 是十六个比特。单个比特写作 4: "标签",相对写法 +16: "标签" 取接下来的十六个,这样在中间插入字段时就不必重新数一遍。字段必须连续:出现空隙或重叠都会指出该行并拒绝绘制,因为两者都会悄悄挪动后面的全部内容。每行 32 个比特,跨行的字段会画在两行上,标签放在较宽的那一段;网格上方的数字标出每个字段的起始位置,以及每行的最后一个比特。

网格、面积、架构、流向与 ZenUML

block(block-beta)绘制方块的网格,其中的位置就是你书写的顺序:columns 3 指定网格有几列(不写时全部排成一行),每个方块可用流程图的各种形状(a["标签"]、b(("圆"))、c{"菱形"}),a:2 让方块占两列,space(或 space:2)留出空位。block:id … end 把一个网格嵌进另一个,可有自己的 columns,外面变成一个框。箭头就是流程图的写法(a --> b,带标签写作 a -- "文字" --> b),但这里它们只引用已声明的方块:指向不存在名称的箭头会指出该行并拒绝绘制,而不是在你没写过的格子里凭空造出一个方块。列间距会一直增大到箭头标签放得下,这样它就不会碰到旁边的方块。块箭头(a<["去程"]>(right))是一个箭头形状的框:方向写在括号里(right、left、up、down,或者用 x 表示两个水平方向、y 表示两个垂直方向),且可以组合((x, down));自创的方向会指出所在行并拒绘整张图,而不是随便画成一个箭头。

treemap(treemap-beta)绘制面积图:每个矩形的面积与数值成正比,缩进表示层级,深度不限。叶子声明数值("名称": 12),分区不声明任何数值——它的值是子项之和;允许它自带总数就会出现一个对自身构成撒谎的矩形,所以那会指出该行并拒绝绘制。含空格或冒号的名称要用引号括起来;classDef 和 :::类名 可以上色。排布采用 squarified,让矩形尽量接近正方形——总沿同一个轴切分会得到无法用眼睛比较的长条,而比较面积正是这个图唯一要做的事。标签和数值只在能完整放进矩形时才显示:被边缘截断的文字什么也说明不了。

architecture(architecture-beta)绘制服务及其之间的连接:service api(server)[API] 声明一个组件,group yun(cloud)[云] 开启一个边界,后缀 in yun 把服务放进去(分组可以嵌套),junction j 创建一个拐角用来折线。

决定位置的是连接所用的“边”:a:R -- L:b 把 a 的右边贴到 b 的左边,也就是把 b 放在 a 的右侧;L、R、T、B 都可用,箭头出现在有 < 或 > 的一侧(-->、<-->,或不带箭头的 --)。端点上的 {group} 后缀会把线引到分组的边界,而不是里面的方块。图标就是 Mermaid 内置的那五个——cloud、database、disk、internet、server——其他任何名称都会指出该行、列出可用名称并拒绝绘制。其余的(如 logos:aws-lambda)来自 Iconify,只在发布页面的人用 JavaScript 注册了图标包的地方才显示,连 GitHub 都没有注册:在这里接受它们,等于交给你一张在别处都复现不出来的图。align row a b c(或 align column)把列举的成员放在同一行——或同一列——;不存在的名称会指出所在行并拒绘整张图,而不是默默地保持原来的排列。

sankey(sankey-beta)绘制流向图,带子的粗细就是数值:正文里没有任何箭头——它是三列 CSV(来源,去向,数值),一行一条连接,靠在两端重复同一个名称把流向串起来。含逗号的标签要放在引号里,标签内部的引号写成两个("固定 ""成本""");同一组来源/去向重复出现时会相加。节点竖条的高度取流入与流出中较大的那个,这样分出去比收进来多的节点,出去的带子才不会溢出边框。列由到每个节点的最长路径决定,没有去向的节点排到最后一列。数值小于等于零、指向自身的连接以及环都会拒绝该图并指出所在行——环里不存在最长路径,为了画出来而剪掉一条连接,展示的就是你没有写过的流向。这里没有 title:正文是纯 CSV,接受它在 LightNote 里能画好,在 Mermaid 里却是语法错误。

zenuml 是同一张图的另一种写法——时序图——用代码而不是箭头来写。同步调用只写目标(Store.register(item)),发送方是包住它的那个块:在 Store.register() { Stock.reserve() } 里,调用 Stock 的是 Store。最外层的调用者是发起者,@Starter(Ana) 给它命名;不写则使用一个火柴人 User,且只有在某个调用需要时才出现。异步消息写作 A->B: 文本(开口箭头,没人等待),而 A->B.method() 是写明发送方的同步调用。{} 用来嵌套,return x 返回给发起外层调用的那一方(中间夹一个 if 不影响这一点),x = A.m() 是同一个返回的另一种写法,new A(args) 创建对象,// 注释 会变成下一条消息上方的备注。块有 if/else if/else、while/for/forEach/loop、opt、par 和 try/catch/finally;} else { 不会另开一个框,而是用分隔线继续同一个框。@Actor 画火柴人;其他注解器(@Database、@Boundary 等)会变成标签里的构造型(«Database» Stock),因为这里不绘制它们的图标——名字仍然显示,这才是要紧的。带空格的名字要放在引号里。

请留意这个块最终会去哪里:在 Mermaid 里 zenuml 是需要页面用 JavaScript 注册的外部图,GitHub 并不注册,所以在这里能画出来的同一则笔记,在那边仍然是代码块。

而当 LightNote 读不懂某个图时,会在块的下方说明原因和所在行。尚未支持的类型不会给出提示,因为你写的并没有错。