Skip to content

[layout] 저장 vpos 가 문단 아래 간격을 빠뜨린 문서에서 8px 이내 역보정이 문단을 7.57px 씩 위로 당긴다 (HWP5-nopassword 9~12쪽) #7874

Closed

Description

@planet6897

증상

samples/HWP5-nopassword-123456.hwpx(기준 pdf/HWP5-nopassword-123456-hwpx-2024.pdf, --compat 2024)에서 문단 몇 곳이 한/글보다 7.57px 위로 붙는다. 어긋남은 쪽 아래로 누적된다.

  • 12쪽: [HNC Input] 아래 −7.6px, 「한글 97의 나아진 기능」 아래 −15.1px(줄마다 일정, 표준편차 약 0.1px)
  • 10쪽: 9쪽에서 당겨진 7.57px 덕분에 제목 pi=135 가 9쪽 바닥(1003.3 / 본문 아래 1009.2)에 들어간다. 한/글은 이 제목을 10쪽 첫머리에 둔다. 그래서 10쪽 전체가 제목 한 줄(35px)만큼 어긋난다.

devel 552f5228d 와 #7805·#7836 head 에서 9~12쪽 줄 y 가 같다(기존 결함). #7836 이 줄 나눔을 한/글과 맞추면서 이 어긋남을 가리던 여분 줄이 사라져 Visual Sweep 점수에 드러났다(#7836 p10 36.07 → 30.71, p12 51.49 → 40.81, 줄 시작 PDF 일치는 문서 전체 523 → 611줄로 개선).

재현

RHWP_VPOS_DEBUG=1 rhwp export-svg samples/HWP5-nopassword-123456.hwpx -p 11 -o out

VPOS_CORR 가 매번 정확히 −7.57px 되감는다.

쪽 문단 y_in → 결과
9 pi=133 837.01 → 829.44
10 pi=146 448.80 → 441.23
12 pi=169 225.17 → 217.60
12 pi=173 333.23 → 325.65

원인

  • HeightCursor::vpos_adjust(src/renderer/height_cursor.rs)가 vpos_corrected_end_y(src/renderer/layout.rs)를 호출하고, 이 함수는 단계당 8px 이내의 뒤로 가는 보정을 받아들인다(MAX_BACKWARD_PX = 8.0, Task 페이지 분할 드리프트 — pi=80 마지막 줄 다음 페이지로 넘어감 (2022 국립국어원 업무계획.hwp p6) #643). 쪽 나누기(typeset/section/vpos.rs::vpos_snap_current_height)도 같은 함수를 쓴다.
  • 이 문서의 저장 vpos 는 실제 출력과 맞지 않는다. 예: pi=168 은 저장 줄 4개가 63672 에서 끝나고 pi=169 는 65272 에 저장돼 간격이 줄 피치 1600 뿐이다(문단 아래 간격 없음). 한컴 2024 PDF 는 1600 + 568 = 2168 을 둔다. 568HU = 7.57px. 빈 문단 → 제목 경계(pi=132→133, 145→146, 172→173)도 같은 꼴이다.
  • 7.57px 는 8px 허용 안이라 rhwp 가 낡은 저장값으로 되감는다.

진단 근거

뒤로 가는 보정만 끄는 진단 빌드(정식 수정 아님)에서:

  • pi=135 가 10쪽으로 넘어가고, 12쪽 줄 시작 잔차가 제목 줄(약 −4px)을 빼고 0 이 된다.
  • Visual Sweep(실루엣 전용, --dpi 96, Chrome 149): 10쪽 30.71 → 81.85, 12쪽 40.81 → 93.32. 4·5·8·9·17·21·24쪽도 오르지만 3쪽은 61.70 → 57.57 로 내려간다.

보정을 일괄로 끄면 Task #643 이 고친 문서들이 다시 깨질 수 있으므로 해법이 아니다.

기대 결과와 범위

저장 vpos 를 믿고 되감아도 되는 조건을 독립 근거(한컴 출력·정상 생성본)로 정한다. 이 문서처럼 저장 간격에 문단 아래 간격이 빠진 경우는 되감지 않아야 한다. 판정은 쪽 나누기와 그리기가 같은 결과를 소비해야 한다.

미검증

  • 이 문서의 저장 vpos 가 왜 문단 아래 간격을 빠뜨렸는지(저장 프로그램·버전).
  • 보정을 껐을 때 다른 문서에 미치는 영향, 3쪽 하락 원인, 10쪽 위·제목 줄에 남는 약 −4px.

관련: #7702(#7836), Task #643, #7537(다른 원인의 8px 되감기)

🤖 Generated with Claude Code

Activity

  1. planet6897 commented on Oct 18, 2026

    @planet6897
    ContributorAuthor

    PR #8015 로 수정했습니다. 저장 사다리가 문단 아래 간격을 뺀 경계(경계 간격 0)에서 후방 이동량이 앞 문단 아래 간격과 같으면 스냅하지 않습니다 — 조판·배치 공용 HeightCursor::vpos_adjust. pi=133·146 의 7.57px 되감기가 사라지고 제목 pi=135 가 다음 쪽 첫머리로 갑니다. 공개 합성 입력 samples/issue7874(한/글 2024 Print) 1쪽 46.7 → 98.5%(fresh WASM 99.4%), 10k 코퍼스 변화 0. 문서 전체의 25/24쪽 차이는 4쪽 한 줄 넘침에서 시작하는 별도 차이로 남습니다.

  2. planet6897 commented on Oct 26, 2026

    @planet6897
    ContributorAuthor

    devel 반영 확인 — 닫습니다

    저장 사다리가 뺀 문단 아래 간격을 되감지 않는 수정(PR #8163 판정 공유)이 #8228(3e02fe274)로 devel 에 들어갔습니다. devel 4e690c930 새 빌드로 다시 쟀습니다(Native native-skia·fresh WASM, --compat 2024, 96dpi, raw 실루엣, 글꼴 공급).

    • 회귀 검사 issue_7874_stored_ladder_omitted_spacing_after::paragraphs_keep_spacing_after_omitted_by_stored_ladder: PASS
    • 합성 samples/issue7874/omitted-spacing-after.hwpx ↔ pdf/issue7874/omitted-spacing-after-2024.pdf: Native·WASM 전 2쪽 100 / 100
    • samples/HWP5-nopassword-123456.hwpx ↔ pdf/HWP5-nopassword-123456-hwpx-2024.pdf:
    쪽 이슈 당시 (#7836 기준) 현행 Native 현행 fresh WASM
    9 — 99.46 99.49
    10 30.71 99.98 99.97
    11 — 99.75 99.77
    12 40.81 97.06 97.29
    전체 쪽수 25 / PDF 24 24 = 24 24 = 24

    이 문서에는 이 이슈 범위 밖의 차이가 남아 있어, 문서 전체 피델리티 추적 이슈 #7746 쪽에 둡니다.

    • 18쪽 Native 38.2 · WASM 37.2: 17쪽 끝의 URL 줄과 다음 문단이 rhwp 에서는 18쪽으로 넘어오는 쪽 경계 차이입니다.
    • 24쪽 86.9 · 87.7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions