Skip to content

수식 SVG 레이아웃: 큰 디스플레이 TAC 수식이 줄 상단(y=col_area.y)으로 올라감 (exam_math_8) #287

@planet6897

Description

@planet6897

증상

samples/exam_math_8.hwprhwp export-svg 로 내보내면, (가) 박스 안의 큰 cases 수식 a_{n+1} = { a_n-3 ... | ½a_n ... } 이 박스 좌상단(body-clip 원점)에 찍혀 박스 테두리 및 "(가) 모든 자연수 n에 대하여" 줄과 겹친다. 한컴 PDF(samples/exam_math_8.pdf)에서는 이 수식이 "(가) ..." 줄 다음 줄에 단독으로(들여쓰기 되어) 배치된다.

작은 인라인 수식(n, m, 3, |a_m|=|a_{m+2}|)은 정상 배치된다.

재현

./target/release/rhwp export-svg samples/exam_math_8.hwp -o output/svg/exam_math_8/

SVG 의 큰 수식 그룹 transform:

<g transform="translate(71.80, 147.38) scale(0.9736,1)">  <!-- col_area 원점 -->

원인 (조사 결과 요약)

  • 문단 0.0 LINE_SEG 는 3줄:
    • ls[0] vpos=0, lh=1150 — "(가) 모든 자연수 n에 대하여"
    • ls[1] vpos=1898, lh=4095큰 cases 수식 전용 줄
    • ls[2] vpos=6741, lh=1150 — "이다."
  • 수식 4개 모두 tac=true (인라인). 큰 수식도 인라인이지만 자기 몫의 줄 높이(4095 HU)를 가짐.
  • 경로: paragraph_layout.rs:1574-1620 (TAC 인라인 수식 분기).
  • paragraph_layout.rs:716-729has_tac_shape && raw_lh > max_fs * 1.5 조건이 TAC Shape 만 대상으로 하고 있어, TAC Equation 이 줄 높이를 키운 동일 상황을 처리하지 못함.
  • 결과: 큰 수식의 line_height 가 폰트 기반(~18 px)으로 축소되고, ls[1] vpos 오프셋이 반영되지 않아 줄 상단이 ls[0] 과 같은 y 가 됨. eq_y = (y + baseline - layout_box.baseline).max(y) (paragraph_layout.rs:1586) 의 .max(y) clamp 가 음수 보정을 막아 y 가 col_area.y 에 고정됨.
  • x 축도 col_area.x 로 전파되어 박스 중앙 정렬/들여쓰기 미반영.

범위

  • 수정 대상: src/renderer/layout/paragraph_layout.rs
    • has_tac_shape 판정 확장 (Equation 포함) 또는 별도 has_tac_large_equation 분기
    • 큰 디스플레이 수식에 대한 text_y / eq_y 재계산
    • ls vpos 가 수식 줄에 적용되는지 파이프라인 확인
  • 회귀 방지: samples/exam_math.hwp, samples/equation-lim.hwp 포함 기존 수식 샘플 시각 비교
  • 연관(아님): 수식 SVG 렌더링: 괄호 path 폭이 폰트 글리프 대비 과대 (#280 Phase 2) #283 (괄호 path 폭) — 이 이슈와 별개 영역

검증

  • exam_math_8.hwp SVG 가 PDF 와 시각적으로 동일 배치
  • exam_math.hwp 16개 수식 회귀 없음
  • equation-lim.hwp 회귀 없음
  • cargo test --lib 전수 통과, clippy clean

관련

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions