Skip to content

Task #362: kps-ai p56 외부 표 안 콘텐츠 클립 회귀 해소 (TAC 셀 vpos 클램프)#374

Closed
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:local/task362
Closed

Task #362: kps-ai p56 외부 표 안 콘텐츠 클립 회귀 해소 (TAC 셀 vpos 클램프)#374
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:local/task362

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

요약

samples/kps-ai.hwp 56쪽 외부 표 (pi=535, 1×1 TAC, 635.0×865.1px) 안에
배치된 11개 문단 + 7×6 내부 표가 외부 셀 경계를 초과해 마지막 행이
시각적으로 클립되던 v0.7.3 대비 회귀를 해소한다.

closes #362

원인

커밋 f3ba9eb (Task #347 cont) 가 셀 첫 줄의 y 좌표를
cell_y + pad_top + LineSeg.vertical_pos[0] 으로 적용했다.
exam_eng.hwp p4 Q27/Q28 박스의 ~1mm 미세 오프셋 보정에는 효과적이었으나,
셀 콘텐츠가 셀 높이에 꽉 찬 케이스(kps-ai p56 외부 표) 에서는
vpos=2000 HU(≈26.67px) 만큼 콘텐츠 전체가 아래로 밀려
외부 셀(y=148.28 + h=865.05 → bottom=1013.33)을 초과해
마지막 inner row(이전 y=995.73 + h=38.63 → bottom=1034.36)가
21px 클립되었다.

변경 내용

src/renderer/layout/table_layout.rs::layout_table_cells 에서
text_y_start 계산 시 vpos 를 셀 내부 여유 공간(inner_height - total_content_height) 으로 클램프한다. 여유가 충분한 케이스에서는
기존 #347 동작이 그대로 유지되고, 콘텐츠가 꽉 찬 케이스에서는
v0.7.3 와 동일한 cell_y + pad_top 으로 자연 폴백된다.

let text_y_start = if let Some(vpos) = first_line_vpos.filter(|&v| v > 0.0) {
    let remaining_room = (inner_height - total_content_height).max(0.0);
    cell_y + pad_top + vpos.min(remaining_room)
} else {
    // 기존 mechanical_offset 폴백 유지
    ...
};

검증

  • cargo build --release
  • cargo test --release1008+ ok / 0 failed (회귀 없음)
  • rhwp export-svg samples/kps-ai.hwp -p 55 재출력
    • 외부 셀: y=148.28 + h=865.05 = bottom 1013.33
    • 마지막 inner row: y=969.07 + h=38.63 = bottom 1007.69 ✅ 들어감
    • 외부 표 내부 상대좌표 89.88px — v0.7.3 와 일치
  • rhwp export-svg samples/exam_eng.hwp -p 3 회귀 검증
  • 회귀 샘플(form-002, k-water-rfp, exam_eng, exam_math, kps-ai)
    LAYOUT_OVERFLOW 신규 0건 (kps-ai 의 4건은 사전 존재)

영향 범위

  • 표 셀 layout 단일 분기 변경. 그리기/측정 다른 경로 영향 없음.
  • 여유 공간이 충분한 셀(exam_eng p4 등): 기존 동작 유지 (clamp 미발동).
  • 콘텐츠가 꽉 찬 셀(kps-ai p56 외부 표 등): v0.7.3 와 동일하게 폴백.

변경 파일

  • src/renderer/layout/table_layout.rslayout_table_cells
    text_y_startremaining_room 클램프 추가 (+6 -2)

…귀 해소)

f3ba9eb (Task edwardkim#347 cont) 가 LineSeg.vertical_pos[0] 을 셀 첫 줄 y 오프셋
으로 그대로 적용했으나, 콘텐츠가 셀 높이에 꽉 찬 케이스(kps-ai p56
외부 표 pi=535: 1x1 TAC, 셀 안 11 paragraphs + 7x6 내부 표)에서
vpos=2000 HU(~26.67px) 만큼 콘텐츠가 아래로 밀려 외부 셀 경계를 초과 →
마지막 행이 클립되는 v0.7.3 대비 회귀.

수정: vpos 를 셀 내부 여유 공간(inner_height - total_content_height) 으로
클램프. 여유가 충분한 케이스(exam_eng p4 Q27/Q28)에서는 기존 edwardkim#347 동작
유지, 꽉 찬 케이스에서는 v0.7.3 와 동일한 cell_y+pad_top 으로 폴백.

검증:
- kps-ai p56 외부 셀 (y=148.28 + h=865.05 = bottom 1013.33) 안에
  마지막 inner row (y=969.07 + h=38.63 = bottom 1007.69) 들어감 ✓
- exam_eng p4: SVG 바이트 단위 동일 (0 diff vs HEAD)
- LAYOUT_OVERFLOW 4건은 사전 존재 (기존 회귀 아님)
- cargo test --release: 1008+ passed, 0 failed

closes edwardkim#362
edwardkim added a commit that referenced this pull request Apr 27, 2026
PR #374 (Task #362): kps-ai p56 외부 표 안 콘텐츠 클립 회귀 정정 PR.

본 결함은 메인테이너 Task #362 (8 항목 누적: vpos 가드, PartialTable nested
분할, Square wrap 어울림, hide_empty_line 등) 로 v0.7.7 에 정정 완료.
이슈 #362 도 CLOSED.

PR #374 의 vpos clamp 접근 (`vpos.min(remaining_room)`) 은 측정 의존 일반화
시멘틱으로 메인테이너의 nested 가드 (`has_nested_table` 분기) 보다 회귀 위험.
흡수 가치 없음 → close.

PR #360 검토 문서도 함께 commit (회신 대기 중).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim

Copy link
Copy Markdown
Owner

kps-ai p56 외부 표 클립 회귀 정정 PR 검토했습니다.

본 결함은 메인테이너 Task #362 (8 항목 누적: vpos 가드, PartialTable nested 분할, Square wrap 어울림, hide_empty_line 등) 로 v0.7.7 (2026-04-27 배포) 에 정정 완료되었습니다. 이슈 #362 도 close 상태입니다.

본 PR 의 vpos clamp 접근 (`vpos.min(remaining_room)`) 과 메인테이너의 nested table 가드 (`has_nested_table` 분기) 는 다른 시멘틱입니다. 메인테이너 작업이 p56 외에 p67 (PartialTable nested 분할), p68-70 (Square wrap 어울림), p72-73 (표 누락 차단) 등 8 항목 광범위 정정을 포함하므로 본 PR 은 close 합니다.

상세: `mydocs/pr/pr_374_report.md`
감사합니다.

@edwardkim

Copy link
Copy Markdown
Owner

메인테이너 Task #362 (v0.7.7) 로 처리 완료.

@edwardkim edwardkim closed this Apr 27, 2026
@planet6897 planet6897 deleted the local/task362 branch April 30, 2026 00:03
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