首页 > 编程语言 >Python 如何将Latex转换成Word公式?

Python 如何将Latex转换成Word公式?

时间:2024-06-13 19:01:08浏览次数:25  
标签:Latex mathml Word Office latex Python MathML str oxml

好久没写博客啦! 最近帮女朋友(数学老师)搞了个题目转成Word的小工具。情景就是,我们在一些图片里获取到数学题目时通常会使用到ocr 技术,但是呢通过 ocr给到的数学公式是Latex表达式, 这也就是为什么我们用识图软件或者手机微信等自带的识别不了数学公式,识别了粘贴到word中又变成了乱码文本。但是ocr识别不是这篇博客的内容 那么如何将Latex表达式写入到Word中呢?

Latex在线工具链接:

simpletex

latexlive

有道智云

踩坑经历:

  • sympy 可以解析Latex表达式(但是式子中有%解析会报错),解析完了是一个个节点对象需要自己识别组装word的oxml数学公式节点

  • plasTeX chatgpt说的是可以很好的识别解析,可以自定义渲染器进行组装word的oxml数学公式节点。但是并没有按理想的情况解析

  • 最后无意间了解到了mathml 它是以xml格式来展示数学公式而且可以通过latex2mathml库很好的进行转换。那么转换一下思路,既然不能直接将Latex转换成word的oxml那我们可以 Latex->mathml->oxml 再通过python-docx写入到段落的文本对象中

    • 然后我就搜到了这样一篇文章: python-docx/issues这是在github上的python-docx库中的一个问题(Insert MathML as plain text for Word 2010 to render it as an equation) 将MathML作为Word 2010的纯文本插入,能让它展示为word的公式

    • 有一个名叫peepall的大佬的回答并且已经解决了这个问题:

      I've managed to make it work. However, you must use the MathML to Office MathML stylesheet in order to transform the MathML data into Office-compatible MathML.

      The stylesheet is installed along with Microsoft Office and you can find it in:
      C:\Program Files (x86)\Microsoft Office\Office14\MML2OMML.XSL.

      #!/bin/env python
      # coding: utf-8
      
      from lxml import etree
      
      # Convert MathML (MML) into Office MathML (OMML) using a XSLT stylesheet
      tree = etree.fromstring(mathml_string)
      xslt = etree.parse(mml2omml_stylesheet_path)
      
      transform = etree.XSLT(xslt)
      new_dom = transform(tree)
      
      paragraph = doc.add_paragraph()
      paragraph._element.append(new_dom.getroot())
      

      You may also need to remove any namespace from the `` tag before transforming it into Office MathML. Let me know if it works for you too.

    • 他说如果要将MathML数据转换成Office兼容的MathMl,需要使用MathML to Office MathMl样式表,如果你安装了Office那么你可以在C:\Program Files (x86)\Microsoft Office\Office14\MML2OMML.XSL中找到它

解决

综上,我现在有一个Latex表达式我需要先使用latex2mathml库,将其转换成mathml,再通过上述的办法转换成oxml写入word,下面是我的示例(如果你需要MML2OMML文件可以在这里下载):

import latex2mathml.converter
from docx import Document
from lxml import etree


def latex_to_mathml(latex_str: str) -> str:
    """
    latex 转成 mathml表达式
    :param latex_str: latex字符串
    :return: mathml表达式
    """
    return latex2mathml.converter.convert(latex_str)


xslt = etree.parse(r"./plug/MML2OMML.XSL")
xslt_transform = etree.XSLT(xslt)


def mathml_to_oxml(mathml_str: str):
    """
    mathml表达式 转换成word的oxml
    :param mathml_str: mathml表达式
    :return: word的oxml dom
    """
    mathml_xml = etree.fromstring(mathml_str)
    return xslt_transform(mathml_xml).getroot()


def latex_to_oxml(latex_str: str):
    mathml_str = latex_to_mathml(latex_str)
    return mathml_to_oxml(mathml_str)


if __name__ == '__main__':
    latex_str = r'\frac{\frac{a}{c}}{b}\times d\%'
    # 创建一个新的 Word 文档
    doc = Document()
    # 添加一个段落
    paragraph = doc.add_paragraph()
    # 创建一个 run 对象
    run = paragraph.add_run()
    run._element.append(latex_to_oxml(latex_str))
    # 保存文档
    doc.save('example.docx')

