Skip to content

task 1245: 어울림 그림 및 미주 수식 배치 보정#1250

Merged
edwardkim merged 6 commits into
edwardkim:develfrom
jangster77:task_m100_1245
Jun 2, 2026
Merged

task 1245: 어울림 그림 및 미주 수식 배치 보정#1250
edwardkim merged 6 commits into
edwardkim:develfrom
jangster77:task_m100_1245

Conversation

@jangster77

@jangster77 jangster77 commented Jun 2, 2026

Copy link
Copy Markdown
Collaborator

작업 범위

이 PR은 #1245에서 보고된 3-09월_교육_통합_2022.hwp 및 후속 확인 중 발견된 3-09월_교육_통합_2023.hwp 렌더링 불일치를 단계별로 보정합니다.

대상 문서:

  • samples/3-09월_교육_통합_2022.hwp
  • samples/3-09월_교육_통합_2023.hwp

주요 영역:

Stage1: 2022년 9월 문서 7쪽 그림 객체 위치 보정

대상:

  • 문서: 3-09월_교육_통합_2022.hwp
  • 페이지: 7쪽
  • 위치: 문25), 문28) 주변 Square/어울림 그림 객체

원인:

  • square_wrap_first_narrow_line_vpos_px는 어울림 그림이 문단 중간부터 본문을 감싸는 경우 처음 좁아지는 LINE_SEG.vertical_pos를 그림 상단 보정값으로 사용합니다.
  • 기존 구현은 좁아지는 줄의 raw vertical_pos를 px로 변환해 para_base_y에 그대로 더했습니다.
  • 하지만 문제 문단의 첫 줄 vertical_pos31648처럼 이미 누적 흐름값입니다.
  • 이 상태에서 좁아지는 줄의 raw vertical_pos=37804를 다시 더하면 para_base_y + absolute_vpos가 되어 그림이 페이지 하단 밖으로 밀립니다.

수정:

  • 어울림 그림 상단 보정값을 raw vertical_pos가 아니라 첫 줄 대비 상대 delta로 계산했습니다.
delta = first_narrow_line.vertical_pos - first_line.vertical_pos
  • 첫 줄 vertical_pos=0인 기존 문서 유형은 delta가 기존 raw 값과 같으므로 기존 동작을 유지합니다.

회귀 가드:

  • issue_1245_2022_page7_square_pictures_use_relative_line_vpos

검증한 내용:

  • 7쪽 문25) 타원 그림 pi=386 ci=11이 첫 좁은 줄과 같은 y에 붙는지 확인했습니다.
  • 7쪽 문28) 포물선 그림 pi=420 ci=9도 같은 방식으로 확인했습니다.
  • 문25) 그림이 페이지 하단 밖으로 밀리지 않는지 확인했습니다.

Stage2: 2022년 9월 문서 10쪽 문12) 수식 배치 보정

대상:

  • 문서: 3-09월_교육_통합_2022.hwp
  • 페이지: 10쪽
  • 위치: 우측 단 문12) 본문과 수식 블록

초기 증상:

  • 우측 단 하단의 긴 수식/분수식이 한컴/PDF 기준보다 오른쪽 또는 아래쪽으로 밀렸습니다.
  • 수정 전 SVG 기준 따라서 텍스트는 x=402.52에서 시작하지만, 바로 뒤 첫 lim 수식은 x=442.88에서 시작했습니다.
  • x 보정 이후에도 따라서와 첫 수식 사이 y 간격이 한컴보다 크게 남았습니다.

