如何使用Python实现LateX数学表达式编辑,绘制SVG,生成JPEG图片
说起LateX就是比较热门的公式编辑器,LaTeX工具分为在线工具和本地工具,本地工具又分为前台和后台。在线工具推荐Overleaf,本地工具推荐前台使用TeXStudio,后台推荐使用TeXLive(后台工具有TeXLive,MikTeX,CTeX等)。
1. LateX编辑器基本介绍
说起LateX就是比较热门的公式编辑器,LaTeX工具分为在线工具和本地工具,本地工具又分为前台和后台。在线工具推荐Overleaf,本地工具推荐前台使用TeXStudio,后台推荐使用TeXLive(后台工具有TeXLive,MikTeX,CTeX等)。
在Latex里面使用数学公式要用 $$圈起来,和markdown的语法类似,直接写就行,但是在Latex不允许出现特殊字符,π和希腊字符 α β之类的不能直接打进去,需要用 \alpha \pi \beta的方式输入 另外大括号 {} 下划线_ 还有反斜杠“\” 都是不能直接输入的,需要用公式符号圈起来,才能正常渲染。
LateX编辑器各类后台比较:
-
TeXLive 有跨平台的性质,适用于Linux、Mac以及Windows系统,TeXLive是完全安装,大小大概为5G左右,每年有一次更新。
-
TeXStudio 只适用于Windows系统,它只安装基本的东西,其他任何需要的东西可以动态安装,只有发生重大变化时才会更新。
-
CTeX 只适用于Windows系统,默认编码不是UTF-8,经不再维护,不再更新了,也很容易出Bug。
LateX编辑器历史背景介绍:
LaTeX,是一种基于TEX的排版系统,由美国电脑学家莱斯利·兰伯特在20世纪80年代初期开发,利用这种格式,即使用户没有排版和程序设计的知识也可以充分发挥由TEX所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。
对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。这个系统同样适用于生成从简单的信件到完整书籍的所有其他种类的文档。
LaTeX手册:http://www.ctex.org/documents/packages/math/index.htm
2. LateX编辑器API
关于LateX的API推荐,网上其实有很多免费的API接口,这边推荐如下:
API名称 | API调用URL地址 | 返回值类型 |
---|---|---|
vercel | https://math.vercel.app/?from=【公式】 | svg 矢量图 |
math.now | https://math.now.sh?from=【公式】 | svg 矢量图 |
codecogs/gif | https://latex.codecogs.com/gif.image?【公式】 | gif 动态图 |
codecogs/svg | https://latex.codecogs.com/svg.image?【公式】 | svg 矢量图 |
codecogs/png | https://latex.codecogs.com/png.image?【公式】 | png 透明图 |
简单测评下:首先吐槽的codecogs.gif下面的GIF接口,这玩意就没必要去用,恶心的分辨率。接下来是codecogs/png接口用起来还好,就是分辨率还是不够高,可能官方为了追求响应速度,没有去优化像素这块。
当然最好的还是math.now、codecogs/png和vercel接口,只不过响应的是SVG类型,那么我们再接入我的项目或者应用的时候,大部分都是需要IMG的,所以SVG只适合前端的网页。
codecogs网站还支持在线的编辑,非常的方便:
接口的调用测试,其实就是把上面【公式】
替换成对应正确语法Latex表达式:
https://latex.codecogs.com/svg.image?\lim_{x%20\to%200}%20f(x)%20=%208
通过GET访问得到的SVG页面,展示如下:
3. LateX基本语法规则
在线 LateX 编辑器推荐:https://texpage.com/
入门语法介绍 - 文章结构
\documentclass{article} %文章类型-article,book,letter等
\title{My first Latex document} %文章标题
\author{huanxingshouwan} %作者姓名
\date{\today} %日期,"\today"表示今天
\begin{document} %文档正文开始
\maketitle %控制序列,将文字按预定格式打印
Hello world!
\end{document} %文档正文结束
效果预览如下:
Einstein 's $E=mc^2$. %行内公式
\[ E=mc^2. \] %行间公式
$m^{n}$ %上标
$m_{n}$ %下标
\frac{m}{n} %分式,n分之m
\sqrt{} %开平方
\sqrt[m]{n} %n开m次方
\sum_{i=m}^{n} %累计求和,从m到n求和
\prod_{i=m}^{n} %累计求积,从m到n求积
\int_{i=m}^{n} %从m到n积分
\vec a %a向量
\overrightarrow{AB} %A到B的向量
a+b+\cdots+z %a+b+…+z
\underbrace{a+b+\cdots+z}_{26}
%a+b+…+z
\overline{m+n} %m+n公式上面加上横杠
\underline{m+n} %m+n公式下面加上横杠
\begin{displaymath} %一行几个公式
S_{n+1} = S_{n} + S_{n},
S_{n}=1=2^{n}
\end{displaymath}
\begin{equation} %对行间公式进行标号
...
\end{equation}
常见的数学变量符号,展示如下所示:
4. SVG转化JPEG图像
Python将SVG转换成PNG或JEPG图像,转换SVG格式用到的是cairosvg库,但是安装的时候失败了很多次,主要是下载过程经常中断,建议使用镜像源进行下载。
pip的仓库一般都是在国外的服务器上,加了镜像源可以提供下载的速度。
常见 pip 镜像源(国内源)
清华镜像源:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云镜像源:http://mirrors.aliyun.com/pypi/simple/
中国科技大学镜像源: https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学镜像源:http://pypi.hustunique.com/
山东理工大学镜像源:http://pypi.sdutlinux.org/
豆瓣镜像源:http://pypi.douban.com/simple/
临时使用pip镜像源可以在使用pip的时候加参数:-i https://pypi.tuna.tsinghua.edu.cn/simple
这个库不再支持python2,要求在python3下使用,安装指令如下:
pip3 install cairosvg -i https://pypi.tuna.tsinghua.edu.cn/simple
发现使用镜像源的安装速度是非常流畅,如果没有发生报错,就是安装成功,如下:
cairosvg第三方库的使用:命令行快捷模式
从SVG矢量图转到PNG图像格式,打开我们终端命令行窗口输入如下:
cairosvg old_img.svg -o new_img.png
cairosvg第三方库的使用:嵌入代码模式
以上主要是测试是否安装正确,在python中转换代码如下:
import cairosvg
svg_path = 'svg.svg'
png_path = 'img.png'
cairosvg.svg2png(url=svg_path, write_to=png_path)
特别补充:svglib第三方库也能把SVG转化PNG格式
镜像源来安装svglib第三方库方法:
pip3 install svglib -i https://pypi.tuna.tsinghua.edu.cn/simple
代码测试展示如下所示:
import svglib
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPDF, renderPM
drawing = svg2rlg("svg.svg")
# renderPDF.drawToFile(drawing, "drawing.pdf")
renderPM.drawToFile(drawing, "img.png", fmt="PNG")
# renderPM.drawToFile(drawing, "drawing.jpg", fmt="JPG")
运行结果展示如下所示:左边是放大后的SVG,没有失真,右边是放大后png图片
为什么会出现如此的情况?
原因是:无论我们采用的是cairosvg第三方库还是svglib第三方库,都是根据svg原尺寸进行转换成png图片的,所以问题就是svg原文件的尺寸过小,解决方案:放大SVG原文件的尺寸。
5. 利用python绘制SVG
SVG(可缩放矢量图形)
可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式。它由万维网联盟制定,是一个开放标准。
例如使用numpy、matplotlib绘制可视化图表,保存为svg格式
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure() # 创建画板
axes = fig.add_subplot() # 创建坐标轴
x = np.linspace(0, 10, 50)
y = (x * x)
axes.plot(x, y, label='y=x$^2$')
axes.legend() # 添加图例
fig.savefig('输出图片.svg', format='svg', dpi=150) # 输出保存
其中,format表示输出图片的类型,可以为tiff、jpg、png等格式,按需选择;dpi为像素大小,dpi越大,图片越清晰,占用内存也越大。
特别注意:svg是矢量图格式,在插入word中裁剪放大缩小的时候清晰度基本不会改变,且色彩不失真。
6. Python调节SVG尺寸
关于P3小节遇到的问题,就是我们能不能先放大SVG的尺寸,然后进行转换PNG或者JPEG图片,不就是有更高的保真率了吗?
为此,我想到两张比较可行的方案?在网上查了很多教程多没有具体的方案!
第一种:就是借助JavaScript进行控制,JS调整SVG确实独有一套的,python调用JavaScript语言,当然就是利用Python控制JS脚本语言的执行,Js在本地运行,脱离浏览器就要借助Node环境。
第二种:就是读取SVG对应的数值项,进行合理扩大或者缩小,遍历整个文件进行修改数值,可能会比较复杂!
更多推荐
所有评论(0)