Miscalculation when using keepWithNext
Pierre Ossman <[email protected]> Thu, 4 Nov 2021 08:22:14 +0100
| Newsgroups | gmane.comp.python.reportlab.user |
|---|---|
| Organization | Cendio AB |
| Message-ID | <[email protected]> |
Hi, We've run in to an issue with ReportLab where it can orphan a heading under some circumstances, despite things being correctly marked with keepWithNext. After some digging we found that flowables._listWrapOn() does not compute the same height as Frame._add(). So what happens is that KeepTogether things the flowables will all fit, but once the Frame starts adding things the last element gets punted to the next page. I'm afraid I don't have an easy example for you, but I do have some numbers that should allow anyone to go through the code. We have the following elements that are all marked keepWithNext: Width Height Space Before Space After -------------------------------------------- 0 3 0 0 470 15 12 6 470 36 6 0 The frame is at y=67. The space required for the above elements is 3+12+15+6+36=72. I.e. it won't fit. However _listWrapOn() computes a required height of 57 here, so it thinks things will fit. There are two bugs in play here: a) _listWrapOn() ignores things with 0 width, however Frame._add() does not. So the first element gets discarded, dropping 3 from the resulting height. b) _listWrapOn() assumes it is at the top of a frame, and should therefore discard the first flowable's spaceBefore. This seems unsafe as it will then often underestimate the space required. It would likely be better to assume it is never at the top and hence overestimate. This bug then acts on the second flowable (since the first was dropped), dropping another 12 from the total height. And 72 - 12 - 3 = 57, and we get the bogus height number. For now I've worked around this by making sure that initial flowable is 1×3 instead of 0×3. I also noticed that KeepTogether._H0 is probably incorrect since it doesn't include spaceBefore. But that might be tied to the assumption of always being at the top of a frame. Regards -- Pierre Ossman Software Development Cendio AB https://cendio.com Teknikringen 8 https://twitter.com/ThinLinc 583 30 Linköping https://facebook.com/ThinLinc Phone: +46-13-214600 A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? _______________________________________________ reportlab-users mailing list [email protected] https://pairlist2.pair.net/mailman/listinfo/reportlab-users