使用Python开发Markdown兼容公式格式转换工具

 更新时间:2025年05月04日 09:16:47   作者:灏瀚星空  
在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容公式格式转换工具,有需要的小伙伴可以了解下

一、工具背景

在技术写作中经常遇到公式格式问题:MathML无法显示、LaTeX格式错乱…

本工具实现以下核心功能:

  • 自动转换MathML到KaTeX
  • 标准化LaTeX公式格式
  • 保留原文其他内容
  • 图形化操作界面

工具效果演示

二、环境配置(Windows 10/11)

1. 创建conda环境

# 打开PowerShell执行
conda create -n formula_tool python=3.8
conda activate formula_tool
pip install tk lxml pyinstaller

2. 获取XSLT转换文件

# 下载MathML转LaTeX的XSLT文件
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/ronaldo1967/MathML-to-LaTeX/master/mathml2tex.xsl" -OutFile mathml2tex.xsl

三、完整Python代码(带GUI)

# formula_converter_gui.py
import tkinter as tk
from tkinter import scrolledtext, filedialog
import re
from lxml import etree
import os

class FormulaConverterGUI:
    def __init__(self, master):
        self.master = master
        master.title("公式格式转换工具 v1.0")
        master.geometry("800x600")
        
        # 界面组件
        self.create_widgets()
        self.xslt_path = "mathml2tex.xsl"
        
    def create_widgets(self):
        # 输入框
        self.input_label = tk.Label(self.master, text="输入内容:")
        self.input_label.pack(pady=5)
        
        self.input_text = scrolledtext.ScrolledText(self.master, wrap=tk.WORD, height=15)
        self.input_text.pack(fill=tk.BOTH, expand=True, padx=10)
        
        # 操作按钮
        self.button_frame = tk.Frame(self.master)
        self.button_frame.pack(pady=10)
        
        self.convert_btn = tk.Button(self.button_frame, text="转换公式", command=self.convert)
        self.convert_btn.pack(side=tk.LEFT, padx=5)
        
        self.clear_btn = tk.Button(self.button_frame, text="清空内容", command=self.clear)
        self.clear_btn.pack(side=tk.LEFT, padx=5)
        
        self.save_btn = tk.Button(self.button_frame, text="保存结果", command=self.save_file)
        self.save_btn.pack(side=tk.LEFT, padx=5)
        
        # 输出框
        self.output_label = tk.Label(self.master, text="转换结果:")
        self.output_label.pack(pady=5)
        
        self.output_text = scrolledtext.ScrolledText(self.master, wrap=tk.WORD, height=15)
        self.output_text.pack(fill=tk.BOTH, expand=True, padx=10)
        
        # 状态栏
        self.status_bar = tk.Label(self.master, text="就绪", bd=1, relief=tk.SUNKEN, anchor=tk.W)
        self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)

    def convert(self):
        content = self.input_text.get("1.0", tk.END)
        converted = self.process_content(content)
        self.output_text.delete("1.0", tk.END)
        self.output_text.insert(tk.END, converted)
        self.status_bar.config(text="转换完成")

    def process_content(self, content):
        patterns = {
            'latex_block': re.compile(r'\$\$(.*?)\$\$', re.DOTALL),
            'latex_inline': re.compile(r'\$(.*?)\$'),
            'mathml': re.compile(r'<math.*?>(.*?)</math>', re.DOTALL)
        }
        
        # 处理块级公式
        content = patterns['latex_block'].sub(
            lambda m: f'$$\n{m.group(1).strip()}\n$$', 
            content
        )
        
        # 处理行内公式
        content = patterns['latex_inline'].sub(
            lambda m: f'${m.group(1).strip()}$', 
            content
        )
        
        # 处理MathML
        mathml_matches = patterns['mathml'].finditer(content)
        for match in mathml_matches:
            try:
                tex = self.mathml_to_tex(match.group(0))
                content = content.replace(match.group(0), f'$$ {tex} $$')
            except Exception as e:
                self.status_bar.config(text=f"转换失败:{str(e)}")
        
        return content

    def mathml_to_tex(self, mathml_str):
        xslt = etree.parse(self.xslt_path)
        transform = etree.XSLT(xslt)
        doc = etree.fromstring(mathml_str)
        result = transform(doc)
        return str(result).strip()

    def clear(self):
        self.input_text.delete("1.0", tk.END)
        self.output_text.delete("1.0", tk.END)
        self.status_bar.config(text="已清空")

    def save_file(self):
        file_path = filedialog.asksaveasfilename(
            defaultextension=".md",
            filetypes=[("Markdown文件", "*.md"), ("所有文件", "*.*")]
        )
        if file_path:
            with open(file_path, 'w', encoding='utf-8') as f:
                f.write(self.output_text.get("1.0", tk.END))
            self.status_bar.config(text=f"文件已保存至:{file_path}")

