1. 为什么在drawio里塞公式,总比想象中麻烦
先说个我自己的真实经历。有次画系统架构图,需要在某个组件旁边标注一个时间复杂度的公式 T(n)=O(nlogn),我下意识在drawio里敲了个文本框,结果那个等号和logn的上下标,怎么看怎么像占位符,完全拿不出手。后来又试过用截图工具从别处截公式图贴进来,裁剪半天,图片边缘还带着白底,放进深色主题的图里,丑得离谱。就是从那次开始,我才认真研究drawio里加数学公式这件事。
先说结论:drawio本身不提供类似Word公式编辑器那种“所见即所得”的公式输入体验,它本质上还是画图工具。但这不代表你没法在图里放公式。常见的可行路径有四五条:外链图片、本地LaTeX编译、SVG矢量图、MathML粘贴。每一条路都有自己的优缺点,选对了方案,十分钟就能搞定;选错了方案,你可能会在字体、白边、清晰度这些事上耗掉一晚上。
这篇文章适合谁?如果你平时用drawio画架构图、拓扑图、技术方案图,又需要在图里出现一两个数学公式或带上下标的符号;或者你是老师、写技术文档的人,需要在图示里公式化表达某个计算过程;又或者你只是想统一整套文档的“公式风格”,不想用截图糊弄。那下面这几种方案,你至少能用到其中两三个。我会把每一步操作、参数、坑点都写清楚,照着做就行。
需要提前说明的是,下面所有方案里,有的需要联网,有的需要本地装环境,有的“一劳永逸”但也有兼容性风险。我建议你先看一眼第2章的对比表,再决定走哪条路,不要一上来就装一堆工具。
2. 方案选型:到底有哪几条路可以走
在动手之前,先花两分钟把方案理清。drawio里加公式,本质上做的是“把一段数学表达式变成图片、矢量图或特殊对象,然后放进画布”。根据这个原理,所有方案都可以归到下面几类里。
2.1 四类主流方案对比
| 方案 | 需要网络 | 需要本地环境 | 公式可编辑性 | 缩放质量 | 适合场景 |
|---|---|---|---|---|---|
| 外链图片(在线公式渲染服务) | 是 | 否 | 低,只能换图 | 取决于图片格式,PNG放大略糊 | 快速演示、个人笔记、临时图 |
| 本地LaTeX编译(drawio原生数学排版) | 否 | 需要LaTeX发行版 | 中,能改代码后重新编译 | 矢量输出,缩放到任意大小都不糊 | 深度用户、离线环境、正式技术文档 |
| SVG矢量图插入 | 生成时需联网,插入后可离线 | 否 | 低,SVG可编辑但drwio里编辑体验一般 | 极好,始终清晰 | 需要高清印刷、分享给他人看 |
| MathML粘贴 | 否 | 否 | 中,可修改MathML源码 | 跟drawio内置排版走 | 已有现成MathML内容时 |
从表格能看出来,外链图片是最省事的,几乎零成本就能跑通。我日常用得最多的,也是外链图片。但要注意,外链图片有个天然隐患:一旦你粘贴的公式渲染服务地址失效,drawio里那个公式就变成了一个破图。所以如果画的是要交付给客户或存档很久的图,我更推荐用本地LaTeX编译或SVG方案,至少文件不会因为“外部服务挂了”而集体失效。
2.2 选型前需要想清楚的三件事
第一件事,公式出现的频率。如果你只是偶尔在图里放一两个公式,直接走图片方案,别折腾环境。第二件事,使用场景是离线的还是联网的。如果你经常在高铁上、内网环境里干活,那外链图片方案基本废了,必须提前把公式渲染成图片存到本地再插入。第三件事,协作对象。如果你画的图要发给别人编辑,对方可能没有LaTeX环境,你本地编译出来的公式对象在对方电脑上可能不显示——这一点我踩过坑,后面会细说。
3. 零成本起步:外链图片方案完整实操
外链图片方案的核心逻辑,就是利用互联网上现成的“LaTeX转图片”在线渲染服务,先把你的公式变成一个图片链接,然后把链接作为外部图片插入到drawio中,drawio画布上实时显示渲染结果。省掉了所有本地环境配置,浏览器能打开drawio就能用。
3.1 第一步:把你的公式改写成LaTeX语法
这一步没有捷径,你至少要认识常见的LaTeX数学命令。好消息是,日常用到的高频命令就那么几十个,想不起来可以现场查。比如:
- 上下标:x^2 表示 x 的平方,x_i 表示下标 i,两者结合 x_i^2 表示“下标i、上标2”
- 分式:\frac{a}{b} 表示 b 分之 a
- 根号:\sqrt{x} 表示 x 的平方根
- 求和:\sum_{i=1}^{n} 表示从 i=1 到 n 的求和
- 希腊字母:\alpha、\beta、\theta、\lambda 等等,前面加反斜杠
我一开始也记不住这些,后来发现一个技巧:先在脑子里用白话描述这个公式,再拆成LaTeX的最小片段,写坏了也没关系,渲染服务会实时报错,看到报错改就行,比本地搭环境好调试多了。
3.2 第二步:找在线渲染服务,生成图片地址
在线LaTeX渲染服务不止一家,用法大同小异。这类服务的通用模式是:把LaTeX代码放进URL参数里,服务端实时渲染成图片返回。你只需要把URL复制到drawio图片地址栏即可。
我用的是类似这样的URL结构,你可以根据服务说明调整:
示例URL格式:公式渲染服务地址?公式编码后的LaTeX代码
需要注意,LaTeX代码里的特殊字符,比如井号#、百分号%、&符号,不能直接放在URL里,否则会被截断或解析错误。稳妥的做法是先用URL编码工具把整个LaTeX代码编码一下。这一步非常容易漏,我曾经因为一个大括号没编码,图里直接显示“403错误”,排查了半天才发现问题出在URL上。
3.3 第三步:在drawio中插入外链图片
这一步骤非常快。在drawio画布上,从左侧工具栏选择“更多形状”,或者在菜单栏里点“插入 -> 图片 -> 外链图片”,然后把上一步生成的图片URL粘贴进去。drawio会立即加载图片并显示在画布上。
插入后有几个必调参数,否则图面会很糙:
- 锁定纵横比:选中图片后,在右侧属性栏勾选“锁定纵横比”,拖动大小时不会变形。
- 背景透明:很多公式渲染服务默认生成白底图。如果你的画布是深色主题,白底会很扎眼。可以在渲染时指定透明背景,或者在drawio里双击图片打开裁剪工具,把白边裁干净。
- 缩放比例:drawio默认插入的图片尺寸,可能跟你公式实际大小不匹配。按住Shift再拖动角点,可以等比缩放(实际上drawio默认等比,但依然建议锁定比例以防误操作)。
3.4 第四步:对齐与锚定,让公式“长”在图形上
公式插入后,它和图形对象默认是独立的,你拖动图形它不会跟着走。这里有两个选择:
如果公式只是图形旁边的一个注释,用鼠标拖动公式边缘的绿色箭头,选中“连接线”,把公式对象与图形对象连接起来。drawio里对象的四个绿色箭头就是连接点,拖动箭头到另一个对象上会生成带箭头的连接线,这样移动图形时公式会跟着移动。
如果公式需要严格居中于某个图形内部,比如在流程图节点里放公式,更省事的做法不是外链图片,而是先插入节点,再拖动图片到节点内部。图片会作为“浮动子对象”放在节点上方,这种方式需要手动调整每次移动的相对位置,不能做到“钉死”,但对大多数场景已经够用了。
3.5 外链图片方案的两个大坑
第一个坑,URL长度限制。有些渲染服务对URL长度有隐含限制,公式越长,URL越长,请求越容易失败。我自己遇到过画一个复杂的矩阵公式,渲染服务直接返回错误。后来拆成两个短公式分别渲染,再用drawio的“组合”功能拼在一起,问题就解决了。
第二个坑,图片缓存。同一个URL,drawio在某些情况下会把图片缓存到本地。这意味着你改了公式,重新生成URL时最好带上不同的版本号参数,比如在URL后面加?v=2,避免drawio继续显示旧图。这个坑很隐蔽,我第一次遇到时还以为自己改错了公式,折腾了很久。
4. 桌面版进阶:drawio原生数学排版
如果你用的是drawio桌面版(不是网页版),而且你的电脑里已经安装了LaTeX发行版,那可以解锁一个更优雅的方案:drawio内置的数学排版功能。这个功能可以让你直接在图形里写LaTeX公式,画布自动渲染,实时预览。它不需要把公式转成图片再导入,一切都在drawio里完成,图元本身就是公式对象,不依赖外部服务。
4.1 为什么drawio能本地渲染LaTeX
原理并不神秘:drawio桌面版在检测到系统PATH里有LaTeX可执行程序(命令行工具,通常是latex或pdflatex)时,会启用数学排版功能。你在文本编辑状态输入LaTeX代码,drawio会调用系统LaTeX程序把它编译成一个图片对象,然后嵌入当前图形。整个过程看起来是“实时渲染”,本质上是“本地编译”。
所以,这个方案的先决条件有两个:一是必须使用drawio桌面版,网页版无法调用你本地的程序;二是电脑里必须装好LaTeX发行版,并且能被命令行直接调用。注意,这不代表你会需要写复杂的LaTeX文档,drawio只是借用编译能力,你不要被“安装发行版”这个门槛吓到。
4.2 我建议的LaTeX发行版安装方式
Windows下最省心的是MiKTeX 或者 TeX Live。macOS下我推荐安装MacTeX 的基础版,东西全,但体积很大。如果你只是想在drawio里写公式,不需要装完整发行版,可以试试轻量一点的方案,但要注意:drawio检测的是latex命令是否存在,如果装的是精简工具链,可能检测不到。
安装完成后,在命令行里输入latex --version,能输出版本号就说明环境OK。然后重启drawio桌面版,再新建或打开一个图形,选中某个文本对象,在编辑栏里输入LaTeX公式,drawio会自动识别并渲染。如果没反应,检查一下drawio菜单“Extra -> Features”,看数学排版是否被启用。
4.3 实际输入公式的方式与样式控制
在drawio里用原生数学排版时,输入公式的语法和LaTeX基本一致,但你要注意两点:
一是公式需要包裹在特定的定界符里。drawio的惯例是,用双美元符$$...$$或者反斜杠加括号\[ ... \]包裹的内容会被识别为数学公式,单独一个$...$可能不生效。如果你只是输入一行普通的带上下标的文字,不用刻意追求标准LaTeX排版,但一旦输入定界符,drawio就会走LaTeX编译流程。
二是字体和大小控制。drawio原生渲染出来的公式字体,跟你画布里默认字体是完全不同的体系,因为它走的是LaTeX字体栈。如果你希望公式和图中其他文字“看起来是一家”,可以把公式字体大小调小一点,或者尽量精简公式,让视觉重量一致。但别指望完全一致,LaTeX字体的数学风格是“我愿意为清晰度做一切”的严谨风,跟普通无衬线字体差别挺大。
4.4 这个方案的短板也要说清楚
它最大的短板,还是依赖本机LaTeX环境。你把图发给同事,同事电脑上没装LaTeX,那么公式对象在对方画布里就是一片空白,或者显示成错误提示。我踩过这个坑:画好的架构图发给客户后,对方反馈“公式位置是空的”,当时还没反应过来是环境问题,以为是drawio兼容问题。
所以,如果你的图要多人编辑、多人查看,我强烈建议不要让公式依赖本机环境,而是用一份“渲染后”的版本。好在桌面版有“导出为图片”的功能,导出PNG或PDF时公式会一并固化,这种交付方式就没有问题。如果你确定图只是在团队内部流通、大家都能装环境,那原生数学排版会非常顺手。
5. 补充手段:SVG插入、MathML粘贴与离线图片嵌入
不是所有场景都适合上面两个方案。有的公式特别长,外链图片URL会爆长;有的用户已经写好了MathML内容,不想再转一遍LaTeX;还有的人希望公式能作为矢量图形直接放进图里,这样在印刷时不会出现锯齿。这一章说三个补充手段,按需取用。
5.1 用SVG来保证公式“永不模糊”
外链图片服务通常可以生成PNG或SVG格式。如果你是给印刷物配图,一定优先选SVG。SVG是矢量图,缩放到多大都不会糊。
操作流程:首先用公式渲染服务生成SVG格式的图片链接,然后在drawio中拖入该SVG链接,或者直接下载SVG文件后拖进画布。drawio支持直接打开SVG文件,打开后会把SVG当作矢量对象。
要注意一个细节:SVG对象插入后,不要随意转换成图片格式。drawio里右键点击SVG对象,如果选“转换为图片”,它就栅格化了,失去矢量优势。另外,部分在线渲染服务生成的SVG字体可能没有嵌入,复制到其他设备上打开时,字体可能变成默认字体。这个问题不常见,但一旦遇到就很麻烦,所以SVG方案更适合“最终交付”而不是“编辑中转”。
5.2 已有MathML,直接粘贴进去
MathML是一种用XML描述数学公式的标准格式,很多数学软件和网页都支持导出MathML。如果你手里已经有现成的MathML源码,不需要费力转成LaTeX。
drawio并不是所有版本都支持直接粘贴MathML,但比较新的版本里,有一个“插入 -> 高级 -> 数学排版”入口,也有些版本支持直接粘贴MathML文本,drawio会自动解析。实际操作中,如果你在网页上复制一个由MathML渲染的公式,粘贴到drawio文本框中,drawio有时能自动把它转成图形对象。不过这一行为的兼容性波动比较大,我在多个版本的drawio里都遇到过不同表现。
所以我的建议是:如果你只有MathML源码,别在这种格式上死磕,直接找一个“MathML转LaTeX”的在线工具,转换完再走外链图片或者原生排版方案,省时省力。MathML粘贴更适合“顺手能用”的场景,不适合当主力方案。
5.3 把公式图片“嵌入”画布的离线思路
前面提到的外链图片方案,如果网站关闭了,图片就挂了。但drawio其实也支持“嵌入图片”模式,也就是把图片数据本身保存在图纸文件里,不依赖外部URL。区别在于,外链图片是“引用”,嵌入图片是“复制”。
操作方式是:把公式先用本地工具渲染成PNG或者SVG文件,然后在drawio里用“插入 -> 图片 -> 图片文件”选择本地文件,drawio默认会把图片以嵌入方式保存进.drawio文件(注意是默认,不要选“外部文件链接”)。这样你在离线状态下打开、查看、分享了这个画布文件,公式永远都在,不会破图。代价是文件体积会变大,公式多了以后,几十MB都有可能。
这个方案我建议至少掌握,因为它的确定性最高,不依赖任何服务端,也不要求对方装任何环境。唯一的成本就是你得先有“渲染公式成图片”的工具。如果你电脑里恰好有第4章的LaTeX环境,那你可以在命令行里用pdflatex把公式编译成图片,然后用这个方案嵌入drawio。如果没有,也可以先用在线服务生成图片再下载。
6. 常见问题与排查技巧实录
在写这篇文章的过程中,我把近几年用drawio加公式时踩过的坑集中整理一下,按频率排个序。你如果遇到了同样的问题,可以对照着排查,能省不少时间。
6.1 公式显示为空白方框或红色错误标识
这是最常见的问题。原因基本就两类:一类是drawio检测不到LaTeX环境或服务端返回了错误;另一类是公式语法本身有误。如果是原生数学排版,先检查命令行能否正常输入latex --version。如果是外链图片,把图片URL单独在浏览器里打开,看是否返回正常图片,如果浏览器里都是空白或报错,说明公式语法或URL编码有问题,问题不在drawio而在上游。
6.2 图片显示出来但没有公式,只有一串代码
这种情况绝大多数出在“数学排版”解析失败上。drawio把某些内容当成了普通文本,而不是公式。记得检查公式是否被正确的定界符包裹,以及“数学排版”功能是否真的开启了。有些版本里,这个功能在“Extra -> Features”列表里默认是不勾选的,我今天提到的那个桌面版也不例外。
6.3 公式里有中文,渲染出来全是方块
LaTeX默认不认中文,除非你在序言里加载中文字体宏包。在在线渲染服务里,很多服务根本不支持中文,所以你插入公式时,所有中文一律应该写成LaTeX命令或英文符号。如果你真的需要在公式旁边配中文说明文字,别放公式里,在drawio里单独开一个文本对象写字,排版效果反而更好。
6.4 数学公式的字体和正文字体不一致
这是很多新手问得最多的问题:为什么同一个图里,普通文字是一种字体,公式是另一种字体?答案很简单:公式和普通文本走了完全不同的渲染路径。公式的字体由LaTeX决定的,普通文本由drawio的字体设置决定。想统一有两种思路:要么所有地方都用LaTeX风格字体,这个不现实;要么只在“必要时”用公式,其他说明性文字,尽量用drawio的普通文本框。从视觉上,控制公式出现频率,比强行统一字体有效得多。
6.5 公式图片插入后发现背景是白色的
这个问题出现率极高,尤其是当你用的画布有背景色或深色主题时。解决思路有两种:渲染的时候,把公式背景设置为透明(很多渲染服务支持transparent参数);或者插入后用drawio的裁剪工具把白边裁掉。如果渲染服务既不支持透明背景,又不方便裁剪,那就干脆把这个白底留成“一个白色小方块”,不要放大,视觉上还能接受,但深色模式里就非常明显了,所以最稳的还是上游渲染时处理好透明背景。
6.6 外链图片在同事电脑上打不开
这几乎必然会遇到一次。因为外链图片地址如果是一个公司内网地址或者临时生成本地服务地址,别人当然访问不了。画图之前先想清楚:这个图会不会给外部人看,对方能不能访问同一个URL。如果不能,直接用第5章的“嵌入图片”方案,把这个步骤前置,后面就少很多麻烦。
7. 一点个人经验和后续扩展方向
在我自己日常的drawio使用习惯里,现在的公式方案基本固定下来了。如果是临时笔记或快速原型,我优先用外链图片,公式渲染服务转一张带透明背景的PNG,2分钟搞定。如果是正式的、要长期存档的方案图,我会把公式渲染成独立SVG文件,再用嵌入方式拖进drawio,这样既有矢量清晰度,又不依赖外链。团队协作时,我则会先画好图,再把公式“变成图片”后的版本导出为PDF或高分辨率PNG交付,避免对方环境不兼容导致公式丢失。
最后再分享一个小技巧。如果你平时会向AI提问来辅助设计图,那当AI给你输出一段LaTeX公式代码后,不要直接复制到文档里,先用心仪的方式渲染成图片再放进drawio。很多绘图工具其实已经能输出公式图片,把它们直接作为素材用,比你手动敲靠谱得多。比如你让AI生成一个“贝叶斯公式”的LaTeX代码,拿到代码之后用前面的任意方案做渲染,十分钟就能把公式放进架构图里。
我前阵子还在一个项目里试过,把整套drawio画布和渲染脚本放在一起管理,每次修改公式只需要重新渲染一张图,然后替换原图片。虽然有点“土法炼钢”,但对于那些需要频繁更新的图来说,这个工作流比任何花哨方案都稳定。工具终究是服务于效率的,你有自己的节奏才是最好的方案。