You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-dev@xmlgraphics.apache.org by Luca Furini <lf...@cs.unibo.it> on 2007/03/26 16:33:38 UTC

Footnotes in the float branch

Hi all

I recently had the time (and the pleasure) to look at before-float 
implementation branch, and I played a bit with it.

I focused on the handling of footnotes, as I noticed that sometimes they 
were placed on a page following their citations without a real necessity 
to do it; as I wrote some time ago (and I rememeber there was some 
consesuns on this) this behaviour is acceptable for before floats, but is 
probably not what a user would expect for footnotes.

I have tried to fix this in the PageBreakingAlgorithm, computing a 
"minimum required index" for footnotes, so that no page break will be 
considered that unnecessarily defers some old footnotes to the next page.

I'm attaching a diff file showing the changes (or maybe should I just 
apply it?); after applying the patch, there are 4 more passing testcases 
(foonote_footnote-separator, footnote_large, footnote_positioning_{4,5}) 
and no regressions. Testcases footnote_positioning_{2,3} still generate 
some run-time exception, and in the next days I'm going to see what's 
wrong with them.

I add just a few comments about the new classes: I must admit that it took 
me a while to see and understand the interaction between the 
PageBreakingAlgorithm and the Footnotes / BeforeFloats Record, together 
with their inner Footnotes / BeforeFloats Progress.

In particular, at the beginning I thought the *Progress classes were just 
convenience classes to get "pieces" of footnotes and floats without 
directly fiddling with element lists, and I found only later that their 
methods can actually create new active nodes.

Another thing that I find a bit strange is that the PageBreakingAlgorithm 
does not directly interact with the before floats, as the calls to 
BeforeFloatsProgress.consider() are "hidden" in the FootnotesProgress 
class.

So, I was wondering whether it wouldn't be more "clear" to have the 
PageBreakingAlgorit control all the node creation logic, after having 
accessed information about footnotes and floats that could be placed in 
the page via the helper classes.

WDYT?

Regards
     Luca

Re: Footnotes in the float branch

Posted by Luca Furini <lf...@cs.unibo.it>.
On Mon, 26 Mar 2007, Luca Furini wrote:

> I'm attaching a diff file showing the changes ....

Well, *now* I'm attaching bla bla :-)

Regards
     Luca

Re: Footnotes in the float branch

Posted by Vincent Hennebert <vi...@anyware-tech.com>.
Grmblmblm... and the attached fo file, of course...

Vincent

Vincent Hennebert a écrit :
> Hi Luca,
> 
> Luca Furini a écrit :
>> Hi all
>>
>> I recently had the time (and the pleasure) to look at before-float
>> implementation branch, and I played a bit with it.
>>
>> I focused on the handling of footnotes, as I noticed that sometimes they
>> were placed on a page following their citations without a real necessity
>> to do it; as I wrote some time ago (and I rememeber there was some
>> consesuns on this) this behaviour is acceptable for before floats, but
>> is probably not what a user would expect for footnotes.
>>
>> I have tried to fix this in the PageBreakingAlgorithm, computing a
>> "minimum required index" for footnotes, so that no page break will be
>> considered that unnecessarily defers some old footnotes to the next page.
>>
>> I'm attaching a diff file showing the changes (or maybe should I just
>> apply it?); after applying the patch, there are 4 more passing testcases
>> (foonote_footnote-separator, footnote_large, footnote_positioning_{4,5})
>> and no regressions. Testcases footnote_positioning_{2,3} still generate
>> some run-time exception, and in the next days I'm going to see what's
>> wrong with them.
>>
>> I add just a few comments about the new classes: I must admit that it
>> took me a while to see and understand the interaction between the
>> PageBreakingAlgorithm and the Footnotes / BeforeFloats Record, together
>> with their inner Footnotes / BeforeFloats Progress.
>>
>> In particular, at the beginning I thought the *Progress classes were
>> just convenience classes to get "pieces" of footnotes and floats without
>> directly fiddling with element lists, and I found only later that their
>> methods can actually create new active nodes.
> 
> Actually all the node creation logic lies in the ActiveNodeRecorder
> class (handleNode method). But it is true that the *Progress classes
> make calls to this method and that it may be confusing.
> 
> 
>> Another thing that I find a bit strange is that the
>> PageBreakingAlgorithm does not directly interact with the before floats,
>> as the calls to BeforeFloatsProgress.consider() are "hidden" in the
>> FootnotesProgress class.
> 
> Yes and that's unfortunate. I realized that only later on. The rationale
> was to extract the handling of footnotes and before-floats from the
> PageBreakingAlgorithm class, which is already large enough, and to have
> dedicated classes for that. Among other things PageBreakingAlgorithm
> wouldn't have to bother adding the footnote/before-float separator or
> not, when, etc.
> 
>> So, I was wondering whether it wouldn't be more "clear" to have the
>> PageBreakingAlgorit control all the node creation logic, after having
>> accessed information about footnotes and floats that could be placed in
>> the page via the helper classes.
> 
> Yes, something like that. Eventually we would have a layout engine
> taking elements from several flows (normal flow, footnotes,
> before-floats, side-floats...) and wiring all those flows in a proper
> way.
> 
> 
>> WDYT?
> 
> I had a look at your patch and have several comments:
> - I see you re-enabled the noBreakBetween method; I don't think it's
>   a good solution because it artificially prevents some nodes to be
>   created, which even if bad may be necessary for some complex
>   documents. See for example the attached fo file. I also documented
>   a similar problem on the wiki [1]. While it makes the testcases work
>   it actually creates some bad layout in other cases.
> - I'm a bit reluctant about the newFootnotesCount field as it
>   re-introduces footnotes-related code in the PageBreakingAlgorithm.
>   Likewise, the findMinimumFootnoteIndex shouldn't be in the
>   PageBreakingAlgorithm class, if any.
> - there are checkstyle issues in your patch (tab characters, lines too
>   long, missing javadocs)
> 
> My feeling is that the Knuth algorithm can nicely handle such problems
> already as is. It's just a matter of defining the right demerits for
> deferred footnotes, and give a chance to too-short nodes with
> non-deferred footnotes to be considered WRT normal nodes with deferred
> ones. I seem to remember that there was also a problem with flushing
> floats on the last page (footnotes were unnecessarily deferred). I'd
> have to dig deeper into that. I'll try to illustrate my ideas in a patch
> in the next days.
> 
> 
> Cheers,
> Vincent
> 
> [1]
> http://wiki.apache.org/xmlgraphics-fop/GoogleSummerOfCode2006/FloatsImplementationProgress/ImplementingBeforeFloats#head-40ade416f873071dac75bd80dbd57c592efa3277
> 

