返回资讯中心
外部精选
软件工程
#开发者实时流

Org 模式 LaTeX 预览功能完成全面重写

来源标题:Fabulously Fancy Fragments (Live Org / LaTeX Previews)

Org 模式的 LaTeX 预览系统在历经多年开发后被完全重写,新实现可即时渲染、不阻塞 Emacs,并随输入实时更新。这一项目由作者与 Karthik 从 2022 年启动,两人交流逾万条消息、投入数百小时,期间解决了大量遗留问题。

Hacker News 最新spudlyo2026/11/1 · 3 天前20 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

预览看起来浑然一体,几乎瞬间出现,从不阻塞 Emacs,并且随着你输入而更新。

2021 年 7 月,我曾兴奋地宣布了期待已久的引用语法功能。今天,我要宣布一个更贴近我内心的功能——对 Org 生成 LaTeX 预览的系统进行大幅改进(实际上是一次彻底重写)!

2021 年底,Karthik 和我讨论了我们对现状的共同不满,2022 年我们启动了一个项目,通过彻底移除整个 LaTeX 预览实现并在其位置上构建更好的东西来改善体验。这个起初只是“简短”的合作项目,最终变成了一场长达数年、伴随着一长串烦人问题的苦战,但在交换了一万多条消息并投入数百小时之后,我认为可以公平地说,我们成功了。

让我带你浏览一下这项新工作;如果你有兴趣阅读更多细节,请参阅 Karthik 的配套文章《Understanding Org's LaTeX preview system》。

许多 Org 用户对 LaTeX 非常熟悉,并欣赏 LaTeX 片段与 Org 语法的紧密集成。我是众多受到 Gilles Castel 那篇精彩博客文章启发的数学学生之一,那篇文章展示了他快速插入 LaTeX 片段的系统。我 quest 在 Emacs 中复现这一体验并撰写详细笔记,这让我深入了解了 Org LaTeX 预览系统的种种特殊之处, namely:

多年来,其他人尝试用配置创可贴和试图绕过设计某些方面的包(最著名的是 org-fragtog 和 xenops)来改善体验。所有这些方法都做出了严重的妥协。Karthik 对现状不满,并开始展示可以做出更好的妥协;而我不喜欢做妥协。于是,我们最终抛弃了旧实现,从头开始 💥。

要让 LaTeX 片段感觉像是 Org 缓冲区中自然的一部分,有几件关键的事情需要做好。其中最重要的一点是确保它们永远不会打断你与缓冲区的交互。

打开缓冲区时 Emacs 冻结,或者使用像 org-fragtog 这样的包时在打字过程中冻结,都是非常不愉快的。为了防止这种情况发生,我们将渲染管线拆分,并异步执行其中的每个阶段,同时通过簿记确保即使缓冲区在片段生成期间发生变化,我们也能将正确的 overlay 图像放在正确的位置。

Karthik 和我进行了大量的性能分析和调优,以尽量减少管线中的停顿,确保你在预览生成过程中永远不会感觉到 Emacs 卡顿。

现在,虽然片段预览不再阻碍你与 Org 缓冲区的交互是件好事,但能快速看到它们也是件好事。我们现在竭尽全力缩短在缓冲区中看到预览的时间。细节暂且不提,一个包含 660 个片段的中等数学文档,过去需要两分半钟才能加载,现在只需两秒钟。事实上,差异甚至更为明显,因为我们根据当前缓冲区位置来排列片段生成的顺序,所以你会先看到附近的片段流式出现。

这条新管线是使用 org-async 构建的,这是一个作为补丁集的一部分引入的小型声明式进程链库。

我们还利用 org-persist 来缓存片段,这意味着这约 70 倍的性能提升是最坏情况。重新打开的缓冲区中的片段应该几乎瞬间出现(参见 org-latex-preview-cache,并调整 org-latex-preview-persist-expiry 来改变旧预览的保留时长)。

我一直特别在意的一点是,预览片段在 Org 缓冲区中看起来从来都不太自在。尺寸总是有点不对,定位也不太准确。我们现在收集必要的大小信息,使片段图像的大小与缓冲区文本协调一致,从而产生完美的基线对齐和匹配的尺寸(取决于你的 LaTeX/Emacs 字体搭配,可能需要进行微小的校正;参见 org-latex-preview-appearance-options)。

如果你想知道校准这项工作花了多少功夫,只需知道有一个无法解释的 1.659393% 校正因子,用于对齐计算尺寸和观察尺寸。

这些片段还会跟随文本缩放和当前主题的前景色,帮助它们感觉像是缓冲区文本的一部分。

图 4: 同一文档在几个浅色主题下的效果;预览随之变化而无需重新生成。

实时更新也是!

作为重做预览引擎的一部分,我们希望涵盖 org-fragtog 的功能,这是一个在你进入和离开片段时智能切换预览的包。这通过一个新的 minor mode 提供,即 org-latex-preview-mode。得益于新管线的速度,我们意识到不仅可以快速重新渲染编辑过的片段,还可以在编辑过程中重新渲染。当 org-latex-preview-mode-display-live 非 nil 时,预览模式还会显示实时更新的预览。

图 5: 扩展一个矩阵,预览跟随每一次编辑。

这对于及早发现错误特别有帮助,因为我们现在还会通过应用错误 face 并在 tooltip 中放置该片段的编译日志来指示错误。

图 6: \sqrt 中的拼写错误使预览变为红色,悬停时显示 LaTeX 的错误。

编号美观

以前,每个编号方程都是单独编译的,因此都渲染为 (1)。借助我们在跨缓冲区跟踪片段方面所做的工作,我忍不住想让方程编号真正对应于方程顺序。

图 7: 添加一个方程会重新编号其后的方程。

公平导出

预览生成速度和尺寸方面的改进已被延续

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →