Mathpix Api 识别公式简易python程序 + 快捷方式配置

目录

    • 实现效果
    • 运行环境
    • 源码目录
    • 各文件具体内容
    • 使用方法
    • 使用示例和总结
    • 附加:桌面快捷方式设置和伪装

实现效果

  1. 利用截图工具截图,至剪贴板
  2. 利用自定义快捷键触发 mathpix apipython 程序
  3. 粘贴得到 latex 数学公式

运行环境

  1. windows10
  2. anaconda 懒人包 (python 和相关模块无需再安装,且设置了环境变量)
  3. snipaste 截图工具

源码目录

|—— ProjectPath\ (项目目录)
|———— apikey.json (mathpix api 钥匙)
|———— main.py (主程序,实现从剪切板读取读片,发送请求,返回响应后,将结果写入剪切板)
|———— mathpix.py (请求,响应的具体实现)
|———— mathpix.bat (快捷键配置使用,有cmd窗口)
|———— mathpix.vbs (快捷键配置使用,无cmd窗口)
|———— mathtest.jpg (测试图片)

各文件具体内容

apikey.json (需要自行更改为自己的 id 和 key):

// 需要自行更改
{
"app_id": "your_app_id",
"app_key": "your_app_key"
}

mathpix.py (无需更改):

import base64
import requests
import json

with open("apikey.json", "r") as f:
    api_key = f.read()
api_key = json.loads(api_key)

my_headers = {"app_id": api_key["app_id"],
           "app_key": api_key["app_key"],
           "Content-type": "application/json"}

service = 'https://api.mathpix.com/v3/latex'

def iuri_path(ipath):
    with open(ipath, "rb") as f:
        idata = f.read()
    return "data:image/jpg;base64," + base64.b64encode(idata).decode()

def iuri_bdata(idata):
    return "data:image/jpg;base64," + base64.b64encode(idata).decode()

def latex(data, headers=my_headers, timeout=10):
    r = requests.post(service, data=json.dumps(data), 
                      headers=headers, timeout=timeout)
    return json.loads(r.text)
    
def mylatex(idata, headers=my_headers):
    data = {"src":iuri_bdata(idata),
            "ocr":["math", "text"],
            "formats":["latex_styled"],
            "format_options":{
                "latex_styled":{
                    "transforms":["rm_spaces"]
            }}}
    r = requests.post(service, data=json.dumps(data), 
                      headers=headers, timeout=10)
    
    rd = json.loads(r.text)
    return rd["latex_styled"]

if __name__=="__main__":
    ipath = "mathtest.jpg"
    with open(ipath, "rb") as f:
        idata = f.read()
    res_latex = mylatex(idata)

main.py (无需更改):

import win32clipboard as wc
import os
import mathpix
from PIL import ImageGrab
from PIL import Image
from io import BytesIO

im = ImageGrab.grabclipboard()

if isinstance(im, Image.Image):
    imb = BytesIO()
    im.save(imb, "jpeg")
    imb.seek(0)
    idata = imb.read()
    imb.close()
    
    try:
        clip_text = mathpix.mylatex(idata)
        
    except:
        clip_text = "Mathpix latex api error"
    
else:
    clip_text = "剪切板无图片"

wc.OpenClipboard()
wc.EmptyClipboard()
wc.SetClipboardData(wc.CF_UNICODETEXT, clip_text)
wc.CloseClipboard()

mathpix.bat(python 已设置环境变量,如未设置,需要指明 python 路径):

python "main.py"

mathpix.vbs(python 已设置环境变量,如未设置,需要指明 python 路径):

Set ws = CreateObject("Wscript.Shell") 
ws.run "python main.py", 0

使用方法

  1. 先对以上文件进行相应的修改(如果设置了anaconda的环境变量,则只需要修改 apikey.json 文件)
  2. 将文件保存至同一工作目录下
  3. mathpix.batmathpix.vbs 右键发送快捷方式至桌面,设置该快捷方式的快捷键(bat 会打开 cmd 窗口,vbs 不会)
  4. 使用 snipaste 截选数学公式至剪贴板
  5. 按下 “3” 中所设置的快捷键,等待1-2秒
  6. 此时 latex 数学公式已经复制到剪切板,直接粘贴就可使用

说明:

  1. 如果出现 api 调用错误,最后粘贴时会显示 “Mathpix latex api error”,可能是网络问题
  2. 如果粘贴板没有图片,则在最后粘贴时会显示 “剪切板无图片”
  3. 4—6是正常使用的三个步骤,1—3是具体的配置步骤

使用示例和总结

  1. 使用 snipaste 裁剪公式图片,图片裁剪如下
    Mathpix Api 识别公式简易python程序 + 快捷方式配置_第1张图片

  2. 按快捷键或双击桌面图标(如下)

  3. 粘贴得到 latex 代码如下:

\max _{\theta} \mathbb{E}_{\mathbf{z} \sim \mathcal{Z}_{T}}\left[\sum_{t=1}^{T} \log p_{\theta}\left(x_{z_{t}} | \mathbf{x}_{\mathbf{z}
  1. 验证该代码正确性,如下
    max ⁡ θ E z ∼ Z T [ ∑ t = 1 T log ⁡ p θ ( x z t ∣ x z < t ) ] \max _{\theta} \mathbb{E}_{\mathbf{z} \sim \mathcal{Z}_{T}}\left[\sum_{t=1}^{T} \log p_{\theta}\left(x_{z_{t}} | \mathbf{x}_{\mathbf{z}θmaxEzZT[t=1Tlogpθ(xztxz<t)]

总结:

  1. 使用 mathpix api 识别公式基本准确
  2. 日常使用基本上不成问题
  3. 注意 api 每月1000条限制,超出就要扣钱了,隔段时间上网站看看使用量

附加:桌面快捷方式设置和伪装

快捷方式设置截图
Mathpix Api 识别公式简易python程序 + 快捷方式配置_第2张图片

伪装图标资源:https://download.csdn.net/download/weixin_43852511/12299542

你可能感兴趣的:(Latex)