Skip to content

조판: RowBreak 표 조각의 쪽당 행 수용량이 한/글보다 한 행 크다 — 바깥 아래 여백 예약 축 (scattered_header 15/52) #7685

Closed

Description

@planet6897

증상

samples/task1716/table_scattered_header_rowbreak.hwpx(52쪽, 정본 pdf/task1716/table_scattered_header_rowbreak-hwpx-2020.pdf)에서 rhwp 는 2쪽부터 RowBreak 표 조각마다 한/글보다 한 행을 더 담는다. 쪽 끝 글줄이 정본과 같은 쪽은 devel f0e7228f6 기준 15/52 뿐이다(1, 713, 24, 32, 33, 37, 4345쪽). 같은 원문의 samples/table_scattered_header_rowbreak.hwp 도 같은 양상이다.

PR #7611 리뷰에서 이 문서 44·45쪽이 devel 대비 «하락» 으로 보였지만, devel 의 44·45쪽 일치는 앞쪽 어긋남이 우연히 같은 위상으로 돌아온 결과였다(아래 실측).

실측 (2쪽, 0-based 1)

  • 표 행 위치는 1024px 까지 정본과 0.1px 안에서 같다(render tree TextLine.y ↔ PyMuPDF 줄 위끝).
  • 한/글은 다음 행(「인장시험」, rhwp 높이 약 22.0px)을 3쪽으로 넘기고 직전 행을 쪽 바닥까지 늘린다(가운데 정렬 글자 +10.3px).
  • 한/글 표 아래 괘선은 확인한 모든 쪽(1·2·3·40·41)에서 1081.5px = 본문 바닥 1084.7 − 바깥 아래 여백 141HU(1.88px) − 1.33px.
  • rhwp 는 이어받는 RowBreak 조각에 바깥 아래 여백을 예약하지 않는다(partial_rowbreak_fragment_spacing_px 는 repeat_outer_margin 일 때만; [layout] 쪽 넘김 표 조각의 상자가 내용에 맞춰 줄고 valign 배치를 받지 않는다 (#7086 축 A) #7095 는 HWP5 1×1 쪽 조각에 한해 바깥 아래 여백 + 100HU 를 예약).

시도한 규칙과 결과 (표본 중 출력이 바뀌는 문서의 바뀐 쪽 655쪽, 정본 실루엣 A/B)

규칙 scattered hwpx 쪽 끝 일치 90% 미만 하락 / 상승 정본 쪽수 원장
현재(PR #7611 head) 12/52 512 – –
모든 비-TAC RowBreak 조각에 바깥 아래 여백 예약 28/52 506 43 / 49 개선 1 · 악화 2
위 + 100HU(#7095 상수) 2/52 (54쪽) – – 과함
바깥 아래 여백, 제목 행 반복 표만 28/52 483 13 / 42 악화 1 (1342000 416→417)

막힌 지점

  • 1342000_edu_curriculum_map.hwp 구역 10 표(217×9) 186..202 조각은 rhwp 여유 1.80px 인데 한/글은 그 행을 받는다. scattered 2쪽은 여유 약 1.9px 인데 한/글이 거절한다. 판정이 0.1px 수준에서 갈려 px 반올림한 행 높이로는 규칙을 가를 수 없다.
  • 저장 셀 선언 높이(HU)로 한/글 행 높이를 재구성하면 실제 배치와 82px 어긋난다(내용으로 늘어난 행을 반영하지 못함).
  • «제목 행 반복 표만» 한정은 실측으로 고른 조건이라 근거가 없다.

다음 단계 제안

  1. 한/글 행 높이를 HU 정밀도로 재현(글꼴 줄 높이·셀 안 여백의 HU 반올림 지점)해 경계 여유를 정수로 비교한다.
  2. 그 위에서 바깥 아래 여백 예약이 조각 종류(이어받기/첫 조각, 제목 행 반복 여부)와 무관한 단일 규칙인지 다시 판정한다.

실험 패치(env 토글, 커밋하지 않음)와 A/B 스크립트는 PR #7611 작업 환경에 보관했다.

Refs #7611

Activity

  1. planet6897 commented on Oct 9, 2026

    @planet6897
    ContributorAuthor

    착수합니다(planet/rhwp-71e0b4c1). 정본 PDF 에서 한/글이 쪽 바닥까지 늘린 끝 행의 바닥(L)을 RowBreak 표 조각 전수로 재어, 본문 바닥 − L 이 바깥 아래 여백·100HU 와 어떤 관계인지부터 판정하겠습니다.

  2. planet6897 commented on Oct 9, 2026

    @planet6897
    ContributorAuthor

    1차 측정 결과 — 「바깥 아래 여백 + 상수」 규칙은 세울 수 없고, 판정은 행 높이 정밀도에 좌우된다

    1. 정본의 이어지는 표 조각 아래 끝 L 전수

    표본 중 rhwp 쪽수 = 정본 쪽수인 59문서에서 RowBreak 표 조각 541개를 쟀습니다(본문 바닥 − 정본 쪽의 가장 낮은 긴 가로 괘선).

    바깥 아래 여백 조각 수 최빈값(px)
    141HU 317 4.5 (69) · 3.2 (40) · 4.2 (21) · 10.0 (19) · 8.4 (16)
    283HU 163 중앙값 29.5, 흩어짐
    0 33 2.5 (9) · 5.2
    • 같은 문서 안에서도 값이 갈립니다. scattered hwpx 에서는 4.5px 24곳, 3.2px 20곳이며, 바닥 괘선 굵기(0.24/0.36pt)와는 상관이 없습니다.
    • 그래서 «한/글이 끝 행을 늘려 닿는 바닥 = 본문 바닥 − 바깥 아래 여백 − 상수» 꼴의 단일 한계는 정본에서 보이지 않습니다.

    2. 경계 두 곳 직접 대조

    문서·쪽 정본 끝 행 바닥 본문 바닥과의 차 한/글 판정 rhwp 같은 행 범위의 바닥
    scattered hwpx 2쪽 1081.54 3.18 다음 행(정본 피치로 1081.8 까지) 거절 rhwp 는 그 행을 받아 1082.9
    1342000 구역 10, rhwp 210쪽(정본 209쪽) 715.77 2.43 행 186..202 수용 716.4 (정본 바닥보다 0.6px 아래)
    • 1342000 에서 rhwp 의 같은 행 범위가 한/글이 받은 바닥보다 0.6px 깁니다. 따라서 rhwp 행 높이가 쪽당 0.5~1px 크게 잡히는 곳이 있습니다.
    • scattered 2쪽의 「인장시험」 행도 rhwp 22.0px, 정본 피치 약 20.9px 입니다.
    • 셀 저장 LINE_SEG(HU)로 행 높이를 재구성해 보면, 행 피치는 맞지만 39행에 걸쳐 정본보다 2.6px 짧습니다. 선언 셀 높이만 쓰면 82px 어긋납니다. 둘 다 정본을 재현하지 못합니다.

    결론과 다음 단계

  3. planet6897 commented on Oct 18, 2026

    @planet6897
    ContributorAuthor

    devel 6ed1682c3 재측정 — 52쪽 모두 쪽 끝 행이 정본과 같아 닫는다

    착지: 통합된 #7685 커밋들 — ece68e79f(칸 줄 상자 두 곳을 한/글 정본 높이에), 77f600653(행 경계에서 이어지는 RowBreak 조각은 쪽 위에서 바깥 위 여백을 다시 연다), 70783a257(HWP5 저장 조판에서 문단을 넘는 0→0 저장 쪽 재시작 인정). 이 이슈가 «먼저 풀어야 할 것»으로 적은 행 높이 정밀도가 그 첫 커밋이다.

    samples/task1716/table_scattered_header_rowbreak.hwpx (정본 -hwpx-2020, 52쪽 = 52쪽)

    이슈 당시 (f0e7228f6) devel 6ed1682c3
    쪽 끝 글줄이 정본과 같은 쪽 15 / 52 52 / 52
    Native 2px 실루엣 90% 미만 쪽 — 0 (최저 91.66, 평균 99.34)

    쪽 끝 비교는 각 쪽 본문의 가장 낮은 글줄(렌더 트리 ↔ PyMuPDF)을 맞댄 것이다. 문자열 단순 비교로는 45/52 가 나오는데, 나머지 7쪽(4·5·19·32·33·35·41)은 같은 행의 칸들이 같은 높이(차 ≤1px)에 있고 칸 순서만 달라 가장 낮은 글줄 하나가 다른 칸으로 잡힌 것이다. 예: 4쪽 rhwp 「플라이애시 · KSL5106 · 비표면적」 1064.7~1065.2 ↔ 정본 「·제조회사별 · 비표면적 · 플라이애시」 1065.1, 다음 쪽 첫 행도 둘 다 「KSLISO9597 · 응결」.

    내 열린 PR #7965 head 에서도 52쪽 전부 90% 이상(평균 99.36)이다.

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