Skip to content

Task #435: exam_kor.hwp 24→22 페이지 정합 (#393 옵션 A col 1 reserve 정정)#442

Closed
planet6897 wants to merge 5 commits into
edwardkim:develfrom
planet6897:local/task435
Closed

Task #435: exam_kor.hwp 24→22 페이지 정합 (#393 옵션 A col 1 reserve 정정)#442
planet6897 wants to merge 5 commits into
edwardkim:develfrom
planet6897:local/task435

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

변경 내용

버그

samples/exam_kor.hwp 의 body-wide TopAndBottom 표 (pi=0 wrap=TopAndBottom vert=Paper(38mm)) 처리 시:

  • 표가 paper 38mm (= 143.6 px) 부터 시작 (헤더 영역)
  • 본문 영역 (margin_top 56mm = 211.7 px) 안으로 79.2 px 침범
  • HWP 실제 col 1 시작점: vpos=7085 HU = 94.5 px (body-rel)
  • rhwp 산정 reserve: 306.1 px (= shape_y_offset + h + outer_bottom, paper-rel 좌표를 body-rel 처럼 누적)
  • 차이: +211.6 px 과대

이로 인해 col 1 의 가용 공간이 부족해져 paragraph split 발생, page 2 (49px) / page 15 (104px) orphan 페이지 생성.

수정

-if matches!(common.vert_rel_to, VertRelTo::Paper) {
-    let shape_top_abs = ...vertical_offset...;
-    let shape_bottom_abs = shape_top_abs + ...height...;
-    if shape_bottom_abs <= body_top { continue; }
-}
-let shape_y_offset = ...vertical_offset...;
-if shape_y_offset > body_h / 3.0 { continue; }
-let bottom = shape_y_offset + shape_h + outer_bottom;
+let raw_v_offset = ...vertical_offset...;
+
+// body-rel 기준 시작/끝 y 계산.
+// - VertRelTo::Paper: body_top 차감. 본문과 안 겹치면 skip, 일부만 겹치면 침범 영역만 reserve.
+// - VertRelTo::Page / Para: vertical_offset 이 이미 body-rel.
+let (body_y, body_bottom) = if matches!(common.vert_rel_to, VertRelTo::Paper) {
+    let shape_top_abs = raw_v_offset;
+    let shape_bottom_abs = shape_top_abs + shape_h;
+    if shape_bottom_abs <= body_top { continue; }
+    ((shape_top_abs - body_top).max(0.0), shape_bottom_abs - body_top)
+} else {
+    (raw_v_offset, raw_v_offset + shape_h)
+};
+
+if body_y > body_h / 3.0 { continue; }
+let bottom = body_bottom + outer_bottom;

결과 메트릭

메트릭 Before After
exam_kor.hwp 페이지 수 24 22
Orphan 페이지 (page 2, 15) 2개 0
pi=0.30 split PartialParagraph FullParagraph
pi=1.25 split PartialParagraph FullParagraph
col 1 reserve (Paper-rel body-wide table) 306.1px 94.4px (HWP 실측 94.5 와 ±0.2px)

회귀 검증

문서 Before After 결과
exam_kor.hwp 24 22 -2 (목표 진행)
exam_eng.hwp 8 8
k-water-rfp.hwp 28 28
hwpspec.hwp 177 177
synam-001.hwp 35 35

cargo test --release: 1062 passed, 0 failed

잔여 작업 (별도 이슈로 분리)

22→20 페이지 정합 미달성 — 다음 3 가지 별도 메커니즘:

Test plan

  • cargo build --release --bin rhwp 성공
  • cargo test --release 1062 passed, 0 failed
  • rhwp dump-pages samples/exam_kor.hwp -p 0 → 단 1 used 1207.6 → 1035.8 px
  • rhwp dump-pages samples/exam_kor.hwp -p 13 → 단 1 used 1193.5 → 1076.9 px
  • rhwp export-svg samples/exam_kor.hwp → 22 SVG (was 24)
  • 회귀 검증: exam_eng 8 / k-water-rfp 28 / hwpspec 177 / synam-001 35 페이지 유지
  • RHWP_TYPESET_DRIFT=1 로 col 1 reserve 변화 (306.1 → 94.5) 정량 확인

