Skip to content

Task #568: 인라인 표(분수)+수식 단락 우측 편위 정정 (closes #568)#570

Closed
planet6897 wants to merge 5 commits into
edwardkim:develfrom
planet6897:pr-task568
Closed

Task #568: 인라인 표(분수)+수식 단락 우측 편위 정정 (closes #568)#570
planet6897 wants to merge 5 commits into
edwardkim:develfrom
planet6897:pr-task568

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

  • 본질: paragraph_layout.rs::layout_composed_paragraph L857 의 effective_col_x / effective_col_w 분기가 인라인 TAC 표 보유 줄의 comp_line.segment_width 무시. col_area.width(31692 HU)로 available_width 산출 → Justify slack 과대 → extra_word_spacing 80 px/space 로 부풀어 인라인 표 +175 px 우측 편위 (exam_science.hwp pi=61 12번 응답 분수).
  • 정정: 분기 조건 확장 has_picture_shape_square_wrap || line_has_inline_tac_table (줄 단위 검출, Table tac=true). 임계값 sw < col_w_hu - 200sw + cs < col_w_hu - 200 보정 (단락 들여쓰기 LINE_SEG.column_start 로 인코딩한 paragraph 의 정상 full-width line 미진입 보장).
  • 결과: pi=61 인라인 분수 x=739.87 → 584.93 (편위 +175 px → ±5-10 px 잔여). 변경 LOC: +25/-2.

본질 정정 메커니즘

HWP 는 인라인 TAC 표가 있는 줄의 segment_width 를 표 폭 + 잔여로 좁게 인코딩 (wrap=TopAndBottom 영향). 이 줄에서 layout 이 컬럼 전체 폭(407.5 px)으로 available_width 를 잡으면, Justify slack(~160 px)이 선두 공백 2 개에 80 px/space 분배되어 그 다음 인라인 표를 ~175 px 우측으로 민다.

기존 Picture/Shape Square wrap 분기 (has_picture_shape_square_wrap) 와 동일한 LINE_SEG.cs/sw 사용 패턴을 인라인 TAC 표 줄에도 확장. 단 임계값에 column_start 포함시켜 "단락 들여쓰기를 LINE_SEG 에 인코딩한 정상 full-width line" 을 미진입 보장.

Test plan

  • cargo test --lib — 1125 passed, 0 failed
  • cargo test --test svg_snapshot — 6/6 passed
  • cargo clippy --release --lib — 본 변경 신규 경고 0 (사전 결함 2건 변경 전후 동일)
  • 광범위 fixture sweep — 7 fixture / 66 SVG 페이지 byte-identical (21_언어_기출_편집가능본 Picture wrap / atop-equation-01 / equation-lim / eq-01 / exam_eng / exam_math / exam_kor)
  • exam_science.hwp page 1/3/4 byte-identical, page 2 의도된 정정만 diff
  • 작업지시자 시각 판정 (output/svg/exam_science_after*/exam_science_002.svg)
  • rhwp-studio web Canvas 시각 판정 (WASM)

미해결 (별도 task 후보)

본 PR 은 인라인 표 + 수식 + narrow segment_width 조합만 정정. 다음은 다른 메커니즘:

  • Page 1 header sub-tables LEFT-shift — 외곽 1×1 표 cell halign=Center 미적용
  • Page 3/4 보기 셀 분수 단락 (13/15/16/19번) — 셀 paragraph segment_width=full → 본 fix 임계값 미충족
  • 페이지 쪽번호 색·굵기 — 바탕쪽 CharShape

산출 문서

  • 수행계획: mydocs/plans/task_m100_568.md
  • Stage 1 진단 (코드 무수정): mydocs/working/task_m100_568_stage1.md
  • Stage 2 구현계획: mydocs/plans/task_m100_568_impl.md
  • Stage 3 구현+검증: mydocs/working/task_m100_568_stage3.md
  • 최종 보고서: mydocs/report/task_m100_568_report.md

