증상
samples/exam_science.hwp 페이지 1의 표 안 수식이 화학 기호(K⁺, X⁻, Ca²⁺, O²⁻ 등) 대신 rmK, rmX, rmCa, rmO, rmmol, itl, itaq 등 raw 식별자로 출력됨.
samples/pdf/hwp2022/exam_science.pdf 정답 PDF와 비교하면 페이지 1 전반에서 광범위하게 발생.
원인
HWP 수식(hwpeq) 문법에서 폰트 스타일 키워드 rm / it / bold 는 다음 식별자에 공백 없이 붙여 쓸 수 있다 (예: `rmK` = `rm` + `K`, `itl` = `it` + `l`, `rmmol` = `rm` + `mol`). 한컴 hwpeq 파서는 키워드 길이만큼만 소비하고 나머지는 다음 토큰으로 넘긴다.
`src/renderer/equation/tokenizer.rs:80 read_command()` 는 영문자/숫자를 끝까지 탐욕적으로 읽기 때문에 위 패턴이 단일 토큰이 되어 `src/renderer/equation/symbols.rs:181` `("rm", FontStyleKind::Roman)` 매핑과 매칭에 실패한다. 결과적으로 SVG 출력에 `rm` / `it` prefix가 그대로 글자로 남는다.
원본 스크립트 샘플 (exam_science.hwp s0.p12 표 / 페이지 1)
```
cell5 "rmK ^{+}" → 정답 K⁺
cell5 "rmX ^{-}" → 정답 X⁻
cell13 "rmCa ^{2+}" → 정답 Ca²⁺
cell13 "rmO ^{2-}" → 정답 O²⁻
cell2 "1`rmmol" → 정답 1 mol
cell2 "LEFT ( rmmol RIGHT )" → 정답 (mol)
```
페이지 1 본문에는 `rmKOH LEFT ( itaq RIGHT )` (KOH(aq)), `rmH _{2} O` LEFT ( itl RIGHT )` (H₂O(l)) 등 동일 패턴이 반복.
영향 범위
- `samples/exam_science.hwp` 페이지 1 전체 (이온/원소/단위/상태 표기 포함 모든 화학 수식)
- 동일 hwpeq 문법을 사용하는 다른 과학·수학 문서 광범위
수정 방향
`read_command()` 에서 식별자를 읽을 때, `symbols.rs:179 FONT_STYLES` (`bold`, `it`, `rm`)에 등록된 키워드가 prefix로 매치되면 거기서 토큰을 끊는다. 가장 긴 키워드 우선 (bold → it → rm).
영문 식별자 내부에 우연히 `rm` 등이 포함된 경우(`arm`, `firm` — 실제 hwpeq에 거의 없지만)는 prefix가 아니므로 영향 없음.
검증
- 수정 전후 SVG 비교: `output/svg/exam_science/` 페이지 1 표 안 수식이 K⁺, Ca²⁺ 등으로 정상 출력
- `samples/pdf/hwp2022/exam_science.pdf` 와 시각 비교
- 회귀 검증: `samples/` 내 다른 HWP 파일 SVG 출력 차이 확인
증상
samples/exam_science.hwp페이지 1의 표 안 수식이 화학 기호(K⁺, X⁻, Ca²⁺, O²⁻ 등) 대신rmK,rmX,rmCa,rmO,rmmol,itl,itaq등 raw 식별자로 출력됨.samples/pdf/hwp2022/exam_science.pdf정답 PDF와 비교하면 페이지 1 전반에서 광범위하게 발생.원인
HWP 수식(hwpeq) 문법에서 폰트 스타일 키워드
rm/it/bold는 다음 식별자에 공백 없이 붙여 쓸 수 있다 (예: `rmK` = `rm` + `K`, `itl` = `it` + `l`, `rmmol` = `rm` + `mol`). 한컴 hwpeq 파서는 키워드 길이만큼만 소비하고 나머지는 다음 토큰으로 넘긴다.`src/renderer/equation/tokenizer.rs:80 read_command()` 는 영문자/숫자를 끝까지 탐욕적으로 읽기 때문에 위 패턴이 단일 토큰이 되어 `src/renderer/equation/symbols.rs:181` `("rm", FontStyleKind::Roman)` 매핑과 매칭에 실패한다. 결과적으로 SVG 출력에 `rm` / `it` prefix가 그대로 글자로 남는다.
원본 스크립트 샘플 (exam_science.hwp s0.p12 표 / 페이지 1)
```
cell5 "rmK ^{+}" → 정답 K⁺
cell5 "rmX ^{-}" → 정답 X⁻
cell13 "rmCa ^{2+}" → 정답 Ca²⁺
cell13 "rmO ^{2-}" → 정답 O²⁻
cell2 "1`rmmol" → 정답 1 mol
cell2 "LEFT ( rmmol RIGHT )" → 정답 (mol)
```
페이지 1 본문에는 `rmKOH LEFT ( itaq RIGHT )` (KOH(aq)), `rmH _{2} O` LEFT ( itl RIGHT )` (H₂O(l)) 등 동일 패턴이 반복.
영향 범위
수정 방향
`read_command()` 에서 식별자를 읽을 때, `symbols.rs:179 FONT_STYLES` (`bold`, `it`, `rm`)에 등록된 키워드가 prefix로 매치되면 거기서 토큰을 끊는다. 가장 긴 키워드 우선 (bold → it → rm).
영문 식별자 내부에 우연히 `rm` 등이 포함된 경우(`arm`, `firm` — 실제 hwpeq에 거의 없지만)는 prefix가 아니므로 영향 없음.
검증