[luatex] rounding errors with node.dimensions?

Frank Mittelbach frank.mittelbach at latex-project.org
Wed Apr 13 09:52:03 CEST 2016


I'm looking for a simple way to determine if a paragraph breaking (by 
tex.linebreak) has some overfull boxes inside.

My simple idea was to traverse the resulting list from tex.linebreak and 
use node.dimensions to compare for each hbox

  -  n.width    width of the box

with

  - node.dimensions( n.glue_set, n.glue_sign, n.glue_order, n.head )

which should give me the internal width of all nodes inside with the 
glue setting applied (at least that's the way I understand the manual).

So if the latter is larger than n.width we should have an overfull box.

To my surprise I ended up with many more overfulls than reported by TeX 
itself and those extras all showed a differences of only a few sp, eg 1 
or 2, so I guess what I'm seeing is some sort of rounding error or 
miscalculation  by node.dimensions.

It is probably possible for me to work around that simply by only 
looking at cases with n.glue_set == 1 but regardless of that I think it 
is a bug in node.dimensions because the value should be "exact" not "close"

Below is an MWE that reports 2 possible overfulls only one of which 
being real.

frank

----------------
\directlua{
   require "ltluatex.lua"
function get_hlist_content (hlist)
   local text, n
   text = ""
   for n in node.traverse (hlist.head) do
     if n.id == 37 then
       text = text .. string.char(n.char)
     elseif n.id == 10 then
       text = text .. " "
     end
   end
   return text
end
function postlinebreak (head, groupcode)
   for n in node.traverse_id(0, head) do
     base=node.dimensions( n.glue_set, n.glue_sign, n.glue_order, n.head )
     if n.glue_sign == 2 and n.glue_order == 0 then
      print("Glue set:", n.glue_set)
      if n.width < base then
        print("Node dimensions:", n.width, base, base - n.width, 
"overfull?")
        print("Node dimensions: --- " .. get_hlist_content (n) )
       else
        print("Node dimensions:", n.width, base, "ok")
       end
     end
  end
  return true
end
luatexbase.add_to_callback("post_linebreak_filter", postlinebreak, "new 
postlinebreak callback")
print()
}

\hsize=229.5pt
\parindent=10.00002pt  % strange latex value


At that moment they were met from another walk by Mrs. Hurst and
Elizabeth herself.

"I did not know that you intended to walk," said Miss Bingley, in some
confusion, lest they had been overheard.

"You used us abominably ill," answered Mrs. Hurst, "running away without
telling us that you were coming out."

Then taking the disengaged arm of Mr. Darcy, she left Elizabeth to walk
by herself. The path just admitted three. Mr. Darcy felt their rudeness,
and immediately said:

\bye




More information about the luatex mailing list