On 10.09.2005 21:54:56 Simon Pepping wrote: > On Fri, Sep 09, 2005 at 02:04:08PM +0200, Luca Furini wrote: > > Luca Furini wrote: > > > > For example, if we have this LM tree > > > > Outer BlockLM > > | > > +------------+------------+ > > | | | > > BlockLM 1 BlockLM 2 BlockLM 3 > > | > > +------+-----+ > > | | > > BlockLM A BlockLM B > > > > BlockLM1.getNextKnuthElements() would return to the outer BlockLM only the > > elements representing its block content, without any space. > > > > In order to decide which elements it has to create, the outer BlockLM > > could have some lines like: > > > > (currentChild = BlockLM 1 > > nextChild = BlockLM 2) > > > > space1 = currentChild.getSpaceAfter(); > > space2 = nextChild.getSpaceBefore(); > > if (this.mustKeepTogether() > > || currentChild.mustKeepWithNext() && !nextChild.hasBreakBefore() > > || !currentChild.hasBreakAfter() && nextChild.mustKeepWithPrevious) { > > // there cannot be a break between the two children, > > createElementsForSpace(resolve(space1, space2, false, false)); > > } else { > > // there can be a break between the children > > createElementsForSpace(resolve(space1, null, false, true), > > resolve(null, space2, true, false), > > resolve(space1, space2, false, false)); > > } > > This is a good idea.
I agree. > Each LM would invoke this whenever it steps from > one child to another. Only the top level LM would also invoke it for > its before and after edges. > > I would think of a different treatment of the spaces (space specifiers): > List spaces = new List(currentChild.getSpacesAfter(), > nextChild.getSpacesBefore()); > createElementsForSpaces(spaces); Good idea, too. I actually wondered how to implement Luca's suggestion and I ended up subclassing Knuth classes (in my mind for now) to hold the additional space specifier info, but this is a much cleaner approach even if a little more objects might be instantiated here. I'll try to document this on the Wiki once I'm through playing through my examples so I really understand every aspect of the topic. > createElementsForSpaces would create a single glue and a single > penalty, because all space specifiers in a single block stacking > constraint need to be considered together to calculate the space > value. Resolution and creating elements go together, as a penalty must > be created to reflect the influence of a page break. I'm not sure about this part, yet. I have some doubts about the rule 1 whose effects are only seen after the page breaking. But I'll find out while creating my examples. Jeremias Maerki