배경
Task #774 RFC 분석 결과, 이슈 #773 의 본문 압축 결함은 2개 independent paragraph spacing 결함 의 누적:
- H1': 단/페이지 첫 paragraph 의 ParaShape.spacing_before 누락
- H3b: zone 전환 시 ColumnDef.spacing / 2 vertical 추가 spacing 미적용
정정 대상
H1' — paragraph_layout.rs:744-748
```rust
// 현재 (defect)
let is_column_top = (y - col_area.y).abs() < 1.0;
if start_line == 0 && spacing_before > 0.0 && !is_column_top {
y += spacing_before;
}
// 정정 후보 (셀 안 paragraph 가드 추가)
let is_in_cell = cell_ctx.is_some();
if start_line == 0 && spacing_before > 0.0 && !is_in_cell {
y += spacing_before;
}
```
H3b — layout.rs:1240 영역
```rust
if is_new_zone {
if col_content.zone_y_offset > 0.0 {
let zone_top_extra = extract_columndef_spacing_px(col_content, paragraphs, dpi) / 2.0;
current_zone_start_y = prev_zone_y_end + zone_top_extra;
} else {
current_zone_start_y = 0.0;
}
last_zone_y_offset = col_content.zone_y_offset;
}
```
추가: typeset 측 base_available_height 동기화.
검증 기준
| 측정 |
기대 |
| shortcut.hwp 페이지 1 본문 baseline |
PDF 137.87 px ≈ rhwp 137.x (±2 px) |
| shortcut.hwp 페이지 2-7 본문 baseline |
PDF 정합 |
| sungeo.hwp pi=0 heading 위치 |
PDF 12.63 px ≈ rhwp 13.33 |
| treatise sample.hwp pi=0 heading 위치 |
PDF 23.69 px ≈ rhwp 24 |
| cargo test |
1217 passed (회귀 0) |
| 다단 layout 회귀 (Task #768/#770/#715) |
회귀 0 |
회귀 위험
| 영역 |
위험도 |
| 셀 안 paragraph (cell padding + sb 중복) |
중 |
| 페이지 over-flow (typeset 동기화 누락 시) |
중 |
| 다단 layout 회귀 |
중 |
| sb=0 / ColumnDef.spacing=0 케이스 |
없음 (변경 없음) |
산출물
본 RFC 의 산출물:
- `mydocs/report/task_m100_774_report.md` — RFC 최종 보고서
- `mydocs/tech/hancom_pdf_paragraph_spacing.md` — 알고리즘 모델
본 task
본 task 완료 시 이슈 #773 도 close.
배경
Task #774 RFC 분석 결과, 이슈 #773 의 본문 압축 결함은 2개 independent paragraph spacing 결함 의 누적:
정정 대상
H1' — paragraph_layout.rs:744-748
```rust
// 현재 (defect)
let is_column_top = (y - col_area.y).abs() < 1.0;
if start_line == 0 && spacing_before > 0.0 && !is_column_top {
y += spacing_before;
}
// 정정 후보 (셀 안 paragraph 가드 추가)
let is_in_cell = cell_ctx.is_some();
if start_line == 0 && spacing_before > 0.0 && !is_in_cell {
y += spacing_before;
}
```
H3b — layout.rs:1240 영역
```rust
if is_new_zone {
if col_content.zone_y_offset > 0.0 {
let zone_top_extra = extract_columndef_spacing_px(col_content, paragraphs, dpi) / 2.0;
current_zone_start_y = prev_zone_y_end + zone_top_extra;
} else {
current_zone_start_y = 0.0;
}
last_zone_y_offset = col_content.zone_y_offset;
}
```
추가: typeset 측 base_available_height 동기화.
검증 기준
회귀 위험
산출물
본 RFC 의 산출물:
본 task
본 task 완료 시 이슈 #773 도 close.