if __name__ == "__main__":
    root = tk.Tk()
    app = FormulaConverterGUI(root)
    root.mainloop()

四、核心功能解析

1. MathML转换原理

def mathml_to_tex(mathml_str):
    xslt = etree.parse("mathml2tex.xsl")
    transform = etree.XSLT(xslt)
    return str(transform(etree.fromstring(mathml_str)))

2. 正则匹配引擎

# 块级公式匹配
re.compile(r'\$\$(.*?)\$\$', re.DOTALL)

# 行内公式匹配
re.compile(r'\$(.*?)\$')

五、工具使用说明

1. 界面操作流程

粘贴或输入包含公式的内容

点击"转换公式"按钮

查看右侧转换结果

使用"保存结果"导出Markdown文件

2. 支持格式示例

原始格式转换后格式
<math>...</math>$$ x = \frac{-b}{2a} $$
\Gamma(z)...$$\Gamma(z)...$$
$E=mc^2$$E=mc^2$

到此这篇关于使用Python开发Markdown兼容公式格式转换工具的文章就介绍到这了,更多相关Python Markdown格式转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在keras中对单一输入图像进行预测并返回预测结果操作

    在keras中对单一输入图像进行预测并返回预测结果操作

    这篇文章主要介绍了在keras中对单一输入图像进行预测并返回预测结果操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • PyQt5使用mimeData实现拖拽事件教程示例解析上

    PyQt5使用mimeData实现拖拽事件教程示例解析上

    这篇文章主要为大家介绍了PyQt中如何使用mimeData实现拖拽事件的示例解析过程,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步
    2021-10-10
  • pyscript的简单应用实现

    pyscript的简单应用实现

    本文主要介绍了pyscript的简单应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Python 中的异步与同步深度解析(实践记录)

    Python 中的异步与同步深度解析(实践记录)

    在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际代码示例来加深理解,感兴趣的朋友一起看看吧
    2025-03-03
  • python 利用已有Ner模型进行数据清洗合并代码

    python 利用已有Ner模型进行数据清洗合并代码

    今天小编就为大家分享一篇python 利用已有Ner模型进行数据清洗合并代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 在python中pandas读文件,有中文字符的方法

    在python中pandas读文件,有中文字符的方法

    今天小编就为大家分享一篇在python中pandas读文件,有中文字符的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python使用matplotlib实现基础绘图功能示例

    Python使用matplotlib实现基础绘图功能示例

    这篇文章主要介绍了Python使用matplotlib实现基础绘图功能,结合实例形式分析了Python基于matplotlib实现正弦、余弦图形及多轴图的相关绘制操作技巧,需要的朋友可以参考下
    2018-07-07
  • python re.match()用法相关示例

    python re.match()用法相关示例

    这篇文章主要介绍了python re.match()用法相关示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Django组件cookie与session的具体使用

    Django组件cookie与session的具体使用

    这篇文章主要介绍了Django组件cookie与session的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • python 画图 图例自由定义方式

    python 画图 图例自由定义方式

    这篇文章主要介绍了python 画图 图例自由定义方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论