fix: fragmented-function 前缀匹配,修复 sinx 误输出为 'sinx' 而非 '\sin x' #2

Open
opened 2026-10-15 01:27:21 +08:00 by Quentin · 0 comments
Owner

问题现象

当函数名被 Word 拆成多个 run 且紧贴变量时(如 <mi>s</mi><mi>i</mi><mi>n</mi><mi>x</mi>),输出 sinx 而非 \sin x。

根因

visitors/mrow_visitor.py 的 _check_fragmented_function_at_position 把所有连续单字母拼成整串 "sinx",然后只查整串是否在 MATH_FUNCTIONS 中,不做前缀匹配,导致 "sinx" 匹配失败、函数名未被识别。

(注:compat/legacy_adapter.py 的 _check_fragmented_function_at_level 早已是前缀匹配,仅 mrow_visitor 这一处遗漏。)

修复

改为前缀匹配(从最长 6 字母到最短 2 字母),只消耗函数名对应的字母,其余字母留给调用方继续转换。

验证

  • sinx/cosx/tanx → \sin x/\cos x/\tan x
  • 纯 sin/log → \sin/\log(不回归)
  • log_2(msub)→ \log_{2}(不回归)
  • BC = 2 拼接 → 仍正确(不回归)
  • test_mixed.docx 130 个 OMML 公式输出与上一轮修复相比零变化(纯增量)

关联 commit:93d0709

## 问题现象 当函数名被 Word 拆成多个 run 且紧贴变量时(如 `<mi>s</mi><mi>i</mi><mi>n</mi><mi>x</mi>`),输出 `sinx` 而非 `\sin x`。 ## 根因 `visitors/mrow_visitor.py` 的 `_check_fragmented_function_at_position` 把所有连续单字母拼成整串 `"sinx"`,然后只查整串是否在 `MATH_FUNCTIONS` 中,不做前缀匹配,导致 `"sinx"` 匹配失败、函数名未被识别。 (注:`compat/legacy_adapter.py` 的 `_check_fragmented_function_at_level` 早已是前缀匹配,仅 mrow_visitor 这一处遗漏。) ## 修复 改为前缀匹配(从最长 6 字母到最短 2 字母),只消耗函数名对应的字母,其余字母留给调用方继续转换。 ## 验证 - `sinx`/`cosx`/`tanx` → `\sin x`/`\cos x`/`\tan x` - 纯 `sin`/`log` → `\sin`/`\log`(不回归) - `log_2`(msub)→ `\log_{2}`(不回归) - `BC = 2` 拼接 → 仍正确(不回归) - `test_mixed.docx` 130 个 OMML 公式输出与上一轮修复相比零变化(纯增量) 关联 commit:`93d0709`
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Quentin/DoLuEdu-WordFileParse#2
No description provided.