closes #568

🤖 Generated with Claude Code

planet6897 added 5 commits May 4, 2026 14:47
available_width 가 col_area.width 만 사용하고 comp_line.segment_width 를
무시하여, 인라인 TAC 표 + Justify 단락의 줄에서 slack 이 과대 산출되어
extra_word_spacing 이 80px/space 로 부풀어 인라인 표를 +175px 우측으로 미는
경로 정밀 추적 (pi=61 line[0]).

영향: 본문 pi=61 + 셀 내부 paragraph (보기 셀 분수 단락 — p3 13/15/16, p4 19).
정정 방향: effective_col_x/effective_col_w 분기에 'inline TAC 표 보유 narrow
sw' 조건 추가 (Picture/Shape Square wrap 과 동일 패턴 재사용).

Stage 2 진입 승인 요청.
paragraph_layout.rs L857 의 effective_col_x/effective_col_w 분기 조건을
'has_picture_shape_square_wrap' → 'has_picture_shape_square_wrap ||
line_has_inline_tac_table' 로 확장. 줄 단위 판정 (line_has_inline_tac_table)
은 tac_offsets_px 와 line char range 교차 + Table tac=true 검증.

추정 변경 +12/-1 LOC. cs/margin 이중 적용 위험은 Stage 3 첫 빌드 SVG 실측
으로 결정. 광범위 sweep (159 fixture) byte-identical 검증 + exam_science
의도된 diff (12/13/15/16/19번 분수 정정) 만 발생 확인 후 시각 판정.

Stage 3 진입 승인 요청.
… 단락 우측 편위 정정)

본질 정정 — has_picture_shape_square_wrap 분기 조건에 line_has_inline_tac_table
(줄 단위 인라인 TAC 표 검출) 을 OR 결합. 임계값을 sw < col_w_hu - 200 →
sw+cs < col_w_hu - 200 으로 보정 (단락 들여쓰기를 LINE_SEG.column_start 로
인코딩한 paragraph 의 full-width line 미진입 보장).

이 분기에서 effective_col_w = col_area.width 가 사용되어 Justify slack 이
narrow segment_width line 에서 과대 산출되고, 선두 공백이 80 px/space 로
부풀어 인라인 표를 +175 px 우측으로 밀던 결함이 정정됨.
exam_science.hwp pi=61 (12번 응답) 인라인 분수 x=739.87 → 584.93 (기대 ~575-590).

검증:
- cargo test --lib 1125 통과 (회귀 0)
- svg_snapshot 6/6 통과
- clippy: 본 변경 신규 경고 0 (사전 결함 2건 변경 전후 동일)
- 광범위 sweep 7 fixture 66 페이지 byte-identical (21_언어_기출/atop-equation-01/
  equation-lim/eq-01/exam_eng/exam_math/exam_kor)
- exam_science.hwp page 1/3/4 byte-identical, page 2 의도된 정정만 diff

미해결 (별도 task 후보):
- Page 1 header sub-tables LEFT-shift (item ①)
- 보기 셀 분수 단락 (page 3 13/15/16, page 4 19) — 다른 코드 경로
- 페이지 쪽번호 색·굵기 (item ③)

변경 LOC: src/renderer/layout/paragraph_layout.rs +25 / -2.
Stage 3 보고서: mydocs/working/task_m100_568_stage3.md.

