summaryrefslogtreecommitdiff
path: root/language/japanese/jlreq/make_variant_jfm.lua
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /language/japanese/jlreq/make_variant_jfm.lua
Initial commit
Diffstat (limited to 'language/japanese/jlreq/make_variant_jfm.lua')
-rw-r--r--language/japanese/jlreq/make_variant_jfm.lua177
1 files changed, 177 insertions, 0 deletions
diff --git a/language/japanese/jlreq/make_variant_jfm.lua b/language/japanese/jlreq/make_variant_jfm.lua
new file mode 100644
index 0000000000..e91e85cc33
--- /dev/null
+++ b/language/japanese/jlreq/make_variant_jfm.lua
@@ -0,0 +1,177 @@
+kpse.set_program_name("texlua","lualatex")
+require('lualibs')
+
+function burasage(t)
+ t = table.fastcopy(t)
+ -- 句読点の幅を0にして,句読点に続くglueを句読点の幅だけ増やす.
+ for _,class in ipairs({6,7}) do
+ local width = t[class].width
+ t[class].width = 0
+ -- 句読点を前とするJFMはすべて定義されていることを仮定.
+ if t[class].glue ~= nil then
+ for key,_ in pairs(t[class].glue) do
+ t[class].glue[key][1] = t[class].glue[key][1] + width
+ end
+ end
+ if t[class].kern ~= nil then
+ for key,val in pairs(t[class].kern) do
+ if type(val) == "table" then
+ t[class].glue[key][1] = t[class].glue[key][1] + width
+ else
+ t[class].glue[key] = t[class].glue[key] + width
+ end
+ end
+ end
+ end
+ return t
+end
+
+function zenkaku_kakko(t)
+ t = table.fastcopy(t)
+ -- 開き括弧のwidthを0.5増やす
+ t[1].width = t[1].width + 0.5
+ for cls,val in pairs(t) do
+ if type(cls) ~= "number" then goto continue end
+ if t[cls].glue ~= nil and t[cls].glue[1] ~= nil then
+ t[cls].glue[1][1] = t[cls].glue[1][1] - 0.5
+ end
+ if t[cls].kern ~= nil and t[cls].kern[1] ~= nil then
+ if type(t[cls].kern[1]) == "table" then
+ t[cls].kern[1][1] = t[cls].kern[1][1] - 0.5
+ else
+ t[cls].kern[1] = t[cls].kern[1] - 0.5
+ end
+ end
+ ::continue::
+ end
+ return t
+end
+
+function tate(t)
+ t = table.fastcopy(t)
+ t.dir = 'tate'
+ for key,_ in pairs(t) do
+ if type(key) == "number" then
+ t[key].height = 0.5
+ t[key].depth = 0.5
+ end
+ end
+ return t
+end
+
+function to_pl(t)
+ t = table.fastcopy(t)
+ -- 空きの第四段階は消す
+ for cl1,val in pairs(t) do
+ if type(cl1) == "number" then
+ for cl2,glue in pairs(val.glue) do
+ if glue.priority ~= nil and glue.priority[1] < 0 then
+ t[cl1].glue[cl2][2] = 0
+ end
+ end
+ end
+ end
+ -- LuaTeX-jaのJFMではalcharが使えることに由来する補正
+ t[4].glue[0] = nil
+ return t
+end
+
+-- jfmのテーブル,ファイル名
+function make_jfmfile(t,f)
+ table.tofile(f,t,"local jfm")
+ local fp = io.open(f,"a")
+ fp:write("luatexja.jfont.define_jfm(jfm)\n")
+ fp:close()
+end
+
+function tolf(file)
+ local fp = io.open(file,"r")
+ local s = "";
+ for l in fp:lines() do
+ s = s .. l .. "\n";
+ end
+ fp:close();
+ fp = io.open(file,"wb")
+ fp:write(s);
+ fp:close();
+end
+
+local originaljfm = "jlreq"
+
+local jfmfile = kpse.find_file("jfm-" .. originaljfm .. ".lua")
+if jfmfile == nil then
+ print("JFM " .. originaljfm .. " is not found")
+ os.exit(1)
+end
+
+jfm = nil
+luatexja = {}
+luatexja.jfont = {}
+
+function luatexja.jfont.define_jfm(j)
+ jfm = j
+end
+
+dofile(jfmfile)
+
+make_jfmfile(to_pl(jfm),"jfm-" .. originaljfm .. "-pl.lua")
+make_jfmfile(to_pl(burasage(jfm)),"jfm-b" .. originaljfm .. "-pl.lua")
+make_jfmfile(to_pl(zenkaku_kakko(jfm)),"jfm-z" .. originaljfm .. "-pl.lua")
+make_jfmfile(to_pl(burasage(zenkaku_kakko(jfm))),"jfm-bz" .. originaljfm .. "-pl.lua")
+make_jfmfile(to_pl(tate(jfm)),"jfm-" .. originaljfm .. "v-pl.lua")
+make_jfmfile(to_pl(burasage(tate(jfm))),"jfm-b" .. originaljfm .. "v-pl.lua")
+make_jfmfile(to_pl(zenkaku_kakko(tate(jfm))),"jfm-z" .. originaljfm .. "v-pl.lua")
+make_jfmfile(to_pl(burasage(zenkaku_kakko(tate(jfm)))),"jfm-bz" .. originaljfm .. "v-pl.lua")
+
+local jfm = tate(jfm)
+local file = "jfm-" .. originaljfm .. "v.lua"
+table.tofile(file,jfm,"local jfm")
+local fp = io.open(file,"a")
+fp:write([[
+local function add_space(before,after,glueorkern,space,ratio)
+ if jfm[before][glueorkern] == nil then jfm[before][glueorkern] = {} end
+ if jfm[before][glueorkern][after] == nil then jfm[before][glueorkern][after] = {0} end
+ local origratio = jfm[before][glueorkern][after].ratio
+ if origratio == nil then origratio = 0.5 end
+ jfm[before][glueorkern][after].ratio = (jfm[before][glueorkern][after][1] * origratio + space * ratio) / (jfm[before][glueorkern][after][1] + ratio)
+ jfm[before][glueorkern][after][1] = jfm[before][glueorkern][after][1] + space
+end
+
+if jlreq ~= nil then
+ if type(jlreq.open_bracket_pos) == "string" then
+ local r = jlreq.open_bracket_pos:find("_")
+ local danraku = jlreq.open_bracket_pos:sub(1,r - 1)
+ local orikaeshi = jlreq.open_bracket_pos:sub(r + 1)
+
+ -- 折り返し行頭の開き括弧を二分下げる……つもり
+ if orikaeshi == "nibu" then
+ -- widthを二分増やし,その代わりJFMグルーを二分減らす
+ jfm[1].width = jfm[1].width + 0.5
+ for k,v in pairs(jfm) do
+ if type(k) == "number" then
+ add_space(k,1,"glue",-0.5,1)
+ end
+ end
+ end
+
+ -- 段落行頭の下げ
+ if danraku == "zenkakunibu" then
+ add_space(90,1,"glue",0.5,1)
+ elseif danraku == "nibu" then
+ add_space(90,1,"glue",-0.5,1)
+ end
+ end
+
+ -- ぶら下げ組を有効にする.
+ if jlreq.burasage == true then
+ for _,class in ipairs({6,7}) do
+ table.insert(jfm[class].end_adjust,-0.5)
+ end
+ end
+end
+luatexja.jfont.define_jfm(jfm)
+]])
+fp:close()
+
+tolf(file);
+