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
- Re: keep...="always" and Knuth penalties Luca Furini