Skip to content

MHuiG/hexo-xmath

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Hexo Xmath

Xmath: Server side MathJax renderer plugin for hexo-renderer-marked.

这里是 Hexo 的服务器端 MathJax 渲染器插件。 致力于解决 hexo-renderer-marked 与 MathJax 渲染冲突的问题以及 Nunjucks 和 Mathjax 的语法冲突。 如果你使用了其他的 markdown 渲染器,点击右上角X,出门左转

警告:此插件是一个服务器端数学渲染插件,它不依赖于任何前端脚本。如果您在安装此插件之前已经启用了其他数学渲染方法,请执行以下作以避免冲突:

  • 删除所有其他 Hexo 数学插件
  • 在 Hexo 主题设置中禁用前端数学渲染器
  • 删除与数学渲染相关的前端脚本
  • 删除除了 hexo-renderer-marked 之外的其他 markdown 渲染器
npm install hexo-renderer-marked --save
npm uninstall hexo-xm
npm uninstall hexo-renderer-kramed
npm uninstall hexo-renderer-markdown-it
npm uninstall hexo-renderer-markdown-it-plus
npm uninstall hexo-renderer-multi-markdown-it
npm uninstall hexo-renderer-pandoc
npm uninstall hexo-renderer-unified
npm uninstall hexo-renderer-marked-xmath
npm uninstall hexo-filter-mathjax

安装

npm install hexo-xmath --save

配置选项

您可以在 Hexo _config.yml 中配置此插件。默认选项:

# https://github.com/MHuiG/hexo-xmath/
xmath:
  fuck_md: true # 对 markdown 进行转义兼容
  append_css: true # add CSS to every page
  every_page: false # if true, every page will be rendered by MathJax regardless the `xmath` setting in Front-matter
  packages: # extra packages to load
    # https://docs.mathjax.org/en/latest/input/tex/extensions/index.html
    # - base
    # - configmacros
    # - require
    # 上面三个包默认已加载
    - action
    - ams
    - amscd
    - autoload
    - bbm
    #- bboldx
    - bbox
    - begingroup
    - boldsymbol
    - braket
    - bussproofs
    - cancel
    - cases
    - centernot
    - color
    - colortbl
    - colorv2
    - dsfont
    - empheq
    - enclose
    - extpfeil
    - gensymb
    - html
    - mathtools
    - mhchem
    - newcommand
    - noerrors
    - noundefined
    #- physics
    - setoptions
    - tagformat
    - texhtml
    - textcomp
    - textmacros
    - unicode
    - units
    - upgreek
    - verb
    #- mediawiki-texvc
  tex_config: 
    # you can put your tex extension options here
    # see http://docs.mathjax.org/en/latest/options/input/tex.html#tex-extension-options for more detail
    tags: all # none or 'ams' or 'all'
    inlineMath: 
      '[+]': [['$', '$'], ['\$', '\$'], ['\\(', '\\)']]
    displayMath: 
      '[+]': [['$$', '$$'], ['\\[', '\\]']]
    macros: {Re: '\mathfrak{R}', Im: '\mathfrak{I}',d: '\mathrm{d}',O: '\mathcal{O}',M: '\mathcal{M}',o: '\mathcal{o}',i: '\mathrm{i}',e: '\mathrm{e}'}
    
    
  ###########################################################################################

用法

在您要启用 MathJax 的每篇文章(帖子/页面)的 Front-matter 中设置 xmath: true 或者 math: true 或者 mathjax: true 。例如:

---
title: Hello World
categories: Hello
date: 1900-01-02 10:00:00
xmath: true
---

在 Front-matter 中设置 tex_config 可以覆盖站点配置 _config.yml 中的 tex_config 设置选项。例如:

---
title: Hello World
categories: Hello
date: 1900-01-02 10:00:00
xmath: true
tex_config: 
  tags: none
---

配套 Markdown 渲染器

仅支持 hexo-renderer-marked ,因为笔者不用其他的 Markdown 渲染器。

npm install hexo-renderer-marked --save

同时卸载其他 Markdown 渲染器。

兼容方案及原理

xmath:
  fuck_md: true # 对 markdown 进行转义兼容

创建自动程序仅对 $$$ 之间的数学公式中的 _\ 等进行转义。已经完成手动转义的,不再进行转义。例如:

原始

$$
\begin{alignat*}{1}
\eta\left(\text{s}\right)&=\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}-1\right)^\text{s}}-\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}\right)^\text{s}}+\underbrace{\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}\right)^\text{s}}-\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}\right)^\text{s}}}_{=\space0}\\
\\
&=\underbrace{\underbrace{\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}-1\right)^\text{s}}}_\text{odd part}+\underbrace{\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}\right)^\text{s}}}_\text{even part}}_{\text{odd part}\space+\space\text{even part}}-\left\{\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}\right)^\text{s}}+\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}\right)^\text{s}}\right\}\\
\\
&=\sum_{\text{n}\space\ge\space1}\frac{1}{\text{n}^\text{s}}-2\sum_{\text{n}\space\ge\space1}\frac{1}{\left(2\text{n}\right)^\text{s}}
\end{alignat*}
$$

手动转义:

$$
\\begin{alignat\*}{1}
\\eta\\left(\\text{s}\\right)&=\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}-1\\right)^\\text{s}}-\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}+\\underbrace{\\sum_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}-\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}}\_{=\\space0}\\\\
\\\\
&=\\underbrace{\\underbrace{\\sum_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}-1\\right)^\\text{s}}}\_\\text{odd part}+\\underbrace{\\sum_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}}\_\\text{even part}}\_{\\text{odd part}\\space+\\space\\text{even part}}-\\left\\{\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}+\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}\\right\\}\\\\
\\\\
&=\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\text{n}^\\text{s}}-2\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}
\\end{alignat\*}
$$

经过自动程序处理后,上面两种情形均转换为已转义:

$$
\\begin{alignat\*}{1}
\\eta\\left(\\text{s}\\right)&=\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}-1\\right)^\\text{s}}-\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}+\\underbrace{\\sum_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}-\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}}\_{=\\space0}\\\\
\\\\
&=\\underbrace{\\underbrace{\\sum_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}-1\\right)^\\text{s}}}\_\\text{odd part}+\\underbrace{\\sum_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}}\_\\text{even part}}\_{\\text{odd part}\\space+\\space\\text{even part}}-\\left\\{\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}+\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}\\right\\}\\\\
\\\\
&=\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\text{n}^\\text{s}}-2\\sum\_{\\text{n}\\space\\ge\\space1}\\frac{1}{\\left(2\\text{n}\\right)^\\text{s}}
\\end{alignat\*}
$$

然后交给 markdown 渲染器处理。

同理,我们可以通过添加空格解决 Nunjucks 和 Mathjax 的语法冲突。

题外话

存在另一种冲突解决方案:逆向渲染流程,即先让 MathJax 解析公式,再用 Markdown 引擎处理文本, 最后使用 Nunjucks 渲染。由于理论上 MathJax 生成的 HTML 不含 Markdown 语法,可从根本上避免冲突。

但是笔者发现之前手动转义的公式不能正常解析了。难道要把之前所有手动转义的都改回来?真让人头大,于是这种方案就没有被实现。感兴趣的小伙伴可以尝试一下,但是也不排除会引入新的问题。

许可证

根据 GPL-3.0 发布。

About

Xmath: Server side MathJax renderer plugin for hexo-renderer-marked.

Topics

Resources

License

Stars

Watchers

Forks