배경
Task #331 (문단 trailing line_spacing 누적 drift) 시도가 layout 의 clamp pile 버그를 노출시켜 글자 겹침 회귀 발생 → revert (commit 078717f).
상세 분석: mydocs/troubleshootings/typeset_layout_drift_analysis.md
근본 문제
typeset 과 layout 이 서로 다른 advance 모델 을 사용:
시스템
모델
출처
typeset 페이지 분배
total_height 또는 height_for_fit
ComposedParagraph
layout 그리기
per-line lh + ls 누적
ComposedParagraph + vpos correction
vpos correction
HWP 원본 vpos (with trail_ls)
HWP 파일
body header (표/Shape)
표 매니저 별도 측정
HeightMeasurer
각 단계가 미세하게 다르게 누적해 ~60 px drift → typeset 은 fit 판단, layout 에서는 클램프 piling.
Task #331 의 원래 의도
samples/21_언어_기출_편집가능본.hwp page 1 col 1 의 pi=26 (2. '프로세스 마이닝'에 대해 추론한 것...) + 보기 ①②③ 가 PDF 와 달리 page 2 로 밀림. typeset 의 cur_h 가 매 문단 +9.5 px (trailing_ls) 만큼 over-advance 누적이 원인.
이 의도는 sub-task 5 완료 시 자연 해결.
Sub-task 분해
typeset/layout drift 통합 — 단일 advance 모델로 정합 (Task #331 재시도 기반) #332 -1 : typeset advance 를 height_for_fit 기반으로 변경 (Task 문단 trailing line_spacing 누적 drift — col 1+ 의 본문이 HWP 보다 일찍 다음 페이지로 넘어감 #331 의 1단계 재적용)
typeset/layout drift 통합 — 단일 advance 모델로 정합 (Task #331 재시도 기반) #332 -2 : layout per-paragraph advance 를 height_for_fit 와 정합 (Task 문단 trailing line_spacing 누적 drift — col 1+ 의 본문이 HWP 보다 일찍 다음 페이지로 넘어감 #331 의 2단계 재적용)
typeset/layout drift 통합 — 단일 advance 모델로 정합 (Task #331 재시도 기반) #332 -3 : vpos correction 의 vpos_end 에서 trail_ls 제외 + 양방향 보정 (collapse 회귀 방지 검증 포함)
typeset/layout drift 통합 — 단일 advance 모델로 정합 (Task #331 재시도 기반) #332 -4 : clamp pile 버그 수정 — overflow 시 piling 대신 typeset 에 signal back 또는 stop drawing
typeset/layout drift 통합 — 단일 advance 모델로 정합 (Task #331 재시도 기반) #332 -5 : header (표/Shape) 영역의 측정 통합 — 표 매니저와 typeset 동기화
각 sub-task 별 회귀 테스트 (golden SVG, lib, 수동 샘플 검증) 후 적용.
검증 기준 (최종)
✅ 21_언어 page 1 col 1 에 pi=26 + 보기 ①②③ fit (PDF 일치)
✅ pi=10 partial 글자 겹침 없음
✅ cargo test --lib 992 passed 유지
✅ Golden SVG 6 개 통과 (또는 의도된 baseline 갱신)
✅ 다른 샘플 (form-002, multi-table, tac-case 등) 회귀 없음
참고
배경
Task #331 (문단 trailing line_spacing 누적 drift) 시도가 layout 의 clamp pile 버그를 노출시켜 글자 겹침 회귀 발생 → revert (commit
078717f).상세 분석:
mydocs/troubleshootings/typeset_layout_drift_analysis.md근본 문제
typeset 과 layout 이 서로 다른 advance 모델을 사용:
total_height또는height_for_fitlh + ls누적각 단계가 미세하게 다르게 누적해 ~60 px drift → typeset 은 fit 판단, layout 에서는 클램프 piling.
Task #331 의 원래 의도
samples/21_언어_기출_편집가능본.hwppage 1 col 1 의 pi=26 (2. '프로세스 마이닝'에 대해 추론한 것...) + 보기 ①②③ 가 PDF 와 달리 page 2 로 밀림. typeset 의cur_h가 매 문단 +9.5 px (trailing_ls) 만큼 over-advance 누적이 원인.이 의도는 sub-task 5 완료 시 자연 해결.
Sub-task 분해
height_for_fit기반으로 변경 (Task 문단 trailing line_spacing 누적 drift — col 1+ 의 본문이 HWP 보다 일찍 다음 페이지로 넘어감 #331 의 1단계 재적용)height_for_fit와 정합 (Task 문단 trailing line_spacing 누적 drift — col 1+ 의 본문이 HWP 보다 일찍 다음 페이지로 넘어감 #331 의 2단계 재적용)vpos_end에서 trail_ls 제외 + 양방향 보정 (collapse 회귀 방지 검증 포함)각 sub-task 별 회귀 테스트 (golden SVG, lib, 수동 샘플 검증) 후 적용.
검증 기준 (최종)
cargo test --lib992 passed 유지참고
078717faf80f52mydocs/troubleshootings/typeset_layout_drift_analysis.md