Manuel Mall wrote:

Yes, there is a force parameter and it seems to be always set to true for page breaking (and false for line breaking). But it doesn't seem to guarantee that breaks will be found otherwise we shouldn't get the "giving up after 50 retries" message.

The "force" parameter requires the algorithm to find a set of breaks, even if some of them could require an adjustment ratio greater than the maximum one, or smaller that -1 (those breaks are represented by the nodes stored in lastTooLong and lastTooShort).

During the line breaking, it is first set to "false", so that we first try and look for "good" line breaks, and set to false only if the first tries failed, and we need to create some ugly lines (too short or too long, just as underfull and overfull lines in tex).

The last call to findBreakingPoints (which, for the page breaking, is also the first one) needs to have force = true, as we need to have some breaks to continue (if force == false and the algorithm fails we have no breaks after the end of the method).

The "overflow recovery" mechanism tries avoiding the use of a "long" break (i.e. one involving some content to overflow the available space), inserting an empty page and trying againg: this works if one of the following pages will be taller.

This could happen, for example, when we have a block spanning all columns and then some other content that must flow in the columns: due to the presence of the spanning block, the first page will have some short columns, while the following pages could use the whole body height (this example makes me think that 50 attempts could be even too many, but maybe there are other situations where such a large number is really needed).

Should this strategy not work (for example, we are trying to place a 30cm image inside a 20cm-high body), instead of throwing the exception we could use the lastTooLong node (which always exists), after removing the "empty page" nodes.


Reply via email to