Re: Footnotes in the float branch

Posted by Vincent Hennebert <vi...@anyware-tech.com>.
Hi Luca,

Luca Furini a écrit :
> Hi all
>
> I recently had the time (and the pleasure) to look at before-float
> implementation branch, and I played a bit with it.
>
> I focused on the handling of footnotes, as I noticed that sometimes they
> were placed on a page following their citations without a real necessity
> to do it; as I wrote some time ago (and I rememeber there was some
> consesuns on this) this behaviour is acceptable for before floats, but
> is probably not what a user would expect for footnotes.
>
> I have tried to fix this in the PageBreakingAlgorithm, computing a
> "minimum required index" for footnotes, so that no page break will be
> considered that unnecessarily defers some old footnotes to the next page.
>
> I'm attaching a diff file showing the changes (or maybe should I just
> apply it?); after applying the patch, there are 4 more passing testcases
> (foonote_footnote-separator, footnote_large, footnote_positioning_{4,5})
> and no regressions. Testcases footnote_positioning_{2,3} still generate
> some run-time exception, and in the next days I'm going to see what's
> wrong with them.
>
> I add just a few comments about the new classes: I must admit that it
> took me a while to see and understand the interaction between the
> PageBreakingAlgorithm and the Footnotes / BeforeFloats Record, together
> with their inner Footnotes / BeforeFloats Progress.
>
> In particular, at the beginning I thought the *Progress classes were
> just convenience classes to get "pieces" of footnotes and floats without
> directly fiddling with element lists, and I found only later that their
> methods can actually create new active nodes.

Actually all the node creation logic lies in the ActiveNodeRecorder
class (handleNode method). But it is true that the *Progress classes
make calls to this method and that it may be confusing.


> Another thing that I find a bit strange is that the
> PageBreakingAlgorithm does not directly interact with the before floats,
> as the calls to BeforeFloatsProgress.consider() are "hidden" in the
> FootnotesProgress class.

Yes and that's unfortunate. I realized that only later on. The rationale
was to extract the handling of footnotes and before-floats from the
PageBreakingAlgorithm class, which is already large enough, and to have
dedicated classes for that. Among other things PageBreakingAlgorithm
wouldn't have to bother adding the footnote/before-float separator or
not, when, etc.

> So, I was wondering whether it wouldn't be more "clear" to have the
> PageBreakingAlgorit control all the node creation logic, after having
> accessed information about footnotes and floats that could be placed in
> the page via the helper classes.

Yes, something like that. Eventually we would have a layout engine
taking elements from several flows (normal flow, footnotes,
before-floats, side-floats...) and wiring all those flows in a proper
way.


> WDYT?

I had a look at your patch and have several comments:
- I see you re-enabled the noBreakBetween method; I don't think it's
  a good solution because it artificially prevents some nodes to be
  created, which even if bad may be necessary for some complex
  documents. See for example the attached fo file. I also documented
  a similar problem on the wiki [1]. While it makes the testcases work
  it actually creates some bad layout in other cases.
- I'm a bit reluctant about the newFootnotesCount field as it
  re-introduces footnotes-related code in the PageBreakingAlgorithm.
  Likewise, the findMinimumFootnoteIndex shouldn't be in the
  PageBreakingAlgorithm class, if any.
- there are checkstyle issues in your patch (tab characters, lines too
  long, missing javadocs)

My feeling is that the Knuth algorithm can nicely handle such problems
already as is. It's just a matter of defining the right demerits for
deferred footnotes, and give a chance to too-short nodes with
non-deferred footnotes to be considered WRT normal nodes with deferred
ones. I seem to remember that there was also a problem with flushing
floats on the last page (footnotes were unnecessarily deferred). I'd
have to dig deeper into that. I'll try to illustrate my ideas in a patch
in the next days.


Cheers,
Vincent

[1]
http://wiki.apache.org/xmlgraphics-fop/GoogleSummerOfCode2006/FloatsImplementationProgress/ImplementingBeforeFloats#head-40ade416f873071dac75bd80dbd57c592efa3277