Skip to content

exam_science 12번 문제 인라인 수식 9개 배치 결함 — 인라인 표 뒤 수식이 fallback 경로로 한 점에 stack #526

@planet6897

Description

@planet6897

증상

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-145tac_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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions