fix: 빈 caption phantom advance 정정 — sample16 page 18 본문 다음 페이지 밀림 해소 (closes #957)#958
Closed
jangster77 wants to merge 1 commit into
Closed
fix: 빈 caption phantom advance 정정 — sample16 page 18 본문 다음 페이지 밀림 해소 (closes #957)#958jangster77 wants to merge 1 commit into
jangster77 wants to merge 1 commit into
Conversation
…loses edwardkim#957) ## 본질 `samples/hwp3-sample16.hwp` page 18 의 "나. 주요 과업내용" 후 본문 paragraphs (pi=395~401 "○ 통합모델...") 이 다음 페이지로 밀려 시각 누락. 한컴 viewer 는 같은 페이지 표시. ## Root cause `RHWP_DEBUG_TAC_CURSOR` 추적 결과: ``` Shape pi=394 ci=1 y_in=767.3 y_out=1197.9 dy=430.6⚠️ FullPara pi=395 y_in=1197.9 (body 외 영역) ``` `src/renderer/layout.rs:3470-3475` (layout_shape_item 의 Bottom caption advance): - pi=394 ci=1 picture 의 caption: `dir=Bottom width=0 paras=1 text=""` (빈 caption) - 빈 caption 임에도 layout 이 `cap_bottom = cap_y + caption_h` 계산 - pic_y = 767.3 (has_prior_tac 로 갱신된 잘못된 para_start_y) - image_bottom = 767.3 + 411.89 (pic_h) = 1179.19 - cap_y = 1179.19, caption_h = 18.7 (empty paragraph default line height) - cap_bottom = 1197.89 → result_y +430.6 phantom advance - 다음 paragraph (pi=395) 가 1197.89 부터 시작 → body 외 emit ## Fix 빈 caption 시 result_y advance skip — `paragraphs[*].text` 가 모두 무의미 문자 + `controls.is_empty()` 시 advance 분기 미진입. `RHWP_DEBUG_TAC_CURSOR` 환경변수 영구화 (paragraph item 별 y_offset 추적 진단 도구). ## 검증 - cargo test --release --lib: 1288 passed, 0 failed, 2 ignored - sample16 page 18: pi=395~401 본문 같은 페이지 정상 emit (한컴 viewer page 16 정합) - hwp3-sample14 (Task edwardkim#864 영역, non-empty caption "Cut&Paste 할 영역" + empty 다수): 정상 - hwp3-sample10/11/13, exam_kor/math: 회귀 없음 ## 영향 | 영역 | 영향 | |------|------| | Empty caption picture | result_y advance 제거 (회귀 fix) | | Non-empty caption picture | 영향 없음 | | Caption None | 영향 없음 | | Caption Top direction | 영향 없음 | ## 관련 - 원 issue edwardkim#952 + PR edwardkim#956 — Issue 1 (페이지 외곽선 paper/body) 해결 - archive/task936 — 본 영역 이전 fix 시도 history (미완) - PR edwardkim#918 — 본 영역 시도 history (close) - 잔존 — 원 edwardkim#952 의 Issue 3 (HWP5 시험지 page 1 문9 vertical) 별도 task Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This was referenced May 17, 2026
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
@jangster77 — Issue #952 Issue 1: 페이지 외곽선 paper/body 잘못 분류 회귀. 회귀 source: 4bb1128 fix (#920) 의 paper_based = (attr & 0x01) == 0 비트 반전. 회귀 history: task877 (!= 0, sample16 정합/시험지 회귀) → #920 (== 0, 시험지 정합/sample16 회귀) → 본 PR (true, 모든 sample 한컴 정합). 진단: 5+ samples 한컴 viewer 실측 — attr 0/1, textBorder PAPER/CONTENT 양쪽 다 paper-based. bit 0 은 outline 위치 결정 비트 아님 (text wrap interaction 등 별 의미). 본질 (src/renderer/layout.rs +16/-2): - paper_based = true 강제 (#920 회귀 코드 대체) - RHWP_DEBUG_PAGE_BORDER 환경변수 진단 영구화 - 회귀 history 코멘트 영구 보존 (재회귀 방지) 추가: 시험지 fixture 8 (HWP/HWPX) + 한컴 2022 권위 PDF 4 (회귀 가드) + 문서 4. 본 PR 범위 외 (별도 task 분리, PR 본문 명시): - Issue 2: sample16 page 18 본문 밀림 (typeset multi-TAC cursor over-advance) - Issue 3: 시험지 문9 vertical 처짐 (HWP5 column) 자기 검증: cargo test --release --lib 1288 passed / clippy 통과 / 광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드 시각 판정: 작업지시자 시각 검증 통과 (sample16 + 시험지 page border paper-based, 한컴 2022 PDF 권위) CI: ✅ Build & Test + CodeQL + Canvas visual diff 연속 5 PR 1번째 (#956 → #958 → #961 → #963 → #964, @jangster77 순차 처리)
This was referenced May 17, 2026
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
- mydocs/pr/archives/pr_956_review.md (paper-based outline 회귀 분석) - mydocs/pr/archives/pr_956_report.md (옵션 A 처리 결과 + 동기화 선행) - mydocs/orders/20260517.md PR 처리 섹션 추가 (컨트리뷰터 Task #952 작업 일지 보존) 핵심: - 사전 동기화 (5/11→5/17 +19 commits FF, feedback_release_sync_check) - 회귀 source 4bb1128 (#920) bit 반전 → paper_based=true 강제 - 5+ samples 한컴 실측 정합 (추측보다 실측) - sweep 169/169 same + 작업지시자 시각 판정 통과 - Issue #952 OPEN 유지 (Issue 2/3 별도 task, 연속 PR #958 후속)
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
@jangster77 — Issue #957 (Issue #952 영역 영역 Issue 2 분리 task): sample16 page 18 "나. 주요 과업내용" 후 본문 (pi=395~401) 다음 페이지 밀림. Root cause (RHWP_DEBUG_TAC_CURSOR 추적): pi=394 ci=1 picture 의 빈 caption (dir=Bottom width=0 paras=1 text="") 영역 영역 phantom +430.6px 누적 → pi=395 가 body 외 영역 emit → 다음 페이지 밀림. 본질 (src/renderer/layout.rs): caption_is_empty 가드 — caption 모든 paragraph 영역 영역 무의미 문자 (≤U+001F, U+FFFC) + controls.is_empty() 시 result_y advance skip. RHWP_DEBUG_TAC_CURSOR 진단 영구화 (PR #956 RHWP_DEBUG_PAGE_BORDER 패턴 정합). 영역 좁힘: 빈 caption + Bottom 한정 — non-empty/None/Top 영향 없음. 본 환경 충돌 수동 해결: - mydocs/orders/20260517.md — 본 환경 PR #956 처리 섹션 + PR #958 Task #957 작업 일지 양측 보존 통합 - src/renderer/layout.rs — PR #956 (paper_based :770) + PR #958 (caption :3491) 다른 영역 auto-merge (양립 확인) 자기 검증: cargo test --release --lib 1288 passed / clippy 통과 / 광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드 시각 판정: 작업지시자 시각 검증 통과 (sample16 page 18 본문 같은 페이지, sample14/10/11/13 + PR #956 page border 회귀 부재) CI: ✅ Build & Test + CodeQL + Canvas visual diff 연속 5 PR 2번째 (#956 ✅ → #958 → #961 → #963 → #964)
Owner
|
@jangster77 머지 완료 (commit RHWP_DEBUG_TAC_CURSOR 추적 영역 영역 pi=394 ci=1 picture 빈 caption phantom +430.6px 정확 진단. caption_is_empty 가드 (무의미 문자 ≤U+001F/U+FFFC + controls.is_empty()) + Bottom 한정 영역 영역 케이스별 명시 — 일반화 없는 정확한 정정. 본 환경 충돌 수동 해결:
본 환경 검증:
archive/task936 (미완 시도) + PR #918 (close) → 본 PR 정확 정정 — feedback_pr_supersede_chain (c) 패턴. 잔존: Issue #952 Issue 3 (시험지 문9 vertical, HWP5 column) 별도 task. 수고하셨습니다. 연속 PR #961 이어서 진행하겠습니다. |
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
- mydocs/pr/archives/pr_958_review.md (빈 caption phantom advance 분석) - mydocs/pr/archives/pr_958_report.md (옵션 A 처리 결과) - mydocs/orders/20260517.md PR #958 행 추가 핵심: - pi=394 ci=1 picture 빈 caption phantom +430.6px (RHWP_DEBUG_TAC_CURSOR 추적) - caption_is_empty 가드 + Bottom 한정 (케이스별 명시) - PR #956 + #958 layout.rs 양립 확인 (paper_based :770 + caption :3491) - sweep 169/169 same + 작업지시자 시각 판정 통과 - Issue #957 close, Issue #952 OPEN 유지 (Issue 3 잔존, 연속 PR #961 후속)
edwardkim
pushed a commit
that referenced
this pull request
May 17, 2026
…p — 시험지 page 1 문9 정합 (closes #959) `samples/3-11월_실전_통합_2022.hwp` page 1 우측 단의 문9 가 한컴 viewer 보다 ~250px 아래 처짐. `RHWP_DEBUG_TAC_CURSOR` 추적 결과: ``` Shape pi=69 ci=0 y_in=709.4 y_out=983.4 dy=274.0⚠️ ... pi=70~72 (빈 줄) ... FullPara pi=73 y_in=1043.5 ... (문9 line) ``` pi=69 picture (16786×20400 HU = 59.2×72.0mm, **height 272px**): - horz_rel_to=Column, h_offset=79.5mm (300px), 정렬=Center - vert_rel_to=Para, wrap=TopAndBottom, tac=false `compute_object_position` 계산: - pic_emit_x = col_area.x + (col_width - pic_width)/2 + h_offset = 399 + (360-224)/2 + 300 = 767 - col_area right = 759.7 → **picture 가 column 우측 외부 emit** 한컴 viewer 는 column flow 에 reservation 하지 않음 (PDF 분석: 우측 단에 picture 표시 안 됨). rhwp 는 picture height 만큼 cursor advance → 문9 처짐. `src/renderer/layout.rs:3500-3556`: horz_rel_to=Column picture 의 emit x 사전 계산. pic_emit_x >= col_area.x + col_area.width 시 result_y = saved_y_offset (advance skip). `RHWP_DEBUG_TAC_CURSOR` 환경변수 영구화 (paragraph item 별 y_offset 추적 진단 도구). - cargo test --release --lib: 1288 passed, 0 failed - 시험지 (3-11월) page 1 문9: y=1061 → y=805 ✓ 한컴 PDF 정합 - pi=69 ci=0 dy: 274 → 18 (line advance만) ✓ - 시험지 4종 (3-09월 2022/2023, 3-10월 2022, 3-11월 2022) page 1: 정상 - exam_kor page 18 (Square wrap picture, Task #722 영역): 정상 - exam_math/eng/hwp3-sample10/11/13: 정상 | 영역 | 영향 | |------|------| | horz_rel_to=Column + col 외부 emit picture | result_y advance 제거 (회귀 fix) | | horz_rel_to=Column + col 내부 emit picture | 영향 없음 (Fix 조건 미진입) | | horz_rel_to=Paper/Page picture | 영향 없음 (is_paper_based 분기) | | horz_rel_to=Para picture | 영향 없음 (Column 검사 false) | | TAC picture | 영향 없음 (별도 분기) | 본 task page 2 시각 검증 중 multi-line equation off-by-one 결함 발견 → 별도 issue #960 (Fix C 와 무관 pre-existing). - 원 issue #952 + PR #956 — Issue 1 (페이지 외곽선) 해결 - PR #958 — Issue 2 (sample16 page 18 본문 누락) 해결 - 본 PR #959 — Issue 3 (시험지 page 1 문9 vertical) 해결 - 신규 issue #960 — page 2 multi-line equation off-by-one (별도) PR #956 와 중복 가능 (먼저 머지되는 PR 가 가져감): - samples/3-09월_교육_통합_2022.{hwp,hwpx} 외 7개 - pdf/3-09월_교육_통합_2022.pdf 외 3개 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
… column 외부 emit advance skip @jangster77 — Issue #959 (Issue #952 영역 영역 Issue 3 분리 task): 시험지 (3-11월) page 1 우측 단 문9 ~250px 처짐. Root cause (RHWP_DEBUG_TAC_CURSOR 추적): Shape pi=69 ci=0 picture (horz_rel_to=Column, h_offset=79.5mm, Center) 영역 영역 pic_emit_x=767 > col_area right=759.7 → picture 좌측 edge column 외부, 한컴 PDF 우측 단 미표시. 그럼에도 cursor 274px advance → 문9 처짐. 본질 (src/renderer/layout.rs:3537): saved_y_offset — horz_rel_to=Column picture pic_emit_x 가 col_area 우측 초과 시 result_y = saved_y_offset (advance skip, :3566). 영역 좁힘: horz_rel_to=Column + col 외부 한정 — col 내부/Paper/Page/Para/TAC 영향 없음. 본 환경 충돌 수동 해결: - mydocs/orders/20260517.md — 본 환경 PR #956/#958 처리 표 + PR #961 Task #959/#960 작업 일지 양측 보존 통합 - src/renderer/layout.rs — auto-merge: PR #956 paper_based=true :770 + PR #958 caption_is_empty :3491 + PR #961 saved_y_offset :3537 3 정정 양립 - 시험지 fixture 8 + PDF 4 — PR #956 머지 영역 영역 동일 content (devel 보존) 자기 검증: cargo test --release --lib 1288 passed / clippy 통과 / 광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드 시각 판정: 작업지시자 시각 검증 통과 (시험지 page 1 문9 y=805 한컴 PDF 정합, 시험지 4종 + exam_kor p18 + PR #956/#958 회귀 부재) CI: ✅ Build & Test + CodeQL + Canvas visual diff Issue #952 종결 — Issue 1 (#956) + Issue 2 (#958) + Issue 3 (#961) 모두 해결. 잔존: Issue #960 (page 2 multi-line equation off-by-one, pre-existing, 별도) 연속 5 PR 3번째 (#956 ✅ → #958 ✅ → #961 → #963 → #964)
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
- mydocs/pr/archives/pr_961_review.md (column picture advance skip 분석) - mydocs/pr/archives/pr_961_report.md (옵션 A 처리 결과 + Issue #952 종결) 핵심: - pi=69 ci=0 horz_rel_to=Column picture col 외부 emit (RHWP_DEBUG_TAC_CURSOR) - saved_y_offset advance skip + col 외부 한정 (케이스별 명시) - PR #956/#958/#961 layout.rs 3 정정 양립 (:770 + :3491 + :3537) - sweep 169/169 same + 작업지시자 시각 판정 통과 - Issue #952 종결 (Issue 1/2/3 모두 해결: #956/#958/#961) - 잔존 Issue #960 (page 2 equation off-by-one, 별도 task)
edwardkim
pushed a commit
that referenced
this pull request
May 17, 2026
… formula off-by-one 해소 (closes #960) `samples/3-11월_실전_통합_2022.hwp` page 2 문14 (pi=117) 의 cases formula (multi-line equation g(x)={cases x...f(x)}) 가 line 0 영역 (y=329) 에 emit (예상 line 1 ~y=347, 한컴 PDF 정합) — header text 와 시각 overlap. `RHWP_DEBUG_PARA_TAC` 추적 결과: pi=117 text 에 FFFC (object replacement char) 없음. `find_control_text_positions` (model/paragraph.rs:817-838) 의 char_offsets gap 분석: - utf16 gap [60, 76] = 15 → 1 control at codepoint position 30 (= `\n`) compose_lines 의 line 1 chars range = [23, 30) — **position 30 (=\n) 제외**. `paragraph_layout.rs:1724-1727` filter: ```rust .filter(|(pos, _, _)| *pos >= run_char_pos && (*pos < run_char_end || (is_last_run && *pos == run_char_end))) ``` cases (pos=30) for line 1 (run_char_pos=23, run_char_end=30): - pos < 30 ❌, is_last_run ❌ (line 1 은 paragraph 의 last line 아님) - → cases 가 line 1 run_tacs 에서 누락 → shape_layout 의 default y (=329) 에 emit `src/renderer/layout/paragraph_layout.rs:1719-1736`: ```rust // [Task #960] has_line_break line 의 마지막 run 도 run_char_end 위치 의 TAC 포함. // HWP3 의 char_offsets gap 분석으로 매핑된 control 위치가 `\n` 문자에 떨어지면, // 그 line 의 chars range [start, end) 에서 end 가 `\n` 위치이므로 누락. let allow_end_tac = is_last_run || (comp_line.has_line_break && is_last_run_of_line(run_idx)); let run_tacs: Vec<(usize, f64, usize)> = tac_offsets_px.iter() .filter(|(pos, _, _)| *pos >= run_char_pos && (*pos < run_char_end || (allow_end_tac && *pos == run_char_end))) ... ``` - cargo test --release --lib: 1288 passed, 0 failed - 시험지 page 2 문14 cases formula y: 329 → 352 ✓ (line 1 정상) - TAC_LINE pi=117 line 1 run_tacs: [] → [(7, 177.85, 3)] ✓ - LAYOUT_OVERFLOW count: 41 → 41 (회귀 0) - exam_kor/math/eng, sample10~14, 시험지 4종: 시각 회귀 0 | 영역 | 영향 | |------|------| | has_line_break + end-position control | 정상화 (이전 누락 → line 내 inline emit) | | has_line_break 없는 line | 영향 없음 (조건 미진입) | | 일반 TAC control (line 안쪽) | 영향 없음 | 본 task Stage 4 시각 검증 중 발견: - 문14 의 <보기> textbox (pi=118 InFrontOfText TAC 사각형 + 내부 글상자) 의 inline 수식 + ㄱㄴㄷ prefix scramble - Fix 적용 전/후 동일 (pre-existing, Fix 와 무관) - → 별도 issue #962 등록 - 원 issue #952 + PR #956 (Issue 1 외곽선) - PR #958 (Issue 2 sample16 page 18) - PR #961 (Issue 3 시험지 page 1 문9 vertical) - 본 PR (Issue 4 cases formula off-by-one) - 신규 issue #962 — page 2 보기 textbox 별도 task samples/pdfs (시험지 hwp/hwpx, pdf) 는 PR #956 에서 추가되므로 본 PR 에 포함 안 함. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
@jangster77 — Issue #960 (Issue #952 영역 영역 Issue 4, PR #961 page 2 검증 중 발견): 시험지 (3-11월) page 2 문14 (pi=117) cases formula 가 line 0 (y=329) 에 emit → header text 와 overlap. Root cause (RHWP_DEBUG_PARA_TAC 추적): char_offsets gap 분석 영역 영역 cases (ci=3) → position 30 (= \n 위치). compose_lines line 1 chars [23,30) 에서 position 30 제외 → is_last_run && pos == end 만 허용 → line 1 (last line 아님) 누락 → line 0 (header) emit → overlap. 본질 (src/renderer/layout/paragraph_layout.rs:1730): allow_end_tac = is_last_run || (comp_line.has_line_break && is_last_run_of_line(run_idx)) — has_line_break line 의 마지막 run 도 end position TAC 포함. RHWP_DEBUG_PARA_TAC 진단 영구화. 영역 좁힘: has_line_break + end-position 한정 — has_line_break 없는 line / 일반 TAC (line 안쪽) 영향 없음. 본 환경 충돌 수동 해결: mydocs/orders/20260517.md (--ours 본 환경 PR 처리 표 보존 + Task #960/#962 작업 일지 갱신). paragraph_layout.rs auto-merge (devel 변경 부재, PR #956/#958/#961 은 layout.rs — 다른 파일, 4 정정 양립). 자기 검증: cargo test --release --lib 1288 passed / clippy 통과 / 광범위 sweep 7 fixture / 169 페이지 / 168 same / 1 diff (exam_math_017.svg). exam_math page 18 inline equation line 매핑 변화 — 작업지시자 한컴 2020 에디터 직접 확인 영역 영역 **의도된 정정 확정** (이전 잘못된 line emit → 정정 후 올바른 line, 시험지 page 2 cases 와 동일 본질). WASM 4.4 MB 재빌드. 시각 판정: 작업지시자 시각 검증 통과 (시험지 page 2 cases y=352 한컴 PDF 정합 + exam_math page 18 의도 확정 + 회귀 부재) CI: Build & Test pending (devel merge commit 재트리거) — 본 환경 자기 검증 보완 잔존: Issue #962 (page 2 보기 textbox scramble, pre-existing, 별도 task) 연속 5 PR 4번째 (#956 ✅ → #958 ✅ → #961 ✅ → #963 → #964)
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
- mydocs/pr/archives/pr_963_review.md (TAC line 매핑 off-by-one 분석) - mydocs/pr/archives/pr_963_report.md (옵션 A + exam_math p18 sweep diff 의도 확정) - mydocs/orders/20260517.md PR #963 행 추가 핵심: - pi=117 cases formula position 30 (\n) off-by-one (RHWP_DEBUG_PARA_TAC) - allow_end_tac (has_line_break line 마지막 run end-position TAC 포함) - PR #956/#958/#961 (layout.rs) + #963 (paragraph_layout.rs) 4 정정 양립 - sweep 168/169 same + exam_math p18 diff 1건 → 작업지시자 한컴 2020 직접 확인 의도 확정 - Issue #960 close, Issue #962 잔존 (별도 task, 연속 PR #964 후속)
edwardkim
pushed a commit
that referenced
this pull request
May 17, 2026
…ox content scramble 해소 (closes #962) `samples/3-11월_실전_통합_2022.hwp` page 2 문14 <보기> textbox (pi=118 InFrontOfText TAC 사각형 + 내부 글상자) 의 inline 수식이 각각 2번 emit → ㄱㄴㄷ prefix + 본문 + 수식 시각 overlap. `RHWP_DEBUG_PARA_TAC` + SVG 분석: - 보기 textbox 영역 (y 440-540, x 400-760) 의 equation transforms: **12 개** (예상 6 × 2 duplicates) - Set 1 (gap 위치, 정상): paragraph_layout 의 inline TAC 처리 (paragraph_layout.rs:2078+) - Set 2 (textbox 좌측 edge x=406): shape_layout 두번째 loop 의 Equation branch (shape_layout.rs:1609) 원래 두번째 loop 의 의도: paragraph_layout 미지원 이전의 legacy fallback. 현재 paragraph_layout 가 textbox 내부 inline TAC 를 정상 처리하므로 중복 emit 발생. `src/renderer/layout/shape_layout.rs:1609-1675`: ```rust Control::Equation(eq) => { let eq_w = hwpunit_to_px(eq.common.width as i32, self.dpi); let eq_h = hwpunit_to_px(eq.common.height as i32, self.dpi); // [Task #962] 글상자 내부 paragraph 의 inline equation 은 paragraph_layout 가 // 정확한 gap 위치 (text 사이) 에 emit. 본 두번째 loop 는 legacy fallback. let equiv_cell_ctx = CellContext { parent_para_index: para_index, path: { /* parent_cell_path + textbox entry */ }, }; if tree.get_inline_shape_position( section_index, pi, ctrl_idx_in_para, Some(&equiv_cell_ctx) ).is_some() { // paragraph_layout 가 이미 emit — inline_x 만 advance inline_x += eq_w; } else { // legacy fallback (기존 emit 분기 유지) ... } } ``` - cargo test --release --lib: 1288 passed, 0 failed - 시험지 page 2 보기 textbox equations: 12 → 6 ✓ (duplicates 제거) - 시각: ㄱ. h(1)=3 / ㄴ. 함수 h(x)는... / ㄷ. 함수 g(x)가... ✓ 한컴 PDF 정합 - LAYOUT_OVERFLOW count: 325 → 325 (회귀 0) - exam_kor/math/eng, sample14, 시험지 4종: 시각 회귀 0 | 영역 | 영향 | |------|------| | textbox 내부 inline Equation (paragraph_layout 등록 case) | duplicate 제거 (회귀 fix) | | textbox 내부 inline Equation (legacy fallback) | 영향 없음 (else 분기 유지) | | textbox 내부 Shape/Picture/Table | 본 fix 미대상 | | textbox 외부 standalone equation | 영향 없음 | - 원 issue #952 + PR #956 (Issue 1 외곽선) - PR #958 (Issue 2 sample16 page 18) - PR #961 (Issue 3 시험지 page 1 문9 vertical) - PR #963 (Issue 4 cases formula off-by-one) - 본 PR (Issue 5 보기 textbox duplicate equation) 원 #952 의 5 issue 모두 해결 → close 가능. samples/pdfs (시험지) 는 이전 PR (#956/#961) 에서 추가되므로 본 PR 에 포함 안 함 (중복 방지). layout.rs 변경은 PR #958/#961 영역 — 본 PR 에 포함 안 함. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
@jangster77 — Issue #962 (Issue #952 영역 영역 Issue 5, PR #963 page 2 검증 중 발견): 시험지 (3-11월) page 2 문14 <보기> textbox inline 수식 각각 2번 emit → scramble. Root cause (SVG 분석): 보기 textbox 영역 영역 equation 12개 (6×2 duplicates): - Set 1 (정상, gap 위치): paragraph_layout inline TAC (paragraph_layout.rs:2078+) - Set 2 (duplicate, textbox 좌측 edge): shape_layout 두번째 loop legacy fallback paragraph_layout 가 현재 textbox 내부 inline TAC 정상 처리 → legacy fallback 중복. 본질 (src/renderer/layout/shape_layout.rs:1620): Equation branch emit 전 get_inline_shape_position (equiv_cell_ctx — parent_cell_path + textbox entry) 확인 → paragraph_layout 등록 시 inline_x += eq_w 만 (duplicate 차단), 미등록 시 legacy fallback 유지. 영역 좁힘: paragraph_layout 등록 case 한정 — legacy fallback / Shape/Picture/Table / standalone 영향 없음. 본 환경 충돌 수동 해결: mydocs/orders/20260517.md (--ours 본 환경 PR 처리 표 보존 + Task #962 작업 일지 갱신). shape_layout.rs auto-merge (devel 변경 부재). PR #956/#958/#961 (layout.rs) + #963 (paragraph_layout.rs) + 본 PR (shape_layout.rs) — **5 정정 모두 다른 파일, 양립 확인**. devel merge commit (93dfe0a/3d1cdf31) cherry-pick 제외 — 본질 682875f 만. 자기 검증: cargo test --release --lib 1288 passed / clippy 통과 / 광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드 시각 판정: 작업지시자 시각 검증 통과 (시험지 page 2 보기 textbox 12→6, ㄱ/ㄴ/ㄷ 한컴 PDF 정합 + 회귀 부재) CI: ✅ Build & Test + CodeQL + Canvas visual diff 원 Issue #952 의 5 분리 결함 완결: #952 Issue 1 (#956) + Issue 2 (#958) + Issue 3 (#961) + #960 (#963) + #962 (본 PR) 연속 5 PR 완결 (@jangster77: #956 → #958 → #961 → #963 → #964)
edwardkim
added a commit
that referenced
this pull request
May 17, 2026
- mydocs/pr/archives/pr_964_review.md (textbox inline equation duplicate 분석) - mydocs/pr/archives/pr_964_report.md (옵션 A + Issue #952 5 분리 결함 완결) - mydocs/orders/20260517.md PR #964 행 + 연속 5 PR 총평 핵심: - 보기 textbox equation 12개 (Set 1 paragraph_layout + Set 2 shape_layout legacy duplicate) - get_inline_shape_position (equiv_cell_ctx) 확인 영역 영역 duplicate 차단 - PR #956~#964 5 정정 다른 파일 양립 (layout.rs×3 + paragraph_layout.rs + shape_layout.rs) - sweep 169/169 same + 작업지시자 시각 판정 통과 - 원 Issue #952 의 5 분리 결함 완결 (#956/#958/#961/#963/#964) - @jangster77 연속 5 PR 완결
Merged
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.
요약
samples/hwp3-sample16.hwppage 18 의 "나. 주요 과업내용" 후 본문 paragraphs (pi=395~401 "○ 통합모델...") 이 다음 페이지로 밀려 시각 누락. 한컴 viewer 는 같은 페이지 표시.빈 caption 의 phantom advance + 잘못된 pic_y 의 복합 결함으로 인한 +430.6px cursor over-advance 정정.
Root cause
RHWP_DEBUG_TAC_CURSOR추적 결과:```
Shape pi=394 ci=1 y_in=767.3 y_out=1197.9 dy=430.6
```
src/renderer/layout.rs:3470-3475에서 pi=394 ci=1 picture 의 caption (dir=Bottom width=0 paras=1 text="", 빈 caption) 이 phantom +430.6px 누적:변경
src/renderer/layout.rs— 빈 caption (paragraphs[*].text모두 무의미 문자 +controls.is_empty()) 시 result_y advance skip +RHWP_DEBUG_TAC_CURSOR진단 영구화mydocs/plans/task_m100_957*.md+ 보고서검증
영향
관련
Test plan
🤖 Generated with Claude Code