Stage 4 진입 승인 요청.
본 task 산출물:
- mydocs/report/task_m100_568_report.md (최종 보고서)
- mydocs/orders/20260504.md (Issue edwardkim#568 행 추가, 검토 사항 보강)

검증 요약:
- pi=61 인라인 분수 x=739.87 → 584.93 (편위 +175 px → ±5-10 px 잔여)
- cargo test --lib 1125 / svg_snapshot 6/6 / clippy 신규 0
- 광범위 sweep 7 fixture 66 페이지 byte-identical
- exam_science page 1/3/4 byte-identical, page 2 의도된 정정만

미해결 (별도 task 후보):
- Page 1 header LEFT-shift (item ①)
- Page 3/4 보기 셀 분수 단락 (13/15/16/19) — 셀 paragraph 메커니즘
- 쪽번호 색·굵기 (item ③)

작업지시자 시각 판정 + close + local/devel merge 승인 요청.
edwardkim added a commit that referenced this pull request May 5, 2026
PR #570 (Task #568, @planet6897 PR / Jaeook Ryu commit author) 1차 검토:
- 본질 결함: paragraph_layout.rs::layout_composed_paragraph L857
  effective_col_x/w 분기가 인라인 TAC 표 보유 줄의 segment_width 무시 →
  Justify slack 과대 → 선두 공백 80 px/space 부풀음 → +175 px 편위
- 정량 측정: exam_science pi=61 인라인 분수 x=739.87 → 584.93
- 본질 정정: has_picture_shape_square_wrap ||
  line_has_inline_tac_table 분기 확장 + 임계값 sw+cs 보정
  (column_start 인코딩 정상 paragraph 미진입 보장)
- PR mergeable=CONFLICTING (PR base 시점 차이 추정),
  본질 cherry-pick (1f187cf) 충돌 0
- 본 환경 임시 검증: cargo test --lib --release 1131 passed (회귀 0) /
  clippy 0건

권장 처리: 옵션 A — 핀셋 cherry-pick + 결정적 검증 + 광범위 sweep +
WASM + 작업지시자 시각 판정.
edwardkim added a commit that referenced this pull request May 5, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
…정 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과)

PR #570 (Task #568, @planet6897 PR / Jaeook Ryu commit author):
- 본질 결함: paragraph_layout.rs::layout_composed_paragraph L857
  effective_col_x/w 분기가 인라인 TAC 표 보유 줄의 segment_width 무시 →
  Justify slack 과대 산출 → 선두 공백 80 px/space 부풀음 →
  인라인 표 +175 px 우측 편위 (exam_science pi=61 12번 응답 분수)
- 본질 정정: has_picture_shape_square_wrap || line_has_inline_tac_table
  분기 확장 (단일 룰 확장) + 임계값 sw+cs 보정
  (column_start 인코딩 정상 paragraph 미진입 보장)
- 단일 파일 본질 (paragraph_layout.rs +25/-2)
- 정량 측정: pi=61 인라인 분수 x=739.87 → 584.93

검증:
- cargo test --lib --release 1131 passed (회귀 0)
- svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release
- WASM 4,570,901 bytes (PR #564 baseline +286 bytes — paragraph_layout.rs +25/-2 정합)
- 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) /
  1,614 페이지 / 페이지 수 회귀 0
- exam_science byte 차이: page 1/3/4 byte-identical, page 2 만 의도된 정정
  (PR 본문 100% 재현)

시각 판정 ★ 통과 — 메인테이너의 SVG (exam_science 12번 문항)
시각 검증으로 인라인 분수 [1g의 A에 들어 있는 중성자수 /
1g의 D에 들어 있는 중성자수] 정상 배치 회복 확인.

closes #568.
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 @jangster77 님,

본 PR 의 본질 commit (1f187cf9) 핀셋 cherry-pick 후 devel merge 완료되었습니다 (8719a03).

처리 결과

본질 cherry-pick

  • 1f187cf9 Stage 3 본질 정정 (src/renderer/layout/paragraph_layout.rs +25/-2)
  • 충돌 0건 (PR mergeable=CONFLICTING 표시는 PR base 시점 차이, 본질은 깨끗 적용)
  • author Jaeook Ryu (@jangster77) 보존

결정적 검증

광범위 페이지네이션 회귀 sweep (본 환경 자동)

