HeiBan:从Markdown转出PPT幻灯片

前情提要:HeiBan(黑板)-将Markdown转换成HTML来当讲义

HeiBan 之前是可以导出 PPTX 的,但打开一看,跟把 Markdown 原文直接粘贴进 PowerPoint 没什么两样。数学公式就是一行 LaTeX 源码,代码块黑底白字毫无高亮,Mermaid 流程图画不出来就直接显示代码。字号也不统一——正文 18pt、代码写死 11pt、引用写死 16pt,互相之间没有关联,说起来有点尴尬。

最近一个版本,把这些全重写了。

安装:

pip install heiban -U

想要最好的数学渲染效果,可以装上 PyMuPDF:

pip install heiban[pptx-hq]

命令行导出 PPTX:

heiban input.md --pptx output.pptx --theme dracula

pdflatex 和 mmdc 是可选的,装了效果最好,不装也有回退方案。

数学公式现在是真正渲染出来的。pdflatex 把 LaTeX 编译成 PDF,PyMuPDF 精确裁剪公式区域,再渲染成高清 PNG 嵌进 PPTX。行内公式 $e^{i\pi}+1=0$ 看到的是排版考究的数学文字,独立公式 $$F(\omega)=\int f(t)e^{-i\omega t}dt$$ 是居中显示的清晰图像。矩阵、aligned 环境、嵌套分数——matplotlib 搞不定的,pdflatex 都能处理。系统没装 pdflatex 的话会自动回退到 matplotlib,只是复杂公式渲染不了。公式字号也统一了,display 数学用基础字号的 2 倍,inline 用 1.3 倍,图片默认撑满可用宽度,不再是角落里看不清的小图。

Image

代码块有了真正的语法高亮。Pygments 逐 token 着色,暗色主题对齐 GitHub Dark,亮色对齐 GitHub Light。关键字红色、函数名紫色、字符串蓝色,每行每个 token 单独着色,不是整段代码刷一个颜色。100 多种语言自动识别,不用手动指定。

Image

Mermaid 图表也渲染成真正的图了。mmdc 渲染为 PNG 嵌入 PPTX,不再回退到代码块。有一个容易踩到的坑:Mermaid 里 () 是特殊字符,O(1) 这种节点标签会导致解析失败。0.3.0 加了自动修复,遇到含特殊字符的标签就自动加双引号,O1[O(1)] 变成 O1["O(1)"],mmdc 就不会报错了。

Image

字号方面,所有数值都从 18pt 基础字号按比例算出来。H1 乘 2.2 得 40pt,H2 乘 1.8 得 32pt,正文乘 1 得 18pt,display 数学乘 2 得 36pt,代码乘 0.6 得 11pt。改一个基础字号,全部按比例联动,不像以前各处硬编码毫不相干。

Image

字体也换了。正文和标题用 Source Sans 3,代码用 Source Code Pro,都是 Adobe SIL 开源字体,而且是配套设计的。Calibri 和 Consolas 是微软专有的,开源项目默认依赖闭源字体不太合适。接收方没装 Source 字体也没关系,PowerPoint 会自动回退,不影响内容显示。

主题从明暗各几套扩展到了 12 套。暗色有 black、dracula、league、moon、night、blood,亮色有 white、beige、sky、solarized、serif、simple,每套都有完整配色。之前有个隐藏的 bug:dracula 在深色主题列表里但实际没有配色定义,所有颜色都回退到了 black,选 dracula 和选 black 出来一模一样。0.3.0 把 dracula 的配色补上了。

内容太多的时候不会一味缩小字体了。页面内容预估超过可用空间的 75%,就自动切换成双列布局:标题占全宽,主体左右各半。双列比缩小字体的可读性强不少。

表格里的数学表达式,比如 $O(\log n)$,以前也是 LaTeX 源码原样显示。现在 \log 会转成 log\pm 转成 ±\infty 转成 ,40 多个 LaTeX 命令都能转成 Unicode,再用斜体和强调色渲染。虽然比不上 pdflatex 的精度,但表格单元格放不了图片,算是可用的折中方案。

修的 bug 也不少。一个比较严重的:数学公式渲染失败走 fallback 路径时会引用一个没定义的 min_h 变量,直接 NameError 崩掉。元素排序也一直有问题——pos 字段写进了 consumed 集合但没存入元素字典,排序函数每次读到的都是同一个默认值,排序等于没排。

还有一处正则匹配的问题:<p> 标签的正则 <p[^>]*> 会误匹配 <pre>。因为 pre 前两个字母就是 p<p[^>]*> 匹配 <pre> 是完全合法的,结果 Mermaid 的 <pre><code> 块被当作 <p> 标签内容给吞了。改成 <p(?:\s[^>]*)?> 之后,p 后面要么直接跟 >,要么空格加属性,<pre> 就匹配不上了。

图片宽高比在 _add_image() 里之前是硬编码 3.5 英寸高度不管实际比例的,现在改为按实际尺寸等比例计算。_add_image_from_bytes() 在用 min_h 约束高度后没有重新限制宽度,极端情况下会超宽,也修了。标题和正文之前是分组渲染的——先画完所有标题再画正文,文档的层次关系就乱了,现在改为按文档顺序处理。LaTeX fallback 路径之前只做了 strip("$"),处理不了 \[...\] 定界符,现在用了和主路径一样的清理逻辑。

项目地址:https://github.com/cycleuser/HeiBan

预览时标签不可点

Close

更多

Name cleared

微信扫一扫赞赏作者

Like the AuthorOther Amount

赞赏后展示我的头像

作品

暂无作品

Like the Author

Other Amount

¥

最低赞赏 ¥0

OK

Back

Other Amount

更多

赞赏金额

¥

最低赞赏 ¥0

1

2

3

4

5

6

7

8

9

0

.

虚拟化,操作系统,以及一些小工具 · 目录

虚拟化,操作系统,以及一些小工具

上一篇针对大模型和智能体新手开发者的Linux环境配置指南下一篇并非故意-为什么我更多用命令行工具而不是GUI

Close

更多

搜索「」网络结果

Close

调整当前正文文字大小

更多

100%