# LaTeX 后处理完整方案总结 ## 功能概述 实现了一个安全、智能的 LaTeX 后处理管道,修复 OCR 识别的常见错误。 ## 处理管道 ``` 输入: a _ {i 1} + \ vdots ↓ Stage 0: 数字错误修复 修复: 2 2. 2 → 22.2 结果: a _ {i 1} + \ vdots ↓ Stage 1: 拆分粘连命令 修复: \intdx → \int dx 结果: a _ {i 1} + \vdots ↓ Stage 2: 清理 LaTeX 语法空格 ← 新增 修复: a _ {i 1} → a_{i1} 修复: \ vdots → \vdots 结果: a_{i1}+\vdots ↓ Stage 3: 微分规范化 (已禁用) 跳过 结果: a_{i1}+\vdots 输出: a_{i1}+\vdots ✅ ``` ## Stage 详解 ### Stage 0: 数字错误修复 ✅ **目的**: 修复 OCR 数字识别错误 **示例**: - `2 2. 2` → `22.2` - `1 5 0` → `150` - `3 0. 4` → `30.4` **安全性**: ✅ 高(只处理数字和小数点) --- ### Stage 1: 拆分粘连命令 ✅ **目的**: 修复 OCR 命令粘连错误 **示例**: - `\intdx` → `\int dx` - `\cdotdS` → `\cdot dS` - `\sumdx` → `\sum dx` **方法**: 基于白名单的智能拆分 **白名单**: ```python _COMMANDS_NEED_SPACE = { "cdot", "times", "div", "pm", "mp", "int", "iint", "iiint", "oint", "sum", "prod", "lim", "sin", "cos", "tan", "cot", "sec", "csc", "log", "ln", "exp", "partial", "nabla", } ``` **安全性**: ✅ 高(白名单机制) --- ### Stage 2: 清理 LaTeX 语法空格 ✅ 新增 **目的**: 清理 OCR 在 LaTeX 语法中插入的不必要空格 **清理规则**: #### 1. 下标/上标操作符空格 ```latex a _ {i 1} → a_{i1} x ^ {2 3} → x^{23} ``` #### 2. 大括号内部空格(智能) ```latex a_{i 1} → a_{i1} (移除空格) y_{\alpha} → y_{\alpha} (保留命令) ``` #### 3. 分式空格 ```latex \frac { a } { b } → \frac{a}{b} ``` #### 4. 命令反斜杠后空格 ```latex \ alpha → \alpha \ beta → \beta ``` #### 5. 命令后大括号前空格 ```latex \sqrt { x } → \sqrt{x} \sin { x } → \sin{x} ``` **安全性**: ✅ 高(只清理明确的语法位置) --- ### Stage 3: 微分规范化 ❌ 已禁用 **原计划**: 规范化微分符号 `dx → d x` **为什么禁用**: - ❌ 无法区分微分和变量名 - ❌ 会破坏 LaTeX 命令(`\vdots` → `\vd ots`) - ❌ 误判率太高 - ✅ 收益小(`dx` 本身就是有效的 LaTeX) **状态**: 禁用,提供可选的上下文感知版本 --- ## 解决的问题 ### 问题 1: LaTeX 命令被拆分 ✅ 已解决 **原问题**: ```latex \vdots → \vd ots ❌ \lambda_1 → \lambd a_1 ❌ ``` **解决方案**: 禁用 Stage 3 微分规范化 **结果**: ```latex \vdots → \vdots ✅ \lambda_1 → \lambda_1 ✅ ``` ### 问题 2: 语法空格错误 ✅ 已解决 **原问题**: ```latex a _ {i 1} (OCR 识别结果) ``` **解决方案**: 新增 Stage 2 空格清理 **结果**: ```latex a _ {i 1} → a_{i1} ✅ ``` ### 问题 3: Unicode 实体未转换 ✅ 已解决(之前) **原问题**: ``` MathML 中 λ 未转换为 λ ``` **解决方案**: 扩展 Unicode 实体映射表 **结果**: ``` λ → λ ✅ ⋮ → ⋮ ✅ ``` --- ## 完整测试用例 ### 测试 1: 下标空格(用户需求) ```latex 输入: a _ {i 1} 输出: a_{i1} ✅ ``` ### 测试 2: 上标空格 ```latex 输入: x ^ {2 3} 输出: x^{23} ✅ ``` ### 测试 3: 分式空格 ```latex 输入: \frac { a } { b } 输出: \frac{a}{b} ✅ ``` ### 测试 4: 命令空格 ```latex 输入: \ alpha + \ beta 输出: \alpha+\beta ✅ ``` ### 测试 5: LaTeX 命令保护 ```latex 输入: \vdots 输出: \vdots ✅ (不被破坏) 输入: \lambda_{1} 输出: \lambda_{1} ✅ (不被破坏) ``` ### 测试 6: 复杂组合 ```latex 输入: \frac { a _ {i 1} } { \ sqrt { x ^ {2} } } 输出: \frac{a_{i1}}{\sqrt{x^{2}}} ✅ ``` --- ## 安全性保证 ### ✅ 保护机制 1. **白名单机制** (Stage 1) - 只拆分已知命令 - 不处理未知命令 2. **语法位置检查** (Stage 2) - 只清理明确的语法位置 - 不处理模糊的空格 3. **命令保护** (Stage 2) - 保留反斜杠后的内容 - 使用 `(?