3.5 KiB
3.5 KiB
LaTeX 字符渲染问题 - 快速修复指南
问题
识别完成后,\lambda 和 \vdots 等 LaTeX 字符没有被正确渲染。
根本原因
不是前端二次处理问题,也不是 LaTeX 语法问题,而是后端 MathML Unicode 实体映射不完整。
在 app/services/converter.py 的 _postprocess_mathml_for_word() 函数中,Pandoc 生成的 Unicode 实体(如 λ 和 ⋮)没有被完整转换为实际字符(λ 和 ⋮)。
已实施的修复
1. 扩展 Unicode 实体映射表
文件: app/services/converter.py
修改内容:
- ✅ 新增 24 个小写希腊字母映射
- ✅ 新增 24 个大写希腊字母映射
- ✅ 新增所有省略号符号(
\vdots,\cdots,\ddots,\iddots,\ldots) - ✅ 新增 50+ 个常用数学符号
- ✅ 新增十进制格式实体处理
2. 支持的字符示例
| 问题字符 | Unicode | 修复前 | 修复后 |
|---|---|---|---|
\lambda |
λ | λ 未转换 |
✅ 转换为 λ |
\vdots |
⋮ | ⋮ 未转换 |
✅ 转换为 ⋮ |
\Lambda |
Λ | Λ 未转换 |
✅ 转换为 Λ |
\cdots |
⋯ | ⋯ 未转换 |
✅ 转换为 ⋯ |
\infty |
∞ | ∞ 未转换 |
✅ 转换为 ∞ |
\sum |
∑ | ∑ 未转换 |
✅ 转换为 ∑ |
验证步骤
1. 运行测试(可选)
cd /Users/yoge/dev/yoge/doc_processer
python test_unicode_fix.py
2. 测试 API 端点
# 测试 lambda 和 vdots
curl -X POST "http://localhost:8000/api/v1/convert/latex-to-omml" \
-H "Content-Type: application/json" \
-d '{"latex": "\\lambda_1, \\lambda_2, \\vdots, \\lambda_n"}'
3. 检查前端(如果后端正常)
如果 API 返回正确但前端显示有问题:
- 检查 API 响应: 使用浏览器开发者工具查看实际返回的内容
- 检查 MathJax/KaTeX: 确认渲染库版本和配置
- 检查字体加载: 确认数学字体正确加载
- 检查 JS 错误: 控制台是否有报错
诊断工具
如果仍有问题,使用诊断工具
# 诊断后处理管道
python diagnose_latex_rendering.py "$\lambda + \vdots$"
# 测试完整转换流程
python test_unicode_fix.py
技术细节
修改位置
文件: app/services/converter.py
函数: _postprocess_mathml_for_word()
行数: ~420-485
修改内容
-
扩展
unicode_map字典:- 从 ~33 个映射增加到 ~180 个映射
- 覆盖所有常用希腊字母和数学符号
-
新增十进制实体处理:
decimal_patterns = [ (r'λ', 'λ'), # lambda (decimal) (r'⋮', '⋮'), # vdots (decimal) # ... 更多映射 ]
为什么这样修复
- Pandoc 输出格式多样: 可能输出十六进制或十进制实体
- Word 偏好 Unicode: 直接使用 Unicode 字符而非实体
- 性能优化: 字符串替换速度快,影响小
- 兼容性好: 不影响现有功能
总结
| 方面 | 状态 |
|---|---|
| LaTeX 语法 | ✅ 正确 |
| OCR 后处理 | ✅ 不修改 \lambda 和 \vdots |
| MathML 转换 | ✅ 已修复(扩展实体映射) |
| 前端处理 | ❓ 需要验证 |
建议:
- 先测试后端 API 是否返回正确的 Unicode 字符
- 如果后端正常,再检查前端渲染
- 使用提供的诊断工具定位具体问题
文档
详细报告: /Users/yoge/dev/yoge/doc_processer/docs/LATEX_RENDERING_FIX_REPORT.md