Task #476 + #479 + #480 + #483 + #488 + #489 + #490 + #492: layout 정합 + 수식 정정 합본#478
Closed
planet6897 wants to merge 100 commits intoedwardkim:develfrom
Closed
Task #476 + #479 + #480 + #483 + #488 + #489 + #490 + #492: layout 정합 + 수식 정정 합본#478planet6897 wants to merge 100 commits intoedwardkim:develfrom
planet6897 wants to merge 100 commits intoedwardkim:develfrom
Conversation
exam_kor.hwp 24페이지 → 20페이지 정합 작업 1단계. - 페이지별 단별 used/hwp_used/diff CSV (output/debug/task435/) - 회귀 대상 5문서 페이지 수 (exam_kor 24, exam_eng 8, k-water-rfp 28, hwpspec 177, synam-001 35) - RHWP_TYPESET_DRIFT 출력 캡처 (pi=0.30, pi=1.25 split 진단) - compute_body_wide_top_reserve_for_para 산정 경로 추적 핵심 진단: col 1 reserve 306.1px (HWP 실제 94.5px 대비 +211.6px 과대). 원인: Paper-rel 좌표를 body-rel 변환 없이 그대로 reserve 에 누적. Stage 2 에서 typeset.rs:2127-2172 의 VertRelTo::Paper 분기 정정. 수행계획서/구현계획서/Stage 1 보고서 포함.
compute_body_wide_top_reserve_for_para 의 VertRelTo::Paper 분기에서 body-rel 변환 누락 정정. body 와 일부만 겹치는 (header→body 침범) 케이스에서 Paper-rel 좌표를 그대로 reserve 에 누적하던 버그 수정. 수정 전 reserve = shape_y_offset(paper) + h + outer_bottom = 306.1 px 수정 후 reserve = max(0, shape_top_abs - body_top) ... = 94.4 px 결과: - exam_kor.hwp: 24 → 22 페이지 (page 2, 15 orphan 해소) - pi=0.30, pi=1.25 split → FullParagraph - 회귀: exam_eng 8, k-water-rfp 28, hwpspec 177, synam-001 35 유지 - cargo test: 1062 passed Stage 3 에서 일반 페이지 누적 -100~-300px 정정 (22 → 20).
원래 가설 ("표/도형 후 컬럼 잔여 공간 산정 부족") 재검토.
RHWP_TYPESET_DRIFT 분석 결과 diff 메트릭은 typeset cur_h 누적
(height_for_fit, trail_ls 제외) vs hwp_used (last line vpos+lh)
의 좌표계 차이를 측정하는 것일 뿐, "rhwp 가 채울 수 있는데 못 채운
잔여 공간" 이 아님을 확인.
실제 22→20 페이지 단축 장애물:
1. 섹션 1 페이지 14: Square wrap 표 + col 0 over-fill (1225>1211)
→ col 1 under-use (64px)
2. 섹션 1 페이지 15: 단일 컬럼 출력 (단정의는 2단인데 단 1 누락)
3. 섹션 2 페이지 18: pi=11 split + pi=13 [단나누기] orphan-like
3가지 전부 해결 시 22→19 가능 (목표 20 도달).
옵션 A/B/C 결정 필요 (현 상태 종료 / Stage 4 확장 / Stage 4 부분).
옵션 A 종료: 24→22 페이지 (Stage 2 col 1 reserve 정정). 잔여 22→20 미달성, 3가지 별도 메커니즘 (Square wrap over-fill, 단일 컬럼 출력 버그, col 0 cur_h over-advance) 별도 task 분리 권고. edwardkim#393 (옵션 A) 본 task Stage 2 로 적용 완료, close 가능.
수행계획서(task_m100_439.md) + 단계1 진단 보고서. 핵심 발견: - 이슈 가설의 engine.rs:702-711 는 fallback 경로 (RHWP_USE_PAGINATOR=1). 기본 활성 엔진은 typeset.rs::TypesetEngine. - 실제 버그 위치: typeset.rs::place_table_with_text (1400-1467). engine.rs 의 !is_wrap_around_table 가드 (engine.rs:1349, 1422) 누락. - 페이지 14 col 0 used=1225.8 (본문 1211.3 초과 +14.5) 정확히 재현. 코드 변경 없음 — 임시 디버그 코드는 모두 revert.
place_table_with_text 의 정확한 cur_h 누적 추적 (디버그 후 revert): - Square wrap 4 표가 pre_height + table_total 합산 → +244.88 px 과다 - HWP 의도: max(호스트 텍스트, 표 + v_offset) 만 누적 수정안: typeset.rs::place_table_with_text 에서 current_height += max(pre_height, v_off + table_total) (Square wrap 시) 코드 변경 없음 — 임시 디버그 println 모두 revert.
typeset.rs::place_table_with_text 에서 Square wrap (어울림) 표일 때 current_height 누적을 pre_height + table_total → max(pre_height, v_off + table_total) 로 변경. 호스트 문단 텍스트와 어울림 표는 같은 수직 영역을 공유하므로 더 큰 쪽만 한 번 누적해야 HWP layout 의도와 일치. PageItem 자체는 PartialParagraph + Table 모두 push (layout 렌더링 보존). 검증: - 페이지 14 col 0 used 1225.8 → 1036.1 px (≤ 1211.3 충족) - exam_kor.hwp 22 → 20 페이지 (목표 ≤ 21 충족) - 회귀 샘플 6 종 (exam_eng/math, 21언어, aift, 2010-01-06, biz_plan) 페이지 수 동일 - cargo test 1066 개 모두 통과 - SVG 렌더링 정상 closes edwardkim#439
Stage 4 회귀 검증 결과: - 149 개 sample HWP 전수 페이지 수 비교: exam_kor 만 22→20 변경, 148개 동일 - cargo test 1066 passed - DoD 전부 충족 본 task 완료. closes edwardkim#439.
typeset.rs::place_table_with_text 의 Square wrap 표 누적 정책을 pre_height + table_total → max(pre_height, v_off + table_total) 로 변경. 효과: - exam_kor.hwp 페이지 14 col 0 used 1225.8 → 1036.1 px (over-fill 해소) - exam_kor.hwp 22 → 20 페이지 - 149 개 sample 중 exam_kor 만 변화, 148 개 동일 (회귀 0건) - cargo test 1066 passed closes edwardkim#439
…문제 수정 - 수행/구현 계획서 + Stage 1·2 보고서 작성 - src/renderer/layout.rs: paragraph border merge 그룹을 col_area 바닥/꼭대기로 클램프 - exam_kor p2/5/8/15 의 세로 구분선이 PDF 와 일치하는 길이로 정상화 (p8: 1671 → 1425, 246px 단축, 페이지 바깥 침범 해소) - vpos-reset 미존중으로 인한 텍스트 자체의 overflow 는 별도 이슈로 분리 - snapshot 갱신: tests/golden_svg/issue-267/ktx-toc-page.svg (invisible 구조 rect 의 height 5.34px 변화, 가시 변화 없음)
페이지 번호 박스가 column divider line 과 붙어 보이는 문제 해결. 원인: 꼬리말 paragraph 의 vert=Para + wrap=TopAndBottom 표가 paragraph top 에 배치되어 본문 바닥과 같은 y 에 위치. HWP 의 실제 동작은 첫 라인의 line_height/2 만큼 아래에 anchor 되어 본문과 시각적 갭 형성. 수정: layout_header_footer_paragraphs 에서 해당 조건의 첫 paragraph 표는 y_offset 에 line_height/2 (px) 를 더하여 배치. 검증 (exam_kor.hwp 20p): - 박스 top y: 1422.93 → 1439.47 (PDF 380.6mm 와 일치) - column line - 박스 갭: 0px → 16.3-17.0px (PDF 16.0px 와 일치) - column line 길이/위치는 PDF 자연 그대로 유지 (p1 1131px, p2+ 1226px) - cargo test --release: 1117 passed, 0 failed
이슈 edwardkim#445 의 두 시각적 결함 (paragraph border 페이지 바깥 침범 + 페이지 번호 박스가 column line 에 붙음) 모두 PDF 와 일치하도록 수정 완료. 승인 후 local/devel 머지 + edwardkim#445 close 예정.
- 수행계획서 (mydocs/plans/task_m100_452.md): 옵션 A 선언, 4단계 분해 - 구현 계획서 (mydocs/plans/task_m100_452_impl.md): paragraph_layout.rs:2511-2520 is_para_last_line 분기 제거, is_cell_last_line 만 보존 - Stage 1 보고서 (mydocs/working/task_m100_452_stage1.md): - exam_kor pi=1.line9↔pi=2.line0 step = 15.34px (버그) ↔ 단락내 24.51px - 10종 샘플 페이지 수 baseline 캡처 (/tmp/task_452_baseline/) - 21_언어 p1 col 1 pi=26+보기①②③ fit 확인 (edwardkim#332 회귀 baseline) - orders 갱신: 버그 섹션 edwardkim#452 항목 추가
… + golden 갱신 - src/renderer/layout/paragraph_layout.rs:2511-2519: is_para_last_line 분기 제거. is_cell_last_line(셀 내) 만 trailing 제외 보존, 본문 단락은 모든 줄에서 y += lh + ls 통일. pagination/engine.rs 의 current_height 누적과 정합. - 검증: exam_kor 1페이지 pi=1.line9↔pi=2.line0 step = 15.34 → 24.50 px (단락내 step 과 동일). cargo test --lib 1066 passed. - golden SVG 2건 baseline 갱신 (Task edwardkim#332 에서 갱신된 것을 본 정합으로 재갱신): - tests/golden_svg/issue-147/aift-page3.svg - tests/golden_svg/issue-157/page-1.svg - LAYOUT_OVERFLOW 메시지: 페이지 마지막 단락의 trailing ls (~10.9 px) 가 col_bottom 을 살짝 넘으나 빈 공간이므로 시각 무영향. pagination engine 의 effective_trailing 처리로 페이지 분배는 유지.
paragraph_layout.rs:2511-2520 의 is_para_last_line 분기 제거. 본문 단락 모든 줄에서 y += lh + ls 통일 → pagination/engine.rs 의 current_height 누적과 정합. is_cell_last_line(셀 내) 만 trailing 제외 보존. 효과: exam_kor pi=1.line9↔pi=2.line0 step 15.34→24.50 px (단락내 step 과 동일, PDF 정합). 10종 샘플 페이지 수 변동 0. Task edwardkim#332 회귀 0 (21_언어 p1 col 1 pi=26+보기①②③ fit 유지). cargo test --lib 1066 passed + svg_snapshot 6/6 (issue-147/157 baseline 재갱신). closes edwardkim#452
paragraph_layout 의 skip_text_for_inline_shape 분기 제거. 인라인 글상자가 있는 줄에서 외부 문단 본문이 통째로 스킵되던 버그를 수정. 원인: skip_text_for_inline_shape 가 글상자 내부 텍스트와 외부 문단 본문 텍스트를 혼동하여, 외부 본문(글상자 좌·우의 일반 텍스트)도 함께 스킵하고 있었음. 글상자 자체와 내부 텍스트는 shape_layout 의 inline_shape_position 경로로 별도 렌더되므로 외부 본문을 항상 렌더해도 중복되지 않는다. 검증: samples/exam_kor.hwp 페이지 2 좌측 단 line 2 의 본문 39자(척사파의 ... 거스를) 가 글상자 좌·우로 분리 렌더되어 복원됨. 페이지 수 20 유지, 전체 테스트 1117 passed.
Stage 3 회귀 검증 결과 (1117 tests passed, 페이지 수 회귀 0). Stage 4 최종 결과보고서 및 PR 메시지(`mydocs/report/task_m100_455_pr.md`) 작성. 오늘할일에 Task edwardkim#455 항목 추가.
`on_first_multicolumn_page` 가드는 새 페이지 시작 시 false 로 리셋되어 다단 구역이 여러 페이지에 걸칠 때 후속 페이지에서 `detect_column_breaks_in_paragraph` 호출이 차단됨. HWP 원본의 LINE_SEG vpos 리셋 위치가 무시되어 좌측 단 하단이 col_bottom 을 초과해 그려지던 버그. 수정: `typeset.rs:856` (기본 경로) + `pagination/engine.rs:607` (RHWP_USE_PAGINATOR=1 fallback) 의 가드에서 `on_first_multicolumn_page` 조건 제거. 검증: - exam_kor p2 pi=39 0..4/4..7 → 0..2/2..7 (HWP 원본 정합) - exam_kor LAYOUT_OVERFLOW 36 → 16 (페이지 5/8 의 동일 메커니즘 자동 해소) - 다단 샘플 4종 (exam_eng/math/science/social) 페이지 수 + SVG byte 동일 - cargo test --release 1120 passed, 0 failed closes edwardkim#459
…/Page 케이스 보강 layout.rs:3382 free function 을 LayoutEngine 메서드로 변환 + horz_rel_to 분기 추가: - Paper: ref_x=0, ref_w=current_paper_width - Page: ref_x=current_body_area.x, ref_w=current_body_area.width - Para/Column: ref_x=col_area.x, ref_w=col_area.width (기존 동작) 이전: horz_rel_to 무시, 항상 col_area 기준 (Column 케이스만 정확). table_layout::compute_table_x_position 의 동일 룰 적용 — 룰 정합. caller 2곳 (layout.rs:2407, 2641) 의 self.dpi 인자 제거. 검증: - 9종 샘플 202 SVG 회귀 0 (Paper/Page case 발생 샘플 없음 — 잠재 결함 보강) - cargo test 1094+ 통과 - clippy 본 변경부 경고 0 Task edwardkim#463 Stage 5 의 후속. closes edwardkim#466
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
… 셀 alignment + Task #483 각주 line_spacing, cherry-pick @planet6897)
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
… 텍스트 LINE_SEG, cherry-pick @planet6897)
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
…LINE_SEG, cherry-pick @planet6897)
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
…기 가드, cherry-pick @planet6897)
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
작성자 devel 분기 누적 9 Task (97 commits) 중 페이지 레이아웃 무관 5 Task 만 분리 cherry-pick. 본 사이클 정정 영역 (#501) 과 충돌 위험 큰 4 Task (#476, #479, #480, #492) 제외. 흡수 (8 commits): - #488 (3): 수식 토크나이저 prefix 분리 + 렌더러 italic - #490 (1): 빈 텍스트 + TAC 수식 셀 alignment - #483 (2): 각주 multi-paragraph line_spacing - #489 (1): Picture+Square wrap 호스트 텍스트 LINE_SEG - #495 (1): 셀 paragraph 인라인 Shape 분기 가드 (부분 정정) 검증: cargo test --lib 1102 passed, svg_snapshot 6/6, issue_418 1/1, issue_501 PASS, clippy 0건, WASM 4,211,238 bytes. 작업지시자 시각 판정: 1차/2차 통과 + 3차 (#495) 부분 정정 → 옵션 B (개선 흡수 + 잔존 결함 별도). 이슈 #502 (문단 내 글상자 TextRun 처리) 분리 등록. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Owner
처리 결과 — cherry-pick 머지 (5 Task / 8 commits)본 PR 의 9 Task 중 페이지 레이아웃 무관 영역 5 Task 분리 cherry-pick 머지 완료. 흡수 (8 commits)
제외 (4 Task)
본 사이클의 정정 (#501 cell.padding 한컴 방어 로직) 안정화 후 위 4 Task 는 다음 PR 사이클에서 재처리 가능 영역으로 봤습니다. 검증
잔존 결함#495 의 가드는 텍스트 중복은 정정했지만 잔존 — exam_science p2 7번 박스 안 본문 4글자 누락 + 사각형 위치. → 이슈 #502 (문단 내 글상자 TextRun 처리) 분리 등록. 머지 commits
상세는 `mydocs/pr/pr_478_report.md` 참고. Author 보존 (Jaeook Ryu) + 단계 commit 분리. 본 PR 은 close 합니다. |
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
…aragraph margin 반영, cherry-pick @planet6897)
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
…h margin 반영, cherry-pick @planet6897)
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
…Shape 페이지 라우팅, cherry-pick @planet6897)
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
…이지 라우팅, cherry-pick @planet6897)
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
PR #478 close 후 추가 cherry-pick 진행: - 4차 #480: wrap=Square 표 paragraph margin (82fd66e) - 5차 #476: PartialParagraph 인라인 Shape 페이지 라우팅 (5955b10) 총 7 Task / 10 commits 흡수. 미흡수 #479 (paragraph trailing line_spacing) 는 한컴 2020 정답지 시각 판정 필수로 이슈 #503 분리. 작업지시자 통찰: "#479 는 회귀쪽에서 실패가 납니다. 이건 따로 분리해서 한컴 2020 버전으로 시각판정을 해야 합니다." 검증: cargo test --lib 1102 passed, WASM 4,202,430 bytes, 4차/5차 시각 판정 모두 통과. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
본 사이클 본질: - Task #501 (cell.padding 한컴 방어 로직 모방 정정, closes #501) - PR #428 (oksure — 그룹 내 그림 직렬화) - PR #494 (DanMeon — Paragraph::utf16_pos_to_char_idx 외부 노출, #484) - PR #478 (planet6897 — 7 Task / 10 commits cherry-pick: #488/#490/#483/#489/#495/#480/#476) - PR #498 (seo-rii — Canvas visual diff 파이프라인, relates #364) 미흡수 + 분리: - 이슈 #502 (#495 잔존 — 문단 내 글상자 TextRun 처리) - 이슈 #503 (#479 미흡수 — 한컴 2020 시각 판정 필수) 버전 갱신: Cargo.toml + npm/editor + rhwp-studio + rhwp-vscode 모두 0.7.8 → 0.7.9. CHANGELOG (한/영) 갱신, rhwp-vscode/CHANGELOG.md 갱신. README 기여자 감사 누적 갱신 (cskwork/DanMeon/oksure/planet6897/seanshin/seo-rii 추가). 검증: cargo build OK, cargo test --lib 1102 passed, cargo clippy 0건, WASM 빌드 정합. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 1, 2026
본 사이클: - rhwp-chrome / Edge v0.2.2: 4 파일 버전 동기화 (manifest + package + dev-tools-inject + content-script — v0.2.0 hotfix 사례 정합) - rhwp-firefox v0.2.2: 동일 영역, content-script.js 는 manifest 동적 참조로 자동 정합 라이브러리 코어 v0.7.3 → v0.7.9 (4 사이클) 갱신 — Task #501 + PR #428/#494/#478/#498 누적 + v0.7.6/v0.7.7/v0.7.8 사이클 흡수. 등록 문구: - chrome-0.2.2_kor.md / chrome-0.2.2_eng.md (한/영) — Chrome/Edge 공통 + AMO 등록 정보 - edge-0.2.2_reviewer_notes.md — Edge 파트너 센터 Notes for certification (1,918자, 2,000자 한계 내) - chrome-0.2.1 한/영 등록 문구 백업 자기검열 grep (feedback_external_docs_self_censor 메모리 룰): 통과 AMO 4 함정 (feedback_amo_submission_gotchas 메모리 룰): 통과 빌드 환경: Node v22.18.0 (rolldown 호환). 빌드 결과: - rhwp-chrome.zip 16 MB - rhwp-firefox.zip 12.9 MB - rhwp-source-0fb3e67.zip 47.9 MB (AMO 소스 제출) 3 스토어 제출 완료: - Chrome Web Store (1~3 영업일 심사) - Microsoft Edge Add-ons (1~2 영업일) - Mozilla AMO (1~5 영업일) .gitignore: rhwp-chrome/*.zip, rhwp-firefox/*.zip, rhwp-firefox/dist/ 추가 (빌드 산출물 누적 차단) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 1, 2026
본 사이클 17번째 PR. HWP 3.0 (한컴 1990년대~2000년대 초반 레거시 포맷) 첫 오픈소스 파서 구현 + Square wrap 어울림 렌더링 정정. 본 PR 머지로 rhwp = HWP 5.0 + HWPX + HWP 3.0 3 포맷 모두 지원. 본질: - Task #417: HWP 3.0 파서 본질 (Stage 1~4) - Task #460: Square wrap + 렌더러 정정 (Stage 1~9 + 보완 1~3 + 리팩토링) - 작성자 분기에서 본 사이클 devel (Task #501 + PR #478 + PR #498 + v0.7.9) 이미 흡수 → 충돌 해결 보존 옵션 B (단일 머지) 선택. 51 commits 의 작성자 단계 보고서 보존 + 본 사이클 회귀 영역 (issue_501 PASS) 통과. 검증: cargo test --lib 1105 passed (1102 + HWP 3.0 신규 3), svg_snapshot 6/6, issue_418 1/1, issue_501 PASS, clippy 0건, WASM 4,378,441 bytes (+176 KB Johab 매핑 + 파서). 작업지시자 통찰: "이제 우리도 HWP 3.0 포맷까지 성공했습니다. 컨트리뷰터가 대단합니다." 머지 commit: c7330cf Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
9 개 task 합본 PR — layout 정합 정정 4건 + 수식 정정 1건 + #488 후속 시각 결함 정정 3건 (1 자연해소 포함).
Task #479 — paragraph 누적에서 trailing line_spacing 제외 (HWP vpos 정합) ★
samples/21_언어_기출_편집가능본.hwp페이지 12 layout drift 200px 해결. typeset.rs:802 의 paragraph total_height 가 마지막 line 의 line_spacing 까지 누적하여 HWP vpos 기준과 어긋나던 문제. paragraph 17개 누적 ≈ 200px drift. 옵션 A (typeset + layout 동시 정정, Task #452 회복 분기 + 셀 내부 보호 분기 유지) 적용.핵심 검증:
samples/aift.hwpp3 모든 paragraph diff = +9.5 → +0.0 (HWP vpos 완전 정합).Task #476 — PartialParagraph 인라인 Shape 페이지 라우팅 정정
paragraph 페이지 분할 시 인라인
treat_as_charShape 의PageItem::Shape가 항상 마지막 페이지에 등록되어 박스가 잘못된 페이지의 fallback 위치에 출현하던 문제 해결.Task #480 — wrap=Square 표의 x 좌표에 paragraph margin 반영
wrap=Square 표가 paragraph margin/indent 가 있는 경우 단 사이 갭 영역에 잘못 그려지던 문제 해결.
Task #483 — 각주 multi-paragraph 처리에서 line_spacing 누락
layout_footnote_paragraph_with_number가 trailing line_spacing 누락하던 것을 정정. follow-up 으로 각주 마지막 paragraph 의 trailing ls 미적용 (note_spacing 과 이중 합산 방지).Task #488 — 수식 토크나이저 rm/it/bold prefix 분리 + 렌더러 italic honor ★
hwpeq 폰트 스타일 키워드(
rm/it/bold)가 식별자에 공백 없이 붙어 쓰일 때(예:rmK,rmCa,rmmol,itl,itaq)를 토크나이저가 분리하지 못해 SVG 에 raw prefix 가 글자 그대로 출력되던 문제 + svg/canvas 렌더러 Text arm 이italic파라미터를 무시하여FontStyle::Roman(rm) 적용 영역도 italic 으로 표시되던 두 가지 본질 결함 정정.tokenizer.rs read_command()에 FONT_STYLES prefix 분리 (bold → it → rm 우선순위)svg_render.rs/canvas_render.rsText arm 이italic파라미터 honor + 진입점 defaultitalic=true(hwpeq 변수 기본 스타일)핵심 검증:
samples/exam_science.hwp페이지 1 표 #3 (이온 결합) 의 K⁺, X⁻, Y⁻, Ca²⁺, O²⁻ 화학 기호가 rawrmK/rmCa에서 정상 roman 으로 정정. 8개 핵심 샘플 59 페이지에서 raw prefix 잔존 0건.Task #489 — Picture+Square wrap (어울림) 호스트 텍스트 LINE_SEG.cs/sw 적용 ★
samples/exam_science.hwp페이지 1 5번 문제 (pi=21) 의 어울림 그림이 본문 첫 줄을 가리고 단어 간격이 비정상적으로 큰 결함 정정.paragraph_layout.rs:layout_composed_paragraph가available_width = col_area.width - margins로 계산하여 LINE_SEG.segment_width(=19592 HU, 그림 너비만큼 좁아짐)를 무시했던 문제. 표 Square wrap (#362/#439/#463) 은 caller 가 col_area 자체를 wrap_area 로 좁혀 우회하지만 Picture/Shape 는 호스트 paragraph 와 같은 paragraph 에 anchor 되어 별도 우회 경로가 없었음.비-TAC
Control::Picture/Control::Shapewithwrap=Square보유 시 LINE_SEG.cs/sw 를 effective_col_x/effective_col_w 로 적용 (200 HU 노이즈 가드, 휴리스틱 없음).핵심 검증: exam_science p1 pi=21 첫 줄 텍스트 x=534..944 (풀컬럼) → x=535..798 (sw 적용, 그림 분리). p2 pi=37 8번 문제 동일 패턴 자동 정정.
Task #490 — 빈 텍스트 + TAC 수식 셀 paragraph alignment 적용 ★
samples/exam_science.hwp페이지 1 3번 표 (이온 결합 4×4) 셀 7/11 의 28/36 수식이 셀 중앙이 아닌 좌측에 정렬되던 결함 정정.paragraph_layout.rs:2227의 빈 runs + TAC 수식 분기 (Task #287 도입) 가 paragraph alignment 적용을 누락. 동일 함수 텍스트 runs 케이스(line 1200) 와 동일 패턴으로align_offset산출 후inline_x에 적용. Justify/Left 는 변경 없음 (회귀 차단).핵심 검증: 28/36 수식 x=358.7 → 415.5 (셀 중앙 부근). 9 종 샘플 263 페이지 byte 비교 = 257 동일 / 6 정정 (59 수식 모두 우측 이동, 회귀 0). exam_science 전 페이지 + exam_math p13 + kps-ai p46 광범위 정정.
Task #492 — 5번 밑단 짤림 (자연해소)
#489 정정으로 자연 해소. 검증: pi=21 (5번) 본문 6 줄, 보기 ㄱ/ㄴ/ㄷ, 선택지, pi=27 (6번) 모두 페이지 1 col 1 에 정상 표시. col 1 used=1108.9px / body 1215.1px (overflow 없음). #488 Stage 2 시각 검증 시 #489 의 텍스트-그림 겹침으로 '잘림' 으로 오인된 케이스.
핵심 검증
21_언어_기출p11 단 1 끝 paragraph 238 박스2010-01-06p1 각주 1) p[0]→p[1] gapexam_sciencep1 표 #3 화학 기호rmK/rmCa(raw)exam_sciencep1 rawrm/itprefixexam_sciencep1 pi=21 첫 줄 텍스트exam_sciencep2 pi=37 첫 6 줄exam_sciencep1 28/36 수식 xTYPESET_DRIFT 정합 (#479)
광범위 회귀
#488 raw prefix 점검
#489 byte 비교 (9 종 샘플 263 페이지)
#490 byte 비교 (9 종 샘플 263 페이지)
Test plan
cargo test --release: 1094 passed, 0 failed, 1 ignored (수식 토크나이저: rm/it/bold 폰트 스타일 키워드를 식별자 prefix로 분리하지 못함 #488 14 + samples/exam_science.hwp 페이지 1 5번 문제: 그림이 본문 텍스트 첫 줄을 가림 #489 1 + samples/exam_science.hwp 페이지 1 3번 표: 28/36 셀 중앙정렬 안 됨 #490 1 추가)cargo test --release --test svg_snapshot: 6/6 통과cargo test --release --test issue_418: 1/1 통과페이지 수 변화 (#479 영향)
paragraph 누적 정확화로 더 많은 paragraph 가 한 페이지에 들어가는 결과.
변경 파일
src/renderer/typeset.rs: paragraph total_height 에서 trailing line_spacing 제외 (페이지 12 layout drift — 누적 trailing line_spacing으로 23번 paragraph가 한컴 PDF 대비 ~200px 하향 #479)src/renderer/layout/paragraph_layout.rs:src/renderer/layout/integration_tests.rs: test_489, test_490 추가src/renderer/pagination.rs,pagination/engine.rs,typeset.rs: 인라인 Shape 페이지 라우팅 (PartialParagraph의 인라인 Shape(treat_as_char)가 다음 페이지에 잘못된 위치로 중복 렌더 #476)src/renderer/layout/shape_layout.rs: D 안전장치 (PartialParagraph의 인라인 Shape(treat_as_char)가 다음 페이지에 잘못된 위치로 중복 렌더 #476)src/renderer/layout.rs: Square wrap 표 effective_margin (wrap=Square 표(어울림 배치)의 x 좌표가 단 사이 갭으로 치우침 — 페이지 14 [A] 박스 #480)src/renderer/layout/picture_footnote.rs: 각주 paragraph trailing ls (각주 multi-paragraph 처리에서 paragraph 간 line_spacing 누락 (4.8px) #483)src/renderer/equation/tokenizer.rs: FONT_STYLES prefix 분리 + 헬퍼 + 테스트 8 (수식 토크나이저: rm/it/bold 폰트 스타일 키워드를 식별자 prefix로 분리하지 못함 #488)src/renderer/equation/svg_render.rs: Text arm italic 파라미터 honor + 진입점 default + 테스트 6 (수식 토크나이저: rm/it/bold 폰트 스타일 키워드를 식별자 prefix로 분리하지 못함 #488)src/renderer/equation/canvas_render.rs: Text arm italic 파라미터 honor + 진입점 default (수식 토크나이저: rm/it/bold 폰트 스타일 키워드를 식별자 prefix로 분리하지 못함 #488)src/main.rs: dump 명령에 horz_align/vert_align 표시 (samples/exam_science.hwp 페이지 1 5번 문제: 그림이 본문 텍스트 첫 줄을 가림 #489 보조 디버깅)tests/issue_418.rs,tests/golden_svg/*,.gitignore: 테스트 갱신#488 후속으로 분리된 별도 이슈 처리 결과
시각 검증 중 발견되었으나 본질 영역이 다른 4건은 별도 이슈로 분리, 본 PR 에서 3건 처리:
closes #476
closes #479
closes #480
closes #483
closes #488
closes #489
closes #490
closes #492