원인:

  • 문제 수식 블록은 pi=574의 텍스트 없는 TAC 수식-only 문단입니다.
  • 빈 runs + TAC 수식 fallback이 본문/미주 수식-only 문단에도 effective_margin_left와 alignment offset을 다시 적용했습니다.
  • RHWP_DEBUG_PARA_TAC=1로 확인한 결과, pi=574에는 TAC가 없는 선행 LINE_SEG가 존재했습니다.
  • 이 선행 줄은 char_start=0, char_end=0인 퇴화 guide 줄이고, 실제 첫 수식은 다음 줄 char_start=0..1에 매핑되어 있었습니다.
  • 한컴은 이 guide 줄을 첫 수식 앞 세로 예약으로 쓰지 않지만, 기존 RHWP는 guide 줄 높이를 y advance에 포함해 첫 수식을 아래로 밀었습니다.

수정:

  • 셀 내부 수식-only 문단은 Task samples/exam_science.hwp 페이지 1 3번 표: 28/36 셀 중앙정렬 안 됨 #490 계열 회귀를 막기 위해 기존처럼 paragraph alignment와 margin을 적용합니다.
  • 본문/미주 수식-only 문단은 저장된 LINE_SEG 흐름을 따르도록 effective_col_x 기준으로 배치합니다.
  • TAC가 없는 선행 guide 줄을 기준 vpos와 y advance에서 제외해 첫 수식이 한컴처럼 앞 문장 바로 뒤에 붙도록 했습니다.

회귀 가드:

  • issue_1209_2022_sep_page10_question12_uses_safe_vpos_backtrack

검증한 내용:

  • 문12) 첫 수식 x 위치가 우측 단 왼쪽 흐름과 정렬되는지 확인했습니다.
  • 따라서와 첫 수식 사이 y 간격이 20px 이하로 유지되는지 확인했습니다.
  • 주석 문단의 render node para_index가 원 문단 번호와 직접 대응하지 않는 경우가 있어, 수식 SVG 내용과 y 범위로 대상 수식을 찾도록 테스트를 보강했습니다.

수정 후 확인값:

  • lim 수식 시작 x: 442.88에서 402.52로 이동
  • 따라서 y: 564.88
  • lim 수식 y: 572.71

Stage3: 2023년 9월 문서 4쪽 문26) 중복 표시 보정

대상:

  • 문서: 3-09월_교육_통합_2023.hwp
  • 페이지: 4쪽
  • 위치: 왼쪽 단 문26)

증상:

  • 왼쪽 단 문26) 제목이 정상 위치에 보이지만, 같은 영역에 작은 문26) 표기가 한 번 더 나타나 본문 첫 줄 부근과 겹쳤습니다.

원인:

  • pi=258 원문 문단에는 문26) 텍스트가 직접 들어 있지 않고, 첫 control이 미주(Endnote)입니다.
  • layout_composed_paragraph는 미주 선두 번호를 본문 크기의 일반 TextRun으로 먼저 렌더링합니다.
  • 이후 같은 Endnote control의 FootnoteMarker가 같은 줄에 위첨자로 다시 생성되어 조판부호 표시 상태에서 문26)이 중복 표시되었습니다.

수정:

  • 선두 미주 번호가 prefix TextRun으로 이미 렌더된 경우, 같은 위치의 FootnoteMarker 생성을 건너뛰도록 했습니다.
  • 각주용 FootnoteMarker는 유지하고, 미주 선두 번호 중복만 제외했습니다.

회귀 가드:

  • issue_1245_2023_page4_question26_endnote_marker_not_duplicated

검증한 내용:

  • 3-09월_교육_통합_2023.hwp 4쪽 렌더 트리에서 문26이 한 번만 나타나는지 확인했습니다.

PR #1241 병합 후 문12 수식 배정 회귀 보정

배경:

  • upstream/devel에 PR #1241이 반영된 뒤 task1245 브랜치를 rebase했습니다.
  • rebase 후 문12) 첫 수식이 다시 따라서와 겹칠 수 있는 회귀가 발견되었습니다.

원인:

  • PR #1241의 수식-only TAC 줄 배정 로직이 같은 위치 후보 중 TAC가 없는 선행 guide 줄을 첫 수식 후보로 선택할 수 있었습니다.
  • 이 경우 Stage2에서 의도한 실제 TAC 줄 기준 배치가 무너질 수 있었습니다.

