latex公式渲染有两种类型,一种是HTML形式展示公式,另一种是图片形式展示公式。如果是HTML形式展示公式,渲染是在前端完成的,一般会比较缓慢。知乎采取的方式是以图片形式展示公式。codecogs是一个latex公式渲染服务,它根据get请求返回一个svg图片。例如:

  • codecogs,这个服务的缺点是比较慢。
  • 知乎的公式渲染:https://www.zhihu.com/equation?tex=\frac{1}{3}

本文介绍ubuntu下搭建类似codecogs的公式渲染服务。

一、安装latex

sudo apt-get install latex
sudo apt-get install latex-cjk-chinese

二、latex命令介绍

latex命令用于把tex文件转换成pdf文件或者dvi文件。dvi是一种设备无关的可打印文件格式。
输入dvi按两次tab可以找到dvisvgm,此命令将dvi文件转为svg。

三、编写服务程序

使用flask编写服务,通过命令行的方式调用latex获取svg。在返回时需要注意两点:

  • 设置好content-type,否则客户端不知道你返回的是什么格式的图片
  • 跨域访问并不需要设置,因为加载的是静态资源。跨域访问只需要在header中设置: "Access-Control-Allow-Origin": "*"

使用latex命令时需要注意:

  • documentclass必须是minimal,这样能够保证生成的文件尽量小。
  • dvisvgm --no-fonts --no-styles,把dvi转为svg时取消导出字体和格式,而只是简单导出一张图片,否则客户端找不到这些字体和格式。
  • 使用latex --interaction=nonstopmode,能够保证即便报错也不会阻塞
  • 要引入amsmath,否则许多宏会找不到
  • 为了防止用户上传不合法公式造成超时的现象,需要使用subprocess模块,它是非阻塞的,父进程可以对子进程的运行时间进行监听。

TODO:

  • 添加缓存功能:对某个公式的请求可能很多,每次不需要调用latex重新生产,直接使用缓存结果。这个优化可能没有必要,因为当查询分布特别分散时,这个优化费力不讨好。
  • 添加统计功能:统计不同网站的请求次数,用来查看都有哪些人使用了本服务。其实调用别人服务是一件很危险的事情。调用别人的服务就是信任别人的服务,把别人的服务当做自己的一部分。当别人变得不可信任时,自己也就危险了。比如latex公式服务把返回的svg图片统一替换成某个不合法的图片。