통계 결과
총 fixture 164 (158 hwp + 6 hwpx — samples/ 폴더 전체)
총 페이지 (devel baseline) 1,614
총 페이지 (cherry-pick 후) 1,614
fixture 별 페이지 수 차이 0

→ 분기 확장 (line_has_inline_tac_table) + 임계값 보정 (sw + cs < col_w_hu - 200) 의 column_start 인코딩 정상 paragraph 미진입 보장이 광범위 sweep 으로 정량 입증.

exam_science byte 차이 (PR 본문 100% 재현)

페이지 byte 차이
page 1 identical ✅
page 2 differ ✅ (12번 응답 분수 정정 영역)
page 3 identical ✅
page 4 identical ✅

PR 본문 명시 "page 1/3/4 byte-identical, page 2 의도된 정정만 diff" 본 환경에서 정확히 재현.

시각 판정 (★ 게이트)

작업지시자 시각 검증 결과:

메인테이너의 시각 검증 통과되었습니다.

첨부 이미지 (exam_science 12번 문항) 의 인라인 분수 (1g의 A에 들어 있는 중성자수 / 1g의 D에 들어 있는 중성자수) 가 본문 흐름에 자연스럽게 배치된 정합 회복 확인. PR 본문 측정 (pi=61 x=739.87 → 584.93, +175 px 우측 편위 → 정합 ±5-10 px 잔여) 의 시각적 효과 입증.

단일 룰 확장 정합

has_picture_shape_square_wrap 분기 (Picture/Shape Square wrap) 와 동일한 LINE_SEG.cs/sw 사용 패턴을 인라인 TAC 표 줄 (line_has_inline_tac_table) 에도 OR 결합으로 확장. 임계값 sw + cs < col_w_hu - 200 으로 단락 들여쓰기를 LINE_SEG.column_start 로 인코딩한 정상 full-width line 미진입 보장. 단일 룰 확장 + 케이스별 명시 가드 (feedback_hancom_compat_specific_over_general + feedback_rule_not_heuristic 정합).

미해결 영역 (PR 본문 명시, 별도 task 후보)

PR 본문 §"미해결" 영역은 별도 후속 task 로 관리:

  • Page 1 header sub-tables LEFT-shift — 외곽 1×1 표 cell halign=Center 미적용
  • Page 3/4 보기 셀 분수 단락 (13/15/16/19번) — 셀 paragraph segment_width=full → 본 fix 임계값 미충족
  • 페이지 쪽번호 색·굵기 — 바탕쪽 CharShape

처리 보고서: mydocs/pr/archives/pr_570_report.md (작성 후 push 됩니다).

본 PR 도 두 분의 협업 흐름 (@jangster77 본질 commit → @planet6897 fork 등록) 의 우수한 사례입니다. Stage 0 수행 → Stage 1 정밀 진단 (코드 무수정) → Stage 2 구현 계획 → Stage 3 본질 정정 → Stage 4 보고의 하이퍼-워터폴 흐름이 메인테이너 cherry-pick 의 본질만 깨끗하게 추출 가능하게 했습니다. 감사합니다.

@edwardkim edwardkim closed this May 5, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: mydocs/pr/archives/pr_570_report.md
  PR #570 (Task #568, @planet6897 / @jangster77) 핀셋 cherry-pick
  1 commit + 결정적 검증 + WASM 4,570,901 bytes + 광범위 페이지네이션
  sweep (164 fixture / 1,614 페이지 / 회귀 0) + 시각 판정 ★ 통과
- 검토 보고서 archives 이동:
  mydocs/pr/pr_570_review.md → mydocs/pr/archives/pr_570_review.md
- 5/5 orders 갱신: PR #570 항목 추가
edwardkim added a commit that referenced this pull request May 5, 2026
…paragraph 라우팅 정정 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과)

