• R/O
  • HTTP
  • SSH
  • HTTPS

luatexja: コミット

ソースコードの管理場所


コミットメタ情報

リビジョンbf31041b7c358d12f4a50fa1df10a8ca3ff28e83 (tree)
日時2020-04-21 12:23:14
作者Hironori Kitagawa <h_kitagawa2001@yaho...>
コミッターHironori Kitagawa

ログメッセージ

jfm: new property "round_threshold" (only yoko direction now)

文字クラス 0 でしか指定できない数値.
もしこの数値 d が指定されており,かつ文字クラス 0 の文字 p に対して
q = p.width / (JFM で指定された文字クラス 0 の文字の幅)が
整数から ±d 未満の範囲に収まっていたとしたら,
「JFM で指定された文字の幅」を q に最も近い整数倍にして処理する.
主な適用対象は #40431 で報告されたような「私用領域にある n 倍角の合字」.
なお「ちょうど整数倍しか許さない」と 0 を指定するのは現実的ではない
(sp 単位で計算することによる誤差が考えられるため).
jfm-ujis.lua で指定した 0.01 とか,ひょっとしたら 0.001 とかが適当な値か?

変更サマリ

差分

--- a/src/jfm-ujis.lua
+++ b/src/jfm-ujis.lua
@@ -28,6 +28,7 @@ local t = {
2828 [8] = { 0, 0, 0, kanjiskip_shrink=1 },
2929 },
3030 kern = { [307] = 0 },
31+ round_threshold = 0.01,
3132 },
3233
3334 [1] = { -- 開き括弧類
--- a/src/ltj-jfont.lua
+++ b/src/ltj-jfont.lua
@@ -108,6 +108,8 @@ function luatexja.jfont.define_jfm(to)
108108 if type(v.down)~='number' then
109109 v.down = 0.0
110110 end
111+ v.round_threshold = ((t.version>=3)and(i==0)and(type(v.round_threshold)=='number'))
112+ and v.round_threshold or nil
111113 if t.version>=2 then
112114 if v.end_stretch then defjfm_res= nil; return end
113115 if v.end_shrink then defjfm_res= nil; return end
@@ -218,7 +220,8 @@ do
218220 width = w[1], stretch = w[2], shrink = w[3],
219221 kanjiskip_natural = w.kanjiskip_natural and w.kanjiskip_natural/sz,
220222 kanjiskip_stretch = w.kanjiskip_stretch and w.kanjiskip_stretch/sz,
221- kanjiskip_shrink = w.kanjiskip_shrink and w.kanjiskip_shrink/sz,
223+ kanjiskip_shrink = w.kanjiskip_shrink and w.kanjiskip_shrink/sz,
224+ round_threshold = w.round_threshold and w.round_threshold/zw,
222225 }
223226 end
224227 for k,w in pairs(v.kern) do
@@ -331,7 +334,7 @@ do
331334 local fmtable = { jfm = j, size = f.size, var = jfm_var,
332335 with_kanjiskip = jfm_ksp,
333336 zw = sz.zw, zh = sz.zh,
334- chars = sz.chars, char_type = sz.char_type,
337+ chars = sz.chars, char_type = sz.char_type,
335338 kanjiskip = sz.kanjiskip, xkanjiskip = sz.xkanjiskip,
336339 chars_cbcache = {},
337340 vert_activated = vert_activated,
--- a/src/ltj-setwidth.lua
+++ b/src/ltj-setwidth.lua
@@ -87,7 +87,7 @@ local call_callback = luatexbase.call_callback
8787
8888 local fshift = { down = 0, left = 0 }
8989
90-local min, max = math.min, math.max
90+local min, max, floor, abs = math.min, math.max, math.floor, math.abs
9191
9292 local rule_subtype = (status.luatex_version>=85) and 3 or 0
9393
@@ -129,6 +129,11 @@ local function capsule_glyph_yoko(p, met, char_data, head, dir)
129129
130130 local q
131131 head, q = node_remove(head, p)
132+ if char_data.round_threshold then
133+ local frac = abs(pwidth / fwidth);
134+ local quot = floor(frac)
135+ if frac-quot <char_data.round_threshold then fwidth = fwidth * quot end
136+ end
132137 local xo, yo = getoffsets(p)
133138 setoffsets(p, xo + char_data.align*(fwidth-pwidth) - fshift.left,
134139 yo - fshift.down);
旧リポジトリブラウザで表示