Phase 4.5 XY-cut reading order determination for block-level layout analysis.
Implementation:
- xy_cut() function with recursive widest-whitespace split
- Vertical split first (columns dominate), then horizontal split
- Single column detection via gap analysis (blocks on both sides of gap)
- Projection histogram for robust gap detection (1-point bins)
- MAX_DEPTH=20 to prevent stack overflow
- XYCutResult with order, region_count, small_region_count, algorithm
Acceptance criteria (PASS):
- 2-column page: all left-column blocks before all right-column blocks
- 3-column page: col0, col1, col2 order preserved
- Single column: top-to-bottom order (y descending)
- Full-width heading + 2 columns: heading first, then columns
- Small region count signals Docstrum trigger (>10 regions with <3 blocks)
- All unit tests pass
Module: crates/pdftract-core/src/layout/reading_order.rs
Tests: 16 tests covering basic cases, edge cases, split detection
Closes: pdftract-4md5z