PR #575 (Task #573, @planet6897 PR / Jaeook Ryu commit author):
- 본질 결함: table_layout.rs::has_table_ctrl 가 block table
  (treat_as_char=false) 와 inline TAC table (treat_as_char=true) 을
  미구분 → 인라인 TAC 표 보유 셀 paragraph 가 ELSE 분기로 빠져
  layout_composed_paragraph SKIP → 'ㄷ. ', '이다.' surrounding text 미렌더
- Stage 1 정밀 진단: 사용자 보고 "오른쪽 편위" → 실제 본질
  "surrounding text 미렌더"
- 본질 정정: has_block_table_ctrl 신설 (treat_as_char=false 만) +
  inline_shape_position 중복 emit 가드 (Equation L1800 패턴 재사용)
- 인접 효과: Issue #572 (Page 1 header sub-tables LEFT-shift) 자동 정정
- 단일 파일 본질 (table_layout.rs +19/-2)

검증:
- cargo test --lib --release 1131 passed (회귀 0)
- svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release
- WASM 4,571,604 bytes (PR #570 baseline +703 bytes — table_layout.rs +19/-2 정합)
- 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) /
  1,614 페이지 / 페이지 수 회귀 0
- exam_science byte 차이: 4 페이지 모두 의도된 정정
  (page 1 Issue #572 인접 효과 / page 2 pi=61 / page 3 13/16번 / page 4 19번)
  PR 본문 100% 재현

시각 판정 ★ 통과 — 메인테이너 시각 검증 완료.

closes #573, 연관 #572 자동 close 검토 예정.
edwardkim added a commit that referenced this pull request May 5, 2026
v0.7.9 후속 patch 사이클 (5/4 ~ 5/6).

## 신규 기능

- **CLI 바이너리 릴리즈** (Issue #608/#612, @almet 의 요청)
  - 4 플랫폼 GitHub Release 자산 첨부 (Linux x86_64 / macOS x86_64+aarch64 /
    Windows x86_64) + SHA-256 체크섬
- **PNG raster backend** (PR #599, @seo-rii) — render P4 단계
  - native Skia 기반 PageLayerTree → PNG export, native-skia feature gate
  - **AI 파이프라인 + VLM 연동 도입** (메인테이너 후속 정정):
    - --vlm-target claude (1568 longest edge / 1.15 MP, Claude Vision 정합)
    - --scale / --max-dimension (자동 scale 계산)
    - export-png CLI 명령 + 매뉴얼 (한글 + 영문 dual)
    - 한글 폰트 fallback chain + char 단위 fallback (공백 두부 정정) +
      --font-path 동적 로딩

## 외부 PR cherry-pick (13 PR / 7 컨트리뷰터)

- @planet6897 / Jaeook Ryu (협업): PR #587/#589/#561/#564/#570/#575/
  #580/#584/#592/#593/#567
- @oksure (Hyunwoo Park): PR #600 (closes #513)
- @seo-rii: PR #599 (refs #536)
- @cskwork / @johndoekim / @nameofSEOKWONHONG / @jangster77 — 사이클 누적

## 메인테이너 정정

Skia 폰트 영역 5개 정정 (한글 fallback / font-path / char-fallback /
VLM 옵션 / export-png CLI).

## 인프라

- CI 빌드 안정성 (Cargo.toml [[example]] required-features)
- 광범위 페이지네이션 회귀 sweep 도구 (164 fixture / 1,614 페이지 자동)

## 후속 이슈

- #613 (VLM 프리셋 확장)
- #614 (DPI 메타데이터)
- #615 (pua_oldhangul.rs U+F53A 한컴 정합)
- #598 (rhwp-studio 각주 삭제, 외부 컨트리뷰터 공개)

## 잔여 PR (v0.7.11 후속 patch)

PR #601, #602 (@oksure) / PR #607 (@dicebattle) / PR #609 (@jangster77,
Task #604) / PR #611 (@kihyunnn).

상세: CHANGELOG.md (한글) / CHANGELOG_EN.md (영문).
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