Skip to content

폰트 충실도: 한컴 돋움 폴백을 Noto Sans KR ExtraLight로 (closes #1224)#1234

Merged
edwardkim merged 1 commit into
edwardkim:develfrom
planet6897:feature/issue-1224-font-fidelity
Jun 2, 2026
Merged

폰트 충실도: 한컴 돋움 폴백을 Noto Sans KR ExtraLight로 (closes #1224)#1234
edwardkim merged 1 commit into
edwardkim:develfrom
planet6897:feature/issue-1224-font-fidelity

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

요약

한컴 돋움(Haansoft Dotum) 미설치 시 폴백되는 Noto Sans CJK KR Regular의 획이 한컴 돋움보다 +43% 두꺼워 본문이 PDF보다 과도하게 굵게 렌더되는 문제(#1224)를, 획 두께가 근접한 **Noto Sans KR ExtraLight(wght 200)**로 폴백/대체하여 교정.

원인 재규명

이슈 진단("크고 두껍게", em-fill 0.87 vs 0.67)을 동일 페이지 픽셀폭으로 고해상도 실측:

잉크 높이 획 밀도
rhwp (Noto Sans CJK KR Regular) 17px 0.378
PDF (한컴 돋움) 17px 0.265
  • 잉크 높이 동일 → 크기/em-fill 차이는 없음(이슈 0.67은 em=15px 저해상도 오차).
  • 진짜 원인 = 획 두께(weight). "두껍게" 진단은 정확.

설계

SVG 텍스트는 메트릭-DB advance 위치에 클러스터별 <text>를 방출하고 textLength로 가로폭까지 제약 → 위치·자간·가로폭은 모두 제어됨. 유일 미제어 차원은 글리프 획 두께이며 폴백 폰트가 결정. weight만 한컴 돋움에 근접시키면 레이아웃·메트릭 무변경으로 시각 교정.

채택: Noto Sans KR ExtraLight (wght 200) — 페이지 밀도 0.277, 동일 Noto 계열(중립 고딕), OFL, 한글 11,172 완비.

변경

  • renderer/mod.rs: generic_fallback sans 체인에 ExtraLight를 무거운 Noto 직전 삽입(시스템 고딕 렌더 무영향) + 테스트
  • renderer/svg.rs: korean_gothic_substitute() 임베딩 후보 + find_font_file 탐색 경로 말단 ttfs/opensource
  • ttfs/opensource/NotoSansKR-ExtraLight.ttf(+OFL, README): 네이티브 번들(독립 family)
  • web/fonts/NotoSansKR-ExtraLight.woff2 + rhwp-studio/.../font-loader.ts: Haansoft Dotum·돋움·굴림 → ExtraLight
  • tech/font_fallback_strategy.md §11 + 측정·계획·단계/최종 보고서

검증

  • 본문 충실도 0.378 → 0.277 ≈ PDF 0.265 (다문서 3-09·3-11 PDF 정합)
  • 레이아웃 불변: dump-pages 3문서 base 대비 바이트 동일(회귀 없음)
  • cargo test --lib 1494 passed, 0 failed

알려진 한계

  • --embed-fonts @font-face는 typst subsetter의 cmap 제거<text>에 무효 → 실효 경로는 폴백 체인 + fontconfig/웹폰트. (cmap 보존 서브셋은 후속 과제)
  • 네이티브 CLI(rsvg)는 ExtraLight가 fontconfig에 설치돼야 적용(웹은 자동).
  • 대체폰트는 독립 family 명명 필수("Noto Sans KR" 섀도잉 방지).

후속 이슈

closes #1224

## 원인 (재규명)
이슈 진단("크고 두껍게", em-fill 0.87 vs 0.67)을 동일 스케일 고해상도로 실측한
결과, 잉크 높이는 17px로 동일 — 크기 차이는 없음. 진짜 원인은 **획 두께**:
Noto Sans CJK KR Regular가 한컴 돋움보다 +43% 두꺼움(페이지 밀도 0.378 vs 0.265).

## 설계
SVG 텍스트는 메트릭-DB advance 위치에 클러스터별 <text>를 방출하고 textLength로
가로폭까지 제약 → 위치·자간·가로폭은 모두 제어됨. 유일 미제어 차원은 글리프 획
두께(폴백 폰트가 결정). weight만 한컴 돋움에 근접시키면 레이아웃·메트릭 무변경으로
시각 교정. 채택: Noto Sans KR ExtraLight(wght 200, 페이지 밀도 0.277, OFL).

## 변경
- renderer/mod.rs: generic_fallback sans 체인에 'Noto Sans KR ExtraLight'를
  무거운 'Noto Sans KR' 직전 삽입(시스템 고딕 렌더 무영향) + 테스트
- renderer/svg.rs: korean_gothic_substitute() — 돋움/고딕/굴림 계열 임베딩 최후
  후보, find_font_file 탐색 경로 말단에 ttfs/opensource 추가
- ttfs/opensource/NotoSansKR-ExtraLight.ttf(+OFL,README): 네이티브 번들(독립 family)
- web/fonts/NotoSansKR-ExtraLight.woff2 + rhwp-studio font-loader.ts:
  Haansoft Dotum·돋움·굴림 → ExtraLight 매핑, FONTS.md 갱신
- tech/font_fallback_strategy.md §11 + 측정 보고서·계획서·단계/최종 보고서

## 검증
- 본문 충실도 0.378→0.277 ≈ PDF 0.265 (다문서 3-09·3-11 PDF 정합)
- 레이아웃 불변: dump-pages 3문서 base 대비 바이트 동일(회귀 없음)
- cargo test --lib 1494 passed, 0 failed

## 주요 발견(한계 명시)
- --embed-fonts @font-face는 typst subsetter의 cmap 제거로 <text>에 무효
  (실효 경로 = 폴백 체인 + fontconfig/웹폰트). cmap 보존은 후속 과제.
- 네이티브 CLI(rsvg)는 ExtraLight를 fontconfig에 설치해야 적용(웹은 자동).
- 대체폰트는 독립 family 명명 필수('Noto Sans KR' 섀도잉 방지).

## 후속
- 수식 큰 연산자(Σ/∏/∫) 피연산자 간격 누락 → 별도 이슈 edwardkim#1233
@planet6897 planet6897 force-pushed the feature/issue-1224-font-fidelity branch from 013057d to dbf8aa8 Compare June 2, 2026 01:48
@edwardkim edwardkim self-requested a review June 2, 2026 02:42
@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 9ec04ef into edwardkim:devel Jun 2, 2026
7 checks passed
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 님, 기여 감사합니다.

PR #1234는 local/devel 기준 검증 브랜치에서 병합 후 다음 검증을 통과했습니다.

  • cargo fmt --all --check
  • cargo test --lib renderer::tests::test_generic_fallback
  • cargo test --test svg_snapshot
  • cargo test --lib
  • cargo test --tests
  • Docker WASM build
  • rhwp-studio production build

추가로 samples/3-09월_교육_통합_2023.hwp 6페이지 SVG 산출물로 메인테이너 시각 판정을 진행했고 통과했습니다.

반영 과정에서 Stage 1/2 문서의 Light/ExtraLight 선정 흐름이 오해되지 않도록, Stage 3에서 Noto Sans KR ExtraLight로 재확정되었다는 문서 주석을 보완했습니다.

devel에 반영 완료했습니다.

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