十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Joplin 化学方程式支持:KaTeX 与 mhchem 插件的渲染原理与实战指南

Joplin 化学方程式支持:KaTeX 与 mhchem 插件的渲染原理与实战指南 Joplin 化学方程式支持KaTeX 与 mhchem 插件的渲染原理与实战指南【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin本文围绕 Joplin 对 mhchem 化学方程式语法的支持展开先讲清如何在 Joplin 笔记中书写与渲染化学方程式再深入到开源仓库源码剖析 mhchem 如何以 KaTeX 宏的形式被注入渲染管线以及数学公式的解析、缓存、错误处理与字体导出是如何实现的。读完本文你既能直接在 Joplin 中写出规范的\ce/\pu化学表达式也能理解 Joplin Markdown 渲染器处理数学内容的完整链路。功能背景与快速上手Joplin 的桌面版与移动版均支持基于 KaTeX 的数学表达式而 mhchemmixture of chemical equations插件则在此之上扩展了对化学方程式语法的支持。启用数学公式功能后mhchem 插件会自动随之激活无需单独配置。在 Markdown 笔记中书写化学方程式的方式与普通数学公式一致行内公式用$...$包裹独立公式块用$$...$$包裹。Joplin 官方文档中给出的 mhchem 语法示例如下引自发布时的新闻稿见 readme/news/20191012-223121.md$\ce{CO2 C - 2 CO}$$C_p[\ce{H2O(l)}] \pu{75.3 J // mol K}$$\ce{Hg^2 -[I-] HgI2 -[I-] [Hg^{II}I4]^2-}$在 Joplin 中它们会被渲染为规范的化学式碳与二氧化碳的高温反应、液态水的定压热容\pu命令自动处理单位与斜杠比例、以及连续加碘离子生成四碘合汞(II)配离子的反应序列箭头上下方显示反应条件。两条最常用的命令\ce{...}解析并排版化学方程式与化学式。支持反应箭头-、-、等、上下标系数、电荷、氧化态、反应条件箭头内[...]标注、物质状态(aq)、(l)、(s)、(g)等\pu{...}解析物理量单位其中//会渲染为分数斜杠例如\pu{75.3 J // mol K}输出每摩尔开尔文 75.3 焦耳。完整的 mhchem 语法覆盖化学式、反应、配合物、晶格系统等内容可按 mhchem 上游文档的语法约定书写。需要留意的是mhchem 扩展不属于 CommonMark 规范因此这些语法只在 Joplin或其他同样集成了 mhchem 的阅读端中可渲染在其他通用 Markdown 阅读器中会显示为原始文本。Joplin 的 Markdown 指南在 readme/apps/markdown.md 中同时列出了Math notation与Chemical equations两个小节明确说明化学方程式经由 KaTeX 的 mhchem 插件支持、且随数学公式功能自动启用。源码剖析mhchem 如何接入 Joplin 渲染管线Joplin 的 Markdown 渲染核心位于 packages/renderer/MdToHtml 目录数学公式渲染规则实现于 packages/renderer/MdToHtml/rules/katex.ts。理解 mhchem 支持的关键在于这个文件里的一行let katex require(katex); const mhchemModule require(./katex_mhchem.js); // ... katex mhchemModule(katex);参见 katex.ts#L7-L112即Joplin 先加载 KaTeX 核心再把 KaTeX 实例交给 mhchem 模块做改装。改装后的实例随即被 Joplin 自己的 markdown-it 规则用作渲染后端。vendored 的 mhchem 实现packages/renderer/MdToHtml/rules/katex_mhchem.js 是从 KaTeX 官方仓库contrib/mhchem/mhchem.js中 vendored 下来的 mhchem 3.3.0 版本文件头注释说明了来源与以函数包裹以便各端应用导入的包装方式文件长达 1700 余行。它向 KaTeX 注册了三个宏katex.__defineMacro(\\ce, function(context) { return chemParse(context.consumeArgs(1)[0], ce) }); katex.__defineMacro(\\pu, function(context) { return chemParse(context.consumeArgs(1)[0], pu); });参见 katex_mhchem.js#L78-L84此外还定义了\tripledash宏用于绘制键合中的三短横线~ 形式的化学键。mhchem 的解析机制状态机从源码结构看\ce/\pu的参数并不是直接交给 KaTeX 排版而是先经过一个专用的mhchemParser状态机chemParse-mhchemParser.go(str, stateMachine)模式匹配表patterns中定义了数十种正则与函数型匹配模式如letters元素字母与希腊字母、digits下标数字、-各种反应箭头含 Unicode 箭头、state of aggregation $(aq)、(l)等物态标注、amount计量系数等见 katex_mhchem.js#L255-L397状态迁移stateMachines定义了ce主解析器、a、o、text等状态机createTransitions把模式 - 状态 - 动作的声明式表格展开为迁移表逐字符驱动解析缓冲区用a/b/p/o/q/d分别暂存计量数、左上/左下标、元素、下标、右上标等字段输出为 TeX状态机把化学式拆分为chemfive五元化学式、arrow带上下标注的箭头、operator等结构化输出再由texify转回 KaTeX 可渲染的 TeX 字符串——所以最终化学式仍是 KaTeX 排版产物能完整享受 KaTeX 的字体与断行能力防死循环保护解析循环带 watchdog 计数未识别字符会抛出MhchemBugU之类的明确错误。这就是为什么\ce{Hg^2 -[I-] HgI2 -[I-] [Hg^{II}I4]^2-}中箭头上方标注I-能正确排版——[(...)]模式在r|rt状态下把括号内容写入箭头的上方脚本缓冲rd输出为带rd的arrow节点。数学公式的 markdown-it 规则math_inline / math_block 两个解析函数负责从 Markdown 源中切分出$...$行内公式与$$...$$块级公式逻辑源自 markdown-it-simplemath并处理了转义$、空公式$$、闭合定界符后不能紧跟数字等边界情况。切出 TeX 内容后的渲染流程为渲染并缓存renderToStringWithCache用md5(escape(latex) escape(stringifyKatexOptions(options)))生成缓存键命中则直接复用特别地若本次渲染过程中 KaTeX 新增了宏beforeMacros ! afterMacros则不写入缓存保证一个公式块里定义的宏可被后续块复用对应上游 issue #1105见 katex.ts#L330-L346宏跨块持久化插件初始化时把共享的macros对象挂到options.context.userData.__katex上所有公式块读写同一份宏表strict 选项调用方可通过 RenderOptions 传入strict如ignore用于抑制 KaTeX 对 LaTeX 不兼容字符如从邮件/Word 粘贴引入的 U00A0 不换行空格的控制台警告。测试用例 katex.test.ts 验证了两种行为默认情况下渲染$x 1$含 nbsp会产生LaTeX-incompatible警告传入strict: ignore后输出不变但警告被静默trust 白名单isTrustedKatexContext限制\href/\url只接受https://、http://、mailto:、joplin://、页内锚点及:/32位ID笔记链接等协议见 katex.ts#L39-L52防止公式中的 URL 绕过 Joplin 的链接白名单错误降级渲染抛错时不中断整篇笔记而是输出span|div classinline-code包裹的错误信息行内公式用span、块级公式用div。输出 HTML 结构为富文本编辑器保留源码值得注意的实现细节是渲染输出不是裸 KaTeX HTML而是包了一层 Joplin 自定义结构!-- 行内公式 -- span classjoplin-editable span classjoplin-source hidden contenteditable="false">【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表