증상
samples/exam_math.hwp 13페이지 상단(미적분 첫 페이지)에서 PDF와 비교 시 세 가지 결함이 동시에 관찰됨.
| 항목 |
PDF (정답) |
rhwp (현재) |
| 머리 제목 영역 |
2025학년도 대학수학능력시험 문제지 + 수학 영역(미적분) |
위 텍스트 위에 수학 영역(확률과 통계) 가 겹쳐 출력 |
| 23번 문제 |
23. lim 3x²/sin²x 의 값은? 1회 |
동일 문단이 2회 출력 |
제 2 교시 둥근사각형 배지 |
표시됨 |
누락 |
페이지 9(확률과 통계 시작)에서도 23번 중복 + 배지 누락이 동일하게 재현됨.
원인
세 결함 모두 src/renderer/typeset.rs 의 처리 누락에서 비롯됨. 동일 로직이 pagination/engine.rs 에는 이미 존재하나 typeset 경로로 옮겨질 때 빠짐.
1. 머리말 누출 (확률과 통계 가 13페이지에 표시)
Control::PageHide 가 collect_header_footer_controls 에서 수집되지 않음 → finalize_pages 가 page.page_hide 를 None 으로 둠 → build_render_tree 가
hide_header=false 로 판단하고 머리말 렌더.
pi=34 의 [감추기] header=true 가 무시되어, 섹션 1 시작 시 등록된 "수학 영역(확률과 통계)" 머리말이 미적분 페이지까지 잔존.
- backtrace 로
layout_header_footer_paragraphs → layout_shape → layout_textbox_content → layout_composed_paragraph 경로 확인.
2. 23. 문단 중복 — 다중 TopAndBottom 표 분할기 결함
place_table_with_text 가 마지막 표 처리 시 is_last_table && !is_first_table 분기에서 post_table_start=0 으로 잡아 PartialParagraph(0..total_lines)
를 emit.
- 이미 첫 표 처리 단계에서 동일 범위를 pre-text 로 emit 했음에도,
engine.rs:1418-1421 에 있는 pre_text_exists 가드가 typeset 측에 누락되어 본문이 두 번
등록됨.
3. 제 2 교시 둥근사각형 누락
typeset_table_paragraph 의 인라인 컨트롤 등록 분기가 Picture | Equation 만 PageItem::Shape 로 추가하고 Shape 분기를 누락.
pi=34 ctrl[3](둥근사각형 글상자, InFrontOfText)이 페이지 항목에 등록되지 못해 layout_column_shapes_pass 에서 렌더 후보로 잡히지 않음.
수정
src/renderer/typeset.rs:
collect_header_footer_controls 의 반환 튜플에 Vec<(usize, PageHide)> 추가, Control::PageHide 수집.
finalize_pages 에 page_hides 매개변수 추가, engine.rs::para_starts_in_page 와 동일 규칙으로 page.page_hide 설정.
place_table_with_text(마지막 표 post-text emit 직전)에 pre_text_exists 가드 추가.
typeset_table_paragraph 인라인 컨트롤 분기에 Control::Shape(_) 추가.
각 수정의 참조 모델은 src/renderer/pagination/engine.rs 의 동일 함수.
검증
- 페이지 13 SVG: 제목 겹침 사라짐,
수학 영역(미적분) 단독, 제 2 교시 배지 표시, 23. 1회 출력 — PDF 와 일치.
- 페이지 9 SVG:
23. 다항식... 1회, 배지 표시 — PDF 와 일치.
cargo test --release --lib → 992 passed, 0 failed.
증상
samples/exam_math.hwp13페이지 상단(미적분 첫 페이지)에서 PDF와 비교 시 세 가지 결함이 동시에 관찰됨.2025학년도 대학수학능력시험 문제지+수학 영역(미적분)수학 영역(확률과 통계)가 겹쳐 출력23. lim 3x²/sin²x 의 값은?1회제 2 교시둥근사각형 배지페이지 9(확률과 통계 시작)에서도 23번 중복 + 배지 누락이 동일하게 재현됨.
원인
세 결함 모두
src/renderer/typeset.rs의 처리 누락에서 비롯됨. 동일 로직이pagination/engine.rs에는 이미 존재하나 typeset 경로로 옮겨질 때 빠짐.1. 머리말 누출 (
확률과 통계가 13페이지에 표시)Control::PageHide가collect_header_footer_controls에서 수집되지 않음 →finalize_pages가page.page_hide를 None 으로 둠 →build_render_tree가hide_header=false로 판단하고 머리말 렌더.pi=34의[감추기] header=true가 무시되어, 섹션 1 시작 시 등록된 "수학 영역(확률과 통계)" 머리말이 미적분 페이지까지 잔존.layout_header_footer_paragraphs → layout_shape → layout_textbox_content → layout_composed_paragraph경로 확인.2.
23.문단 중복 — 다중 TopAndBottom 표 분할기 결함place_table_with_text가 마지막 표 처리 시is_last_table && !is_first_table분기에서post_table_start=0으로 잡아PartialParagraph(0..total_lines)를 emit.
engine.rs:1418-1421에 있는pre_text_exists가드가 typeset 측에 누락되어 본문이 두 번등록됨.
3.
제 2 교시둥근사각형 누락typeset_table_paragraph의 인라인 컨트롤 등록 분기가Picture | Equation만PageItem::Shape로 추가하고Shape분기를 누락.pi=34 ctrl[3](둥근사각형 글상자, InFrontOfText)이 페이지 항목에 등록되지 못해layout_column_shapes_pass에서 렌더 후보로 잡히지 않음.수정
src/renderer/typeset.rs:collect_header_footer_controls의 반환 튜플에Vec<(usize, PageHide)>추가,Control::PageHide수집.finalize_pages에page_hides매개변수 추가,engine.rs::para_starts_in_page와 동일 규칙으로page.page_hide설정.place_table_with_text(마지막 표 post-text emit 직전)에pre_text_exists가드 추가.typeset_table_paragraph인라인 컨트롤 분기에Control::Shape(_)추가.각 수정의 참조 모델은
src/renderer/pagination/engine.rs의 동일 함수.검증
수학 영역(미적분)단독,제 2 교시배지 표시,23.1회 출력 — PDF 와 일치.23. 다항식...1회, 배지 표시 — PDF 와 일치.cargo test --release --lib→ 992 passed, 0 failed.