상위 Epic: #309
선행: #310 (분석 도구), #311 (vpos-reset 가설 부정), #312 (TypesetEngine 발견)
배경
#312 조사 도중 코드베이스에 이미 존재하는 `TypesetEngine` 이 검증 모드로 동작 중이며, 4샘플 모두에서 Paginator 보다 정확한 페이지 수를 산출함을 발견.
| 샘플 |
Paginator |
TypesetEngine |
PDF |
평가 |
| 21_언어 |
19 |
15 |
15 |
✅ TypesetEngine = PDF 정확 일치 |
| exam_math |
20 |
20 |
20 |
✅ 동일 |
| exam_kor |
25 |
24 |
? |
typeset 1쪽 적음 |
| exam_eng |
11 |
9 |
? |
typeset 2쪽 적음 |
검증 출처: `dump-pages` stderr `TYPESET_VERIFY` 메시지 (debug 빌드 한정)
코드 현황
- `src/renderer/typeset.rs` — 단일 패스 조판 엔진. format() → fits() → place/split 흐름
- `src/document_core/queries/rendering.rs:837~` — Paginator 결과와 병렬 검증 (페이지 수 차이 시 stderr 경고)
- 실제 렌더링은 Paginator 결과 사용. TypesetEngine 결과는 검증용으로만 폐기
작업 범위
- 호환성 검토: TypesetEngine 의 `PaginationResult` 출력이 Paginator API 와 동일 형식인지 확인
- 진입점 전환: `DocumentCore::paginate`에서 Paginator → TypesetEngine 으로 변경
- 회귀 검증:
- `cargo test` 992 passed 유지
- 4샘플 페이지 수: 21_언어=15, exam_math=20, exam_kor=24, exam_eng=9
- SVG 시각 회귀 (rhwp-studio E2E 또는 export-svg 비교)
- 부속물 정리:
- 검증 코드 제거: TYPESET_VERIFY 분기 정리
검증 매트릭스 (목표)
| 모드 |
21_언어 |
exam_math |
exam_kor |
exam_eng |
| 기본 |
15쪽 |
20쪽 |
24쪽 |
9쪽 |
| PDF |
15쪽 |
20쪽 |
? |
? |
비범위
- TypesetEngine 자체 알고리즘 변경
- 새 페이지네이션 엔진 작성
위험 / 대응
| 위험 |
대응 |
| TypesetEngine API 가 Paginator 대체 가능한 형식 미지원 |
어댑터 레이어로 출력 형식 변환 |
| TypesetEngine이 처리 못하는 케이스 (각주/머리말/꼬리말 등) 잔존 |
케이스별 추가 구현, fallback to Paginator 옵션 |
| 시각 회귀 발생 |
rhwp-studio E2E + 4샘플 SVG diff 검증 |
완료 조건
참고
- `mydocs/report/task_m100_312_report.md`
- `mydocs/tech/line_seg_vpos_analysis.md`
- `src/renderer/typeset.rs` (전체)
상위 Epic: #309
선행: #310 (분석 도구), #311 (vpos-reset 가설 부정), #312 (TypesetEngine 발견)
배경
#312 조사 도중 코드베이스에 이미 존재하는 `TypesetEngine` 이 검증 모드로 동작 중이며, 4샘플 모두에서 Paginator 보다 정확한 페이지 수를 산출함을 발견.
검증 출처: `dump-pages` stderr `TYPESET_VERIFY` 메시지 (debug 빌드 한정)
코드 현황
작업 범위
검증 매트릭스 (목표)
비범위
위험 / 대응
완료 조건
참고