# [Dev-luatex] The hpack_filter callback

Jonathan Sauer Jonathan.Sauer at silverstroke.com
Tue Apr 29 11:33:40 CEST 2008

Hello,

> The hpack_filter is not the right callback, at least not for now.
> I could make a dedicated callback for line packaging, maybe?
>
> It is possible to get the "prepared paragraph"  using the
> "post_linebreak_filter", but then you have a bit of work to do.
> Here is the code:

Thank you! A few questions, though:

> \directlua0{
>       % head is the alternating list of hboxes and glues etc.
>       for i in node.traverse_id('hlist',head) do
>            if i.next == nil then % last line has no next
>               v = node.hpack(i.list,'natural')

"v" should be local, of course. The two-parameter form of node.hpack
is a bit strange (since not explained in the manual). Is above line
different from "v = node.hpack(i.list)"?

(Incidentally, the manual also does not note that node.traverse_id
can take a string as its first parameter.)

>               print (v.width / 65535)
>               % next two lines prevent memory leaks
>               v.list = nil

I don't quite understand why this is necessary. Since node.hpack
creates a new node list, why should this list not be freed by
node.free?

>               node.free(v)
>             end
>          end
>       return true
>     end)
> }
>
> If you want to be 'perfect', you should copy i.list to and remove
> the last glue(s) from the copy before hpacking() it: the final
> glue(s) may have a non-zero natural width.

I'll call that a feature ;-)

> > Which leads me to another question: When having a \hbox node list,
> > how to I determine the horizontal (when typesetting horizontally)
> > resp. vertical (when typesetting vertically) position of a node
> > relative to the left/top edge of the \hbox? I would think that
> > after line breaking, each node should know this position, but
> > how do I access it?
>
> Using the function above, you can calculate the position within a
> paragraph by adding up the various widths and heights and depths.

Umm ... in the case of a glyph node, I then would access the font
using font.fonts[glyph.font] and then retrieve the character's
dimensions from the appropriate table? Since as far as I can see,
not all nodes store their dimension directly.

> Best wishes,
> Taco