단계별 커밋

  • e0cdc2e Stage 1: 베이스라인 측정 + 진단 데이터 수집
  • 0879f11 Stage 2: col 1 reserve 정정 (typeset.rs 32 lines)
  • bd08d6b Stage 3: 일반 페이지 누적 부족 조사 (코드 변경 없음)
  • 0a096fc Stage 5: 최종 결과보고서 + 오늘할일 갱신

관련

  • 수행계획서: mydocs/plans/task_m100_435.md
  • 구현 계획서: mydocs/plans/task_m100_435_impl.md
  • 단계별 보고서: mydocs/working/task_m100_435_stage{1,2,3}.md
  • 최종 보고서: mydocs/report/task_m100_435_report.md

planet6897 and others added 5 commits April 29, 2026 11:54
exam_kor.hwp 24페이지 → 20페이지 정합 작업 1단계.

- 페이지별 단별 used/hwp_used/diff CSV (output/debug/task435/)
- 회귀 대상 5문서 페이지 수 (exam_kor 24, exam_eng 8, k-water-rfp 28, hwpspec 177, synam-001 35)
- RHWP_TYPESET_DRIFT 출력 캡처 (pi=0.30, pi=1.25 split 진단)
- compute_body_wide_top_reserve_for_para 산정 경로 추적

핵심 진단: col 1 reserve 306.1px (HWP 실제 94.5px 대비 +211.6px 과대).
원인: Paper-rel 좌표를 body-rel 변환 없이 그대로 reserve 에 누적.
Stage 2 에서 typeset.rs:2127-2172 의 VertRelTo::Paper 분기 정정.

수행계획서/구현계획서/Stage 1 보고서 포함.
compute_body_wide_top_reserve_for_para 의 VertRelTo::Paper 분기에서
body-rel 변환 누락 정정. body 와 일부만 겹치는 (header→body 침범)
케이스에서 Paper-rel 좌표를 그대로 reserve 에 누적하던 버그 수정.

수정 전 reserve = shape_y_offset(paper) + h + outer_bottom = 306.1 px
수정 후 reserve = max(0, shape_top_abs - body_top) ... = 94.4 px

결과:
- exam_kor.hwp: 24 → 22 페이지 (page 2, 15 orphan 해소)
- pi=0.30, pi=1.25 split → FullParagraph
- 회귀: exam_eng 8, k-water-rfp 28, hwpspec 177, synam-001 35 유지
- cargo test: 1062 passed

Stage 3 에서 일반 페이지 누적 -100~-300px 정정 (22 → 20).
원래 가설 ("표/도형 후 컬럼 잔여 공간 산정 부족") 재검토.
RHWP_TYPESET_DRIFT 분석 결과 diff 메트릭은 typeset cur_h 누적
(height_for_fit, trail_ls 제외) vs hwp_used (last line vpos+lh)
의 좌표계 차이를 측정하는 것일 뿐, "rhwp 가 채울 수 있는데 못 채운
잔여 공간" 이 아님을 확인.

실제 22→20 페이지 단축 장애물:
1. 섹션 1 페이지 14: Square wrap 표 + col 0 over-fill (1225>1211)
   → col 1 under-use (64px)
2. 섹션 1 페이지 15: 단일 컬럼 출력 (단정의는 2단인데 단 1 누락)
3. 섹션 2 페이지 18: pi=11 split + pi=13 [단나누기] orphan-like

3가지 전부 해결 시 22→19 가능 (목표 20 도달).

옵션 A/B/C 결정 필요 (현 상태 종료 / Stage 4 확장 / Stage 4 부분).
옵션 A 종료: 24→22 페이지 (Stage 2 col 1 reserve 정정).
잔여 22→20 미달성, 3가지 별도 메커니즘 (Square wrap over-fill,
단일 컬럼 출력 버그, col 0 cur_h over-advance) 별도 task 분리 권고.

