数学公式以两种形式出现,且只有前一种被正确渲染(mathjax),我不知道是否是自己的配置问题,亦或确实是bug。
该文摘抄自知乎,不过应该和网站无关。
个人理解这事比较复杂…
以知乎为例, 目前我看到的当前版本的专栏文章里的一个典型数学公式是这样子的:
<span class="ztext-math" data-eeimg="1" data-tex="\cos^2\alpha+\sin^2\alpha=1">
<span></span>
<span>
<span class="MathJax_Preview" style="color: inherit;"></span>
<span class="MathJax_SVG" id="MathJax-Element-2-Frame" ... data-mathml="<math> ...</math>" role="presentation">
<svg ...>
一堆标签
</svg>
<span class="MJX_Assistive_MathML" role="presentation">
<math>
一堆标签
</math>
</span>
</span>
<script type="math/tex;mode=inline" id="MathJax-Element-2">\cos^2\alpha+\sin^2\alpha=1</script>
<span class="tex2jax_ignore math-holder">\cos^2\alpha+\sin^2\alpha=1</span>
</span>
</span>
可看到, 就简单一个 \cos^2\alpha+\sin^2\alpha=1
, 它会以不同形式给表达六七次
那么 Ob 官方 Clipper 抄出来的是哪俩代码?
实测, 如果 Clipper 转换出 $AAAAA$BBBBB
这个形式,
那么 AAAAA 来自 <span class="MJX_Assistive_MathML" >...</span>
,
而 BBBBB 来自 <span class="tex2jax_ignore math-holder">...</span>
其余那些代码似乎是无关的
咋解决?
目前觉得, 在仍要使用 Clipper 的前提下, 最快速办法是剪藏前手动干掉 <span class="tex2jax_ignore math-holder">...</span>
这个元素, 如下:
// 比如在浏览器 console 执行这个
document.querySelectorAll(".tex2jax_ignore.math-holder").forEach(element => element.remove());
这样至少先做到, 剪藏到的乱糟糟的 $AAAAA$BBBBB
没有了, 全改成 $AAAAA$
的样子
至于更细节的问题:
KaTeX 公式咋办, 反复转义斜杠咋办, 行级块级公式认不准咋办, 维基那一堆 \displaystyle
咋办, … 这些可能得具体讨论了… 我目前觉得没有一个通用办法能搞定所有的网页里的公式
是的,我同意这点。顶多只能针对不同的网站做优化了
maoxian插件却能处理大部分数学公式,不知道它是怎么写的
确实, MaoXian 对知乎公式的处理会好一些
以上述例子 MaoXian Web Clipper 可能是找 <script type="math/tex;mode=inline" id="MathJax-Element-2">...</script>
这元素里面的公式, 并忽略同一个公式的其他渲染形式, 见 ref (大概率是, 也可能我理解不准)
同时 MaoXian 还在 src/js/lib/md-plugin-xxx.js
里有好多处理格式细节的逻辑, 这个值得参考