Skip to content

narrow glyph(콤마·중점 등) 뒤 문자 advance 과다로 숫자·중점 뒤 공백 벌어짐 #257

@planet6897

Description

@planet6897

증상

text-align-2.hwp 를 rhwp SVG 로 내보내면 콤마(,)·중점(·) 등 실제 글리프 폭이 반각(em/2)보다 훨씬 좁은 narrow glyph 뒤에 오는 글자가 한컴 오피스 PDF 보다 3~5 px 더 오른쪽에 배치됨.

위치 한컴 PDF rhwp SVG
표 셀 숫자 1,000항목 1, 000항목
표 셀 숫자 30,000항목 30, 000항목
표 헤더 중점 어휘·표현 어휘· 표현

재현

cargo run --bin rhwp -- export-svg text-align-2.hwp -o output/svg/text-align-2/

생성된 output/svg/text-align-2/text-align-2.svg 의 TAC 표 셀 내 1,000항목 / 30,000항목 / 어휘·표현 좌표를 PDF 출력과 비교하면 콤마·중점 뒤 글자 x 좌표가 PDF 대비 3~5 px 우측으로 밀림.

상세 비교: mydocs/tech/text_align_2_svg_pdf_compare.md §2.2

원인 가설

src/renderer/layout/text_measurement.rs:280-290 compute_char_positions 의 음수 자간 min-clamp 로직:

if style.letter_spacing + style.extra_char_spacing < 0.0 {
    let min_w = base_w * ratio * 0.5;
    w = w.max(min_w);
}
  • 콤마 base_w = font_size × 0.5 (반각 휴리스틱)
  • 자간 -8% 시 w = 반각 + (-8% × font_size) 로 줄어드는 게 정상
  • 그러나 min_w = 반각 × ratio × 0.5 ≈ font_size × 0.25하한으로 작동, 실제 글리프(font_size × 0.15 수준)보다 과도한 advance 로 남음 → 콤마·중점 뒤 공백 벌어짐
  • 폰트 메트릭 DB(measure_char_width_embedded)에 실제 advance 값이 있으면 해당 경로로 처리되지만, 미등록 폰트(HY헤드라인M 등)에서는 반각 휴리스틱으로 fallback 되어 증상 발생

영향 범위

  • 표 셀 내 숫자 (1,000, 30,000 등 콤마 포함 숫자 전반)
  • 일반 본문 내 콤마·중점이 다수 쓰이는 문서
  • 콤마·중점 빈도가 높은 시험지·보고서·사양서 등
  • text-align.hwp (원본 Task 원문자(③) 위에 ⓪이 겹쳐 렌더링되는 버그 #146 샘플)에는 해당 문자가 없어 회귀 검증에서 드러나지 않았음

수정 접근 후보

내용 리스크
A base_w 휴리스틱 개선 — Unicode Punctuation 범주의 narrow glyph 는 font_size × 0.3 수준의 작은 값 반환 낮음
B min_w 하한값 폐지 — narrow glyph 에 per-char clamp 미적용 낮음
C 폰트 메트릭 DB에 공통 narrow glyph (, . · : ;) 실제 값 추가 중간 (유지보수 비용)

권장: A + B 조합 (narrow glyph 감지 후 clamp 우회).

관련

산출 예상

  • 소스: src/renderer/layout/text_measurement.rs 1개 (+ 유니코드 범주 분기 추가 시 helper 함수)
  • 테스트: 단위 테스트 1~2개 (콤마/중점 advance)
  • 회귀: text-align-2.hwp SVG 좌표 골든 테스트 or 시각 확인

text-align-2.zip

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions