Markdown语法情况下转化Mathjax语法

2024年9月25日 上午11:26 杂项 ,

作为一个科班出身的人经常会使用公式,在本博客的写作中使用WordPress经常会有公式的问题,在使用不同的插件调试之后,选择了最后的WP Githuber MD插件,并且使用Mathjax语法。不要问我为什么捏,是因为经常顾此失彼,想要达到一个完美的使用情况最后不得不综合使用。

对于使用段间公式是需要双美元符号$$的,有的时候会出错可能导致第一个可以,第二个就会出现错误(经常不知道为什么出错),这导致我耗费了很长一段时间,这两天下定决心解决这个问题终于有了改善。例如我现在写一个勾股定理:

$$
a^2=b^2+c^2
$$

但是往往在我加入了其他东西之后就会出错,例如:

这是我的座右铭:悟已往之不谏,知来者之可追。
$$
\lambda = a + b
$$

其实不是用mathjax写法则会出现以上错误,类似于不可兼容的情况,但是如果不适用mathjax写法就无法顺利书写。

这里使用了Mathjax写法,也就是使用代码块去渲染公式,例如:

\lambda = a + b

则需要在代码块使用mathjax进行渲染,而行内公式则需要在双美元符号加上a+b

但是我们在做markdown笔记的时候是不可能是用mathjax语法的,所以编写了python代码只需要导入转换即可

version1.0

import re

def process_text(input_text):
    # 删除所有的 '==' 删除高亮
    input_text = input_text.replace('==', '')

    # 将段间公式 $$ 变为 mathjax 代码块
    modified_text = re.sub(r'\$\$(.*?)\$\$', r'\n```mathjax\n\1\n```\n', input_text, flags=re.DOTALL)

    # 将行内公式 $a$ 变为 `$a$`
    modified_text = re.sub(r'\$(.*?)\$', r'`$\1$`', modified_text)

    return modified_text

# 从 in.md 读取输入
with open("in.md", "r", encoding="utf-8") as f:
    input_text = f.read()

output_text = process_text(input_text)

# 输出到终端
# print(output_text)

# 保存到 output.md
with open("output.md", "w", encoding="utf-8") as f:
    f.write(output_text)

例如下面这段话的markdown如下:

$\nabla$的LaTeX是`\nalba`

> 梯度的定义:
>
> 给定函数$f:\mathbb{R}^n\rightarrow\mathbb{R}$,且$f$再点$x$的一个邻域内有意义,若存在向量$g\in\mathbb{R}^n$满足:
> $$
> \lim_{p\rightarrow 0}\frac{f(x+p)-f(x)-g^T p}{\Vert p\Vert}=0
> $$
> 其中$\Vert \cdot\Vert$是任意向量范数,就称$f$在点$x$处可微.此时$g$称为$f$在点$x$处的梯度,记作$\nabla f(x)$

若$f$在点$x$处梯度存在,在定义式中令$p=\varepsilon e_i$,$e_i$是第$i$个分量为$1$的单位向量(其余是$0$),可知$\nabla f(x)$的第$i$个分量$\frac{\partial f(x)}{\partial x_i}$.因此,
$$
\nabla f(x)=\left[\frac{\partial f(x)}{\partial x_{1}}, \frac{\partial f(x)}{\partial x_{2}}, \cdots, \frac{\partial f(x)}{\partial x_{n}}\right]^{\mathrm{T}}
$$

我原封不动的将其放置in.md中并且运行程序,生成的output.md如下:
(由于mathjax渲染的时候需要三个反单引号,所以我这里在代码块中只显示两个)

`$\nabla$`的LaTeX是`\nalba`

> 梯度的定义:
>
> 给定函数`$f:\mathbb{R}^n\rightarrow\mathbb{R}$`,且`$f$`再点`$x$`的一个邻域内有意义,若存在向量`$g\in\mathbb{R}^n$`满足:
> 
``mathjax

> \lim_{p\rightarrow 0}\frac{f(x+p)-f(x)-g^T p}{\Vert p\Vert}=0
> 
``

> 其中`$\Vert \cdot\Vert$`是任意向量范数,就称`$f$`在点`$x$`处可微.此时`$g$`称为`$f$`在点`$x$`处的梯度,记作`$\nabla f(x)$`

若`$f$`在点`$x$`处梯度存在,在定义式中令`$p=\varepsilon e_i$`,`$e_i$`是第`$i$`个分量为`$1$`的单位向量(其余是`$0$`),可知`$\nabla f(x)$`的第`$i$`个分量`$\frac{\partial f(x)}{\partial x_i}$`.因此,

``mathjax

\nabla f(x)=\left[\frac{\partial f(x)}{\partial x_{1}}, \frac{\partial f(x)}{\partial x_{2}}, \cdots, \frac{\partial f(x)}{\partial x_{n}}\right]^{\mathrm{T}}

``

至此,这段markdown渲染如下:
\nabla的LaTeX是\nalba

梯度的定义:

给定函数f:\mathbb{R}^n\rightarrow\mathbb{R},且f再点x的一个邻域内有意义,若存在向量g\in\mathbb{R}^n满足:


\lim_{p\rightarrow 0}\frac{f(x+p)-f(x)-g^T p}{\Vert p\Vert}=0

其中\Vert \cdot\Vert是任意向量范数,就称f在点x处可微.此时g称为f在点x处的梯度,记作\nabla f(x)

f在点x处梯度存在,在定义式中令p=\varepsilon e_ie_i是第i个分量为1的单位向量(其余是),可知\nabla f(x)的第i个分量\frac{\partial f(x)}{\partial x_i}.因此,


\nabla f(x)=\left[\frac{\partial f(x)}{\partial x_{1}}, \frac{\partial f(x)}{\partial x_{2}}, \cdots, \frac{\partial f(x)}{\partial x_{n}}\right]^{\mathrm{T}}

version2.0

增加了让图片居中的功能

import re

def process_text(input_text):
    # 删除所有的 '==' 删除高亮
    input_text = input_text.replace('==', '')

    # 将段间公式 $$ 变为 mathjax 代码块
    modified_text = re.sub(r'\$\$(.*?)\$\$', r'\n```mathjax\n\1\n```\n', input_text, flags=re.DOTALL)

    # 将行内公式 $a$ 变为 `$a$` 
    modified_text = re.sub(r'\$(.*?)\$', r'`$\1$`', modified_text)

    # 处理带 zoom 的图片标签,保持 zoom 并居中对齐
    modified_text = re.sub(
        r'<img src="(.*?)" alt="(.*?)" style="zoom:(\d+)%;" />',
        r'<div align="center">\n  <img src="\1" alt="\2" style="zoom:\3%;" />\n</div>',
        modified_text
    )

    # 处理没有 zoom 的 <img> 标签,默认 zoom 为 100%,并居中对齐
    modified_text = re.sub(
        r'<img src="(.*?)" alt="(.*?)" ?/>',
        r'<div align="center">\n  <img src="\1" alt="\2" style="zoom:100%;" />\n</div>',
        modified_text
    )

    # 处理 Markdown 格式的图片标签,转换为 <img> 标签并默认 zoom 为 100%
    modified_text = re.sub(
        r'!\[(.*?)\]\((.*?)\)',
        r'<div align="center">\n  <img src="\2" alt="\1" style="zoom:100%;" />\n</div>',
        modified_text
    )

    return modified_text

# 从 in.md 读取输入
with open("in.md", "r", encoding="utf-8") as f:
    input_text = f.read()

output_text = process_text(input_text)

# 输出到终端
# print(output_text)

# 保存到 output.md
with open("output.md", "w", encoding="utf-8") as f:
    f.write(output_text)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注