Task #565 exam_science.hwp 12/15/18/19번 인라인 수식(Equation, treat_as_char) 미렌더 정정#567
Task #565 exam_science.hwp 12/15/18/19번 인라인 수식(Equation, treat_as_char) 미렌더 정정#567planet6897 wants to merge 4 commits into
Conversation
exam_science.hwp 12/15/18/19번 인라인 수식(treat_as_char) 미렌더 정정 타스크. Stage 1 핵심 진단: - 9개 수식 (X/A/B/C/D/m-4/m-2/m+2/m+4) 모두 SVG 동일 좌표 (534.8, 1218.106) 에 겹침 - IR 정상 (EquationNode 생성 확인), 좌표 산출 결함만 - paragraph_layout.rs 의 인라인 수식 처리 2 경로 (L1830 / L2274) 식별 - Stage 2 진입 시 임시 디버그 로그로 활성 경로 + 좌표 누적 단계 정밀 식별 권고 산출: - mydocs/plans/task_m100_565.md (수행 계획서, 4 단계) - mydocs/working/task_m100_565_stage1.md (정밀 진단 보고서) 코드 무수정. closes 없음 (Stage 단계 진행 중).
…ragraph 인라인 수식 미처리) 임시 디버그 로그로 0.61 dispatch 추적 → 본질 결함 확정: - 0.61 (12번 본문) 은 has_inline_tables=TRUE 분기로 layout_inline_table_paragraph (paragraph_layout.rs:88) 호출됨 - 이 함수는 인라인 표 + 텍스트 세그먼트만 처리. 인라인 수식 9개 무시 - inline_shape_position 미등록 → shape_layout fallback (col_area.x, para_y) 으로 9개 수식 모두 동일 좌표 (534.8, 1218.106) 에 겹침 - 0.60 (12번 그림 문단, 인라인 표 없음) 은 plain layout_paragraph 정상 대조: dispatch 로그에서 pi=60 "no special table" + T565-A 9개 정상 분산 vs pi=61 "has_inline_tables=TRUE" + T565-A 0개 (paragraph_layout 미진입). 정정 방향 3안 비교 후 안 A 권장 — has_inline_tables 가드를 has_inline_tables && !has_other_inline_ctrls 로 좁혀 일반 layout_paragraph 로 보냄 (layout_paragraph 의 인라인 수식+표 처리 경로 재사용). Stage 3-1 사전 검증으로 안 A 적합성 확인 후 부적합 시 안 B (layout_inline_table_paragraph 에 수식 처리 통합) 로 전환. 산출: - mydocs/plans/task_m100_565_impl.md (구현 계획서) 코드 무수정 (디버그 로그는 진단 후 모두 제거됨, git diff --stat 비어있음).
…수식 미렌더 정정) 본질 정정 — has_inline_tables 가드를 has_inline_tables && !has_other_inline_ctrls 로 좁혀, 인라인 표 + 인라인 수식/treat_as_char Picture/Shape 가 같이 있는 문단은 일반 layout_paragraph 로 보낸다. 이 분기에서 layout_inline_table_paragraph (인라인 표 + 텍스트 세그먼트만 처리) 가 호출되면 인라인 수식이 무시되어 inline_shape_position 미등록 → shape_layout fallback (col_area.x, para_y) 으로 9개 수식이 동일 좌표에 겹쳤다 (exam_science.hwp 12/15/18/19번 본문). 일반 layout_paragraph 의 run_tacs / inline_x 체계는 인라인 표 + 인라인 수식을 모두 처리한다. 검증: - cargo test --lib 1125 통과 (회귀 0) - svg_snapshot 6/6 통과 - 광범위 sweep: 15 fixture 274 페이지 중 271 byte-identical, 3 페이지 (exam_science 002/003/004) 의도된 정정 — 12/15/18/19번 본문 인라인 수식 모두 정상 분산 표시 - clippy: 본 변경에 의한 신규 경고/오류 0 (사전 결함 2건 변경 전후 동일) - WASM: Docker 미가동으로 본 세션 미검증 (Stage 4 보강) 변경 LOC: src/renderer/layout.rs +13 / -1. Stage 3 보고서: mydocs/working/task_m100_565_stage3.md.
본 task 의 본질 결함, 정정 코드, 검증 결과, 회귀 위험 검증, 시각 판정 안내, 후속 사항 (edwardkim#566, clippy 사전 결함) 정리. orders/20260504.md 신규 작성 — edwardkim#565 완료 (Stage 4 시각 판정 대기) + edwardkim#566 신규 별도 task + clippy 사전 결함 2건 별도 정정 권고. 산출: - mydocs/report/task_m100_565_report.md (최종 보고서) - mydocs/orders/20260504.md (오늘 할일) 본 task 의 코드 변경은 src/renderer/layout.rs +13/-1 (Stage 3 commit 82aa0b8c). 본 commit 은 문서만.
PR #567 (Task #565, @planet6897 PR / Jaeook Ryu commit author) 1차 검토: - 본질 결함: layout_inline_table_paragraph 가 인라인 수식 무시 → shape_layout fallback 으로 동일 좌표 (534.8, 1218.106) 에 9개 겹침 (exam_science 12/15/18/19번) - 정밀 진단 (Stage 1~2): 동일 페이지 두 문단 비교 (0.60 그림 = 정상 / 0.61 본문 = 결함) - 본질 정정 (Stage 3): has_inline_tables && !has_other_inline_ctrls 케이스별 명시 가드 — feedback_hancom_compat_specific_over_general 정합 - PR mergeable=CONFLICTING (PR base 시점 차이 추정), 본질 cherry-pick (a35bdbe) 충돌 0 - 본 환경 임시 검증: cargo test --lib --release 1130 passed (회귀 0) / clippy 0건 / build --release 통과 권장 처리: 옵션 A — 핀셋 cherry-pick + 결정적 검증 + 작업지시자 시각 판정.
…anet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과) PR #567 (Task #565, @planet6897 PR / Jaeook Ryu commit author): - exam_science.hwp 12/15/18/19번 본문의 인라인 표 + 9개 인라인 수식 동시 케이스에서 layout_inline_table_paragraph 가 인라인 수식을 무시 → shape_layout fallback 으로 동일 좌표 (534.8, 1218.106) 에 9개 겹침 - 본질 정정: has_inline_tables && !has_other_inline_ctrls 케이스별 명시 가드 - 단일 파일 변경 (src/renderer/layout.rs +13/-1) 검증: - cargo test --lib --release 1130 passed (회귀 0) - svg_snapshot 6/6 passed - clippy 0건 - WASM 4,570,464 bytes (+244 bytes — layout.rs +13/-1 LOC 정합) - 광범위 sweep 3 fixture 44p / 3 differ (exam_science 002/003/004 — PR 본문 100% 재현) exam_kor 20/20 + exam_math 20/20 회귀 0 시각 판정 ★ 통과: - 12번 인라인 수식 겹침 해결 - 15/18/19번 개선 - 12번 문항의 잔존 조판 영역은 컨트리뷰터가 추가 이슈로 인지 closes #565.
|
본 PR 의 본질 commit ( 처리 결과본질 cherry-pick
결정적 검증
광범위 회귀 sweep (PR 본문 측정 100% 재현)
→ PR 본문이 명시한 "271/274 identical + 3 의도 정정" 패턴이 본 환경 sweep 에서도 정확히 재현. 다른 시험지에서 회귀 0 — 케이스별 명시 가드 ( 시각 판정 (★ 게이트)작업지시자 시각 판정 결과:
본 PR 본질 영역 (인라인 표 + 9개 인라인 수식 동시 케이스의 동일 좌표 겹침) 이 시각적으로도 정상 분산되어 회복되었음을 확인했습니다. 잔존 영역 인지작업지시자 안내:
본 PR 의 본질 영역은 정합 통과 + 잔존 조판 영역은 별도 후속 task 로 관리 예정. 본질 가드의 정합성
처리 보고서: 본 PR 도 컨트리뷰터 두 분의 협업 흐름 (@jangster77 의 본질 commit |
- 처리 보고서 추가: mydocs/pr/archives/pr_567_report.md PR #567 (Task #565, @planet6897 / @jangster77) 핀셋 cherry-pick 1 commit + 결정적 검증 + WASM 4,570,464 bytes + 시각 판정 ★ 통과 - 검토 보고서 archives 이동: mydocs/pr/pr_567_review.md → mydocs/pr/archives/pr_567_review.md - 5/5 orders 갱신: PR #567 항목 추가
…bottom 누락 정정 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과) PR #564 (Task #521, @planet6897 PR / Jaeook Ryu commit author): - 본질 결함: layout_table_item TAC after-spacing 분기가 outer_margin_bottom 미적용 (layout_partial_table_item 와 산식 불일치) - 한컴 명세: lh = cell_h + outer_margin_bottom (exam_eng pi=104 lh=22207 = 21607+600) - 단일 룰 정정 (layout_partial_table_item 산식과 통일) - exam_eng p2 18번 ① 543.95 → 551.95 (+8 px PDF 정합) 검증: - cargo test --lib --release 1131 passed (test_521 GREEN) - svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release - WASM 4,570,615 bytes (PR #567 baseline +151 bytes) - 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) / 1,614 페이지 / 페이지 수 회귀 0 시각 판정 ★ 통과 (메인테이너 광범위한 샘플 파일 페이지네이션 + 분리된 표 검증). closes #521.
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
src/renderer/layout.rs::layout_column_item의has_inline_tables=TRUE분기가paragraph_layout::layout_inline_table_paragraph(인라인 표 + 텍스트 세그먼트만 처리, 인라인 수식/treat_as_char Picture/Shape 는 무시) 를 호출 →inline_shape_position미등록 →shape_layout::layout_shape_itemfallback (col_area.x,para_y) 으로 9개 인라인 수식이 동일 좌표 (534.8, 1218.106) 에 겹쳐 그려짐 (samples/exam_science.hwp12/15/18/19번 본문)has_inline_tables가드를has_inline_tables && !has_other_inline_ctrls로 좁혀, 인라인 표 + 인라인 수식/treat_as_char Picture/Shape 동시 케이스는 일반layout_paragraph로 보내run_tacs / inline_x체계로 정상 배치 (src/renderer/layout.rs+13/-1)cargo test --lib1118/0,svg_snapshot6/6, 광범위 sweep 15 fixture 274 페이지 중 271 byte-identical + 3 의도 정정 (exam_science 002/003/004), clippy 신규 0closes #565
본질 분석 (Stage 1~2 디버그)
paragraph_layout::layout_composed_paragraph의 인라인 수식 처리 경로 (run_tacs / inline_x) 자체는 정상 — 동일 페이지의 0.60 (12번 그림 문단, 인라인 표 없음) 의 8개 수식은 정상 분산되었으며, 0.61 (12번 본문, 인라인 표 + 수식 9) 만 잘못된 분기로 떨어진 것.plain layout_paragraph✅layout_inline_table_paragraph❌변경 LOC
src/renderer/layout.rs검증
Unit / Snapshot 테스트
cargo test --lib: 1118 passed / 0 failedcargo test --release --test svg_snapshot: 6/6 passedcargo clippy --release(본 변경): 신규 경고/오류 0document_core/commands/{table_ops.rs:1007, object_ops.rs:298}panicking_unwrap) 변경 전후 동일 — 본 PR 범위 외, 별도 정정 권고광범위 fixture sweep (15 sample / 274 페이지)
대상:
exam_science.hwp,exam_kor.hwp,exam_math.hwp,exam_eng.hwp,exam_social.hwp,aift.hwp,issue-505-equations.hwp,eq-01.hwp,equation-lim.hwp,atop-equation-01.hwp,21_언어_기출_편집가능본.hwp,2010-01-06.hwp,biz_plan.hwp,k-water-rfp.hwp,kps-ai.hwpbaseline (가드 강화 전) vs after-fix SVG byte-compare:
변경 전후 좌표 비교 (12번 본문)
SVG 텍스트 검증 (의도 정정 영역)
[페이지 2 12번](단,X는임의의원소기호이고,A,B,C,D의원자량은각각m-4,m-2,m+2,m+4이다.)[페이지 3 15번]15.-그림(가)는원자WsimY의를,(나)는원자이온반지름이온의전하XsimZ의을…[페이지 4 18번]18.-표는2xMHA(aq),xMH2B(aq),yMNaOH(aq)의부피를…[페이지 4 19번](단,XsimZ는임의의원소기호이다.)→ 인라인 수식 누락 0 건.
회귀 위험 검증 결과
has_other_inline_ctrls에 포함 — 일반 분기has_other_inline_ctrls에 포함 — 일반 분기paragraph_layoutL2245 분기 무수정 — 회귀 영역 외Test plan
cargo test --lib1118 passedcargo test --release --test svg_snapshot6 passedcargo clippy --release본 변경 신규 경고 0docker compose --env-file .env.docker run --rm wasm) — 본 PR 환경 Docker 미가동, reviewer 환경에서 확인 권고잔존 / 후속
document_core/commands/{table_ops.rs:1007, object_ops.rs:298}panicking_unwrap): 본 PR 범위 외 — 별도 issue 등록 권고.