Task #568: 인라인 표(분수)+수식 단락 우측 편위 정정 (closes #568)#570
Conversation
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 승인 요청.
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 + 작업지시자 시각 판정.
…정 — @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.
|
본 PR 의 본질 commit ( 처리 결과본질 cherry-pick
결정적 검증
광범위 페이지네이션 회귀 sweep (본 환경 자동)
→ 분기 확장 ( exam_science byte 차이 (PR 본문 100% 재현)
PR 본문 명시 "page 1/3/4 byte-identical, page 2 의도된 정정만 diff" 본 환경에서 정확히 재현. 시각 판정 (★ 게이트)작업지시자 시각 검증 결과:
첨부 이미지 (exam_science 12번 문항) 의 인라인 분수 ( 단일 룰 확장 정합
미해결 영역 (PR 본문 명시, 별도 task 후보)PR 본문 §"미해결" 영역은 별도 후속 task 로 관리:
처리 보고서: 본 PR 도 두 분의 협업 흐름 (@jangster77 본질 commit → @planet6897 fork 등록) 의 우수한 사례입니다. Stage 0 수행 → Stage 1 정밀 진단 (코드 무수정) → Stage 2 구현 계획 → Stage 3 본질 정정 → Stage 4 보고의 하이퍼-워터폴 흐름이 메인테이너 cherry-pick 의 본질만 깨끗하게 추출 가능하게 했습니다. 감사합니다. |
- 처리 보고서 추가: 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 항목 추가
…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 검토 예정.
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 (영문).
Summary
paragraph_layout.rs::layout_composed_paragraphL857 의effective_col_x / effective_col_w분기가 인라인 TAC 표 보유 줄의comp_line.segment_width무시. col_area.width(31692 HU)로available_width산출 → Justify slack 과대 →extra_word_spacing80 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 - 200→sw + cs < col_w_hu - 200보정 (단락 들여쓰기 LINE_SEG.column_start 로 인코딩한 paragraph 의 정상 full-width line 미진입 보장).본질 정정 메커니즘
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 failedcargo test --test svg_snapshot— 6/6 passedcargo clippy --release --lib— 본 변경 신규 경고 0 (사전 결함 2건 변경 전후 동일)21_언어_기출_편집가능본Picture wrap /atop-equation-01/equation-lim/eq-01/exam_eng/exam_math/exam_kor)output/svg/exam_science_after*/exam_science_002.svg)미해결 (별도 task 후보)
본 PR 은 인라인 표 + 수식 + narrow segment_width 조합만 정정. 다음은 다른 메커니즘:
산출 문서
mydocs/plans/task_m100_568.mdmydocs/working/task_m100_568_stage1.mdmydocs/plans/task_m100_568_impl.mdmydocs/working/task_m100_568_stage3.mdmydocs/report/task_m100_568_report.mdcloses #568
🤖 Generated with Claude Code