현상
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=true → y += 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, 다단 샘플 시각 검증)
현상
samples/exam_eng.hwp1페이지 우측 단(단 1) 7번 문항 선택지 5개의 줄 간격이 좁게 렌더링됨.각 선택지마다 약 7.20 px씩 부족 → 5개 선택지 누적 약 28 px 위로 당겨져 시각적으로 좁아 보임.
원인
1차 원인 — 단행 문단 trailing line_spacing 누락
paragraph_layout.rs:2439-2444:선택지(pi=34~38)는 단행(single-line) 문단이므로
is_para_last_line=true→y += 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) × scaleend_y >= y_offset - 1.0실패 → 스킵좌측 단은
base=2144(작아서 차감 영향 미미) 이라 조건 통과해 보정 적용됨.핵심 모순
col_area.y + (vpos_end - base) * scalecol_area.y + vpos * scale(절대 vpos 사용)재현
cargo build --release ./target/release/rhwp export-svg samples/exam_eng.hwp -p 0 # output/exam_eng_001.svg 우측 단 7번 문항 선택지 ①~⑤ 줄간격 좁음진단 스크립트 (보정 적용 여부):
검증 기준