# LaTeXSnipper ## 用户手册 *适用于 v3.2.0-LTS* --- LaTeXSnipper 封面图
--- ## 目录 ### 第一卷 · LaTeXSnipper 用户指南 - [开始使用前(必读)](#开始使用前必读) - [主窗口功能入口与识别流程](#主窗口功能入口与识别流程) - [自动化接口与远程设备](#自动化接口与远程设备) - [本地模型(MathCraft ONNX)相关问题](#本地模型mathcraft-onnx相关问题) - [外部模型相关问题](#外部模型相关问题) - [安装和环境问题](#安装和环境问题) - [网络与更新问题](#网络与更新问题) - [PDF 与识别效果问题](#pdf-与识别效果问题) - [使用技巧与功能问题](#使用技巧与功能问题) - [平台特定问题(Linux / macOS)](#平台特定问题linux--macos) - [与其他软件冲突](#与其他软件冲突) - [从源码运行与开发者常见问题](#从源码运行与开发者常见问题) - [如何有效反馈 Bug](#如何有效反馈-bug) ### 第二卷 · Office 加载项指南 - [加载项介绍与系统要求](#加载项介绍与系统要求) - [安装与注册](#安装与注册) - [Word 功能详解](#word-功能详解) - [PowerPoint 功能详解](#powerpoint-功能详解) - [公式编辑器与侧边栏](#公式编辑器与侧边栏) - [设置与帮助](#设置与帮助) - [常见问题排查](#常见问题排查) ### 第三卷 · LaTeXSnipper Mobile(移动端) - [LaTeXSnipper Mobile 介绍](#latexsnipper-mobile-介绍) - [功能与页面结构](#功能与页面结构) - [与桌面版的差异](#与桌面版的差异) - [OCR 识别与输入方式](#ocr-识别与输入方式) - [公式编辑器与键盘策略](#公式编辑器与键盘策略) - [导出与分享](#导出与分享) - [移动端常见问题](#移动端常见问题) ### 第四卷 · MathCraft 内部模型介绍 - [MathCraft OCR 项目介绍](#mathcraft-ocr-项目介绍) - [模型集与识别配置](#模型集与识别配置) - [识别效果展示](#识别效果展示) - [性能参考](#性能参考) - [环境变量设置指南](#环境变量设置指南) ---
# 第一卷 · LaTeXSnipper 用户指南 ---
--- ## 开始使用前(必读) ### 安装后直接开始识别 桌面发行包含应用、独立推理 Python、锁定依赖、全部模型及 Pandoc。安装后打开主窗口,在设置中选择内置模型和识别类型,再使用截图、图片、PDF 或手写入口。公式预览固定使用内置 MathJax,可离线运行。 Windows/Linux 提供 CPU 与 NVIDIA GPU 两种发行,macOS Apple Silicon 使用 CPU。GPU 发行携带私有 CUDA/cuDNN 用户态库,系统只需支持的 NVIDIA 显卡与驱动。更换 CPU/GPU 发行使用对应安装器,日常应用更新保持当前发行类型。 ### 资源异常时 “应用诊断”报告运行版本、状态和实际错误;“模型资源”显示实际使用路径。应用更新只下载业务包并保留固定底座。底座有变化或安装资源损坏时,运行对应的完整安装包。 截图权限和系统热键限制与 OCR 独立。macOS 需要为实际运行的应用授予屏幕录制权限;Linux Wayland 的截屏与全局热键取决于桌面环境。 ### 使用外部模型 外部模型服务需要自行部署或配置。在设置中填写协议、服务地址、模型名称及必要的密钥,并测试连接。具体配置见“外部模型相关问题”。本地 MathCraft OCR 不要求这些服务。 ## 主窗口功能入口与识别流程 首次运行可通过快速入门了解截图、导出、快捷键与本地模型使用,也可随时重新打开“快速入门”查看。模型在后台准备。 ### 主窗口按钮分别做什么 当前主窗口左侧是截图和历史区,右侧是 LaTeX 编辑、预览和工具入口: - **截图识别:** 使用全局快捷键或按钮进入框选截图识别。默认快捷键 Windows/Linux 为 `Ctrl+F`,macOS 为 `Command+F`,可在主窗口"快捷键"按钮中修改。 - **图片识别:** 选择本地图片文件并走当前识别模型。 - **PDF识别:** 选择 PDF 后按页渲染识别,可输出 Markdown 或 LaTeX 文档。 - **手写识别:** 打开独立手写画布,写完后自动触发识别,结果可复制或写回主编辑器。 - **复制 / 导出:** 复制当前编辑器内容,或通过统一导出菜单导出为 LaTeX、Markdown、MathML、HTML、OMML、SVG 以及 Pandoc 扩展格式(Word、ODT、PowerPoint、EPUB、PDF、HTML 独立页、Typst、纯文本)。 - **收藏夹 / 历史记录:** 历史项和收藏项都支持复制、编辑、导出、重命名和删除。 桌面端当前共有 **20 种导出格式**: - **内置格式(无需 Pandoc):** LaTeX 行内、LaTeX display、LaTeX equation、Markdown 行内、Markdown 块级、MathML、MathML `.mml`、MathML ``、MathML 属性形式、HTML、Word OMML、SVG Code - **Pandoc 扩展格式:** Word `.docx`、ODT `.odt`、PowerPoint `.pptx`、EPUB `.epub`、PDF `.pdf`、HTML 独立页 `.html`、Typst `.typ`、纯文本 `.txt` 导出 Word、ODT、PowerPoint、EPUB 或 PDF 时,如果识别内容包含完整闭合的 SVG 源码块,程序会验证并按出现顺序保存原始 SVG 和 PNG 图像,将 PNG 嵌入目标文档,不额外添加图片标题或占位文字。图像保存在导出文件旁的 `<文件名>_assets_<内容哈希>` 目录;不同内容不会互相覆盖。无效、不完整或包含危险外部资源的 SVG 会被跳过。资源处理和 Pandoc 转换均在后台执行。 托盘或菜单栏状态菜单还提供 **识别屏幕**:默认按鼠标释放位置自动选择,也可以固定到某一块显示器。多屏截图位置不对时,优先检查这里。 ### 设置 设置页的"选择识别模型"只有两类入口: - **内置模型:** 使用 MathCraft OCR。本地识别类型可选 **公式**、**混合(文字+公式)**、**纯文字**。 - **外部模型:** 连接 OpenAI-compatible、Ollama 或 MinerU Local 服务。推荐预设包括 GLM-OCR、PaddleOCR-VL(FastDeploy)、Qwen2.5/Qwen3-VL 和 MinerU Local。 外部模型的 **提示词模板** 决定普通图片和截图识别的请求内容与结果类型,可选公式、Markdown 或纯文本。手写识别固定使用混合文档类型;内置模型及 OpenAI-compatible / Ollama 的 PDF 入口会单独询问导出格式和 DPI。填写 **自定义提示词** 后,自定义提示词优先级最高,会覆盖图片、截图、手写以及 OpenAI-compatible / Ollama PDF 识别的默认提示词;MinerU Local 直接解析原 PDF,不使用提示词或渲染 DPI。 普通图片和截图的确认窗口、历史记录及主窗口预览会按结果类型渲染:LaTeX 使用公式预览,Markdown 使用混合预览,纯文本使用文本预览。本地 MathCraft 的公式、混合和纯文字结果遵循相同映射。 设置中可以调整主题、语言、日志和自动化接口,通过“应用更新”升级,通过“应用诊断”排查故障。 ### PDF 识别流程 点击 **PDF识别** 后,程序会按当前模型执行: - 当前为 **内置模型** 且不是混合模式时,会提示切换到 MathCraft 混合识别后继续。PDF 文档识别需要混合模式做文本和公式整理。 - 当前为 **外部模型** 时,必须先在设置中完成外部模型配置并通过连接测试。 - MinerU Local 会走文档解析模式,输出固定为 Markdown;其他模型会先询问输出 Markdown 还是 LaTeX。 - 程序会询问识别页码或连续范围,例如 `5`、`3-7`;默认先填入 `1-5`,避免大 PDF 一次性耗时过长。 - 内置模型及 OpenAI-compatible / Ollama 会询问 PDF 渲染 DPI,范围为 90-300;OpenAI-compatible / Ollama 默认 150 DPI,内置模型默认 200 DPI。MinerU Local 直接解析原 PDF,不显示 DPI 选择。 - 识别结果会打开独立的 PDF 结果窗口,可编辑、复制或保存。Markdown 文档保存时,如果结构化结果包含图片资源,程序会尽量把相关 assets 一起复制到保存目录。 ## 自动化接口与远程设备 自动化接口供 Office 加载项、本机脚本、批量程序、编辑器插件,以及经用户明确授权的远程设备提交现有图片进行识别。API 调用不会打开桌面截图遮罩,也不会改变桌面端窗口;远程设备不能订阅下一次桌面识别结果。 ### 仅本机:推荐默认配置 普通用户、Office 加载项和同一台电脑上的 Python、AutoHotkey、AutoKey、Hammerspoon 或 ShareX 应保持以下设置: | 设置 | 推荐值 | 说明 | |---|---|---| | 访问范围 | 仅本机 | 不接受其他设备连接 | | 端口 | `28765` | 只有端口冲突时才修改 | | 监听地址 | `127.0.0.1` | 不要填写路由器地址、其他设备地址或 `0.0.0.0` | 开启“自动化接口”后,本机客户端从应用状态目录中的 `automation-api.json` 自动读取实际地址和每次启动都会更新的本机会话 token。Office 加载项不需要手工填写端口或 token。关闭 API 后该发现文件会被删除。 ### 远程设备:推荐使用 Tailscale 或 WireGuard 最简单、安全的家庭远程方案是让运行 LaTeXSnipper 的电脑和手机/远程电脑加入同一个 Tailscale 网络: 1. 在两台设备上安装并登录 Tailscale,确认它们可以互相访问。 2. 在运行 LaTeXSnipper 的电脑上查询 Tailscale 地址,例如执行 `tailscale ip -4`,得到类似 `100.x.x.x` 的地址。 3. 打开“设置 → 高级设置 → 自动化接口”,将“访问范围”改为“远程设备”。 4. “安全方式”选择“安全隧道(推荐)”;“监听地址”填写本机的 Tailscale/WireGuard 接口地址,不能填写远程设备地址、普通局域网地址或 `0.0.0.0`。 5. 端口通常保留 `28765`;生成独立的远程访问密钥并安全复制到远程设备。 6. “浏览器 Origin 白名单”通常留空;只有网页 JavaScript 直接跨域调用时才填写网页的准确 Origin。 7. 默认不要开启远程外部模型。只有确实需要调用桌面端已经配置好的 Ollama、MinerU 或在线接口,并接受资源/费用消耗时才开启。 8. 勾选安全确认项,保存配置,然后开启自动化接口。必要时只允许 VPN 网卡访问该端口的系统防火墙规则。 远程设备使用 `http://<隧道地址>:28765` 作为基础地址,并在每个受保护请求中发送: ```text Authorization: Bearer <远程访问密钥> ``` 可以先访问 `GET /api/v1/health` 检查连通性,再以 `multipart/form-data` 向 `/api/v1/recognition/jobs` 提交一个或多个 `images` 字段。iOS Shortcuts、Android Tasker、curl 和 Python 都不需要填写浏览器 Origin 白名单。手机远程调用要求家中电脑保持开机、LaTeXSnipper 正在运行且自动化接口已开启;识别结果直接返回调用端,不会唤起家中电脑的截图界面。 例如,远程电脑可以使用以下命令提交一张图片。下面使用 macOS/Linux shell 的续行符;Windows PowerShell 应改用 `curl.exe`,并将每行末尾的 `\` 换成反引号 `` ` ``: ```bash curl -sS "http://100.x.x.x:28765/api/v1/recognition/jobs" \ -H "Authorization: Bearer <远程访问密钥>" \ -H "Prefer: wait=30" \ -F backend=mathcraft \ -F mode=formula \ -F "images=@formula.png" ``` 返回 `202` 表示任务仍在后台执行,应按响应中的 `Location` 查询结果;返回 `200` 表示等待期间已经完成。 ### HTTPS 模式 没有安全隧道时可以选择 HTTPS,但需要自行准备证书和私钥:监听地址填写这台电脑实际使用的非回环网卡 IP,证书的 SAN 必须覆盖远程设备访问时使用的主机名或 IP,并且远程设备必须信任该证书。不要把自签名证书错误或明文 HTTP 服务直接暴露到公网;家庭用户优先使用 Tailscale/WireGuard。 ### 字段说明与启动耗时 - **端口:** 本机和远程调用地址的一部分。保持 `28765` 可以减少客户端配置;端口被其他程序占用时才更换。 - **监听地址:** 指运行 LaTeXSnipper 这台电脑上的本地网卡地址,不是允许访问的客户端地址。本机模式固定使用回环地址;隧道模式必须是被识别出的 VPN 接口地址。 - **远程访问密钥:** 与本机会话 token 完全独立,重启 API 后仍保持不变,除非点击重新生成或撤销。密钥只应保存在受信任设备中。 - **浏览器 Origin 白名单:** 只控制浏览器 CORS,格式为 `协议://主机[:端口]`,多个地址用英文逗号分隔,不能包含路径。它不是设备 IP 白名单,也不会影响 Office、curl、Shortcuts、Tasker 或普通 Python 客户端。 - **允许远程设备调用外部模型:** 只增加远程密钥的外部模型权限;远程端仍不能读取或覆盖桌面端保存的模型地址、模型名、API Key 和提示词。 API 开关在后台执行,开启本身不会加载或预热 MathCraft。服务正在运行时,如果端口、监听地址、安全方式、证书、密钥、CORS 或远程权限发生变化,保存操作必须停止并重新绑定一次服务,因此会比普通设置保存稍慢,本机会话 token 也会更新。没有实际变化的重复保存不会重启服务。不要在识别任务进行中连续修改网络配置或反复开关;正常启停通常很快,持续数秒时应检查端口占用、防火墙、证书/私钥以及运行日志。 ## 本地模型(MathCraft ONNX)相关问题 ### 模型与识别类型 内置 MathCraft OCR 提供公式、纯文字及文字与公式混合识别。PDF 页面使用混合模式恢复文档内容。公式模式适合裁剪清晰的单个公式;正文或图文页面应使用文字或混合模式。 ### 权重在哪里 发行程序只使用安装目录中的模型,加载前按模型清单校验。权重缺失或损坏时停止加载,请重新运行完整安装包;安装版不使用外部模型缓存或自动下载权重。 源码桌面端和独立库、CLI 使用以下默认缓存位置: - Windows:`%APPDATA%/MathCraft/models` - Linux:`${XDG_DATA_HOME:-~/.local/share}/LaTeXSnipper/MathCraft/models` - macOS:`~/Library/Application Support/LaTeXSnipper/MathCraft/models` 可以通过“模型资源”查看各模型实际使用的路径;加载错误请查看“应用诊断”和运行日志。 源码桌面端显式使用默认缓存位置,不读取 `MATHCRAFT_HOME`。独立使用 mathcraft-ocr 库或 CLI 时,可以用公开参数或环境变量指定缓存,并保留自动下载行为。安装版不使用该缓存;清理缓存可能影响源码运行及 CLI。 ### 下载失败或识别不可用 业务更新和源码运行的模型下载需要网络。检查网络、代理、磁盘空间及应用运行日志;需要代理时可以为启动进程配置 `HTTP_PROXY`、`HTTPS_PROXY`。安装资源异常或程序无法启动时,重新运行完整安装包。 CPU 发行固定使用 CPU;GPU 发行固定请求 CUDA,并在推理后核对私有库加载位置。GPU 失败时诊断硬件、驱动或资源问题,不自动改变发行类型。需要 CPU 时使用 CPU 安装器。 ### 提高识别质量 - 裁剪到目标区域,保留完整上下标,避免边缘截断。 - 提供清晰、有对比度的图片,避免过度缩放和压缩。 - 对混合正文选择混合识别,对单个公式选择公式识别。 - 在结果编辑器中核对源码,再复制或导出。 ## 外部模型相关问题 ### 根本没配置外部模型,直接点识别然后报错 **现象:** 截图后识别失败,提示"模型名为空"或"外部模型地址为空"。 > [!CAUTION] > **错误原因** > > 外部模型客户端要求普通视觉协议填写模型名和 Base URL;MinerU Local 可不填模型名。 > 默认 `model_name` 就是空字符串,你需要手动填写。 **解决:** 先去 **设置 → 外部模型**,至少填上 Base URL 和模型名(或选择预设),点"测试连接"通过后再使用。 ### Base URL 应该填服务根地址 **现象:** 服务本身正常,但测试连接访问了重复路径,或提示接口路径不存在。 **原因:** LaTeXSnipper 会按协议自动拼接接口路径: - Ollama:`/api/tags` 测试模型列表,`/api/chat` 执行识别 - OpenAI-compatible:`/v1/models` 测试模型列表,`/v1/chat/completions` 执行识别 - MinerU Local:`/<健康检查路径>` 测试连接,`/<解析接口路径>` 执行解析 **解决:** Base URL 只填服务根地址,例如 `http://127.0.0.1:11434`、`http://127.0.0.1:8000` 或服务商 HTTPS 根地址;不要手动追加 `/v1`、`/api/chat`、`/v1/chat/completions` 或 `/file_parse`。 ### 模型没预热(冷启动),第一次调用巨慢或超时 **现象:** 首次 OCR 识别等待很久(可能超过 60 秒),然后报超时。 **原因:** vLLM / Ollama / 本地 ONNX 模型首次加载需要将模型读入内存/显存,尤其是大模型(7B+)。默认超时仅 60 秒。 **解决:** - **方案 A:** 首次使用前先手动调用一次预热(用 curl 或 Ollama 的 API 测试页面) - **方案 B:** 在设置里把超时提高到 120-180 秒 - **方案 C:** Ollama 用户可以先 `ollama run ` 确保模型已在内存中 ### Ollama 已启动但 Base URL 填错 **现象:** 测试连接报"无法连接到 127.0.0.1:11434"。 **常犯错误:** - 填了 `http://localhost:11434/v1`(Ollama **不需要** `/v1` 后缀) - 填了 `https://` 而不是 `http://`(本地 Ollama 默认不开 HTTPS) - Ollama 服务实际监听在其他端口,但用户没改端口号 - Ollama 根本没启动(`ollama serve` 没运行) > [!TIP] > **快速验证:** 先在浏览器访问 `http://127.0.0.1:11434/api/tags`,如果返回 JSON 就说明正常。 ### 模型名拼写错误 / 大小写不对 **现象:** 测试连接提示"模型名不存在: xxx",然后列出可用模型。 **原因:** 模型名必须完全一致,包括大小写。 **解决:** - Ollama 用户执行 `ollama list` 查看确切模型名 - OpenAI-compatible 用户查服务文档或 `/v1/models` 接口返回值 ### 线上 API 用了但没填 API Key **现象:** 测试连接或识别时报 401 "接口认证失败"。 **原因:** 线上服务(硅基流动、DeepSeek、OpenAI 等)必须提供 API Key。本地 Ollama 通常不需要。 **解决:** 在设置的 API Key 栏填入正确的密钥。 > [!WARNING] > **安全提醒** > > API Key 是敏感信息,请勿分享给他人或上传到公开仓库。 > LaTeXSnipper 不会将你的 API Key 发送到除你指定的 Base URL 以外的任何地方。 ### MinerU Local 协议选了但是服务端没配好 **现象:** 测试连接报 404 或 409。 **原因:** MinerU 的默认测试端点是 `/health`,默认解析端点是 `/file_parse`。不同版本可能用不同路径。 **解决:** - 先确认 MinerU 服务是否在运行:浏览器访问 `http://127.0.0.1:8000/health` - 如果路径不对,在设置中修改"解析接口路径"和"健康检查路径" - MinerU 409 错误通常表示解析任务失败,查看 MinerU 服务端日志 > [!NOTE] > **源码实现对应关系** > > MinerU Local 与普通视觉模型走不同链路: > > - 测试连接访问 `Base URL + 健康检查路径`,默认 `/health` > - 图片识别和 PDF 解析访问 `Base URL + 解析接口路径`,默认 `/file_parse` > - 解析请求会依次尝试 `pipeline`、`hybrid-auto-engine`、`vlm-auto-engine` > - PDF 使用 MinerU Local 时会把原 PDF 交给服务端解析;OpenAI-compatible / Ollama 则由 LaTeXSnipper 用 PyMuPDF 按 DPI 渲染页面后逐页发送图片 ### 选了 OpenAI-compatible 协议但服务是 Ollama **现象:** 测试连接时访问 `/v1/models` 返回 404。 **原因:** Ollama 的模型列表接口是 `/api/tags`,不是 `/v1/models`。 **解决:** 把协议从 "OpenAI-compatible" 改成 "Ollama"。 > [!NOTE] > **协议选择速查** > > - Ollama 服务 → 选 **Ollama** > - 硅基流动 / DeepSeek / OpenAI / Groq 等 → 选 **OpenAI-compatible** > - MinerU 本地服务 → 选 **MinerU Local** > - 本地 MathCraft ONNX → 在"选择识别模型"中选 **内置模型** ### 自定义提示词把系统提示覆盖了导致输出格式错乱 **现象:** 填写了自定义提示词后,输出变成了自然语言解释而不是 LaTeX 代码。 **原因:** 自定义提示词优先级最高,会完全覆盖图片、截图、手写以及 OpenAI-compatible / Ollama PDF 识别的模板提示词。如果自定义提示词没有明确输出格式,模型可能返回解释文字或不符合导出格式的内容。MinerU Local 不使用提示词。 **解决:** 如果不确定怎么写,清空自定义提示词,只用模板。 --- ## 安装和环境问题 ### 选择发行 - Windows x86_64:CPU 或 NVIDIA GPU 安装器。 - Debian/Ubuntu 兼容的 Linux x86_64(glibc 2.35 及以上):CPU 或 NVIDIA GPU 离线安装归档,解包后运行 `sh install.sh`。 - macOS 14.0 及以上的 Apple Silicon:CPU DMG,把应用复制到 Applications 后运行。 发行携带 Python、推理依赖、模型、Pandoc 和内置预览资源,无需自行安装 Python 或 CUDA Toolkit。Linux 包管理器仍负责 Qt 所需的系统图形库;缺少依赖时,安装器通过 apt 补齐,需要可用的软件源和网络,或已缓存的依赖包。GPU 仍需要支持的显卡和系统驱动;3.2.0 的最低 NVIDIA 驱动版本为 Windows 570.65、Linux 570.26。普通 PDF 文件导出需要用户提供 LaTeX PDF 引擎。 ### 安装资源与用户数据 Windows 安装目录包含业务目录 `application` 和固定资源目录 `runtime`、`inference`、`models`,以及 `distribution.json`。Linux 文件由 dpkg 管理,位于 `/usr/lib/latexsnipper`,安装身份位于 `/var/lib/latexsnipper/distribution.json`。macOS 业务目录位于应用的 `Contents/Resources/desktop`,固定资源位于 `Contents/Frameworks/LaTeXSnipperBase.bundle/Contents/Resources`。 配置、历史、收藏和日志属于用户数据。Windows/Linux 应用状态位于 `~/.latexsnipper`;macOS 位于 `~/Library/Application Support/LaTeXSnipper`,日志位于 `~/Library/Logs/LaTeXSnipper`。MathCraft 默认模型缓存独立于安装组件。 ### 权限与重装 默认用户安装位置可由当前用户更新;受保护位置的部署由独立更新进程申请平台权限。Linux 通过 dpkg 更新业务包和文件归属;macOS 保留独立签名底座,只替换业务资源并重新执行本地 ad-hoc 签名。 重新运行安装器会按目标清单部署完整组合。Windows/Linux 更换 CPU/GPU 发行使用对应安装器,正常更新保持当前类型。下载和暂存阶段不会覆盖运行中的组件。 ### 卸载与清理 Windows 使用系统卸载入口;Linux 卸载四个安装包: ```bash sudo dpkg --purge latexsnipper-runtime latexsnipper-inference latexsnipper-models latexsnipper ``` macOS 删除安装的应用。卸载只移除产品拥有的安装资源;用户配置、日志及共享模型缓存可另外按需清理。Windows 卸载选项分别提供应用数据与模型缓存清理;Linux 在卸载前可使用 `latexsnipper-clean-user-data` 命令选择清理范围。macOS 退出应用后可按[用户数据位置](../docs/user_data_storage.md)手动清理,源码仓库也提供支持 Linux/macOS 的 `scripts/latexsnipper-clean-user-data.sh`。共享模型缓存可能也被 mathcraft-ocr CLI 使用。用户保存的导出文件和外部工具由用户自行管理。 ## 网络与更新问题 ### 何时需要联网 完整安装后,本地识别、编辑与内置 MathJax 预览可以离线使用。HTML 独立页导出使用 CDN,接收者打开文件时需要联网加载公式和字体。业务更新、源码模型下载、外部在线模型需要网络。外部本地服务是否需要网络取决于其部署方式。 ### 应用更新与完整安装 “应用更新”检查匹配当前平台、架构及 CPU/GPU 类型的发行。日常更新只下载和校验业务包,替换业务文件并删除废弃业务文件,保留 Python、Qt、Pandoc、推理依赖、模型与用户数据,不全量扫描固定资源。目标版本需要新的底座时,会提示下载完整安装包;首次切换到该架构也需要完整安装。 下载支持暂停、继续与取消;中断文件按内容身份保存,复用前验证长度和 SHA256。准备完成后确认安装,应用停止识别与 worker 并退出,独立部署进程完成替换和验证。需要权限时由操作系统显示授权窗口。 “应用诊断”报告版本、运行状态与实际错误,不执行推理环境或权重的完整性扫描。底座损坏或业务程序无法启动时,请重新运行完整安装包。更新校验或部署失败时不提交新身份,中断事务在下次启动前恢复。临时备份只用于本次失败恢复,成功提交后清理;清理失败稍后重试,不撤销已完成的更新。不提供历史版本选择或手动降级。 ### 常见失败 - 无匹配发行清单:查看发布状态及应用日志,不选择其他平台或类型的载荷。 - 网络或摘要校验失败:检查代理和连接后重试,损坏下载不会进入部署。 - 空间不足:清理空间后重试,保留当前组件。 - 权限不足或文件占用:关闭其他应用实例,并按系统提示授予必要权限。 - 源码运行:应用显示源码更新说明,使用 Git 和开发工具更新源码与环境。 ## PDF 与识别效果问题 ### PDF 识别结果很乱 **现象:** 用内置模型或外部模型识别 PDF 效果很差。 **原因:** - DPI 过低会丢失小字和细线细节;过高会增加内存和处理时间,使用外部模型时还可能触发缩放、输入限制或超时 - 扫描件与文字型 PDF 处理方式不同 - 提示词模板不匹配(用了公式模板去识别文档) **解决:** - 文字型 PDF:尝试 140-170 DPI - 扫描件:尝试 200-300 DPI - 外部模型普通图片识别:确认设置中的提示词模板与任务匹配;手写识别固定使用混合文档类型 - PDF 识别:内置模型及 OpenAI-compatible / Ollama 在 PDF 入口单独选择 Markdown/LaTeX 与 DPI;MinerU 文档解析直接使用原 PDF 并固定输出 Markdown ### 切换了输出模式但结果没变 **现象:** 设置里选了 LaTeX 输出,但返回的还是 Markdown。 **原因:** 提示词模板决定普通图片和截图的结果类型;手写识别固定使用混合文档类型,PDF 入口的格式选择独立。自定义提示词会覆盖 OpenAI-compatible / Ollama 的内置提示词,包括手写和 PDF 识别;MinerU Local 走文档解析接口,不使用提示词。 **解决:** 清空自定义提示词并确认提示词模板;如果是 PDF,请重新从 PDF 入口选择导出格式。 ### 大图片 / 高分辨率截图识别失败 **现象:** 截了 4K 屏幕的图,识别直接报错或超时。 **原因:** 图片太大,Base64 编码后体积膨胀约 33%,可能超过服务端请求体大小限制,或传输太慢导致超时。 **解决:** - 缩小截图范围 - 降低截图分辨率 - 提高超时时间 --- ## 使用技巧与功能问题 ### 预览与导出 公式预览固定使用内置 MathJax。修改 LaTeX 后实时查看结果;复制菜单提供 LaTeX、Markdown、MathML、HTML、SVG、图片和 Office 公式等输出。按用途选择格式,纯源码编辑保留原文。 桌面发行的固定底座提供 Pandoc,支持 DOCX、ODT、PPTX、EPUB、独立 HTML、Typst、纯文本和 PDF 文件导出。PDF 导出还需要外部 XeLaTeX、LuaLaTeX 或 pdfLaTeX。源码开发使用 PATH 中的 Pandoc;随包 Pandoc 缺失时重新运行完整安装包。 桌面端 Word OMML 导出仅支持 Windows,需要正常注册的 Microsoft Word 及其安装目录中的 `MML2OMML.XSL`。自定义 Office 安装位置通过 Windows App Paths 定位;若注册或样式表缺失,请修复 Office 安装。该条件不影响其他导出格式。 ### 手写识别 打开手写窗口,在画布上书写后识别。结果进入公式编辑器,可修改源码、预览、复制和导出。手写窗口采用同一内置模型与 MathJax 预览资源。 ### 历史、收藏与快捷键 识别结果保存在历史中,可重新编辑并加入收藏。设置中提供截图快捷键、主题、语言与启动行为。Windows/Linux 使用 Ctrl 作为主要修饰键,macOS 使用 Command;系统保留组合会被拒绝,可使用允许的带 Shift 或 Option 的组合。 ### 窗口关闭与退出 Windows 有托盘时关闭主窗口会隐藏,使用托盘退出。Linux 无托盘时会询问退出;macOS 关闭窗口会隐藏主窗口并保留应用进程,可通过 Dock 或菜单栏重新打开,使用菜单退出或 Command+Q。 ## 平台特定问题(Linux / macOS) ### Linux 图形环境与截图 X11 使用 pynput 监听全局热键。Wayland 使用桌面提供的 GlobalShortcuts Portal,需要完成系统授权;实际组合键由桌面确认,应用显示授权后的快捷键。取消修改会保留原有授权。若桌面未提供该接口,请检查 `xdg-desktop-portal` 及对应桌面后端,也可使用截图按钮或切换 X11 会话,无需以 root 运行。 Wayland 的截图仍受合成器策略限制;应用先尝试 Qt 截图,可使用可用的 `grim`、`maim`、`gnome-screenshot` 等后备工具。这些系统工具由用户或发行版安装。 出现 EGL、GLOzone 或 WebEngine 画面异常时,先检查桌面会话和系统图形库。应用对 Wayland、虚拟机、WSL 等高风险会话启用软件图形后备;可用以下变量手动控制: ```bash LATEXSNIPPER_FORCE_LINUX_GRAPHICS_FALLBACKS=1 latexsnipper LATEXSNIPPER_DISABLE_LINUX_GRAPHICS_FALLBACKS=1 latexsnipper ``` 这是预览图形后端设置,不改变 MathCraft 推理发行类型。Linux 安装依赖必要的系统 Qt 图形库,但不使用系统 Python、CUDA Toolkit 或 cuDNN。 ### macOS 屏幕录制权限 把应用复制到 Applications,退出后从同一位置重新启动。在“系统设置 → 隐私与安全性 → 屏幕录制”中为实际运行的应用授权;较新系统可能将该项命名为“屏幕与系统音频录制”。开启后用 Command+Q 完全退出并重新启动,关闭窗口不会退出应用。 源码运行应授权系统列出的 Python、Terminal 或 IDE 启动进程。不要直接从 DMG 或应用转移位置持续运行。原生 Carbon 全局热键通常不需要辅助功能权限,截图权限单独检查。 开发机存在失效权限记录时可手动重置后重新授权: ```bash tccutil reset ScreenCapture com.mathcraft.latexsnipper ``` 应用不会自动执行重置。若授权检查成功但截图为空,报告屏幕布局、选区和截图日志。 ### macOS 签名与重新安装 macOS 安装包使用 ad-hoc 签名,未经 Apple 公证,不需要用户提供 Developer ID。业务更新保留固定底座签名并重新签署外层应用;安装资源损坏时重新安装。 ## 与其他软件冲突 ### 源码运行时 Python 环境不一致 **现象:** 从终端运行源码正常,但 IDE 启动失败,或反之。 **原因:** 终端与 IDE 选择了不同的 Python 环境。源码运行使用启动应用的解释器,推理 worker 也使用同一环境。 **解决:** - 运行 `python -c "import sys; print(sys.executable)"` 确认当前解释器 - 在 IDE 中选择同一环境,并在该环境安装项目依赖 - 桌面安装包使用随包部署的独立推理环境;安装资源异常应重新运行完整安装包 ### 输入法 / 屏幕取词软件干扰截图 **现象:** 截图快捷键无效或截到的画面不对。 **原因:** 某些输入法、词典取词、录屏软件占用全局快捷键或 hook 了屏幕捕获。 **解决:** 暂时关闭冲突软件的屏幕相关功能,或在 LaTeXSnipper 设置中修改截图快捷键。 --- ## 如何有效反馈 Bug ### 提供可复现信息 提交 Issue 时包含操作系统、应用版本、CPU/GPU 发行类型、输入类型、具体步骤、完整报错和必要截图。识别错误最好附可公开的输入样例以及期望结果。外部服务问题应说明协议与模型配置,密钥无需提供。 ### 诊断与日志 设置中的“应用诊断”显示安装版本、底座身份、Python/ORT 版本、计算提供者及实际运行错误。“运行日志”显示当前会话诊断。请附应用日志目录;闪退时还需 `crash-native.log`(如果生成)。 - Windows:`%USERPROFILE%/.latexsnipper/logs` - Linux:`~/.latexsnipper/logs` - macOS:`~/Library/Logs/LaTeXSnipper` 模型问题请附实际模型路径及加载错误;GPU 问题请附显卡型号与驱动版本;更新或重新安装失败请附完整日志。 ## 从源码运行与开发者常见问题 ### 使用同一开发 Python 选择 venv、Conda、uv 等受支持的 Python 环境,运行、测试和 IDE 使用同一解释器。三平台统一安装 `requirements.txt`,平台专用依赖由环境标记自动选择。本地 OCR 还需要 CPU extra: ```bash python -m pip install -r requirements.txt python -m pip install -e '.[cpu]' python src/main.py ``` 源码 worker 使用启动应用的 Python,固定 CPU,并显式使用库的平台默认缓存。开发依赖由标准开发工具管理。源码 Pandoc 从 PATH 获取;PDF 文件导出的 LaTeX 引擎同样由开发者提供。 ### 检查与发行构建 在选定环境中安装检查工具后执行: ```bash python -m pytest -q python -m pyright --pythonpath python -m compileall -q src mathcraft_ocr scripts python scripts/update_translations.py --check python scripts/check_ui_translations.py ``` 客户端安装器由 GitHub Actions 构建,复用输入未变化的固定底座和维护程序;原生安装与识别验收按需单独运行。 ---
# 第二卷 · Office 加载项指南 ---
## 加载项介绍与系统要求 ### 什么是 Office 加载项 LaTeXSnipper Office 加载项是一个 Windows 原生 VSTO 插件,安装后会在 Word 和 PowerPoint 的功能区(Ribbon)中添加 LaTeXSnipper 专用标签页。截图 OCR 作为普通客户端通过本机 Automation API 创建、查询和取消独立任务。 ### 系统要求 - **Windows 版本:** Windows 10 22H2 或更高版本 / Windows 11 - **Office 版本:** Microsoft 365 应用(当前通道或月度企业通道)、Office 2024 / 2021 / 2019 零售版或批量许可版、Office LTSC 2024 / 2021 - **运行时:** .NET Framework 4.8、Visual Studio Tools for Office Runtime 10.0、Microsoft Edge WebView2 Runtime;缺少 VSTO Runtime 时,安装器会提示先安装 - **Office 体系:** 仅支持 32 位和 64 位桌面版 Office;不支持网页版、移动版和 macOS 版 Office - **LaTeXSnipper 桌面端:** 使用截图 OCR 时需在本机运行并开启“自动化接口” ### 安装前检查 > [!WARNING] > > - 安装前请关闭所有正在运行的 Word 和 PowerPoint 窗口。Office 进程会锁定加载项 DLL,安装程序无法覆盖。 > - 如果此前安装过开发版(通过脚本手动注册),请先使用注册脚本的反注册功能清理,或运行安装包执行升级安装。 > - 安装程序需要管理员权限,用于写入 HKLM 注册表和受信任的发布者证书存储。 --- ## 安装与注册 ### 安装流程 关闭 Word 和 PowerPoint 后运行安装器。安装器会部署加载项、配置信任与 Office 注册,并注册匹配 Office 位数的 OLE 公式处理程序;无需另行运行 VSTO 注册工具。安装完成后重新打开 Office。 ### 自定义安装路径 安装程序支持自定义安装路径,VSTO 注册和文件引用会自动适配所选路径。不建议将加载项安装到受保护的临时目录或网络路径。 ### 卸载 通过 Windows"设置 → 应用 → 已安装的应用"卸载,或运行安装目录下的 `unins000.exe`。卸载程序会自动: - 删除所有安装文件 - 移除 HKLM 注册表键值 - 移除插件的 VSTO 信任记录和 OLE 公式处理程序注册 - 清理 Office 禁用项和崩溃记录 ### 命令行静默安装 安装包支持 Inno Setup 标准静默参数: ```text :: 静默安装(显示进度条) LaTeXSnipperOffice_3.2.0_amd64.exe /silent :: 完全静默(无界面) LaTeXSnipperOffice_3.2.0_amd64.exe /verysilent :: 自定义安装目录 LaTeXSnipperOffice_3.2.0_amd64.exe /dir="<安装目录>" ``` --- ## Word 功能详解 ### 功能区概览 安装后,Word 功能区的最后位置会出现 **LaTeXSnipper** 标签页,包含 9 个功能组: - **公式组:** 行内公式、行间公式、带编号公式、截图识别 - **编辑组:** 加载所选、删除所选 - **转换组:** 转为 MathType、转为 OLE、转为 Word - **公式解析组:** 解析所选、解析全文 - **交叉引用组:** 插入引用 - **编号组:** 添加编号、重编号 - **编号边界组:** 章分隔符、节分隔符 - **公式样式组:** 格式化所选、格式化全文 - **工具组:** 状态窗格、设置、帮助 ### 公式插入方式 Word 支持插件 OLE 对象和 Word 原生 OMML(Office Math Markup Language)公式,在“设置 → 公式插入方式”中选择: - **OLE 对象(默认):** 本地渲染的矢量公式对象,双击或“加载所选”可打开插件编辑器。复制到另一份文档后仍可加载并独立编辑。 - **Word 原生公式:** 可直接使用 Word 的公式工具编辑,也可通过插件加载、更新和转换。 > [!NOTE] > OMML 公式是 Word 原生格式,卸载加载项后公式仍然可以正常显示和编辑。加载项插入的公式会附带 LaTeXSnipper 管理元数据(公式源码、显示模式、编号模式),用于后续加载、更新和重编号。普通 Word 公式没有 LaTeXSnipper 元数据,插件不会猜测其 LaTeX 来源。 ### 三种插入模式 - **行内公式:** 插入正文中的行内公式,跟随文字排版 - **行间公式:** 插入居中显示的独立公式 - **带编号公式:** 插入自动编号的行间公式,编号位置、外框、章/节层级和层级分隔符可在设置中配置 ### 公式解析 “解析所选”和“解析全文”可将正文及表格单元格中完整且非空的 `$...$`、`\(...\)`、`$$...$$` 和 `\[...\]` 转换为 LaTeXSnipper 管理公式。`$...$` 与 `\(...\)` 生成无编号行内公式;`$$...$$` 与 `\[...\]` 生成行间公式,并使用当前插入方式、字体、颜色、缩放和编号选项。 行间公式中的有效顶层 `\tag{...}` 优先作为自定义编号,解析本身不执行全文重编号。已有 LaTeXSnipper 公式、Word 原生公式、字段、引用和受保护内容会被跳过;单个公式失败时保留原文并继续处理。批量解析分批显示进度并支持 Word 撤销,取消或超时后可再次执行以继续处理剩余公式。 ### 加载、更新和删除 选中由 LaTeXSnipper 插入的公式后: - **加载所选:** 将公式保存的源码加载到公式编辑器,可以修改后更新原公式 - **更新:** 在编辑器中修改后点击更新,新公式会替换原公式,保留元数据 - **删除所选:** 删除选中的插件公式;删除带编号公式时同时删除其编号段落 ### 添加编号与重编号 Word 支持将未编号的 LaTeXSnipper 公式转换为自动编号公式,并按文档顺序维护自动编号: - **添加编号:** 为选中的行间公式添加自动编号。如果公式已有编号,不会重复添加 - **重编号:** 按文档顺序更新所有自动编号公式的 SEQ 字段、编号书签和引用字段,不重新渲染公式内容;缺失元数据或编号字段的异常公式会被跳过并计数 - **编号位置:** 设置中可选择右编号或左编号;该设置只影响新插入的编号公式和之后被自动编号的普通公式,不改变已有公式的编号属性 ### 章/节分隔符与层级编号 支持多层级公式编号体系。在文档中插入章或节分隔符后,自动编号会按层级生成(例如 `1.1`、`1.2`)。 - **插入章分隔符:** 标记新章开始,后续自动编号重置为当前章号 - **插入节分隔符:** 标记新节开始,后续自动编号追加当前节号 - **包含章/节编号:** 设置中可控制编号是否包含章或节的层级部分 - **分隔符样式:** 层级分隔符可在设置中选择(`.`、`-`、`·`、`:`、`/`) - **隐藏分隔符:** 设置中可隐藏插入文档中的分隔符标记 ### 交叉引用 支持在文档正文中插入对公式编号的交叉引用: - **插入引用:** 在光标位置插入引用占位符,然后选中目标公式或目标公式所在段落,自动生成交叉引用 - 交叉引用与 Word 原生交叉引用系统集成,可通过 Word 的"更新域"刷新 ### 公式转换 选中公式后,通过功能区转换组选择目标格式: - **转为 MathType:** 将普通插件 OLE 公式转为 MathType 原生对象;带编号公式暂不支持 - **转为 OLE:** 将插件 OMML、Word 原生 OMML 或 MathType 公式转为插件 OLE 对象 - **转为 Word:** 将 OLE 公式转为 Word 原生 OMML 公式(可像 Word 公式一样直接编辑) MathType 双向转换无需安装 MathType;双击编辑 MathType 对象需要安装。转为 MathType 不保留原插件源码与字体快照,转回 OLE 根据对象当前内容生成。 Word 原生 OMML 或 MathType 转为 OLE 后保存的是 MathML 源码,可加载、更新、格式化及继续转换,不会还原为原始 LaTeX。 ### 格式重置 - **格式化所选:** 恢复所选插件公式的默认样式和自然大小 - **格式化全文:** 恢复全文插件公式的默认样式和自然大小 两者均使用当前设置中的公式默认属性,只处理样式或尺寸需要恢复的插件公式。 ### 性能与复杂度参考 下面的复杂度用于估算长文档中的响应时间。设 `n` 为参与操作的公式数,`m` 为文档中 LaTeXSnipper 管理公式总数,`c` 为文档中的内容控件、图片/OLE 对象或形状数量,`f` 为 Word 域数量,`p` 为当前段落内公式对象数量,`s` 为单个公式源码或 OMML/MathML XML 的长度,`r` 为一次 MathJax 渲染或图片/OLE 生成成本。 | 操作 | Word 复杂度 | PowerPoint 复杂度 | 主要耗时来源 | | --- | --- | --- | --- | | 插入 OLE 公式 | `O(s + r + ole)` | `O(s + r + ole)` | MathJax 渲染、EMF/OLE 对象创建、Office COM 插入 | | 插入 Word OMML | `O(s + r + xsl + xml)` | 不适用 | MathJax 转 MathML、MML2OMML XSL、Word `InsertXML` | | 插入 PowerPoint PNG | 不适用 | `O(s + r + png)` | MathJax 渲染、SVG/PNG 光栅化、形状插入 | | 插入带编号公式 | `O(s + r + ole/xml + c)` | 不适用 | 公式插入、SEQ 编号域、书签、居中/右对齐制表位布局 | | 加载所选 | `O(c)` 最坏,通常接近 `O(1)` | `O(c)` 最坏,通常接近 `O(1)` | 从选区附近定位元数据,必要时扫描对象 | | 更新公式 | `O(s + r + replace)` | `O(s + r + replace)` | 重新渲染和替换原对象;OLE 会保留用户缩放 | | 删除所选 | `O(c + n log n)` | `O(c + n)` | 收集所选插件公式;Word 按文档位置倒序删除,带编号公式同时删除编号段落 | | 添加编号 | `O(s + r + replace + before)` | 不适用 | 将普通行间公式改为编号布局,只扫描当前位置前的编号时间线 | | 重编号 | `O(c + f + m log m + refs)` | 不适用 | 收集并排序自动编号公式和章/节边界,一次建立 SEQ 字段映射,更新编号书签和 LaTeXSnipper 引用域 | | 插入章/节分隔符 | `O(c + m log m + refs)` | 不适用 | 插入边界控件后立即重编号全部自动编号公式 | | 插入交叉引用 | `O(1)` 插入占位,选择目标时最坏 `O(c + f)` | 不适用 | 查找目标公式、定位编号书签并创建 Word REF 域 | | 公式解析 | `O(c + n * (s + r + replace))` | 不适用 | 安全范围扫描、公式渲染和 Office 对象替换 | | 转 OLE(插件 OMML) | `O(n * (s + r + ole))` | `O(n * (s + r + ole))`(PNG → OLE) | 渲染、OLE 创建、逐个 COM 替换 | | Word 原生 OMath 转 OLE | `O(n * (s + xsl + r + ole))` | 不适用 | OMML2MML XSL、MathJax 按 MathML 渲染、OLE 创建 | | 转 Word OMML / PNG | `O(n * (s + r + xsl + xml))` | `O(n * (s + r + png))` | OLE/PNG 重新生成和 Office 对象替换 | | 格式化所选 | `O(n * (s + r + replace) + p)` | `O(n * (s + r + replace))` | 只有属性不同或尺寸被改过时才重新渲染/重置;Word 行内基线只扫描当前段落 | | 格式化全文 | `O(m * (s + r + replace) + p)` | `O(m * (s + r + replace))` | 复用所选格式化流程,按当前默认样式重绘需要恢复的公式并重置自然大小 | | 截图识别 | `O(ocr + s + r)` | `O(ocr + s + r)` | 桌面端 OCR 和后续公式插入 | 转换、公式解析和格式化会分批执行并更新状态窗格;单项失败会报告具体错误,并继续处理其他项,结束后显示处理统计。重编号会跳过编号信息不完整的公式并计数。长公式或大量公式时,主要耗时仍来自 `r`(MathJax 渲染/图片生成)和 `ole/xml/png`(Office COM 插入与对象替换)。建议长文档批量处理时分段执行并保存文档。 格式化保留公式源码,通过当前默认属性重新渲染;LaTeX 和 MathML 源码均可处理。原生行内公式由 Word 自己维护外层公式输入框,少数单选场景下外层占位框可能由 Word 保留;继续转为 LaTeXSnipper 管理的 OMML 后会由插件接管并清理为插件格式。 ### 截图识别 打开 LaTeXSnipper 桌面端,并启用设置中的“自动化接口”。点击插件“截图识别”后,使用桌面端全局快捷键框选公式;识别结果会填入 Office 公式编辑器。等待期间再次点击“截图识别”可取消。普通公式编辑和插入无需启动桌面端。 --- ## PowerPoint 功能详解 ### 功能区概览 PowerPoint 的 LaTeXSnipper 标签页结构与 Word 类似,但功能更精简: - **公式组:** 插入公式、截图识别(识别流程与 Word 相同) - **编辑组:** 加载所选、删除所选 - **转换组:** 转为 MathType、转为 OLE、转为 PNG - **公式样式组:** 格式化所选、格式化全文 - **工具组:** 状态窗格、设置、帮助 PowerPoint 不包含编号组、引用组、边界组——这些是 Word 文档专属功能。 ### 插入公式 光标位于文本框文字中时,点击“插入公式”生成随文字排版的 PowerPoint 原生公式,可用 PowerPoint 的公式工具编辑。 其他位置按设置插入居中的独立 OLE 对象或高 DPI PNG 图片;OLE 支持双击编辑,PNG 可通过“加载所选”修改。 > [!NOTE] > 加载、删除、转换和批量格式化面向插件插入的独立对象;文本内原生公式由 PowerPoint 管理。PowerPoint 不支持插件自动编号和重编号。 ### 加载与删除 - **加载所选:** 将所选插件 OLE 或 PNG 公式载入编辑器;修改后点击“更新”,尽量保留原位置和手动缩放 - **删除所选:** 删除选中的插件 OLE 或 PNG 公式 OLE 公式复制到另一份演示文稿后仍可加载并独立编辑。 ### 公式转换与格式重置 - **转为 MathType:** 将所选插件 OLE 公式转为 MathType 原生对象 - **转为 OLE:** 将插件 PNG 或 MathType 公式转为插件 OLE 对象 - **转为 PNG:** 将 OLE 公式转换为 PNG 图片 - **格式化所选:** 恢复所选插件公式的默认样式和自然大小 - **格式化全文:** 恢复全文插件公式的默认样式和自然大小 MathType 双向转换无需安装 MathType;双击编辑 MathType 对象需要安装。转为 MathType 不保留原插件源码与字体快照,转回 OLE 根据对象当前内容生成。 > [!TIP] > 如果你在幻灯片上找不到公式图片,可以检查形状的替代文本(Alt Text)。所有 LaTeXSnipper 公式图片的替代文本均以 "LaTeXSnipper formula" 开头。 --- ## 公式编辑器与侧边栏 ### 侧边栏(任务窗格) 侧边栏是加载项的常驻面板,通过功能区"状态窗格"按钮或自动弹出显示: - **MathLive 编辑器:** 侧边栏顶部是可视化公式编辑器,支持所见即所得的公式编辑 - **LaTeX 源码:** 编辑器下方是 LaTeX 源码输入区,编辑器和源码区双向同步 - **连接按钮:** 测试与桌面端 Automation API 的连通性 - **截图识别按钮:** 触发截图 OCR 等待状态 - **插入按钮:** 将当前侧边栏公式直接插入文档/幻灯片 ### 独立公式编辑器 通过 Word 功能区的“行内公式”“行间公式”“带编号公式”、PowerPoint 的“插入公式”或“加载所选”打开独立公式编辑器。 - **数学编辑区:** 全尺寸 MathLive 所见即所得编辑区,支持键盘快捷键(如 `+` `_` `/` `sqrt` 等标准 LaTeX 缩写自动识别)、光标导航和即时预览 - **LaTeX 源码区:** 编辑区下方的 LaTeX 源码输入区,与可视化编辑区实时双向同步,可直接粘贴或编辑 LaTeX 代码 - **符号面板(左侧):** 内置 **18 分类、2121 个数学符号与公式模板**,覆盖从基础算术到前沿研究的全部符号体系: - *基础(4 类 171 条):* 希腊字母(含变体和希伯来字母)、结构模板(矩阵/根式/行列式等,支持自选行列数)、分隔符(含大尺寸变体和装饰框线)、集合与逻辑符号 - *代数(1 类 174 条):* 线性代数(矩阵运算/特征系统)/抽象代数(群环域/同调代数/李理论/代数几何)/算子代数(C*/von Neumann/K-理论) - *几何(1 类 133 条):* 微分几何/黎曼曲率/陈类/Chern-Simons/Atiyah-Singer 指标/辛几何 - *数论(1 类 166 条):* 同余/二次互反律/模形式/L 函数/丢番图方程/解析数论 - *分析(1 类 210 条):* 微积分/实复分析/傅里叶分析/PDE/泛函分析/不等式/估计理论 - *拓扑(1 类 166 条):* 一般拓扑/同调论/同伦论/示性类/莫尔斯理论/谱序列/K 理论 - *关系与箭头(4 类 264 条):* 比较关系(含各种否定变体)/二元运算(含环论算子)/大型运算符/箭头符号 - *函数(1 类 131 条):* 三角函数/反三角函数/双曲函数/对数/极值/实虚部/误差函数/积分正弦余弦 - *概率统计(1 类 170 条):* 常见分布/随机过程/鞅/信息论/极限定理/不等式 - *物理(1 类 251 条):* 力学/电磁学/热力学/量子力学/相对论/标准模型/量子场论/弦论 - *化学(1 类 229 条):* 分子式/有机官能团/化学反应/物化常数/光谱学/电化学 - *其他(1 类 56 条):* 杂项符号 - **标签内搜索:** 每个符号面板顶部设有搜索框,支持按中文名称或 LaTeX 源码实时过滤当前标签内的符号 - **全局搜索:** 标签列顶部设有全局搜索框,输入关键词后跨所有 18 个标签检索,按组归类展示结果 - **样式工具栏:** 调整当前公式的符号字体、数字字体、汉字字体、字形、字号和颜色;“最终预览”显示实际渲染结果,小字号仅在屏幕上放大,插入仍使用选定字号 - **常用公式:** 右键符号磁贴可加入或移出“常用”,工具栏星形按钮可收藏当前公式;升级或重装后保留收藏 - **插入 / 更新:** 底部按钮根据当前模式显示"插入"或"更新" - **取消:** 关闭编辑器,不应用更改 > [!TIP] > `Enter` 新建数学行;`Shift+Enter` 插入或更新当前公式;`Esc` 只收回 MathLive 虚拟键盘,不关闭编辑器。 源码区按 `Tab` 在光标处缩进,补全列表按 `Enter` 接受。源码含有可视化编辑器无法原样保留的写法时,上方只显示参考结果;可继续编辑源码,或点击“用上方结果替换源码(可撤销)”。 ### 平台界面差异 Word 侧边栏包含行间公式、自动编号、自定义编号输入框等 Word 专属控件。PowerPoint 侧边栏不包含这些选项,界面更简洁。 --- ## 设置与帮助 ### 设置窗口 通过功能区"设置"按钮打开。设置窗口支持完整的公式参数配置: **公式插入方式** - **Word:** OLE 对象(默认)或 Word 原生 OMML 公式 - **PowerPoint:** OLE 对象(默认)或 PNG 图片;文本框内插入时使用 PowerPoint 原生公式 **Word 带编号公式默认布局** - **编号位置:** 右编号(默认)或左编号 - **外框:** 无、圆括号(( ))、方括号([ ])、花括号({ }) - **层级分隔符:** `.`、`-`、`·`、`:`、`/` - **包含章编号 / 包含节编号:** 控制编号是否包含层级部分 - **隐藏章分隔符 / 隐藏节分隔符:** 控制文档中是否显示分隔符标记 **公式默认属性** - **符号字体:** TeX 或 STIX2 字体方案,用于数学字母、符号和公式结构 - **数字字体:** 指定普通数字的系统字体,或跟随符号字体 - **汉字字体:** 指定公式内汉字使用的字体 - **默认字形:** 自动、正体、斜体、粗体、黑板粗体、花体、哥特体、无衬线、等宽等数学样式,与字体方案分别选择 - **字号与颜色:** 新公式和格式化命令使用的默认字号、颜色;“新建时跟随文字字号”优先采用光标或选区文字字号,无有效字号时使用固定值 - **JSON 导入 / 导出:** 保存或应用当前 Word / PowerPoint 的公式默认属性 编辑器中的临时选择仅用于当前公式,修改已有公式时沿用其保存的属性。升级、重装和卸载会保留公式默认属性、插入偏好、Word 编号布局及编辑器收藏。 **编辑器键盘行为** | 快捷键 | 功能 | |---|---| | 可视化区 `Enter` | 新建数学行 | | 可视化区 `Shift` + `Enter` | 插入或更新当前公式 | | 可视化区 `Ctrl` + `F` | 插入分式 | | 可视化区 `Ctrl` + `R` | 插入根号 | | 可视化区 `Ctrl` + `H` | 插入上标 | | 可视化区 `Ctrl` + `L` | 插入下标 | | 可视化区 `Ctrl` + `J` | 插入上下标 | | 源码区 `Tab` | 在光标处缩进 | | 源码补全列表 `Enter` | 接受当前补全项 | | `Esc` | 收回 MathLive 虚拟键盘 | ### 帮助窗口 通过功能区"帮助"按钮打开,根据当前宿主(Word 或 PowerPoint)显示对应内容: - 开始使用与公式编辑 - 设置、字体与预览 - 当前宿主的插入、转换、格式化等常用操作 - 社区与支持 宽窗口中目录固定在左侧,点击条目可跳转到对应章节;窄窗口中目录位于正文上方。页面随 Office 界面语言显示中文或英文。 --- ## 常见问题排查 ### 加载项未出现在功能区 **现象:** 安装后打开 Word 或 PowerPoint,功能区没有 LaTeXSnipper 标签页。 **排查步骤:** 1. 打开 Word / PowerPoint → 文件 → 选项 → 加载项 2. 在"管理"下拉列表中选择"COM 加载项",点击"转到" 3. 检查列表中是否有 **LaTeXSnipper** 4. 如果存在但未勾选,勾选后确定 5. 如果存在但被禁用,在"禁用的应用程序加载项"中重新启用 如果列表中完全没有 LaTeXSnipper: - 确认安装程序以管理员权限运行 - 检查杀毒软件是否拦截了安装 ### 连接桌面端失败 **现象:** 点击"连接"按钮后提示"无法连接到 LaTeXSnipper"。 **解决:** - 确认 LaTeXSnipper 桌面端正在运行 - 在桌面端设置中确认“自动化接口”已开启 - 检查防火墙是否拦截了 `127.0.0.1:28765` 端口 - Office 会读取当前用户状态目录中的 `automation-api.json`,无需设置端口或 token 环境变量 ### Word 公式转换提示缺少 Office 样式表 Word 插件从当前运行的 Word 安装目录读取 `MML2OMML.XSL` 和 `OMML2MML.XSL`,分别用于转为 Word 公式和从原生 Word 公式转换。仅在对应转换操作时加载,缺失不会阻止插件启动。若报错,请修复 Office 安装后重试;无需把 Office 安装到固定路径。 ### 公式编辑器加载失败 **现象:** 侧边栏或独立编辑器显示空白或加载错误。 **原因:** 公式编辑器依赖 Microsoft Edge WebView2 Runtime。如果系统中未安装或版本过旧,编辑器可能无法加载。 **解决:** - 从 下载并安装 WebView2 Runtime - Windows 11 和 Microsoft 365 通常已内置 WebView2 ### 截图 OCR 提示"正忙" **现象:** 点击截图识别后提示已有客户端正在等待下一次识别结果。 **原因:** 同一时间只允许一个本机客户端等待下一次桌面识别结果,已有等待任务尚未完成、取消或超时。 **解决:** 完成或取消当前等待任务后重试;无需关闭自动化接口。 ### 加载项被 Office 禁用 **现象:** 加载项之前正常使用,某次打开 Office 后消失了。 **原因:** Office 检测到加载项启动耗时过长或崩溃,将其自动禁用。 **解决:** - 文件 → 选项 → 加载项 → 管理"禁用的应用程序加载项" → 转到 - 找到 LaTeXSnipper,重新启用 - 如果频繁被禁用,查看 Office 加载项 Resiliency 注册表(`HKCU\Software\Microsoft\Office\{App}\Resiliency`)并清理对应条目 ### 安装后出现两个无图标程序条目 **现象:** Windows"设置 → 应用 → 已安装的应用"中出现 `LaTeXSnipper.OfficePlugin.WordVstoAddIn` 和 `LaTeXSnipper.OfficePlugin.PowerPointVstoAddIn` 无图标条目。 **说明:** 这些是 VSTO ClickOnce 部署的注册痕迹,属于正常现象。加载项安装程序已将其标记为系统组件,通常不会在用户界面上显示。如果仍然可见,不影响加载项的正常使用。 ---
# 第三卷 · LaTeXSnipper Mobile(移动端) ---
## LaTeXSnipper Mobile 介绍 LaTeXSnipper Mobile 是基于 Capacitor + Vite 构建的移动端公式 OCR 应用。前端采用 Web 技术栈(HTML/CSS/JS),Android 端通过 Java ONNX Runtime 执行本地推理,并提供 Capacitor iOS 工程。 ### 项目地址与版本 - GitHub: - 当前版本:**v1.3.1** - 构建方式:Vite 8 + Capacitor 8(Android/iOS) - 许可证:GNU AGPL-3.0 ### 与桌面版的关系 > **全平台生态** > > LaTeXSnipper Mobile 是独立的应用,不依赖桌面版 LaTeXSnipper。 > 两者共享 MathCraft OCR 模型体系,但不共享实现代码;Android 版使用 Java ONNX Runtime,而非桌面版的 Python 运行时。 > 桌面版的 Office 加载项和扩展格式导出不在移动版中提供。 ### 系统要求 - Android 10+(推荐 Android 12+) - 存储空间:应用本体不再内嵌完整 OCR 模型;首次使用前需按需下载约 188MB 的完整模型包,Pandoc 导出另需下载约 58MB 的 WASM 运行时 - RAM:推荐 6GB 以上(低端设备可能出现模型加载缓慢或 OOM) - 网络连接:首次下载 OCR 模型或 Pandoc WASM 时需要;完成下载后本地识别和离线导出不再依赖网络。自动更新检查、AI 整理及外部 API 始终需要网络 ## 功能与页面结构 移动端采用单页面 SPA 架构,底部导航栏包含 4 个主页面: ### 识别页面(OCR) 移动端的核心功能页面,顶部有三个识别模式标签: - **公式模式:** 仅检测和识别数学公式,输出 LaTeX 代码 - **混合模式:** 同时识别文本和公式,输出 Markdown + LaTeX 混合文档 - **文字模式:** 纯文本 OCR,不检测公式 识别图片的来源有 5 种方式: 1. **拍照识别:** 打开系统相机拍摄,支持矩形框选和套索裁剪,支持闪光灯、四角把手拖拽透视矫正、旋转滑块 2. **图片选择:** 从系统相册选取图片,自动识别 3. **PDF 识别:** 选择 PDF 文件,使用 pdfjs 逐页渲染为图片后识别 4. **手写识别:** 打开独立 Canvas 手写画板(支持压感、墨迹平滑、笔/橡皮擦、撤销/重做) 5. **文件拖放:** 将图片或 PDF 文件拖入识别区域 ### 编辑器页面 MathLive 所见即所得公式编辑器,支持中文界面和本地化: - **MathLive 编辑区:** 所见即所得数学公式编辑,开启 smartMode 自动识别数学/文本模式,smartFence 自动闭合括号 - **LaTeX 源码区:** 编辑器下方显示当前公式的 LaTeX 源码,与编辑区双向同步 - **快速符号工具栏:** 希腊字母(alpha beta pi theta omega)、运算符(sqrt int sum prod)、关系符(le ge rightarrow rightarrow infty) - **计算工具栏:** 求值、退格、常用 LaTeX 片段插入 - **三态键盘切换:** 详见"公式编辑器与键盘策略"章节 - **KaTeX 实时预览:** 编辑器内容通过 KaTeX 渲染为公式图片 - **导出菜单:** 支持 9 种导出格式 ### 历史记录页面 基于 IndexedDB 的本地存储,支持: - **滑动操作:** 右滑删除、左滑分享/复制/收藏(收藏触发阈值为 50% 位置) - **收藏筛选:** 过滤仅显示收藏项;收藏模式下清空只删除收藏条目 - **点击载入:** 点击历史条目自动填入公式编辑器 - **来源标记:** 每条历史记录标注来源(拍照/图片/PDF/手写) ### 设置页面 - **识别引擎:** 内置 MathCraft ONNX(默认)或外部 API(OpenAI-compatible) - **模型管理:** 按识别任务下载、导入、切换或删除模型包,支持断点续传、镜像源和 SHA256 完整性校验 - **加速模式:** ONNX Runtime 推理加速选项(CPU / NNAPI / GPU) - **渲染引擎:** KaTeX(轻量快速)或 MathJax(兼容性更好),完全离线 - **视觉皮肤:** 7 套视觉主题(Material 蓝 / MIUI 渐变 / iOS 蓝 / 樱花和风 / 黑客矩阵 / 暖咖纸墨 / 极简纤白) - **AI 整理:** DeepSeek 兼容 API 配置,用于识别结果纠错和格式化 - **多语言:** 简体中文 / 繁体中文 / 英文 / 日文 / 韩文 - **开发者面板:** 日志查看、版本信息、更新检查 ## 与桌面版的差异 > 移动端不是桌面版的简化版——LaTeXSnipper Mobile 基于完全不同的技术栈实现(Java ONNX Runtime + WebView),与桌面版 Python/PyQt 共享模型体系但不共享代码。功能取舍上更侧重移动场景,部分桌面功能不提供,也有桌面版没有的移动专属特性。 ### 移动端没有的桌面功能 - **Office 加载项:** Word / PowerPoint 插件只支持桌面 Windows,移动端不支持 - **全局截图快捷键:** 移动端不存在桌面端的操作系统级截图快捷方式 - **Pandoc 全格式导出:** AsciiDoc、reStructuredText、OPML 等格式在移动端已移除,保留 9 种常用格式 - **自定义环境变量:** 桌面发行由安装身份确定模型资源与 CPU/GPU 类型,移动端通过设置 UI 配置 - **多窗口管理:** 桌面端有主窗口、手写窗口、识别结果窗口等多个独立窗口,移动端为单页面应用 ### 移动端独有的桌面没有的功能 - **相机拍照识别:** 移动端利用手机摄像头拍摄文档和公式 - **套索裁剪:** 拍照后支持自由四边形框选和透视矫正 - **手写画板:** 移动端提供触控手写板(桌面端也有手写窗口,但移动端支持压感触控笔) - **更多视觉皮肤:** 7 套皮肤(桌面端仅有浅色/深色主题) - **自动更新检查:** 启动时检测 GitHub Release,移动端弹出系统更新提示 - **离线 PWA:** 可通过 Service Worker 缓存,支持离线使用 - **系统分享集成:** 结果可通过 Android/iOS 系统分享菜单发送到其他应用 - **三态键盘:** MathLive 虚拟键盘 / 系统原生键盘 / 关闭键盘的灵活切换 ### 技术栈差异 **桌面端** - Python / PyQt6 / PyInstaller - Python ONNX Runtime(公式/文字/混合识别) - Qt WebEngine(编辑器、公式渲染) - Pandoc 系统命令(文件格式转换) - Win32 / Carbon / pynput / GlobalShortcuts Portal(全局快捷键) **移动端** - Vite 8 / Capacitor 8 / WebView - Java ONNX Runtime Android(公式/文字/混合识别) - KaTeX / MathJax(公式渲染) - Pandoc WASM(格式转换,按需下载) - pdfjs-dist 4.2.67(PDF 渲染) ## OCR 识别与输入方式 ### 识别引擎架构 Android 端使用 Java ONNX Runtime 引擎,模型下载完成后在设备本地推理: - **公式检测(YOLOv8):** 标准模型包中的 `model.onnx`,输入 [1,3,768,768],采用 768x768 letterbox - **公式识别(TrOCR):** `encoder.onnx`(DeiT 编码器)+ `decoder.onnx`(束搜索解码) - **文字检测(DBNet):** 标准模型包中的 `model.onnx`,最长边 960,stride32 对齐 - **文字识别(CRNN):** 标准模型包中的 `model.onnx`,BGR 48x320 输入,CTC 解码 - **方向检测:** 文档方向模型随应用内置,用于 0/90/180/270 度自动校正 识别流程: ```text 图片 → 自动旋转(EXIF + ONNX 方向检测) → 模式选择: 公式模式:YOLOv8 检测 → TrOCR 识别 → LaTeX 输出 文字模式:DBNet 检测 → CRNN 识别 → 文本输出 混合模式:YOLOv8 检测 + DBNet 检测 → 区域裁剪合并 → 公式段:行分割 → TrOCR 逐行识别 → {aligned} 重组 → 文字段:CRNN 识别 → 版面输出(inline: $...$, display: $$...$$) ``` ### 拍照识别 移动端全屏相机支持: 1. 点击识别页相机按钮启动系统相机,自动对焦 2. 拍照后进入裁剪模式:矩形框选或自由套索(四角把手拖拽) 3. 支持旋转滑块(0-360 度) 4. 透视矫正:四边形扭曲自动矫正为矩形 5. 确认后自动进入识别 6. 大图自动压缩:大于 500KB 压缩到最长边 1920px ### 手写识别 移动端提供触控手写板(独立于桌面端的手写窗口): - **工具:** 笔 / 橡皮擦 - **墨迹处理:** 墨迹平滑(SMOOTH_WINDOW=3)、压感支持(触控笔) - **撤销/重做:** 栈式管理,最多保留 60 笔 - **画布调整:** 根据屏幕自动适配 - **颜色跟随:** 笔颜色自动跟随深色/浅色主题 - **识别:** 点击"识别"按钮,导出为 PNG 后走当前识别引擎 - **默认模式:** 从图片切换到手写时自动设为混合模式 ### 外部 API 识别 移动端支持连接外部 OCR API(OpenAI-compatible 协议): - **内置预设:** PaddleOCR-VL、硅基流动 Qwen2.5-VL、Gemini 2.5 Flash、MinerU 原生 - **连接测试:** 设置页中测试配置的有效性 - **AI 整理:** 配置 DeepSeek 兼容 API,对识别结果进行纠错和格式化 ## 公式编辑器与键盘策略 ### MathLive 编辑器配置 移动端使用 MathLive 0.104 作为所见即所得公式编辑器,核心配置: - mathVirtualKeyboardPolicy = manual — 不自动弹出虚拟键盘 - smartMode = true — 自动识别输入为数学模式还是文本模式 - smartFence = true — 自动闭合未配对的括号、花括号、方括号 - 中文本地化:通过 MathfieldElement.strings 注入完整中文 UI 文本 - 通过 new MathfieldElement() 创建而非 mathlive-field 标签(避免部分 WebView 不注册自定义元素) ### 三态键盘切换 针对移动端输入场景的特殊设计: 编辑器顶部的键盘按钮支持三种模式循环切换: 1. **关闭(默认):** 不弹出任何键盘,适合纯符号工具栏输入 2. **MathLive 虚拟键盘:** 弹出 MathLive 内置数学符号键盘,包含希腊字母、运算符、关系符等专用键位;通过 toggleVirtualKeyboard 命令唤起 3. **系统原生键盘:** 使用 textarea 代理接收焦点并触发 IME,输入事件转发到 MathLive 的 insert() 方法。系统键盘弹出时自动隐藏底部公式符号工具栏,腾出编辑空间 > **系统键盘实现机制** > > MathLive v0.104 中 sandboxed 策略被映射为 manual,无法在 Android WebView 中触发系统 IME。移动版采用 offscreen textarea 代理方案: > > - 代理以 position: fixed 覆盖编辑区接收焦点,触发系统键盘 > - input 事件触发 mathField.insert() 转发输入 > - Shadow DOM 的 contentEditable 在系统键盘模式下被禁用,配合 capture-phase focus guard 防止 MathLive 抢焦点 > - 零宽空格占位防止 Android 在内容清空时自动隐藏 IME > - 处理 Backspace、Enter、方向键和 CJK 输入法合成事件 ### 符号面板 编辑器底部提供快速符号工具栏: - **希腊字母:** alpha beta gamma pi theta mu sigma omega delta epsilon phi - **运算符:** sqrt int sum prod partial infty - **关系符:** le ge ne approx rightarrow rightarrow leftrightarrow - 点击符号直接在光标位置插入对应 LaTeX ### 渲染引擎 - **KaTeX(默认):** 轻量快速(265KB),HTML 输出模式原生支持中文混合显示,无中文字体渲染问题,资源完全离线 - **MathJax(可选):** 兼容性更好(1.1MB + 23 字体文件),启动阶段 splash 预加载,完全离线(无 CDN 依赖) ## 导出与分享 ### 9 种导出格式 | 格式 | 转换路径 | 说明 | |------|----------|------| | PNG | KaTeX → SVG → Canvas | 高清公式图片,含中文字体回退 | | SVG | KaTeX → SVG | 矢量公式图片 | | LaTeX | Pandoc WASM | .tex 文件格式 | | MathML | Pandoc WASM | 数学标记语言 | | Markdown | Pandoc WASM | markdown+tex_math_dollars | | HTML | Pandoc WASM | 网页格式 | | Typst | 纯 JS 转换器 | 200+ 符号映射 + 结构转换,不依赖 Pandoc | | Word | Pandoc WASM | .docx 格式 | | Plain Text | Pandoc WASM | 纯文本 | > **Typst 导出说明** > > Typst 导出使用纯 JS 转换器,包含 200+ LaTeX 到 Typst 符号映射(希腊字母、运算符、箭头、关系符、函数名)和结构转换(分数、根式、矩阵、cases、text 等)。不经过 Pandoc WASM,因为 pandoc-wasm 的 WASM 二进制对完整 LaTeX math mode 支持受限。 ### 分享功能 - **系统分享:** 通过 Capacitor Share API 将识别结果分享到其他应用 - **文件分享降级:** 当 Capacitor Share 在某些 Android 版本上传 base64 文件失败时,自动触发下载而非弹系统分享(避免"没有应用可执行此操作"的错误) - **复制到剪贴板:** 一键复制 LaTeX 源码 - **发送到编辑器:** 将识别结果填入公式编辑器,修改后再导出 ### Pandoc WASM 说明 > **移动端 Pandoc 导出注意事项** > > Pandoc WASM 二进制约 58MB,不再内嵌在 APK 中。首次使用依赖 Pandoc 的格式前,需在设置页下载并缓存 WASM 运行时。 > Android WebView 运行时有几点限制: > > - wasi_snapshot_preview1 模块在部分 WebView 中缺失,已通过 @bjorn3/browser_wasi_shim 垫片修复 > - WASM 加载路径已处理为 Capacitor 兼容路径,绕开 vite-plugin-wasm 生成的路径问题 > - 下载并校验完成后,Pandoc WASM 导出不再需要网络连接 ## 移动端常见问题 ### 模型加载失败或 OOM(内存不足) **现象:** 启动时进度条卡住,或识别时报"内存不足"直接闪退。 **原因:** OCR 模型体积较大,低端设备(4GB 以下 RAM)同时加载多个推理会话时可能 OOM;下载不完整或校验失败也会导致模型无法加载。 **解决:** - 在设置页加速模式中切换到较低加速级别 - 在模型管理中检查对应任务的模型是否已完整下载并通过 SHA256 校验 - 避免在识别时同时运行大型应用(如游戏、视频编辑) - 如果频繁 OOM,尝试减少识别模式切换频率(避免频繁加载/卸载不同模型) - 应用已启用 largeHeap(AndroidManifest.xml),但仍有物理限制 - 模型加载失败时会自动清理 session 并重试 ### 拍照识别卡顿或无法对焦 **现象:** 相机启动慢、对焦困难或拍照后裁剪界面卡顿。 **原因:** 移动端相机使用系统 WebView 的 getUserMedia API,其性能和对焦能力取决于 Android WebView 实现和系统相机 HAL。 **解决:** - 优先使用系统自带相机应用拍照,然后从相册选择图片识别 - 确保手机有足够光线的环境 - 拍照时保持手机稳定 - 大图自动压缩机制会处理大于 500KB 的图片,无需手动压缩 ### 手写板延迟或误触 **现象:** 手写识别延迟高,或手指/触控笔划线时出现误触。 **原因:** Canvas 触控事件在 WebView 中可能不如原生应用灵敏,某些廉价的触控屏或贴膜也可能导致触控不准。 **解决:** - 使用触控笔而非手指书写,效果更佳 - 手写板支持墨迹平滑(SMOOTH_WINDOW=3),轻微抖动会被自动过滤 - 如果橡皮擦不方便,可使用"清空"按钮一键清除 - 手写完成后点击"识别"按钮,不走自动识别(减少误触发) ### 导出失败(Pandoc WASM 相关问题) **现象:** 导出 Markdown/HTML/Word 等格式时卡住或报错。 **原因:** Pandoc WASM 模块加载失败,或 WASM 二进制损坏/缺失。 **解决:** - PNG、SVG、Typst 三种格式不依赖 Pandoc WASM,可直接导出 - 如果 Pandoc 依赖的格式导出失败,先尝试使用不依赖 Pandoc 的格式 - 重启应用后重试 - 在设置页删除并重新下载 Pandoc WASM - 检查开发者日志面板是否有 WASM 相关错误信息 ### AI 整理连接失败 **现象:** 点击"AI 整理"后提示连接失败或超时。 **原因:** AI 整理需要连接 DeepSeek 兼容 API,未配置正确的 API Key 或 Base URL,或网络不可用。 **解决:** - 前往设置页 AI 整理配置 API Endpoint 和 API Key - 确认手机网络连接正常 - 如果使用自定义 API,确保接口兼容 DeepSeek 的聊天补全格式 - AI 整理为可选功能,不配置不影响识别和导出 ### 更新检查失败 **现象:** 启动时检查更新失败或不弹更新提示。 **原因:** 更新检查访问 GitHub Releases API,国内用户可能无法直接访问。 **解决:** - 确保手机网络可访问 GitHub - 如果使用代理/VPN,确认已正确配置 - 更新检查失败不影响核心识别功能 - 手动去 GitHub Releases 页面下载最新 APK ### 外部 API 识别配置问题 **现象:** 切换到外部引擎后识别失败或提示配置有误。 **原因:** 外部 API 需要正确的协议类型、Base URL、模型名和可选的 API Key。 **解决:** - 设置页提供预设(PaddleOCR-VL、硅基流动、Gemini、MinerU 原生),一键填写常用配置 - 使用预设后再根据需要微调 Base URL 和模型名 - 配置完成后点击测试连接确认配置有效 - 移动端的外部 API 设置与桌面端类似,但预设列表可能不同 ### KaTeX / MathJax 渲染异常 **现象:** 公式在预览中显示为源码或渲染错乱。 **原因:** 渲染引擎切换后未完全加载,或公式包含特定语法导致渲染失败。 **解决:** - 在设置页切换公式渲染引擎尝试另一种引擎 - KaTeX 为默认引擎,轻量快速,绝大多数场景足够 - 如果公式含有 KaTeX 不支持的语法(如某些 LaTeX 宏包),切换到 MathJax 通常可以解决 - renderBlock 智能判断显示/内联模式:多行环境(begin{aligned}、$$...$$)按逻辑块分组渲染,不逐行切分 - 不含反斜杠的表达式(如 x^2 + y^2 = z^2)会被正确渲染(兜底逻辑) ### 历史记录丢失 **现象:** 重启应用后历史记录消失。 **原因:** 历史记录存储在 IndexedDB 中,清除应用数据或存储空间不足时可能丢失。 **解决:** - IndexedDB 数据与应用绑定,卸载应用会清除所有历史记录 - 重要的识别结果建议提前复制到其他地方保存 - 不要通过系统设置清除应用数据(会一并删除 IndexedDB) - 如果存储空间极度不足,Android 系统可能自动清除 IndexedDB ### PDF 识别页数限制 **现象:** 选择 PDF 后只识别了前面部分页面。 **原因:** 移动端限制 PDF 最多识别 100 页,识别时逐页渲染处理较慢。 **解决:** - 超过 100 页的 PDF 建议分卷处理或将长文档分段导出 - PDF 使用 pdfjs-dist 4.2.67 在 WebView 中逐页渲染为图片后识别,渲染目标 768px - 处理器密集,长文档建议在充电状态下操作 ### 移动端特定兼容性问题 > **WebView 兼容性注意事项** > > 以下问题已在开发中解决,但如果遇到异常,可参考: - **MathLive 自定义元素:** mathlive-field 在部分 WebView 中不注册,改用 new MathfieldElement() 创建 - **虚拟键盘策略:** 设置为 manual,不自动弹出;通过键盘按钮手动唤起 - **按钮事件:** 必须用 pointerdown + stopPropagation,click 在 WebView 中不可靠 - **COOP/COEP 头:** 已通过 Capacitor 和 Vite 配置,确保 WASM 加载正确 - **Service Worker:** 注册 /sw.js 用于离线缓存 - **PWA 安装:** 支持 beforeinstallprompt 事件,可添加到主屏幕 - **中文渲染:** SVG foreignObject 显式指定中文字体回退,避免中文方框问题 ### 移动端数据目录 > **关注存储占用** > > 移动端所有文件(模型、日志、历史记录)均存储在应用内部目录。 > 完整模型下载包约 188MB,Pandoc WASM 约 58MB;两者均按需下载到应用内部目录。 > 强烈不建议通过系统设置清除应用数据,否则所有模型和离线功能需要重新下载。 **应用数据目录位置** - **ONNX 模型:** 通过设置页模型管理下载或导入;仅文档方向模型和必要的 tokenizer/字典资源随应用提供 - **Pandoc WASM:** 首次启用相关导出格式时从设置页下载并缓存 - **历史记录:** IndexedDB(应用内部存储) - **日志:** localStorage(开发者日志面板查看) - **设置:** localStorage + Android SharedPreferences **额外存储占用** - 完整 OCR 模型包:约 188MB;也可按公式检测、公式识别、文字检测和文字识别分别下载 - Pandoc WASM:约 58MB,仅在需要 LaTeX、MathML、Markdown、HTML、Word 或纯文本导出时下载 - 实际占用还包括模型解压文件、历史记录、日志和导出文件,以系统设置显示为准 ---
# 第四卷 · MathCraft 内部模型介绍 ---
## MathCraft OCR 项目介绍 MathCraft OCR 是 LaTeXSnipper 内置的本地公式、文本与混合文档识别引擎,基于 ONNX Runtime 实现本地推理。桌面安装包已包含所需模型;独立库与 CLI 可按清单下载并缓存模型。资源完整后,截图、图片和 PDF 页面识别都可以离线完成。 **项目地址:** - GitHub: - PyPI: **主要特点:** - **本地离线识别:** 模型安装完成后无需网络连接,识别在本地完成 - **ONNX 运行时:** 基于 ONNX Runtime,支持 CPU 与 CUDA GPU 路径 - **多任务识别:** 支持公式、纯文字、混合文档与 PDF 文档识别 - **独立库 / CLI 自动缓存修复:** 按清单校验模型,缺失或损坏时复用有效缓存或按需下载修复 **独立库安装方式(桌面安装包无需执行):** ```bash pip install "mathcraft-ocr[cpu]" # CUDA 13(Python 3.11+): pip install "mathcraft-ocr[gpu]" # CUDA 12: pip install "mathcraft-ocr[gpu-cu12]" ``` 单独使用 PyPI 包时,请在干净环境中只选择一种 ONNX Runtime 后端;不要同时安装 `onnxruntime` 和 `onnxruntime-gpu`。CUDA 11 还需使用 ONNX Runtime 官方 CUDA 11 feed。LaTeXSnipper 桌面发行由安装器提供完整推理组件。 **命令行使用:** ```bash # 检查模型缓存状态 python -m mathcraft_ocr models check # 检查运行环境并预热模型 python -m mathcraft_ocr doctor --provider auto python -m mathcraft_ocr warmup --profile mixed --provider auto # 识别图片中的公式 python -m mathcraft_ocr ocr formula.png --profile formula --provider auto --json # 混合文档识别并输出 Markdown python -m mathcraft_ocr ocr page.png --profile mixed --provider auto --output result.md ``` **在 LaTeXSnipper 中使用:** 在设置页的"选择识别模型"中选择 **内置模型** 即可启用本地 MathCraft OCR;识别类型可选公式、混合(文字+公式)或纯文字。桌面端使用 CPU 安装器即可固定 CPU 推理;独立库的提供者配置见环境变量章节。 ### 模型集与识别配置 独立的 `mathcraft-ocr` PyPI 包版本为 `0.3.2`;它使用自己的版本线,不与 LaTeXSnipper v3.2.0 客户端或 Office 插件版本绑定。模型权重使用 MathCraft Models `v1.0.0` 发布集,包含 **4 个 ONNX 模型**: - `mathcraft-formula-det` — 数学公式区域检测(Formula Detection) - `mathcraft-formula-rec` — 公式到 LaTeX 识别(Formula Recognition) - `mathcraft-text-det` — 快速多语言文本检测(Text Detection) - `mathcraft-text-rec` — 快速多语言文本识别(Text Recognition) > [!NOTE] > **识别流程** > > MathCraft 采用 **先检测后识别** 的流水线架构: > 图片输入 → 公式区域检测 → 公式识别 + 文本检测 → 文本识别 → 结构化输出。 > 这种设计确保公式区域的识别优先级高于普通文本,避免公式被误判为正文。 **三种识别模式(Profiles):** - **`formula`** — 公式截图 → LaTeX 公式文本 - **`text`** — 纯文本 OCR → 文本 - **`mixed`** — 文本+公式混合文档 → Markdown 结构化文本 ### 识别效果展示 以下示例来自 MathCraft 的结构化块输出。彩色框标注了检测到的角色、顺序、分栏信息和置信度分数。 #### 英文数学论文:Abstract Algebra (p.18) 公式密集的英文数学论文页面,包含大量行内公式和展示公式。 ![mathcraft_abstract_algebra](mathcraft_abstract_algebra.png) #### 英文期刊:Dynamics Journal (p.5) 以展示公式为主的期刊页面,包含公式编号、标签、页眉和页码。 ![mathcraft_dynamics_journal](mathcraft_dynamics_journal.png) #### 中文讲义:Lecture Note (p.1) 中文数学文档页面,包含文本与公式混合排版。 ![mathcraft_chinese_lecture](mathcraft_chinese_lecture.png) #### 极限与级数:Limits and Series (p.1) 稀疏的标题/封面式页面,用于验证版面分析稳定性。 ![mathcraft_limits_series](mathcraft_limits_series.png) ### 性能参考 以下为本地 `block_layout_regression_v4` 基准测试数据(CUDA 环境): - 测试页数:10 - 总块数:495 - 总字符数:21,417 - Markdown 行数:304 - **平均每页耗时:8.34 秒** - 最快页面:1.33 秒 - 最慢页面:18.53 秒 > [!NOTE] > **稳定性保障** > > MathCraft OCR 的设计原则: > > - 仅依赖 ONNX Runtime,无 PyTorch 推理依赖 > - 基于清单(manifest)的文件校验与缓存修复 > - 断点续传支持(适用于慢速/不稳定网络) > - 公式检测优先于文本 OCR > - 结构化块输出:标题、段落、展示公式、页眉、页码、分栏 ## 环境变量设置指南 ### 桌面发行与独立库的边界 桌面安装包自带 Python、推理依赖、模型和运行库。桌面端不使用环境变量切换 CPU/GPU 类型或模型缓存目录;更换类型时请使用对应安装包。 单独使用 mathcraft-ocr 库或 CLI 时,`MATHCRAFT_HOME` 指定模型缓存目录;CLI 使用 `--provider` 参数选择计算提供者,Python API 使用 `provider_preference` 或 `providers` 参数。为独立 GPU 环境安装所需的 ORT 和运行库时遵循库的文档。桌面 GPU 发行自带匹配用户态库。 ### 临时配置示例 Windows PowerShell: ```powershell $env:MATHCRAFT_HOME = './models' python -m mathcraft_ocr doctor --provider cpu ``` Linux/macOS: ```bash MATHCRAFT_HOME=./models python -m mathcraft_ocr doctor --provider cpu ``` 网络代理 `HTTP_PROXY`、`HTTPS_PROXY` 可作用于应用下载和外部服务。Linux 预览图形变量 `LATEXSNIPPER_FORCE_LINUX_GRAPHICS_FALLBACKS` 与 `LATEXSNIPPER_DISABLE_LINUX_GRAPHICS_FALLBACKS` 只影响 Qt 图形后端,具体用法见平台章节。排障时优先使用应用诊断中的实际版本、提供者与日志。