惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
腾讯CDC
J
Java Code Geeks
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
云风的 BLOG
云风的 BLOG
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
雷峰网
雷峰网
B
Blog RSS Feed
博客园_首页
量子位
F
Fortinet All Blogs
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog

热爱生活与梦想

迁移LeanCloud的Waline评论数据到TiDB/Neon 25年江浙地区暑假自驾游之感慨 使用阿里云灵码继续完成构建 SSL 证书管理器 亲手给儿子做的棒棒糖摩天轮六一礼物 使用腾讯云 CodeBuddy 构建 SSL 证书管理器 修复代码块默认高度相关缺陷 HugoNexT4.7.2 新功能和升级提示 改善代码块折叠和选中功能 支持Github风格的警告样式 新增音乐短代码功能支持 给文章添加摘要和过期提示功能 回顾24年的过去总结 给Hugo文章增加阅读更多跳转的锚点定位功能 Win10隐匿的VPN设置和L2TP连接常见错误 Go语言中“糟糕”的日期时间格式化设计 DaoCloud道客提供的免费Docker镜像代理服务 感谢万能淘宝让自己吃到喜欢的美食 WSL运行时遇到未知异常错误无法使用 隐藏的换行符导致Base64加密解密失败 MySQL自带客户端直接免密登录操作 Linux系统中删除目录软链接的注意项 Java程序调用外网API时CA问题 如何不关机重启WSL2恢复虚拟服务 在Windows上安装Podman容器平台做虚拟化 记一次无法弹出移动硬盘的记录 为友情链接添加自动检测脚本 重新激活Github的2FA认证 Linux中使用tar压缩命令排除文件 继续小米手环的健康生活之旅 一次意外的“坠机”引发了我对手机保护壳的深思
修复Mathjax行内显示公式的问题
凡梦星尘 · 2024-12-15 · via 热爱生活与梦想

hugo-theme-next 的主题默认便是可支持使用mathjaxkatex两种不同组件,通过它们来实现对数学公式的渲染输出显示。只不过自己对数学公式的使用了解的也比较少,测试时直接就是复用网上的文章来验证数学公式渲染是否正常。结果当遇到真正的数学“专家”用户时,便是暴露出在了无法在同行文字内显示数学公式的问题 Issue#90 ,趁此便是参考评论区大家提供的建议尝试修复这“千年老🐛”。

修复问题

针对需要在行内显示数学公式的需求,乍一看用户提供的修复参考示例代码,觉得hugo-theme-next主题中的代码应该是没有问题才对,因为明显也是有相同的配置项设置,此时真是丈二和尚摸不着头脑啦。接下来只能是花点时间和耐心直接扒拉下评论中的参考代码进行调试,通过分析后确实也是找到根本原因,主要是如下两点:

  • Mathjax的配置项并非是等待其脚本加载完成后再触发,反而是要先于脚本加载前准备好
  • 加载脚本的script标签需要添加id属性,而且名称也是固定的MathJax-script不可修改

那么接下来只要按上面的问题原因,调整下/assets/js/third-party/others/math.js中的部分代码即可,修复后的代码参考如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
const render_js = NexT.utils.getCDNResource(NexT.CONFIG.page.math.js);
const mathjaxCfg = `
  window.MathJax = {
    // 自定义内联数学公式的分隔符号
    tex: {
      inlineMath: [['$', '$'], ['\\(', '\\)']]
    },
    // SVG 渲染配置为全局共享字体缓存
    svg: {
      fontCache: 'global'
    },
    // 排除特定的HTML标签,避免过度渲染
    options: {
      skipHtmlTags: ["script", "noscript", "style", "textarea", "pre", "footer"],
    }
  };
`;
NexT.utils.getScript(null, { textContent: mathjaxCfg });
NexT.utils.getScript(render_js, { attributes: { id: "MathJax-script", "async": true }});

中间在修复过程中还遇到了件“有趣”的现象,在文章底部的打赏区设置有个字符表情,原则上是不符合Mathjax语法标准的,但不知为何还是受到了影响,导致此表情无法正常显示,于是在上述的配置项中又增加了HTML标签排除来避免整个页面渲染。

效果展现

然后就是来见证奇迹发生的时刻,在行内用不同的语法写个二次元方程的数学公式进行验证,具体的数学公式和效果如下:

1
2
3
4
5
## 支持不同的行内语法标记
一元二次方程:$ax^2+bx+c=0$ 的求解公式为:\( x={-b\pm\sqrt{b^2-4ac} \over 2a} \) 

## 就是这个字符表情会被mathjax识别进行渲染,有点坑
ヾ(^▽^*)))

渲染后的实际效果: 一元二次方程:$ax^2+bx+c=0$ 的求解公式为:( x={-b\pm\sqrt{b^2-4ac} \over 2a} )

其他补充

另外也发现当前主题使用的Mathjax脚本文件是tex-mml-chtml组件,它是通过不同的字体来支持显示数字公式的,为此需要在页面加载时下载诸多使用到的字体库。而另一个组件tex-svg是把公式转换为SVG矢量图形输出,则不需要下载字体的操作。经过思索一番后,决定还是转向使用tex-svg组件来渲染数学公式,减少了资源下载的同时,也是支持更高质量的数学公式显示。

此次修复过程中也是参考了不少其他的资料学习,感兴趣的童靴可以点击下方的参考资源深入了解一二,也欢迎更多的用户使用反馈,提升 hugo-theme-next 主题对数学公式渲染的支持力度。😀