Skip to content

Task #565 exam_science.hwp 12/15/18/19번 인라인 수식(Equation, treat_as_char) 미렌더 정정#567

Closed
planet6897 wants to merge 4 commits into
edwardkim:develfrom
planet6897:pr-task565
Closed

Task #565 exam_science.hwp 12/15/18/19번 인라인 수식(Equation, treat_as_char) 미렌더 정정#567
planet6897 wants to merge 4 commits into
edwardkim:develfrom
planet6897:pr-task565

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

  • 본질: src/renderer/layout.rs::layout_column_itemhas_inline_tables=TRUE 분기가 paragraph_layout::layout_inline_table_paragraph (인라인 표 + 텍스트 세그먼트만 처리, 인라인 수식/treat_as_char Picture/Shape 는 무시) 를 호출 → inline_shape_position 미등록 → shape_layout::layout_shape_item fallback (col_area.x, para_y) 으로 9개 인라인 수식이 동일 좌표 (534.8, 1218.106) 에 겹쳐 그려짐 (samples/exam_science.hwp 12/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 --lib 1118/0, svg_snapshot 6/6, 광범위 sweep 15 fixture 274 페이지 중 271 byte-identical + 3 의도 정정 (exam_science 002/003/004), clippy 신규 0

closes #565

본질 분석 (Stage 1~2 디버그)

paragraph_layout::layout_composed_paragraph 의 인라인 수식 처리 경로 (run_tacs / inline_x) 자체는 정상 — 동일 페이지의 0.60 (12번 그림 문단, 인라인 표 없음) 의 8개 수식은 정상 분산되었으며, 0.61 (12번 본문, 인라인 표 + 수식 9) 만 잘못된 분기로 떨어진 것.

0.60 (그림 문단) 0.61 (본문)
인라인 표 없음 있음 (treat_as_char Table)
인라인 수식 8개 9개
분기 plain layout_paragraph layout_inline_table_paragraph
결과 8개 수식 좌표 분산 9개 수식 모두 (534.8, 1218.106) 겹침

변경 LOC

파일 +/-
src/renderer/layout.rs +13 / -1
// [Task #565] 인라인 표 + 다른 인라인 컨트롤(수식/treat_as_char Picture/Shape)
// 이 같이 있는 문단은 layout_inline_table_paragraph 가 인라인 수식 등을
// 처리하지 않아 shape_layout fallback (col_area.x, para_y) 으로 9개 수식이
// 동일 좌표에 겹친다 (exam_science.hwp 12/15/18/19번). 일반
// layout_paragraph 로 보내 인라인 표 + 인라인 수식이 같은 line/x 체계
// (run_tacs / inline_x) 로 정상 배치되도록 한다.
let has_other_inline_ctrls = para.controls.iter().any(|c| match c {
    Control::Equation(_) => true,
    Control::Picture(p) => p.common.treat_as_char,
    Control::Shape(s) => s.common().treat_as_char,
    _ => false,
});

if has_inline_tables && !has_other_inline_ctrls {
    // 기존 layout_inline_table_paragraph 경로
} else {
    // 일반 layout_paragraph 경로 — 인라인 표 + 인라인 수식 정상 처리
}

검증

Unit / Snapshot 테스트

  • cargo test --lib: 1118 passed / 0 failed
  • cargo test --release --test svg_snapshot: 6/6 passed
  • cargo clippy --release (본 변경): 신규 경고/오류 0
    • 사전 결함 2건 (document_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.hwp

baseline (가드 강화 전) vs after-fix SVG byte-compare:

총 274 SVG: identical=271, diff=3

diff 파일:
  exam_science_002.svg   ← 12번 본문 정정 (9개 수식 정상 분산)
  exam_science_003.svg   ← 15번 본문 정정 (수식 정상 표시)
  exam_science_004.svg   ← 18/19번 본문 정정 (수식 정상 표시)

변경 전후 좌표 비교 (12번 본문)

변경 전 변경 후
9개 수식 모두 (534.8, 1218.106) — 동일 좌표 겹침 첫 줄 y=1174.91: X(606.87), A(887.87), B(934.87)
둘째 줄 y=1196.37: C(549.87), D(569.87), m-4(698.87), m-2(743.97), m+2(789.08), m+4(834.19)

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 건.

회귀 위험 검증 결과

케이스 결과
인라인 표만 사용 paragraph (12번 보기 셀 등) ✅ 정상 분산 — 본 정정 가드 조건 외
인라인 표 + 인라인 그림 동시 케이스 has_other_inline_ctrls 에 포함 — 일반 분기
인라인 표 + 인라인 글상자 동시 케이스 has_other_inline_ctrls 에 포함 — 일반 분기
Task #287 (display equation as own LINE_SEG) paragraph_layout L2245 분기 무수정 — 회귀 영역 외
광범위 sweep ✅ 271/274 byte-identical

Test plan

  • cargo test --lib 1118 passed
  • cargo test --release --test svg_snapshot 6 passed
  • cargo clippy --release 본 변경 신규 경고 0
  • 광범위 sweep (15 fixture / 274 페이지) — 271 byte-identical + 3 의도 정정
  • SVG 텍스트 검증 (12/15/18/19번 본문 인라인 수식 모두 정상 표시)
  • WASM 빌드 (docker compose --env-file .env.docker run --rm wasm) — 본 PR 환경 Docker 미가동, reviewer 환경에서 확인 권고
  • rhwp-studio web Canvas 시각 판정 — WASM 빌드 후

잔존 / 후속

planet6897 added 4 commits May 4, 2026 13:26
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 은 문서만.
@planet6897 planet6897 changed the title [m100] Task #565 exam_science.hwp 12/15/18/19번 인라인 수식(Equation, treat_as_char) 미렌더 정정 Task #565 exam_science.hwp 12/15/18/19번 인라인 수식(Equation, treat_as_char) 미렌더 정정 May 4, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
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 + 결정적 검증 + 작업지시자 시각 판정.
edwardkim added a commit that referenced this pull request May 5, 2026
…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.
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 @jangster77 님,

본 PR 의 본질 commit (a35bdbed) 핀셋 cherry-pick 후 devel merge 완료되었습니다 (bbd4418).

처리 결과

본질 cherry-pick

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

결정적 검증

광범위 회귀 sweep (PR 본문 측정 100% 재현)

Fixture 페이지 수 byte 차이
exam_science 4 3 (page 002, 003, 004 — 12/15/18/19번 본문) ✅
exam_kor 20 0 ✅
exam_math 20 0 ✅
합계 44 3

→ PR 본문이 명시한 "271/274 identical + 3 의도 정정" 패턴이 본 환경 sweep 에서도 정확히 재현. 다른 시험지에서 회귀 0 — 케이스별 명시 가드 (has_inline_tables && !has_other_inline_ctrls) 의 정합성이 정량적으로 입증되었습니다.

시각 판정 (★ 게이트)

작업지시자 시각 판정 결과:

samples/exam_science.hwp

  • 12번 인라인 수식 겹쳐지던 문제 해결
  • 15번 개선됨
  • 18번 개선됨
  • 19번 개선됨

본 PR 본질 영역 (인라인 표 + 9개 인라인 수식 동시 케이스의 동일 좌표 겹침) 이 시각적으로도 정상 분산되어 회복되었음을 확인했습니다.

잔존 영역 인지

작업지시자 안내:

12번 문항의 인라인과 별개로 해결할 조판은 컨트리뷰터가 추가 이슈로 인지하고 있습니다.

본 PR 의 본질 영역은 정합 통과 + 잔존 조판 영역은 별도 후속 task 로 관리 예정.

본질 가드의 정합성

has_inline_tables && !has_other_inline_ctrls 가드는 케이스별 명시 가드 패턴 — 인라인 표 단독 케이스는 기존 layout_inline_table_paragraph 경로 유지 (회귀 0), 인라인 표 + 다른 인라인 컨트롤 동시 케이스만 일반 layout_paragraph 로 보냄. Stage 1~2 의 정밀 진단 (동일 페이지 0.60 그림 문단 vs 0.61 본문 비교) 으로 결함 origin 을 정확히 식별한 흐름이 메인테이너 시각 판정 통과의 기반이었습니다.

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

본 PR 도 컨트리뷰터 두 분의 협업 흐름 (@jangster77 의 본질 commit a35bdbed@planet6897 의 fork 등록) 의 우수한 사례입니다. 감사합니다.

@edwardkim edwardkim closed this May 5, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: 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 항목 추가
edwardkim added a commit that referenced this pull request May 5, 2026
…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.
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