Skip to content

feat: 페이지 여백 (PageMargin) - #50

Merged
centwon merged 1 commit into
mainfrom
feat/page-margins
Sep 20, 2026
Merged

centwon merged 1 commit into
mainfrom
feat/page-margins

Conversation

@centwon

@centwon centwon commented Sep 20, 2026

Copy link
Copy Markdown
Owner

백로그의 "페이지 여백 API". 1.3.0 계획 3건의 마지막이다(#48 표 API, #49 단축키 표에 이어서).

여백이 아무도 닿을 수 없는 상수 둘(좌우 48 · 상하 40 DIP)이었다. 호스트는 용지는 고를 수 있어도 그 위 어디까지 쓸지는 정할 수 없었고, Word·HWP에서 온 RTF는 자기 여백이 버려져 저자가 보던 것과 다르게 쪽이 나뉘었다.

표면

editor.PageMargin = new Thickness(96, 80, 96, 80);   // 좌·상·우·하, DIP
document.PageSetup.Margin                            // 문서에 저장되는 같은 값
PageSetup.DefaultMargin                              // 48/40/48/40 — 종전 상수
  • 문서에 속한다: JSON/.flow에 저장하고 불러올 때 적용한다 — 용지 크기가 가는 길 그대로. 기본값이면 필드를 생략하므로 여백을 건드리지 않은 문서의 바이트는 그대로다.
  • RTF는 이제 읽는다(사용자 결정). 쓰기는 원래 \margl\margr\margt\margb 넷을 내보내고 있었고(값만 2개에서 복사), 읽기는 문서 수준과 섹션 수준(HWP가 읽는 쪽) 둘 다 받는다.
  • 네 변으로 낸 것도 사용자 결정 — Word·HWP·RTF가 전부 네 변이다.

본문 자리가 남지 않는 여백

음수·NaN·무한대, 또는 마주 보는 두 변의 합이 용지 이상. 이 값이 들어오는 길이 둘이라 양쪽에서 막는다.

  • 속성은 coerce에서 막고 마지막 쓸 수 있던 값을 유지한다. XAML·바인딩에서도 들어오므로, 읽는 자리 열두 곳마다 가드하는 대신 들어오는 지점에서 한 번 막는다.
  • 파일은 네 변 모두 기본값으로 되돌린다. 한 변만 고치지 않는다 — 파일이 뜻한 바가 아니고, 남의 300 DIP 여백을 조용히 반으로 줄이는 것도 그 나름의 놀람이다.
  • RTF에서는 여백이 용지보다 먼저 올 수 있다. 그때는 A4 폴백으로 검사하고 용지가 확정되면 다시 검사한다 — A4엔 맞고 A5엔 안 맞는 여백이 있다.

정리된 것

PagePadX/PagePadY 상수 → 인스턴스 PagePadLeft/Top/Right/Bottom(여백이 문서 설정이 됐으니 상수일 수 없다). A4ContentWidth/Height도 같은 이유로 속성. 읽던 자리 12곳과 테스트 3곳을 옮겼다.

검증

  • PageMarginTests 16개 — 유닛 1135 → 1151, 렌더 41 그대로, 클린 빌드 0 warn.
  • 반증 5종 전부 의도한 테스트만 빨강: 속성 coerce 제거 · 용지 확정 후 재검사 제거 · JSON 검증 제거 · 문서의 여백 적용 제거 · RTF \margl 읽기 제거.
  • ⚠ 첫 판 테스트 3개가 제 산수 때문에 빨갰다: 용지 twips가 표와 2 twips 넘게 달라 매칭이 안 됐고(11906 vs 표의 11910), 문단 DTO에도 MarginRight가 있어 문자열 검사가 걸렸다. 테스트를 고쳤고 제품 코드는 그대로다.

공개 API 추가 6건(제거·시그니처 변경 없음).

실기 확인이 필요한 부분: 페이지 뷰에서 여백을 바꿨을 때 머리글·바닥글·쪽번호가 띠 안에 제대로 앉는지, 인쇄·PDF 출력의 여백이 화면과 같은지.

🤖 Generated with Claude Code

여백이 아무도 닿을 수 없는 상수 둘(좌우 48 · 상하 40)이었다. 호스트는 용지는 고를 수 있어도 그 위
어디까지 쓸지는 못 정했고, Word·HWP에서 온 RTF는 자기 여백이 버려져 저자가 보던 것과 다르게
쪽이 나뉘었다.

- RichEditor.PageMargin(Thickness, DIP, 네 변) + PageSetup.Margin + PageSetup.DefaultMargin.
  네 변으로 낸 건 사용자 결정(2026-09-20) — Word·HWP·RTF가 전부 네 변이고, RTF 쓰기는 이미
  \margl\margr\margt\margb 넷을 내보내고 있었다(값만 2개에서 복사).
- 문서에 속한다: JSON/.flow에 저장(기본값이면 생략 — 여백을 건드리지 않은 문서는 바이트 그대로)하고
  불러올 때 적용한다. 용지 크기가 가는 길과 같다.
- RTF는 쓰기만 하던 것을 이제 읽는다(사용자 결정). 문서 수준과 섹션 수준(HWP가 읽는 쪽) 둘 다.
- 본문 자리가 남지 않는 여백은 거부한다: 음수·NaN·무한대, 또는 마주 보는 두 변의 합이 용지 이상.
  속성은 coerce에서 막고(XAML·바인딩에서도 들어오므로 열두 군데 읽는 자리마다 가드하지 않는다)
  마지막 쓸 수 있던 값을 유지하며, 파일은 네 변 모두 기본값으로 되돌린다(절반만 적용하지 않는다).
- RTF에서 여백이 용지보다 먼저 올 수 있다. 그때는 A4 폴백으로 검사하고, 용지가 확정되면 다시
  검사한다 — A4엔 맞고 A5엔 안 맞는 여백이 있다.

PagePadX/PagePadY 상수는 인스턴스 PagePadLeft/Top/Right/Bottom으로 바뀌었다(A4ContentWidth/Height도
상수일 수 없어 속성으로). 읽던 자리 12곳과 테스트 3곳을 옮겼다.

테스트 PageMarginTests 16개(1135 → 1151), 렌더 41 그대로, 클린 빌드 0 warn. 공개 API 추가 6.
반증 5종 전부 의도한 테스트만 빨강: 속성 coerce 제거 · 용지 확정 후 재검사 제거 · JSON 검증 제거 ·
문서의 여백 적용 제거 · RTF \margl 읽기 제거.
⚠ 첫 판 테스트 3개가 제 산수 때문에 빨갰다(용지 twips 값이 표와 2 twips 넘게 달라 매칭 실패,
문단 DTO에도 MarginRight가 있어 문자열 검사가 걸림). 테스트를 고쳤고 제품 코드는 그대로다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@centwon
centwon merged commit 5d8a33c into main Sep 20, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant