On Wed, Oct 30, 2019 at 2:33 AM Marcel Fabian Krüger <t...@2krueger.de> wrote:
> Hi, > > current versions of LuaTeX from TeXLive for Linux (Windows is not > affected) always > add `\adjdemerits` when a line is more loose than the previous one, even > if it is only one step more loose: > > Take > > \tracingparagraphs1 > \tracingonline1 > > aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa > aaaaaa > aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa > aaaaaa > aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa > aaaaaa > \bye > > This gives > > @firstpass > []\tenrm aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa > aaaaaa > aaaaaa aaaaaa aaaaaa > @ via @0 b=96 p=0 d=1011236 > @@1: line 1.1 t=21236 -> @0 > aaaaaa > @ via @0 b=83 p=0 d=8649 > @@2: line 1.3 t=8649 -> @0 > aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa > aaaaaa aa > aaaa aaaaaa > @ via @1 b=3 p=0 d=169 > @@3: line 2.2 t=1011405 -> @1 > aaaaaa > @ via @2 b=3 p=0 d=1000169 > @@4: line 2.2 t=1008818 -> @2 > aaaaaa aaaaaa aaaaaa aaaaaa aaaaaa > @\par via @3 b=0 p=-10000 d=100 > @\par via @4 b=0 p=-10000 d=100 > @@5: line 3.2- t=1008918 -> @4 > > Here, the relevant part is > > @@2: line 1.3 t=8649 -> @0 > ... > @ via @2 b=3 p=0 d=1000169 > @@4: line 2.2 t=1008818 -> @2 > > So breakpoint @2 is .3 aka. "tight", while @4 is .2 aka. "decent". > This break gives demerits d=100169=1000000+(10+3)^2. So \adjdemerits are > inserted which is wrong because tight and decent lines are "visually > compatible" as defined in the TeXbook. > > The problem is in linebreak.c. There the demerits are inserted by > > if (abs(fit_class - fitness(r)) > 1) > d = d + adj_demerits; > > Both fit_class and fitness(r) have type fitness_value which is an enum > with four entries. These enums have an implementation defined type and > the bug is triggered if LuaTeX is compiled with a compiler which uses an > unsigned type: Then `fit_class - fitness(r)` is a difference of unsigned > values and therefore unsigned. If fitness(r) is bigger than fit_class, > the attempt to store a negative difference in a unsigned value > wraps around to a high positive value which is bigger than 1. So if > fitness(r) is bigger than fit_class, the condition is always true. > > This can be fixed by explicitly casting fit_class and fitness(r) to a > signed type. A possible patch is attached. > hm. I will see it. -- luigi
_______________________________________________ dev-luatex mailing list dev-luatex@ntg.nl https://mailman.ntg.nl/mailman/listinfo/dev-luatex