如果你还有任何疑问或者更好的解决方案可以留言或者联系我QQ:1126184155

标签:Latex,mathml,Word,Office,latex,Python,MathML,str,oxml
From: https://www.cnblogs.com/ljno/p/18246543

相关文章

  • 量化交易:miniQMT的可转债与正股折价套利策略python代码
    哈喽,大家好,我是木头左!套利是一种艺术,一种利用市场的价格差异来获取无风险利润的艺术。而可转债与正股之间的折价套利,更是量化交易者眼中的香饽饽。今天,我们将一起揭开这层神秘的面纱,探索如何使用miniQMT和Python来实现这一策略。......
  • 流畅的python--第十三章 接口、协议和抽象基类
    面向对象编程全靠接口。在Python中,支撑一个类型的是它提供的方法,也就是接口。在不同的编程语言中,接口的定义和使用方式不尽相同。从Python3.8开始,有4种方式,如图13-1中的类型图所示。这4种方式概述如下。鸭子类型自Python诞生以来默认使用的类型实现方式。从第1......
  • WordPress、Typecho 站点如何让 CloudFlare 缓存加速
    众所周知WordPress、Typecho都是著名动态博客站点(一个最简单的判断依据就是都要依赖结合数据库),这类站点在CDN缓存上都有一个致命的缓存弊端就是动静态请求的区分,理论上要让CDN绕过所有的动态请求,缓存所有的静态请求,否则就会造成前端登录和非登录状态的混乱,影响用户浏览体......
  • 如何利用ChatGPT辅助下处理:ENVI、GEE、Python等遥感数据
    遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。重点介绍ChatGPT在遥感中的应用,人工智能在解释复杂数据、提供见解和帮助决策过程方......
  • Python typing 的使用总结
    1. 类型提示(TypeHints):Python3.5引入了类型提示,这是一种新的语法特性,允许在函数声明中指定参数和返回值的预期类型。这些类型注解对Python解释器没有任何影响,但是可以被类型检查器、IDE、linter等工具用来捕获类型错误。defgreet(name:str)->str:return'Hello,'+......
  • 用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类|附代码数据
    全文下载链接:http://tecdat.cn/?p=8640在本文中,我们将看到如何开发具有多个输出的文本分类模型。我们开发一个文本分类模型,该模型可分析文本注释并预测与该注释关联的多个标签。多标签分类问题实际上是多个输出模型的子集。在本文结尾,您将能够对数据执行多标签文本分类。数据集......
  • python运行js代码拿到逆向数据-execjs库
    #前提安装了node.js并且设置环境变量https://blog.csdn.net/bestyellow/article/details/119820509importsubprocessfromfunctoolsimportpartialsubprocess.Popen=partial(subprocess.Popen,encoding='utf-8')importexecjs#如果funcs_name是js代码里面的函数名字var代......
  • python 赋值后is ==遇到的问题
    在python中小整数对象池包括[-5,256]。这之间的小整数数值相同时在小整数对象池中属于同一对象即是aisb返回True。简单字符串也是如此,对于其他对象则不适用简单来说 is与notis比较的是数字的地址                ==判断的是数字的值在计算机中的......
  • Python 学习笔记
    第二章编程基础那点事2.6模块在Python用import或者from...import来导入相应的模块。一个模块就是一个文件,模块是保存代码的最小单位,在模块中可以声明变量、函数、属性和类等Python代码元素。将整个模块导入,格式为: importsomemodule 从某个模块中导入某个函数,格......
  • 2024 年最新 Python 使用 gewe 框架搭建微信机器人实现语音智能回复(详细教程)
    Gewe个微框架GeWe(个微框架)是一个创新性的软件开发框架,专注于IPAD协议,为个人微信号以及企业信息安全提供了强大的功能和保障。GeWe的设计旨在简化开发过程,使开发者能够高效、灵活地构建和定制通信协议,以满足不同应用场景的需求。灵活可扩展:GeWe框架采用灵活可扩展的设计理......