import os
import signal
import subprocessfrom flask import Flask, request, Responseapp = Flask(__name__)file_id = 0
latex_dir = os.path.join(os.path.expanduser("~"), "latex-server")
if not os.path.exists(latex_dir):os.mkdir(latex_dir)def run_command(s, log_file):pro = subprocess.Popen(s, shell=True, preexec_fn=os.setsid)try:pro.wait(1)  # 最多等待1秒钟except Exception as ex:print(ex)# pro.terminate()os.killpg(os.getpgid(pro.pid), signal.SIGTERM)  # 杀死一个进程组raise exdef gets(formula):global file_idfile_id += 1now = file_idtex_file, dvi_file, svg_file, log_file = [os.path.join(latex_dir, "{}.{}".format(now, file_type)) for file_type in "tex dvi svg log".split()]open(tex_file, mode='w').write(r"""
\documentclass{minimal}
\usepackage{amsmath}
\begin{document}
$$%s$$
\end{document}""" % formula)try:run_command("latex  --interaction=nonstopmode --output-directory  {} {}".format(latex_dir, tex_file), log_file)run_command("dvisvgm --no-fonts --no-styles -c2,2 -o {} {}".format(svg_file, dvi_file), log_file)svg = open(svg_file).read()  # 如果不存在,那就直接抛出异常吧return svgexcept Exception as ex:raise exfinally:# 清理文件for i in "tex dvi log aux svg".split():filename = os.path.join(latex_dir, "{}.{}".format(now, i))if os.path.exists(filename):os.remove(filename)@app.route("/render")
def render():formula = request.args['formula']try:resp = gets(formula)return Response(response=resp, headers={"Content-Type": "image/svg+xml"})except Exception as ex:print(ex)return Response(status=500)if __name__ == '__main__':app.run(host='0.0.0.0', port=9988, debug=True)

参考资料

https://cloud.tencent.com/developer/article/1015883

转载于:https://www.cnblogs.com/weiyinfu/p/10126152.html

手动搭建latex公式渲染服务器相关推荐

  1. 前端显示LaTex公式

    前端显示LaTeX公式 Time:2021-06-27 前言 近来在学习神经网络,不少笔记中都使用了LaTeX进行公式的书写,考虑到准备把这些笔记也放到网站上方便日后来看,于是就整起了引入显示LaTe ...

  2. JS配置KaTeX渲染LaTeX公式

    一.前言 LaTeX\LaTeXLATE​X公式在许多技术性网站中很有用,尤其是论坛类网站--支持LaTeX语法能使用户体验大大提高. 例如(摘自Demo KaTeX与Mathjax的比较): 1(ϕ ...

  3. wangeditor扩展:借用API实现latex的公式渲染

    用图片来渲染公式,公式不能再编辑,有时候会显得不方便 uniapp的uparser又不识别latex公式,扩展uparser也不容易. 所以考虑用latax api来利用网上的latex服务实现lat ...

  4. 腾讯云服务器如何手动搭建LAMP环境?

    LAMP 环境是指 Linux 系统下,由 Apache + MariaDB + PHP 及其它相关辅助组件组成的网站服务器架构.本文本文档介绍如何在腾讯云云服务器(CVM)上手动搭建 LAMP 环境 ...

  5. 腾讯云服务器CVM(CentOS 7、Tencent Linux)手动搭建LNMP环境(linux+Nginx+Mariadb+PHP)

    手动搭建云服务器运行环境就是喜欢折腾,如果觉得麻烦的网友可以使用LNMP镜像直接启动CVM实例,以便快速建站. 腾讯云服务器CVM(CentOS 7.Tencent Linux)手动搭建LNMP环境( ...

  6. vscode_为markdown启用latex插件(markdown+latexWorkship)(变通方法workaround)(latex公式实时预览)

    文章目录 插件准备 latex workship 打开一个markdown文件 以Text Editor 模式打开 打开Markdown Preview(Built-in)预览 临时切换语言环境 效果 ...

  7. Hexo如何显示latex公式

    我们用hexo+github/gitee搭建个人博客,会发现无法显示markdown文件里的latex公式,这是因为hexo默认支持的hexo-renderer-marked渲染器不支持latex公式 ...

  8. 拖拽公式图片、一键转换LaTex公式,这款开源公式识别神器比Mathpix Snip更适合你...

    视学算法报道 机器之心编辑部 只需要把公式图片用鼠标拖动到工具内,就能一键转成 LaTex 公式. 写论文.做研究时,最让你头疼的是什么?想必公式编辑会榜上有名.那么有没有便捷的方法进行公式编辑呢?这 ...

  9. Python 代码转 Latex 公式,这个开源库用一行代码帮你搞定

    转自 | 机器之心 数学是数据科学和机器学习的重要基础,数学运算的结果对于机器学习项目而言是至关重要的.在编写代码时,我们常常需要定义数学公式的计算形式.像 S=r^2 这样简单的数学公式,大概不会出 ...

最新文章

  1. JavaScript学习总结(7)——JavaScript基础知识汇总
  2. java char 空_2020重新出发,JAVA入门,数据类型
  3. 信息安全技术网络安全等级保护定级指南_行业标准 |报业网络安全等级保护定级参考指南V2.0发布,明确保护对象、定级要求...
  4. 生成器(generator)
  5. URL编码 java
  6. 类的封装,继承和多态
  7. Spring的Controller是单例还是多例,怎么保证并发的安全
  8. 一个小工具帮你搞定实时监控Nginx服务器
  9. ARM体系结构的特点
  10. matlab多种图像边缘检测方法,[转载]Matlab多种图像边缘检测方法
  11. Systrace工具解析
  12. EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)
  13. 洛谷 P3939 数颜色
  14. ROS2与C++入门教程-在C++包里增加python支持
  15. Cypher高级查询
  16. canvas清除画布
  17. 云存储系统服务器版安装,云存储系统服务器版安装
  18. OJ刷题记录:将十进制数转换成八进制数 题目编号:545
  19. 关于Echarts不渲染南海诸岛的问题
  20. mysql 查询前面显示序号1 2 3 4 5 ......等

热门文章

  1. 如何实现插入数据时自动更新另外一个表的内容
  2. hibernate之初学复合主键
  3. jQuery学习-显示与隐藏
  4. linux下用户及用户组的管理
  5. 从零开始学java(2)--java中命名的明规则与潜规则
  6. Windows版Mysql5.6.11的安装与配置
  7. 【翻译】WPF应用程序模块化开发快速入门(使用Prism+MEF)【中】
  8. 6. 区别值类型和引用类型。
  9. ExtJS使用总结和参考
  10. 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息