수정:

  • equation_only_tac_line_assignment가 문단 정보를 함께 받아, TAC가 없는 선행 guide 줄을 후보에서 제외하도록 했습니다.
  • 기존 PR #1241의 연속 인라인 수식 병합 해소 로직은 유지했습니다.

확인:

  • 진단에서 첫 AH 수식이 따라서 꼬리와 겹치지 않는 위치로 이동한 것을 확인했습니다.
  • issue_1209_2022_sep_page10_question12_uses_safe_vpos_backtrack가 다시 통과했습니다.

PR #1247 병합 후 회귀 확인

  • upstream/devel에 PR #1247이 반영된 뒤 다시 rebase했습니다.
  • #1247의 미주 사이 간격 처리(endnote_between_notes_hu)와 task1245의 TAC guide 보정 로직이 함께 유지되는 것을 확인했습니다.
  • cargo test --test issue_1139_inline_picture_duplicate -- --nocapture 기준 43개 테스트가 통과했습니다.

최종 보고서

변경 파일

  • src/renderer/layout.rs
    • 어울림 그림의 line segment 기반 세로 위치 계산 보정
  • src/renderer/layout/paragraph_layout.rs
    • 수식-only TAC guide 줄 처리
    • 본문/미주 수식-only 문단 정렬 기준 분리
    • 미주 선두 번호 중복 marker 억제
  • tests/issue_1139_inline_picture_duplicate.rs
  • mydocs/plans/task_m100_1245.md
  • mydocs/plans/task_m100_1245_impl.md
  • mydocs/working/task_m100_1245_stage0.md
  • mydocs/working/task_m100_1245_stage1.md
  • mydocs/working/task_m100_1245_stage2.md
  • mydocs/working/task_m100_1245_stage3.md
  • mydocs/report/task_m100_1245_report.md

검증

최종 PR 전 수행한 검증:

cargo test --tests
cargo test --test issue_1139_inline_picture_duplicate -- --nocapture
cargo fmt --all -- --check
git diff --check

결과:

  • cargo test --tests: 통과
  • issue_1139_inline_picture_duplicate: 43개 통과
  • cargo fmt --all -- --check: 통과
  • git diff --check: 통과

관련 이슈

Closes #1245

3-09월_교육_통합_2022 7쪽 Square 그림이 누적 LINE_SEG vertical_pos를 중복 적용해 하단 밖으로 밀리던 문제를 첫 줄 대비 상대 delta로 보정했다.

검증: cargo test --test issue_1139_inline_picture_duplicate -- --nocapture; cargo fmt --all --check
@edwardkim edwardkim self-requested a review June 2, 2026 13:38
@edwardkim edwardkim added the enhancement New feature or request label Jun 2, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone Jun 2, 2026
@edwardkim edwardkim merged commit 855be98 into edwardkim:devel Jun 2, 2026
7 checks passed
@edwardkim

Copy link
Copy Markdown
Owner

메인테이너 확인 완료했습니다.

  • local/pr1250-verify에서 PR #1250을 병합해 검증했습니다.
  • cargo fmt --all --check 통과
  • cargo test --test issue_1139_inline_picture_duplicate -- --nocapture 통과
  • cargo test --test issue_1082_endnote_multicolumn_drift 통과
  • cargo test --lib renderer::height_cursor 통과
  • cargo test --lib renderer::layout 통과
  • cargo test --tests 전체 통과
  • WASM 빌드 및 rhwp-studio 빌드 통과
  • 메인테이너 시각 판정 통과

시각 판정 산출물:

  • output/poc/pr1250-visual/page7/3-09월_교육_통합_2022_007.svg
  • output/poc/pr1250-visual/page10/3-09월_교육_통합_2022_010.svg
  • output/poc/pr1250-visual/2023-page4/3-09월_교육_통합_2023_004.svg

devel 반영 완료: 4fdb9c1f

기여 감사합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants