Jeremias Maerki wrote:

> I thought I could come up with a combined element list for this one, too,
> but so far I haven't managed.

At last I'm here!
I start with a question I could not find an answer to: is row splitting
allowed by default and forbidden using keep-together, or is it forbidden
unless otherwise specified? (in other words, is this problematic situation
the most common one, or the most unlikely?)

> For those who want to join the mind game,
> here are the expected results from the broken lists:
>
> break at first legal break:
> Part 1 (height -> 15):
> Part 2 (height -> 41):
>
> break at second legal break:
> Part 1 (height -> 30):
> Part 2 (height -> 41):
>
> break at third legal break:
> Part 1 (height -> 33):
> Part 2 (height -> 15):
>
> break at fourth legal break:
> Part 1 (height -> 41):
> Part 2 (height -> 15):
>
> no breaks:
> Part 1 (height -> 45):

This could be the procedure that creates the combined elements, at least
when there is no stretch nor shrink; with this assumption, the resulting
sequence will contain only boxes and penalties.
First of all, we must know the total height of the row, if it is not split
between pages.

    totalHeight = 0
    for each cell-list
        height[i] = compute the total height of each cell-list
        if (height[i] > totalHeight)
            totalHeight = height[i]

The sequence we are going to create must be totalHeight long when it is
not divided.

    step = 0
    addedBoxHeight = 0;
    while step < totalHeight
        step = nextStep()
        penaltyHeight = step + maxRemainingHeight() - totalHeight
        boxHeight = step - addedBoxHeight - penaltyHeight
        addedBoxHeight += boxHeight
        sequence.add(new box(boxHeight))
        sequence.add(new penalty(penaltyHeight, 0))

For each cell-list, we must know, besides the total height, the height of
the elements already combined into the new ones.
The nextStep() method looks at each cell-list, computing the height of the
first sub-sequence, chooses the smallest increase and updates in each list
the height of the elements already combined; maxRemainingHeight() returns
the greatest difference between the total height of a cell-list and the
height of the elements already combined.

Using your example, the behaviour of this algorithm is this:

totalHeight = 45

1st step: step = 15
          maxRemaingHeight = 41
          addedBoxHeight = 0
          penaltyHeight = 15 + 41 - 45 = 11
          boxHeight = 15 - 0 - 11 = 4

2nd step: step = 30
          maxRemaingHeight = 41
          addedBoxHeight = 4
          penaltyHeight = 30 + 41 - 45 = 26
          boxHeight = 30 - 4 - 26 = 0

3rd step: step = 33
          maxRemaingHeight = 15
          addedBoxHeight = 4
          penaltyHeight = 33 + 15 - 45 = 3
          boxHeight = 33 - 4 - 3 = 26

4th step: step = 41
          maxRemaingHeight = 15
          addedBoxHeight = 30
          penaltyHeight = 41 + 15 - 45 = 11
          boxHeight = 41 - 30 - 11 = 0

5th step: step = 45
          maxRemaingHeight = 0
          addedBoxHeight = 30
          penaltyHeight = 45 + 0 - 45 = 0
          boxHeight = 45 - 30 - 0 = 15


combined elements, with their width and what happens if a penalty is used:

 box      4
 penalty 11 ----> 15+41
 box      0
 penalty 26 ----> 30+41
 box     26
 penalty  3 ----> 33+15
 box      0
 penalty 11 ----> 41+15
 box     15 ----> 45

I think this procedure could be quite easily extended in order to take
into account stretch and shrink.

> An alternative approach might be to do create "combined stretch boxes"
> (actually box+pen(inf)+glue)
>
> Cell1, combined stretch box: w=45000 y=30000 z=0
> Cell2, combined stretch box: w=30000 y=15000 z=15000
> Cell2a, combined stretch box: w=41000 y=8000 z=0
>
> The combined stretch box for the whole row is easily calculated:
>
> row combined stretch box in both cases (2 and 2a) is:
> w=45000 y=30000 z=0
>
> The LM tries to fit as much as possible into the available area (similar
> to block-container with fixed BPD). The rest that doesn't fit at the end
> is deferred for the next page where a new combined stretch box is
> calculated. The consequence of this is the loss of look-ahead
> possibility, since the combined stretch box doesn't know how much can
> really fit on the previous page, and a new block list needs to be built.

Yes, I think we should use this approach only if we don't find a better
one ...

> A point I still have to think about for both approaches is how exactly
> to handle row spanning, although I suspect it'll be easier for the first
> approach.

I did not think about this yet, but I agree with you.

Regards
    Luca



Reply via email to