관측된 문제
같은 내용의 HWPX 두 본을 rhwp 가 재조판하면 한 줄에 담는 글자 수가 다릅니다. 내용·글자모양·문단모양·글꼴·칸 속성이 모두 같은데, HWP5 계보 표시가 있는 본은 줄 상자를 15px 넘는 두 글자를 더 받아들이고 자간을 균등 축소해 밀어 넣습니다.
한/글 출력은 두 글자를 받지 않습니다.
재현 — 마커 한 줄
rhwp export-hwpx 는 HWP5 에서 변환한 HWPX 에 META-INF/rhwp-hwp5-origin 마커를 넣습니다. 이 마커가 Document::layout_profile() 의 hwp5_origin_hwpx 를 켭니다.
# 1) 원본 HWP5 를 HWPX 로 변환
rhwp export-hwpx samples/issue6639/rhwp-table-cell-minimal-repro.hwp /tmp/orig.hwpx
# 2) 대상 칸 10문단의 hp:linesegarray 를 제거해 rhwp 가 직접 조판하게 한다
# 3) 그 파일에서 META-INF/rhwp-hwp5-origin 만 빼고 다시 압축한다
rhwp export-svg /tmp/orig_nocache.hwpx -o /tmp/a # 마커 있음
rhwp export-svg /tmp/no_marker.hwpx -o /tmp/b # 마커 없음
|
연속 줄 글자 |
대상 칸 줄 수 |
글자 전진폭 |
| 마커 있음 (HWP5 계보 프로파일) |
46 |
24 |
11.0748px |
| 마커 없음 (HWPX 프로파일) |
44 |
25 |
11.40px |
| 한/글 정본 PDF |
44 |
25 |
— |
기준: pdf/issue6639/issue6639-original-160-2020.pdf. 같은 문서의 한/글 저장 HWPX(issue6639-hancom-160.hwpx)에서 같은 문단의 줄 캐시만 지운 본도 44 입니다.
실측 — 받아들인 뒤 균등 축소한다
SVG 의 글자별 x 간격을 직접 재면 줄 전체가 균일합니다.
44자 줄 간격 11.4000 × 43 (자연 전진폭, 맑은 고딕 9pt 장평 95%)
46자 줄 간격 11.0748 × 45
46 × 11.40 = 524.4px ← 자연 폭
줄 상자 = 509.44px
524.4 → 509.44 압축비 = 0.97147 = 11.0748 / 11.40
즉 폭을 다르게 잰 것이 아니라, 상자를 14.96px 넘는 두 글자를 받아들인 뒤 줄 전체를 0.97147배로 균등 축소한 것입니다. 두 렌더의 glyph scale(0.9747,1) 은 동일하므로 글꼴 축도 아닙니다.
line_break_tolerance_hwp 의 여유는 상자 폭 509.44px(38,208 HWPUNIT)에서 최대 50 HWPUNIT(0.67px)이라 두 글자(1,710 HWPUNIT)를 설명하지 못합니다.
배제한 후보 — 두 입력은 이 마커 말고 같습니다
| 항목 |
결과 |
hh:paraPr 원문 |
borderFillIDRef id 외 완전 동일(BREAK_WORD / KEEP_WORD / condense=0 / snapToGrid=0 / LEFT) |
hh:charPr 원문 |
id·borderFillIDRef 외 완전 동일(height 900, ratio hangul 95 / latin 92, spacing 0) |
| 글꼴 표 |
HANGUL·LATIN 모두 id=0 → 맑은 고딕 로 동일 |
| 대상 문단 본문 XML |
hp:p id / charPrIDRef 외 동일 |
hp:tc (칸 33개) |
양쪽 모두 lineWrap 속성 없음 |
hh:layoutCompatibility |
rhwp 본을 한/글 본과 같게 치환해도 46 유지 → 배제 |
hh:linkinfo pageInherit |
1 로 맞춰도 46 유지 → 배제 |
lastSavedWith.product |
양쪽 모두 hancom-office-2020 |
META-INF/rhwp-hwp5-origin |
제거하면 46 → 44 |
왜 지금 찾았나 — #7416 의 선행축입니다
#7416(자기 모순 저장 사다리)에서 「사다리를 버리면 정본에 맞는가」를 A/B 하다 나왔습니다. 대상 문서의 사다리를 버리면 24줄 / 46자 / 상자 15px 초과가 되어 정본(25줄 / 44자)에서 더 멀어집니다. 원인이 사다리 판별자가 아니라 이 프로파일이었습니다.
이 결함을 먼저 고치면 #7416 의 사다리 폐기가 정본과 정확히 일치합니다(44자·25줄·26 글줄, 위 표의 「마커 없음」 행).
조사 및 완료 조건
- 코드 게이트가 아직 특정되지 않았습니다.
native_hwp5_layout 은 HeightMeasurer 로 가고, hwp5_origin_hwpx 의 현재 유일한 소비처 uses_hwp3_origin_flow_spacing_before(document_core/queries/rendering.rs:766)는 HWP3 계보 전용이라 이 문서(HWP5)와 무관합니다. 줄 채움 쪽에 다른 경로가 있습니다.
- 코퍼스 범위를 측정하지 않았습니다.
samples/** 의 형식 분포는 hwp5 596 · hwpx 523 · hwp3 26 이고 native HWP5 는 전부 같은 프로파일을 탑니다. 다만 이 갈래는 저장 줄이 없어 재조판할 때만 드러나므로 실제 발현 빈도는 별도로 재야 합니다.
- 프로파일이 상자 초과를 허용하는 것이 의도된 호환 동작인지 확인해야 합니다. 의도라면 이 문서에서 왜 한/글과 갈리는지, 아니라면 어느 조건에서 꺼야 하는지를 정합니다.
- 수정 뒤에는 쪽수 원장·넘침/겹침 래칫·정본 대조로 A/B 합니다. 상자 초과를 막는 변경은 줄 수를 늘리므로 쪽수에 영향이 갈 수 있습니다.
비범위
#7407 의 A2a(#7410)·A2b(#7414)는 줄 상자와 글자 폭 축이며 이 이슈와 별개입니다. 두 경로가 같은 상자 509.44px 를 쓰는 것은 위 실측으로 확인했습니다.
#7416 의 사다리 유효성 판별은 이 이슈가 해결된 뒤 재판정합니다.
관측된 문제
같은 내용의 HWPX 두 본을 rhwp 가 재조판하면 한 줄에 담는 글자 수가 다릅니다. 내용·글자모양·문단모양·글꼴·칸 속성이 모두 같은데, HWP5 계보 표시가 있는 본은 줄 상자를 15px 넘는 두 글자를 더 받아들이고 자간을 균등 축소해 밀어 넣습니다.
한/글 출력은 두 글자를 받지 않습니다.
재현 — 마커 한 줄
rhwp export-hwpx는 HWP5 에서 변환한 HWPX 에META-INF/rhwp-hwp5-origin마커를 넣습니다. 이 마커가Document::layout_profile()의hwp5_origin_hwpx를 켭니다.기준:
pdf/issue6639/issue6639-original-160-2020.pdf. 같은 문서의 한/글 저장 HWPX(issue6639-hancom-160.hwpx)에서 같은 문단의 줄 캐시만 지운 본도 44 입니다.실측 — 받아들인 뒤 균등 축소한다
SVG 의 글자별 x 간격을 직접 재면 줄 전체가 균일합니다.
즉 폭을 다르게 잰 것이 아니라, 상자를 14.96px 넘는 두 글자를 받아들인 뒤 줄 전체를 0.97147배로 균등 축소한 것입니다. 두 렌더의 glyph
scale(0.9747,1)은 동일하므로 글꼴 축도 아닙니다.line_break_tolerance_hwp의 여유는 상자 폭 509.44px(38,208 HWPUNIT)에서 최대 50 HWPUNIT(0.67px)이라 두 글자(1,710 HWPUNIT)를 설명하지 못합니다.배제한 후보 — 두 입력은 이 마커 말고 같습니다
hh:paraPr원문borderFillIDRefid 외 완전 동일(BREAK_WORD / KEEP_WORD / condense=0 / snapToGrid=0 / LEFT)hh:charPr원문id=0 → 맑은 고딕로 동일hp:p id/charPrIDRef외 동일hp:tc(칸 33개)lineWrap속성 없음hh:layoutCompatibilityhh:linkinfo pageInheritlastSavedWith.producthancom-office-2020META-INF/rhwp-hwp5-origin왜 지금 찾았나 —
#7416의 선행축입니다#7416(자기 모순 저장 사다리)에서 「사다리를 버리면 정본에 맞는가」를 A/B 하다 나왔습니다. 대상 문서의 사다리를 버리면 24줄 / 46자 / 상자 15px 초과가 되어 정본(25줄 / 44자)에서 더 멀어집니다. 원인이 사다리 판별자가 아니라 이 프로파일이었습니다.이 결함을 먼저 고치면
#7416의 사다리 폐기가 정본과 정확히 일치합니다(44자·25줄·26 글줄, 위 표의 「마커 없음」 행).조사 및 완료 조건
native_hwp5_layout은HeightMeasurer로 가고,hwp5_origin_hwpx의 현재 유일한 소비처uses_hwp3_origin_flow_spacing_before(document_core/queries/rendering.rs:766)는 HWP3 계보 전용이라 이 문서(HWP5)와 무관합니다. 줄 채움 쪽에 다른 경로가 있습니다.samples/**의 형식 분포는 hwp5 596 · hwpx 523 · hwp3 26 이고 native HWP5 는 전부 같은 프로파일을 탑니다. 다만 이 갈래는 저장 줄이 없어 재조판할 때만 드러나므로 실제 발현 빈도는 별도로 재야 합니다.비범위
#7407의 A2a(#7410)·A2b(#7414)는 줄 상자와 글자 폭 축이며 이 이슈와 별개입니다. 두 경로가 같은 상자 509.44px 를 쓰는 것은 위 실측으로 확인했습니다.#7416의 사다리 유효성 판별은 이 이슈가 해결된 뒤 재판정합니다.