Skip to content

다단 우측 단 단행 문단 줄간격 누락: vpos 보정 공식의 base 차감 무력화 #412

@planet6897

Description

@planet6897

현상

samples/exam_eng.hwp 1페이지 우측 단(단 1) 7번 문항 선택지 5개의 줄 간격이 좁게 렌더링됨.

위치 선택지 ①→② y delta 기대값 (vpos delta × scale)
좌측 단 1번 (pi=3→4, vpos delta=1642 HU) 21.89 px 21.91 px ✓
좌측 단 1번 ②→③ 이후 21.89 px 21.91 px ✓
우측 단 7번 (pi=34→35, vpos delta=1690 HU) 15.34 px 22.55 px

각 선택지마다 약 7.20 px씩 부족 → 5개 선택지 누적 약 28 px 위로 당겨져 시각적으로 좁아 보임.

원인

1차 원인 — 단행 문단 trailing line_spacing 누락

paragraph_layout.rs:2439-2444:

if (is_cell_last_line && cell_ctx.is_some()) || is_para_last_line {
    y += line_height;             // ← trailing line_spacing 누락
} else {
    y += line_height + line_spacing_px;
}

선택지(pi=34~38)는 단행(single-line) 문단이므로 is_para_last_line=truey += line_height (15.34 px) 만 적용. 다음 문단의 첫 줄 ls(540 HU = 7.20 px)가 누락됨.

2차 원인 — vpos 보정 무력화 (핵심)

layout.rs:1392-1430 의 vpos 보정 코드가 정상 작동하면 1차 손실이 보정되어야 하나, 우측 단에서 모두 applied=false 로 스킵됨:

  • 우측 단 vpos_page_base = 7060 (pi=33 첫 seg vpos)
  • col_area.y = 213.53 (body_area top)
  • 보정 공식: end_y = col_area.y + (vpos_end - 7060) × scale
  • pi=34 보정값: 262.49 px (sequential y_offset 356.07보다 작음)
  • 조건 end_y >= y_offset - 1.0 실패 → 스킵

좌측 단은 base=2144 (작아서 차감 영향 미미) 이라 조건 통과해 보정 적용됨.

핵심 모순

  • 보정 공식: col_area.y + (vpos_end - base) * scale
  • 실제 sequential 배치: col_area.y + vpos * scale (절대 vpos 사용)
  • base 차감이 보정값을 first-item의 vpos만큼 아래로 끌어내림 → 우측 단처럼 base가 큰 단에서는 보정값이 너무 작아 발동하지 않음

재현

cargo build --release
./target/release/rhwp export-svg samples/exam_eng.hwp -p 0
# output/exam_eng_001.svg 우측 단 7번 문항 선택지 ①~⑤ 줄간격 좁음

진단 스크립트 (보정 적용 여부):

grep VPOS_CORR ... # 우측 단 pi=34~50 모두 applied=false

검증 기준

  • 우측 단 7번 선택지 ①→② y delta = 22.55 px (=좌측 단의 ② 이후와 동일 패턴)
  • 기존 회귀 없음 (cargo test, 다단 샘플 시각 검증)

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