+ if ga then gb = node_new(id_kern); gb.kern = 0 else return nil end
+ elseif not ga then
+ ga = node_new(id_kern); ga.kern = 0
+ end
+
+ local k = node.type(gb.id) .. node.type(ga.id)
+ if k == 'glueglue' then
+ -- 両方とも glue.
+ gb.spec.width = round(diffmet_rule(
+ rbb*gb.spec.width + rba*ga.spec.width,
+ rab*gb.spec.width + raa*ga.spec.width ))
+ gb.spec.stretch = round(diffmet_rule(
+ rbb*gb.spec.stretch + rba*ga.spec.stretch,
+ rab*gb.spec.stretch + raa*ga.spec.stretch ))
+ gb.spec.shrink = -round(diffmet_rule(
+ -rbb*gb.spec.shrink - rba*ga.spec.shrink,
+ -rab*gb.spec.shrink - raa*ga.spec.shrink ))
+ node.free(ga)
+ return gb
+ elseif k == 'kernkern' then
+ -- 両方とも kern.
+ gb.kern = round(diffmet_rule(
+ rbb*gb.kern + rba*ga.kern,
+ rab*gb.kern + raa*ga.kern ))
+ node.free(ga)
+ return gb
+ elseif k == 'kernglue' then
+ -- gb: kern, ga: glue
+ ga.spec.width = round(diffmet_rule(
+ rbb*gb.kern + rba*ga.spec.width,
+ rab*gb.kern + raa*ga.spec.width ))
+ ga.spec.stretch = round(diffmet_rule(
+ rba*ga.spec.stretch, raa*ga.spec.stretch ))
+ ga.spec.shrink = -round(diffmet_rule(
+ -rba*ga.spec.shrink,-raa*ga.spec.shrink ))
+ node.free(gb)