解决latex数学公式渲染不正确及行内公式中文渲染乱码问题

问题

之前数学OCR渲染数学公式用的 katex 来渲染,前端解决方案,我们的进行公式编写的时候是需要输入中文的,如:

Fe_{2}O_{3} + 3 C O \stackrel{高温}{=} 2 F e + 3CO_{2}

解决latex数学公式渲染不正确及行内公式中文渲染乱码问题
抑或:
c = \sqrt{a^{平方}+b_{xy}^{平方}+e^{x次方}}

解决latex数学公式渲染不正确及行内公式中文渲染乱码问题

在上篇 解决Latex输出PDF纸张自适应大小及中文无法显示问题,需要支持化学式识别,我们的服务是支持全量的latex语法,所以化学式和数据公式统一使用新服务来进行识别,毕竟katex就是latex的一个快速web数学公式渲染器,现在把两个公式合并一下在我们的服务上渲染一下试试

Fe_{2}O_{3} + 3 C O \stackrel{高温}{=} 2 F e + 3CO_{2}\\c = \sqrt{a^{平方}+b_{xy}^{平方}+e^{x次方}}

解决latex数学公式渲染不正确及行内公式中文渲染乱码问题
WTF! 中文的问题不是解决了吗?怎么又出问题了, 已经对中文进行了处理,怎么不生效了?

一些例子:

Fe_{2}O_{3} + 3 C O \stackrel{HighTemperature}{=} 2 F e + 3CO_{2}测试中文

解决latex数学公式渲染不正确及行内公式中文渲染乱码问题
Fe_{2}O_{3} + 3 C O \stackrel{HighTemperature}{=} 2 F e + 3CO_{2}$测试中文

解决latex数学公式渲染不正确及行内公式中文渲染乱码问题
Fe_{2}O_{3} + 3 C O \stackrel{\mbox{高温}}{=} 2 F e + 3CO_{2}

解决latex数学公式渲染不正确及行内公式中文渲染乱码问题

分析

行内公式和行间公式

latex中行内公式和行间公式分别使用 () $ 来作为公式的起止符,如果在行内公式显示中文则需要用\mbox{}来包裹中文,这样中文就能在公式中正常显示
之前我们直接在chemfig公式后面直接输入中文,由于chemfig有明显起始判断,我们的中文latex并没有识别为公式的一部分,所以能正常显示,一旦我们在公式内部使用中文,仍然会出现中文无法渲染的问题,不过这个问题在katex下是不存在,应当是katex做了适配

解决办法

方案一:按照标准的latex语法来,用户在输入公式的时候对中文部分自行加入 \mbox{} 或在公式结束位置标记 $结束符,这样行内公式和公式外的中文就能正常显示,合情合理
方案二:由于数学公式没有明显起始标识,所以可以在把传入的字符中所有的连续中文在后台用 \mbox{} 包裹起来,需要在代码中手动截取相应的连续中文并使用mbox包裹即可

解决

毫无疑问,为了保持用户使用的惯性,采取方案二,上代码

def with_mbox(mix_str):
    """ 混合字符串自动填充mbox
    :param mix_str:  chemfig表达式
    :return: 自动包裹连续中文的chemfig表达式
"""
    flag = False
    t = ''
    for char in mix_str:
        if not flag and is_chinese(char):
            flag = True
            t += "\\mbox{" + char
        elif flag and not is_chinese(char):
            t += "}" + char
            flag = False
        elif is_chinese(char):
            t += char
        else:
            t += char
            flag = False
    if is_chinese(t[len(t) - 1]):
        t += "}"
    return t

def is_chinese(check_char):
    """ 检查是否中文字符,含中文标点
    :param check_char: 字符
    :return: True|False
"""
    if u'\u4e00'

使用前调用一下with_mbox方法 chem_fig = with_mbox(request.json['chemfig']) 完美解决

参考链接

TeX,LaTeX和KaTeX简介:https://blog.csdn.net/wobushisongkeke/article/details/99677578
python 匹配中文字符:https://www.cnblogs.com/iamjqy/p/6824297.html

