Skip to content

HWP5 wrap=Square 호스트 본문 커서 전진 — 답안↔문제 겹침 수정 (3-09월_교육_통합_2023 4쪽)#1220

Merged
edwardkim merged 1 commit into
edwardkim:develfrom
planet6897:fix/1218-wrap-square-host-height
Jun 1, 2026
Merged

HWP5 wrap=Square 호스트 본문 커서 전진 — 답안↔문제 겹침 수정 (3-09월_교육_통합_2023 4쪽)#1220
edwardkim merged 1 commit into
edwardkim:develfrom
planet6897:fix/1218-wrap-square-host-height

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

문제

samples/3-09월_교육_통합_2023.hwp 4쪽 문26: 답안 ① 0.7262 가 문제 끝줄(…표준정규분포표를 이용하여 구한 것은?)과 세로로 겹침. 한글 2022 PDF 4쪽은 ①~⑤ 가 각 줄에 분리.

근본 원인 (계측 확정)

RHWP_DEBUG_TAC_CURSOR 계측:

Table pi=258 ci=5  y 822.4→895.9 (dy=73.6 = 표 높이)   ← 커서 전진
PartialPara pi=258 y 895.9→895.9 (dy=0.0)              ← 호스트 본문, 커서 전진 0
FullPara pi=259 ①  y 895.9→...                          ← 표 하단에서 시작 → 겹침

wrap=Square 인라인 표는 커서를 표 높이만큼만 전진시키고, 호스트 본문(layout_wrap_around_paras, void 렌더)은 커서를 전진시키지 않는다. 본문(90px) > 표(73.6px) 이면 본문 하단이 표 하단보다 아래인데 다음 단락(①)이 표 하단에서 시작 → 겹침.

수정

src/renderer/layout.rs 어울림(Square) 호스트 Table item 처리에서 layout_wrap_around_paras 직후 커서를 본문 하단까지 전진:

let host_text_bottom = table_y_before + (text_h - last_ls).max(0.0);
if host_text_bottom > y_offset { y_offset = host_text_bottom; }

본문 ≤ 표 인 기존 다수 케이스는 host_text_bottom ≤ y_offset동작 불변(가드). 19줄 추가, 단일 hunk.

검증

  • 계측(수정 후): ① pi=259 895.9 → 912.5 (본문 아래로 분리).
  • 4쪽 문26: ①~⑤ 각 줄 분리, 한글 2022 PDF 정합.
  • cargo test --release: 1896 passed / 0 failed (wrap_around issue_546, svg_snapshot 회귀 테스트 포함 — 회귀 0).
  • rustfmt clean.

범위 외

z-표 행 압축(셀 내부 세로정렬/줄높이)은 다른 서브시스템(표 셀 렌더링)으로 별도 이슈로 분리.

근본 원인: wrap=Square 인라인 표는 커서를 표 높이만큼만 전진시키고, 호스트 본문
(layout_wrap_around_paras)은 커서 전진 0. 본문(90px)>표(73.6px)이면 본문 하단이
표 하단보다 아래인데 다음 단락(①)이 표 하단에서 시작 → 마지막 본문 줄과 겹침
(3-09월_교육_통합_2023 4쪽 문26).

수정: layout.rs 어울림 호스트 Table item 에서 layout_wrap_around_paras 직후 커서를
host_text_bottom = table_y_before + 본문높이 로 전진(표보다 길 때만). 본문 ≤ 표 인
기존 다수 케이스는 불변(가드).

검증: ① pi=259 895.9→912.5(분리), 4쪽 문26 ①~⑤ 각 줄 분리(PDF 정합),
전체 1896 passed/0 failed(wrap_around issue_546·svg_snapshot 회귀 0), rustfmt clean.

closes edwardkim#1218

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@planet6897 planet6897 force-pushed the fix/1218-wrap-square-host-height branch from 1c42896 to 2ab366b Compare June 1, 2026 09:21
@edwardkim edwardkim self-requested a review June 1, 2026 11:42
@edwardkim edwardkim added the enhancement New feature or request label Jun 1, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone Jun 1, 2026
edwardkim added a commit that referenced this pull request Jun 1, 2026
…oses #1218)

@planet6897. double advance 트러블슈팅 무재발 확인(exam_science 4쪽/37items 동일),
1924 passed, 문26 ① y 906.3→922.8 분리. 시각 판정 통과.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@edwardkim edwardkim merged commit 351868e into edwardkim:devel Jun 1, 2026
7 checks passed
@edwardkim

Copy link
Copy Markdown
Owner

머지했습니다(devel 351868ec). 감사합니다.

계측으로 근본 원인(호스트 본문 > 표 높이일 때 다음 단락이 표 하단에서 시작)을 정확히 짚으셨고, host_text_bottom > y_offset 가드로 본문 ≤ 표 인 기존 다수 케이스를 불변으로 유지한 점이 안전했습니다.

특히 메인테이너가 우려한 부분은 과거 square_wrap_pic_bottom_double_advance 트러블슈팅(Square wrap 커서 advance 가 wrap-around 누적과 결합해 exam_science.hwp 4→6쪽 회귀)이었는데, 본 PR 은 호스트 본문 단락 자기 텍스트 높이를 기준으로 하여 wrap-around 누적과 결합하지 않음을 실측으로 확인했습니다:

  • exam_science.hwp 페이지 수 4 / p2 단0 37items / 단1 45items — 보정 전후 동일(무회귀)
  • 문26: 최하단 ① y 906.3(문제 끝줄 904.7과 겹침) → 922.8(18px 아래 분리)
  • cargo test --tests 1924 passed(svg_snapshot, issue_546 wrap_around 회귀 포함), 작업지시자 시각 판정 통과

렌더 경로 변경이라 WASM 을 재빌드했습니다. 좋은 수정 감사합니다.

@edwardkim

Copy link
Copy Markdown
Owner

추가로, WASM 재빌드 후 rhwp-studio(편집기)에서도 4쪽 문26 의 답안 ①~⑤ 가 문제 끝줄과 겹치지 않고 각 줄에 분리되어 렌더됨을 확인했습니다(rhwp-studio 시각 판정 통과). SVG export 경로와 편집기 canvas 경로 양쪽 모두 정합합니다. 감사합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants