증상
samples/exam_science.hwp 페이지 2 우측 단 12번 문제 후속 단락(pi=61 " 는? (단, X는 임의의 원소 기호이고, A, B, C, D, 의 원자량은 각각 m-4, m-2, m+2, m+4 이다.) [3점]") 에서 9개 인라인 수식(X, A, B, C, D, m-4, m-2, m+2, m+4)이 본문 텍스트 흐름에 배치되지 않고 모두 한 점(gx=534.8, gy=1206.91)에 겹쳐 stack 되어 unreadable.
사용자 시각: 본문은 "(단, _는 임의의 _의 원소 기호이고, _, _, _, _, 의 원자량은 각각 _, _, _, _ 이다.)" 처럼 빈 자리, 페이지 하단에 9개 글리프 겹침 → "폰트 잘못 출력".
측정 데이터
페이지 2 우측 단 pi=61 영역 (y=1119~1218) 수식 그룹 좌표:
| 위치 |
개수 |
비고 |
| gy=1122 (cell row 0) gx=571, 607 |
2 |
인라인 표 셀 0 (정상) |
| gy=1141 (cell row 1) gx=571, 607 |
2 |
인라인 표 셀 1 (정상) |
| gy=1206.91 gx=534.8 |
9 |
모두 stack — 버그 |
기대 위치 (정상이라면):
- y=1169 (ls[1]):
(단, [X]는 ... [A], [B], [C], [D], 의 원자량은 각각
- y=1191 (ls[2]):
[m-4], [m-2], [m+2], [m+4] 이다.) [3점]
원인 가설
paragraph_layout 인라인 수식 배치 실패 → shape_layout.rs:140-152 fallback 경로 진입:
let inline_pos = tree.get_inline_shape_position(...);
if inline_pos.is_some() { return; } // 인라인 등록되어 있으면 스킵
// Fallback — eq_x = col_area.x (Justify), eq_y = para_y
let eq_x = match alignment {
Alignment::Center | Alignment::Distribute => ...,
Alignment::Right => ...,
_ => col_area.x, // ← 모든 수식이 같은 x 받음
};
let eq_y = para_y; // ← 모든 수식이 같은 y 받음
즉 paragraph_layout이 9개 수식의 inline_shape_position 등록을 실패 → shape_layout fallback 진입 → 모두 동일 좌표.
비교 (pi=18 vs pi=61)
pi=18 ("는? (단, 와 는 임의의 원소...", 4번 문제 후속) — 동일 패턴이나 정상:
- 수식 7개 distinct x (gy=447, 469)
- 첫 LINE_SEG lh=1150 (텍스트 줄)
- controls=7 (수식만)
pi=61 (12번 문제 후속) — 버그:
- 수식 9개 stack (gy=1206.91 gx=534.8)
- 첫 LINE_SEG lh=2864 (인라인 2×1 표가 차지)
- controls=10 (인라인 표 1 + 수식 9)
차이: pi=61은 첫 줄에 인라인 2×1 표(tac=true) 가 있다. 인라인 표가 후속 줄의 수식 inline_pos 등록을 방해하는 것으로 추정.
의심 코드 경로
src/renderer/composer.rs:120-145 — tac_controls 빌드. 인라인 표와 수식 모두 포함되어야 함.
src/renderer/layout/paragraph_layout.rs:1751 — run 내 run_tacs 순회로 인라인 수식 배치. tac_offsets_px 와 run 범위 매칭 실패 시 누락.
src/renderer/layout/paragraph_layout.rs:2259 — "빈 runs 줄 + tac" 분기. 큰 디스플레이 수식이 자체 LINE_SEG 가질 때만 작동.
재현
rhwp export-svg samples/exam_science.hwp -p 1 --debug-overlay -o output/debug/
# output/debug/exam_science_002.svg 의 pi=61 영역 (우측 단 y=1119..1218)
관련
마일스톤: M100
증상
samples/exam_science.hwp페이지 2 우측 단 12번 문제 후속 단락(pi=61" 는? (단, X는 임의의 원소 기호이고, A, B, C, D, 의 원자량은 각각 m-4, m-2, m+2, m+4 이다.) [3점]") 에서 9개 인라인 수식(X, A, B, C, D, m-4, m-2, m+2, m+4)이 본문 텍스트 흐름에 배치되지 않고 모두 한 점(gx=534.8, gy=1206.91)에 겹쳐 stack 되어 unreadable.사용자 시각: 본문은 "(단, _는 임의의 _의 원소 기호이고, _, _, _, _, 의 원자량은 각각 _, _, _, _ 이다.)" 처럼 빈 자리, 페이지 하단에 9개 글리프 겹침 → "폰트 잘못 출력".
측정 데이터
페이지 2 우측 단
pi=61영역 (y=1119~1218) 수식 그룹 좌표:기대 위치 (정상이라면):
(단, [X]는 ... [A], [B], [C], [D], 의 원자량은 각각[m-4], [m-2], [m+2], [m+4] 이다.) [3점]원인 가설
paragraph_layout인라인 수식 배치 실패 →shape_layout.rs:140-152fallback 경로 진입:즉 paragraph_layout이 9개 수식의 inline_shape_position 등록을 실패 → shape_layout fallback 진입 → 모두 동일 좌표.
비교 (pi=18 vs pi=61)
pi=18("는? (단, 와 는 임의의 원소...", 4번 문제 후속) — 동일 패턴이나 정상:pi=61(12번 문제 후속) — 버그:차이: pi=61은 첫 줄에 인라인 2×1 표(tac=true) 가 있다. 인라인 표가 후속 줄의 수식 inline_pos 등록을 방해하는 것으로 추정.
의심 코드 경로
src/renderer/composer.rs:120-145—tac_controls빌드. 인라인 표와 수식 모두 포함되어야 함.src/renderer/layout/paragraph_layout.rs:1751— run 내run_tacs순회로 인라인 수식 배치.tac_offsets_px와 run 범위 매칭 실패 시 누락.src/renderer/layout/paragraph_layout.rs:2259— "빈 runs 줄 + tac" 분기. 큰 디스플레이 수식이 자체 LINE_SEG 가질 때만 작동.재현
rhwp export-svg samples/exam_science.hwp -p 1 --debug-overlay -o output/debug/ # output/debug/exam_science_002.svg 의 pi=61 영역 (우측 단 y=1119..1218)관련
마일스톤: M100