Repository navigation
fix(typeset): 빈 공동 앵커 host 자리차지 표의 띠·흐름에 바깥 여백을 거듭 더하지 않는다 (#7687) - #8157
planet6897 wants to merge 2 commits into
Conversation
…#7687) 빈 host 에 자리차지 표가 둘(오프셋 0 / 양수)인 문단은 edwardkim#7687 이후 글 있는 host 와 같은 visible float 배치(place_table_with_text)를 탄다. 그 배치는 표 원점에 바깥 위 여백을, 흐름 끝·배제 띠 끝에 바깥 아래 여백을 스스로 더한다. 그런데 통째 배치 호출부는 이 host 에 흐름용 높이(표 + host 앞 간격)와 RowBreak 흐름 꼬리(아래 여백)를 넘겨, 오프셋 0 표의 흐름 끝과 양수 오프셋 표의 배제 띠 끝이 바깥 여백만큼 더 내려갔다. 한글문서파일형식 20쪽 pi=130: 둘째 표 띠 끝 379.72px — 저장 사다리(pi=132 vpos 28197)와 배치는 375.96px. 뒤 빈 문단이 그 띠로 뛰어 pi=133 「3.2.12. 참고문헌」 host 원점이 3.76px 내려갔고, 통합 뒤 배치가 typeset 확정 원점을 쓰면서 그 host 의 둘째 표(7×2)·제목·뒤 본문이 정본보다 +4.3px 아래에 그려졌다. 첫 표(오프셋 0)는 배치 흐름이 놓아 제자리였다. 글 있는 host 처럼 표 상자 높이(effective_height)만 넘기고 흐름 꼬리를 붙이지 않는다. - 한글문서파일형식 20쪽: 둘째 표 686.0 → 682.3(정본 681.7), 「3.2.12.」 853.9 → 850.2(849.5) - 합성 K1~K4(gen_titled_host_after_band.py, 한/글 2020 Print): K1~K3 T4·뒤 글줄 +3.8px → 정본 ±0.5px, K4(앞 빈 host 없음) 불변 - 회귀: titled_host_after_empty_host_band_keeps_its_float_offsets — 수정 전 FAIL(K1 T4 496.7, 기대 492.9)
5327804 to
495fc8f
Compare
기존 planet6897 PR #8111·#8141·#8152·#8157·#8159·#8163·#8170·#8176·#8185·#8193의 기능 commit 49개와 통합 보정을 반영합니다. 중복 종료된 #8130의 임시 2개 적용은 제거했으며 기능 적용 수에서 제외합니다. 메인터너 보정은 현재 셀 글줄·물리 프레임·선언 행 높이와 선택 span 정렬의 일관성, 공백·출력 경계 및 요청한 회귀 제외를 처리합니다. sample16 계열과 행정업무운영 편람 HWP/HWPX는 사용자 지시로 검토에서 제외했습니다. 검증 code head 673c1d5f7cdcb5573b793ba2d2abaaedd2602134의 전체 nextest는 11,481 PASS/0 FAIL/45 skip이며 필수 로컬 게이트 14개를 통과했습니다. Native/fresh WASM 각35조건·2,041쪽의 최저 raw 91.87422%/91.82753%,90% 미달·고정 devel 대비0.1%p 이상 하락은 없습니다. 실제 Native15/Canvas2D15/지원CanvasKit12와 초기화 JS/WASM 응답을 확인했습니다. Mac WASM은 no-opt 로컬 대체 빌드입니다. CI 보정은 편람 Gym 과제8건 제거에 따른 원장 기대 건수와 삭제된 case를 참조한 --print 대상 한 줄입니다. 제품 Rust·Studio source는 로컬 검증 head와 같습니다. 최종 PR head b1e93d8, 테스트 merge 41a30c3eeb6e50464b6806beeaa20dbaa23a77a8의 Full CI·CodeQL·Render Diff·Proptest·Adapter·Gym 검사가 모두 통과했습니다. Rust4 shard 합계11,288 PASS/0 FAIL/45 skip입니다. 원 PR별 검토 기록, 대응하는 review/overlay PNG·전쪽 TSV와 오늘할일을 포함합니다. 머지 후 사용자 지정 옵션2로 실제 CI·merge·후속 처리 기록을 보완합니다. 대표 #7445 전체 해결을 주장하지 않습니다. Refs #8099, #8105, #7687, #8156, #7874, #8169, #8167, #8172, #4599, #7445, #7765, #7881 Co-authored-by: Jaeuk Ryu <35355437+planet6897@users.noreply.github.com>
|
기여해 주셔서 감사합니다. 이 PR의 기능을 검토·체리픽 통합하여 PR #8228로 devel에 반영했습니다.
원 기여에서는 빈 공동 앵커 host 표의 바깥 여백을 중복 소비하지 않습니다. 원 기여와 통합 보정원 기여를 유지했습니다. #8159에 중첩된 동일 패치를 중복 적용하지 않았습니다. 원 기여 기능과 메인터너의 통합 보정 범위는 위 개별 검토 문서의 적용 commit·소비 경로·실제 회귀 결과에 구분했습니다. 다른 PR의 문서나 제외한 sample16·편람을 이 PR의 개선 증거로 대신하지 않았습니다. 해당 원 PR의 전쪽 비교
전체 페이지 90% 미만·누락 0쪽입니다. 같은 조건의 고정 base 대비 0.1%p 이상 하락은 0쪽이며, 쪽수 개선은 본문 소유·순서 보존을 따로 확인했습니다. 실제 입력·PDF SHA-256과 증적 바이트. 이 원 PR에 대응하는 정식 회귀 2건의 실제 PASS는 개별 검토 기록에 기재했습니다. 직접 확인한 증적직접 판독: T1~T4 표 띠와 K1 제목·본문을 대조했습니다. 표/뒤 문단의 중복 여백은 보이지 않습니다. 테두리 안티앨리어싱 차이는 남습니다. Visual Sweep 비교·병합 판정 방법과 공통 producer·해시·잔여 원장을 연결합니다. 일치율은 내용 픽셀 중심 자동 비교 보조값이며 사람 판독의 정확도나 완전한 픽셀 동일성을 뜻하지 않습니다. 이 원 PR은 별도 직접 merge가 아니라 통합 PR에 반영했으므로 종료하겠습니다. contributor의 원격 브랜치는 유지합니다. 관련 이슈 전체의 완료 여부는 개별 증거 범위로 별도 판단하며 이 PR 종료만으로 일괄 종료하지 않습니다. |




요약
빈(글 없는) host 문단의 공동 앵커 자리차지 표에서 바깥 여백이 두 번 더해지던 문제를 고친다. 대상은 #7687 형상, 곧 첫 표 오프셋 0과 둘째 표 양수 오프셋이다.
그 띠 뒤에 오는 글 host 의 원점이 내려가서, 그 host 의 둘째 표·제목·뒤 본문이 아래로 밀렸다. 한글문서파일형식 20쪽 pi=133 「3.2.12. 참고문헌」에서 +4.3px 이다.
upstream/devel2e087a5b4e648df1cf53278043f원인 — 생산 → 소비 경로
typeset/table/block/entry.rs의 통째 배치는 빈 공동 앵커 host(is_textless_coanchored_float_host)에 두 값을 더해place_table_with_text에 넘겼다.whole_placement_height = table_total= 표 상자 + host 앞 간격(= 바깥 위 여백)unreserved_flow_tail=after − after_for_fit= 바깥 아래 여백place_table_with_text의 visible float 갈래는 [renderer/layout] 빈 host 문단의 다중 자리차지 표: host 줄·빈 문단이 표 사이 틈을 채우고 띠에 걸리는 줄만 띠 아래로 가야 한다 (한글문서파일형식 19쪽 −17.4px) #7687 부터 이 host 도 받는다. 이 갈래는 표 원점에 바깥 위 여백을, 흐름 끝·배제 띠 끝에 바깥 아래 여백을 스스로 더한다. 그래서 여백이 두 번 들어갔다.HostPlacementConstraint)를 쓴다. 그래서 pi=133 의 7×2 표·제목·본문이 +4.3px 로 그려졌다.수정
빈 공동 앵커 host 의 자리차지 표도 글 host 처럼 표 상자 높이(
effective_height)만 넘기고, 흐름 꼬리를 붙이지 않는다(entry.rs두 곳). 바깥 여백의 소유자는place_table_with_text하나다.검증
직접 좌표 (96dpi px)
Visual Sweep — raw 2px 실루엣 (
silhouette_raw_match_percent)합성
samples/issue7687/titled-host.hwpx는 이 PR 의 게이트 입력이다.gen_titled_host_after_band.py, 저장 줄 없음pdf/issue7687/titled-host-2020.pdf, 4쪽 = 4쪽기존 합성
empty-host.hwpx(6쪽) 결과다.used만 3.8px 줄고 SVG 는 바이트 단위로 같다.한글문서파일형식 HWP 는 진단 자료다.
대표 이미지 (head
53278043f)한글문서파일형식 20쪽 — 수정 전 / 수정 후 review (Native)
한글문서파일형식 20쪽 overlay (이 PR, Native / fresh WASM)
합성 K1 — 수정 전 / 수정 후 review (Native), overlay (이 PR, Native / fresh WASM)
직접 판독 결과다.
회귀 검사
tests/cases/issue_7687_empty_host_multi_float_gap.rs::titled_host_after_empty_host_band_keeps_its_float_offsets를 추가했다.기대값은 원본 속성(오프셋 9000HU, 바깥 여백 283HU)에서 계산한 관계이고, 정본 PDF 와 0.5px 안에서 맞는 것을 확인했다.
K1 T4 윗변: 실제 496.7, 기대 492.9synthetic_empty_host_cases_follow_hancom_gap_rule영향 범위
samples 전수 1,317 문서에서
dump-pages출력이 바뀐 문서는 3개다.issue7687/empty-host.hwpx— used 만 바뀌고 SVG 는 같다쪽수와 이상 지표(overflow·offCanvas·textOverlap·emptyPage)는 전후 같다.
게이트
--check --base-ref 2e087a5b4를 실행했다. 통과, error 0.rust-unit-test-tiers --check: 통과issue_6520_svg_layer_contract::subset_font_bytes_are_deterministic_for_multiple_codepoints는 검증 환경에 설치된 글꼴 때문에 생긴다.남은 것 / 비범위
mydocs/report/empty-host-band-outer-margin-7687/에 있다.🤖 Generated with Claude Code
최신 devel rebase (2026-10-23, #8173 절차)
upstream/develdef947c21로 충돌 없이 rebase. head495fc8f86(이전53278043f). 위 SHA 고정 URL 은 새 head 로 갱신했다(같은 파일).495fc8f86, 빌드 전 소스 touch): fmt · Clippy 3종 · workspace build · manifest--check· unit tier 통과, nextest 11,477건 중 11,476 통과(실패 1건issue_6520_svg_layer_contract::subset_font_bytes_are_deterministic_for_multiple_codepoints는 이 host 의 시스템 한컴 글꼴 탓으로 base 에서도 같은 assertion 실패, 무관).--compat 2022, base = develdef947c21+ 무관 커밋, 바이너리·WASM sha256 확인):samples/issue7687/titled-host.hwpx