diff options
Diffstat (limited to 'macros/jptex/latex/jlreq/make_variant_jfm.lua')
-rw-r--r-- | macros/jptex/latex/jlreq/make_variant_jfm.lua | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/macros/jptex/latex/jlreq/make_variant_jfm.lua b/macros/jptex/latex/jlreq/make_variant_jfm.lua new file mode 100644 index 0000000000..d22587fe69 --- /dev/null +++ b/macros/jptex/latex/jlreq/make_variant_jfm.lua @@ -0,0 +1,211 @@ +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 originaljfm_jidori = "jlreq-jidori" + +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); + + +jfmfile = kpse.find_file("jfm-" .. originaljfm_jidori .. ".lua") +if jfmfile == nil then + print("JFM " .. originaljfm_jidori .. " is not found") + os.exit(1) +end + +jfm = nil +function luatexja.jfont.define_jfm(j) + jfm = j +end +dofile(jfmfile) + +function to_jidori_pl(t) + t = table.fastcopy(t) + -- kanjiskipに任せているところを15zwに変更 + for cl1,val in pairs(t) do + if type(cl1) == "number" then + for cl2,glue in pairs(val.glue) do + if glue.kanjiskip_stretch == 1 then + t[cl1].glue[cl2][2] = 15 + end + end + end + end + return t +end + + +make_jfmfile(to_jidori_pl(jfm),"jfm-jlreq-jidori-pl.lua") +make_jfmfile(to_jidori_pl(tate(jfm)),"jfm-jlreqv-jidori-pl.lua") +make_jfmfile(tate(jfm),"jfm-jlreqv-jidori.lua") +tolf("jfm-jlreqv-jidori.lua") |