Original: https://www.cnblogs.com/surging-dandelion/p/14832756.html
Author: 蒲公英的狂想
Title: 解决latex数学公式渲染不正确及行内公式中文渲染乱码问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579592/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 工程师什么时机最合适选择跳槽?

    先聊一下跳槽这个事。在 Java 工程师的职业生涯中,跳槽几乎是我们每一位工程师都会经历的事情。但在面试前需要考虑清楚:现在到底应不应该跳槽? class Resume { pub…

    Java 2023年6月13日
    072
  • 如何等待ajax完成再执行相应操作

    ajax广泛应用于异步请求,对于大多数业务来说,这是十分方便的,但对于一些特殊的业务,ajax的异步性会起到相反的作用。 例如在ajax请求成功后,后续的操作需要依赖ajax执行成…

    Java 2023年6月6日
    082
  • Linux(一)——安装

    Linux(一)——安装 一、VMware Workstation Pro (一款虚拟机软件) 1.下载 打开网址https://www.vmware.com/cn.html跟着红…

    Java 2023年6月16日
    066
  • 聊聊动态线程池的9个场景

    聊聊动态线程池的9个场景 大家好,我是小马哥。 线程池是一种基于 池化思想管理线程 的工具,使用线程池可以减少 创建销毁线程的开销,避免线程过多导致 系统资源耗尽。在 高并发以及大…

    Java 2023年6月14日
    0136
  • 改Bug的经验

    如果修复某个Bug花了很长时间,这时候就要问问自己为什么,怎么做才吸取经验教训,在类似的问题上不再出问题,以及采用的方法,使用的工具是否还有改进的地方;当所有问题都解决之后,一定要…

    Java 2023年6月15日
    062
  • MyBatis快速上手与知识点总结

    1、MyBatis概述 1.1 MyBatis概述 1.2 JDBC缺点 1.3 MyBatis优化 2、MyBatis快速入门 3、Mapper代理开发 3.1 Mapper代理…

    Java 2023年6月14日
    086
  • springmvc学习笔记2

    一、Controller和RestFul 第一步:配置web.xml 第二步:spring_mvc_servlet.xml 参考文档:https://blog.csdn.net/E…

    Java 2023年6月7日
    062
  • SpringMVC

    SpringMVC 注解收集: -@component 组件 -@service service -@controller contro1ler /*代表这个类会被Spring接管…

    Java 2023年6月8日
    079
  • PgSQL-||-连字符

    (PgSQL)连字符 || — 22.22& select 22.22||’%’ as 值; Original: https://www.cnblogs.com/a999…

    Java 2023年6月9日
    090
  • Springboot学习

    具体内容: 包含核心基础、Web原理、单元测试、数据访问、指标监控等章节 SpringBoot 官方文档 https://www.cnblogs.com/youcoding/p/1…

    Java 2023年5月30日
    0105
  • 优雅的代码从现在开始

    个人见解: 写代码前 构思明白, 想明白,想全 写着写着都是在写相同的代码,改动麻烦 看到不好的就立马让他优雅 学习别人是如何优雅的 便于维护,避免重复代码,便于开发 提取公共函数…

    Java 2023年6月14日
    080
  • MySQL 事务基础知识

    数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持 一致性,同时我们还能…

    Java 2023年6月8日
    076
  • volatile 关键字的 用法

    volatile关键字 什么是可见性? 可见性是指线程A改变变量的值后,线程B可以马上看到更改后变量的值 volatile的作用 关键字volatile提示线程每次从共享内存中读取…

    Java 2023年6月5日
    095
  • spring事务失效的几种场景以及原因 spring事务传播机制

    1.抛出编译异常 ,事务只能捕捉运行时异常和error 解决方案: 配置rollbackFor eg. 配置@Transactional(rollbackFor = Excepti…

    Java 2023年6月6日
    096
  • 【反射】method.isBridge() 桥接方法

    泛型擦除留下的方法 public interface SuperClass<t> { void method(T t); } </t> 实现类 public…

    Java 2023年5月30日
    074
  • iphone 开发学习笔记六

    结束了选择开发平台的思想斗争,最终选择MonoTouch. 最终的代码需要在iphone上测试,尽管可以使用iphone模拟器来开发,但模拟器和16实际的手机还是有很大的区别的。内…

    Java 2023年5月29日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球