解决latex数学公式渲染不正确及行内公式中文渲染乱码问题
问题
之前数学OCR渲染数学公式用的 katex 来渲染,前端解决方案,我们的进行公式编写的时候是需要输入中文的,如:
Fe_{2}O_{3} + 3 C O \stackrel{高温}{=} 2 F e + 3CO_{2}
抑或:
c = \sqrt{a^{平方}+b_{xy}^{平方}+e^{x次方}}
在上篇 解决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次方}}
WTF! 中文的问题不是解决了吗?怎么又出问题了, 已经对中文进行了处理,怎么不生效了?
一些例子:
Fe_{2}O_{3} + 3 C O \stackrel{HighTemperature}{=} 2 F e + 3CO_{2}测试中文
Fe_{2}O_{3} + 3 C O \stackrel{HighTemperature}{=} 2 F e + 3CO_{2}$测试中文
Fe_{2}O_{3} + 3 C O \stackrel{\mbox{高温}}{=} 2 F e + 3CO_{2}
分析
行内公式和行间公式
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' <= check_char <= u'\u9fff' or is_zw_punctuation(check_char):
return True
return False
def is_zw_punctuation(char_arr):
punctuation = """!?。。《》"#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〾〿–—‘'‛“”„‟…‧﹏"""
re_punctuation = "[{}]+".format(punctuation)
result = re.match(re_punctuation, char_arr)
return result is not None
使用前调用一下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
解决latex数学公式渲染不正确及行内公式中文渲染乱码问题的更多相关文章
- latex之行内公式与行间公式
1.行内公式 我是对行内公式的测试$f(x)=1+x+x^2$ 2.行间公式 单行不编号 \begin{equation} \int_0^1(1+x)dx \end{equation} 结果为: 单行 ...
- MySQL命令行查询结果中文显示乱码
数据库编码格式为utf8,表和字段也都是utf8,存进去的格式是utf-8 但是用命令行工具查询命令select * from 表名; 查询出来的中文是乱码 原因:MySQL客户端根本就不能以utf8 ...
- Typora开启行内公式
文件→偏好设置→Markdown,勾选内联公式,重启typora 输入$,按Esc键会自动在后面加上一个$,然后在这两个$之间输入公式.
- Markdown 添加 Latex 数学公式
添加公式的方法 Latex 数学公式语法 添加公式的方法 行内公式 $行内公式$ 行间公式 $$行间公式$$ Latex 数学公式语法 角标(上下标) 上标命令^{} 下标命令_{} 上下标命令用来放 ...
- Typora 使用 Markdown 嵌入 LaTeX 数学公式符号语法
博客园不支持渲染 LaTeX 数学公式,需要用到什么公式,请复制到您所用的支持 LaTeX 的编辑器中查看实现效果.Typora 可以渲染 LaTeX 数学公式. 目录 行内与独行 行内公式 独行公式 ...
- markdown下编辑latex数学公式
在利用为知笔记编写笔记的时候,有时需要用的markdown,只要把文件名加上后缀.md,就可以使用markdown语法,以下介绍在markdown下编辑latex数学公式. 使用LaTeX写公式的基本 ...
- Markdown中Latex 数学公式基本语法
原文地址:http://blog.csdn.net/u014630987/article/details/70156489 Markdown中Latex 数学公式基本语法 公式排版 分为两种排版: - ...
- 【Markdown】Markdown 使用MathJax引擎 书写Latex 数学公式
大家都看过Stackoverflow上的公式吧,漂亮,其生成的不是图片.这就要用到MathJax引擎,在Markdown中添加MathJax引擎也很简单, <script type=" ...
- cnblog编辑Latex数学公式
Latex在线公式编辑器 http://www.codecogs.com/latex/eqneditor.php 1. 行内公式: code $ \sqrt{a^2} $ display $ \sqr ...
随机推荐
- 哈工大LTP进阶使用-三元组事件抽取
哈工大LTP基本使用-分词.词性标注.依存句法分析.命名实体识别.角色标注 上一节我们讲了LTP的基本使用,接下来我们使用其进行事件抽取. 参考代码:https://github.com/liuhua ...
- 753. Cracking the Safe
There is a box protected by a password. The password is n digits, where each letter can be one of th ...
- 5. Linux常用命令
clear命令: 作用:清屏 快捷键:Ctrl + L pwd命令: 作用:用于显示当前的工作路径位置(当前工作文件夹) 示例: $ pwd /home/tarena Linux/Unix下的路径: ...
- 『政善治』Postman工具 — 2、Postman主界面详细介绍
目录 1.Postman菜单栏 (1)File 菜单 (2)Edit 菜单 (3)View 菜单 (4)Help 菜单 2.Postman工具栏 3.Postman工具栏中的系统设置 4.Postma ...
- 功能:SpringBoot日志配置详情
SpringBoot日志配置详情 一.介绍 在所有的项目中,日志是必不可少的,为了高效清晰的查找日志,可以配置日志输出的等级和格式. 在配置后,可以自定义输出日志到指定目录,可以按照天数来分割日志,可 ...
- OAuth2(未完待续)
一.OAuth2是什么?OAuth2解决了什么问题 1.OAuth2是第三方授权协议,用于支撑认证和授权 2.OAuth2中的角色划分: 资源拥有者 客户端 资源服务器 授权服务器 二.OAuth2怎 ...
- Xposed学习二:实现机制
在上一篇我们学习了如何在AS中创建Xposed模块,本篇来分析下官方教程中redClock的实现原理.本系列文章基于version-51 public void handleLoadPackage(X ...
- CVE-2010-3974:Windows 传真封面编辑器 FxsCover.exe 双重释放漏洞调试分析
0x01 堆空间申请后的双重释放 Windows FxsCover 程序存储封面编辑器的信息,封面编辑器是传真服务的一个组件,通过解析特定的传真封面文件(.cov)时,会调用类析构函数对同一内存中的栈 ...
- Windows核心编程笔记之进程
改变进程基址,获取进程基址 #include <Windows.h> #include <iostream> #include <strsafe.h> #inclu ...
- Hexo 博客Next 搭建与美化主题
========================================================================================将页面部署到GitHub ...