edwardkim#393 (옵션 A) 본 task Stage 2 로 적용 완료, close 가능.
edwardkim added a commit that referenced this pull request Apr 29, 2026
- mydocs/pr/pr_442_review.md (Task #435 cherry-pick 검토)
- mydocs/pr/pr_442_report.md (cherry-pick 머지 결정 + Canvas 시각 판정 통과)
- mydocs/orders/20260429.md (PR #442 완료 행 추가)

검증: 1066 passed + svg_snapshot 6/6 + issue_418 1/1 + clippy 0 + WASM 4,174,855 bytes
광범위 byte 비교: 285/309 동일, 24 차이 (exam_kor 한정 — 의도된 정정)
시각 판정: 작업지시자 Canvas (rhwp-studio) 통과
본질: typeset.rs Paper-rel→body-rel 변환 정정 (32 lines)
exam_kor 24→22 페이지 (page 2/15 orphan 제거), col 1 reserve 306.1→94.5px (HWP ±0.2)
잔여 22→20 정합: #439/#440/#441 별도 이슈 (작은 단위 회전 정책 부합)
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 님 PR 감사드립니다. 메인테이너가 cherry-pick 으로 devel 에 적용 완료했습니다.

집요한 진단 + 정밀한 측정 (HWP 실측 94.5 px ±0.2) + 잔여 작업 분리 등록 (#439/#440/#441) 모두 좋습니다.

처리

작성자 attribution 보존 4 commits cherry-pick (merge commit 제외):

devel 머지 commit: 82b6438

검증

광범위 byte 단위 비교

10 샘플 / 309 페이지 SVG 비교: 285/309 동일, 24/309 차이 (exam_kor 한정).

차이 분포:

  • exam_kor 24 페이지 모두 (정정 대상)
  • 다른 9 샘플 (aift / biz_plan / exam_eng / exam_math / k-water-rfp / kps-ai / 2025년 기부 / synam-001 / equation-lim) 회귀 0건

→ 본 PR 영향이 exam_kor 에 정확히 한정됨을 byte 단위로 확인.

시각 판정 (작업지시자 직접)

경로 결과
Canvas (rhwp-studio 웹 에디터, WASM) 통과 ✅

페이지 수 24→22, page 2/15 orphan 페이지 제거 정상 확인.

본 PR 의 좋은 점

  1. 정밀 진단: HWP 실측값 (94.5 px) 과 ±0.2px 까지 일치 — 도메인 이해도 높음
  2. 변경 범위 한정: 단일 함수 32 라인, 영향이 exam_kor 에 정확히 한정
  3. 잔여 작업 분리 (Square wrap 표 직후 col 0 over-fill (exam_kor 페이지 14 단 0 1225>1211) #439/다단 섹션에서 [단나누기] 후 새 페이지가 단일 컬럼으로 출력 (exam_kor 페이지 15) #440/다단 col 0 cur_h 가 HWP vpos 대비 ~100px over-advance (exam_kor 섹션 2 페이지 18) #441): 22→20 정합 미달성을 별도 이슈로 분리 — 메인테이너 작은 단위 회전 정책 (feedback_small_batch_release_strategy) 정확 인지
  4. 케이스별 명시 가드: VertRelTo::Paper 분기 명시 + body_top 차감 — feedback_hancom_compat_specific_over_general 원칙 부합

이슈 #435, #393 도 함께 close 됩니다. 잔여 작업 (#439/#440/#441) 도 같은 집요함으로 이어가실 것 같습니다. 감사합니다.

@edwardkim edwardkim closed this Apr 29, 2026
edwardkim added a commit that referenced this pull request Apr 29, 2026
- mydocs/pr/pr_443_review.md (Task #439 cherry-pick 검토)
- mydocs/pr/pr_443_report.md (cherry-pick 머지 결정 + SVG/Canvas 시각 판정 통과)
- mydocs/orders/20260429.md (PR #443 완료 행 추가)

검증: 1066 passed + svg_snapshot 6/6 + issue_418 1/1 + clippy 0 + WASM 4,178,523 bytes
광범위 byte 비교: 298/307 동일, 9 차이 (exam_kor 한정 — 의도된 정정)
시각 판정: 작업지시자 SVG + Canvas 양 경로 통과
본질: typeset.rs Square wrap 표 누적 정책 max 적용 (32 lines)
exam_kor 22→20 (페이지 14+15 통합), col 0 1225.8→1036.1px, col 1 64.3→1016.9px
@planet6897 본 사이클 9번째 PR (가장 활발), PR #442 머지 직후 잔여 작업 즉시 처리
@planet6897 planet6897 deleted the local/task435 branch April 30, 2026 00:02
@planet6897 planet6897 restored the local/task435 branch May 3, 2026 23:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants