From 8439af472e6d3e7ab7333f63d7d50d4ddfb47a57 Mon Sep 17 00:00:00 2001 From: Hironori Kitagawa Date: Thu, 27 Sep 2012 23:26:24 +0900 Subject: [PATCH] Moved Lua codes of test17-priority.tex into ltj-adjust.lua. --- src/ltj-adjust.lua | 138 +++++++++++++++++++++++++++++++++++++++++ test/test17-priority.pdf | Bin 46244 -> 48328 bytes test/test17-priority.tex | 157 ++++++----------------------------------------- 3 files changed, 157 insertions(+), 138 deletions(-) create mode 100644 src/ltj-adjust.lua diff --git a/src/ltj-adjust.lua b/src/ltj-adjust.lua new file mode 100644 index 0000000..d2ba3aa --- /dev/null +++ b/src/ltj-adjust.lua @@ -0,0 +1,138 @@ +-- +-- luatexja/otf.lua +-- +luatexbase.provides_module({ + name = 'luatexja.adjust', + date = '2012/09/27', + version = '0.1', + description = 'Advanced line adjustment for LuaTeX-ja', +}) +module('luatexja.adjust', package.seeall) + +local id_hlist = node.id('hlist') +local id_glue = node.id('glue') +local id_glue_spec = node.id('glue_spec') +local attr_icflag = luatexbase.attributes['ltj@icflag'] + +local PACKED = 2 +local FROM_JFM = 6 +local KANJI_SKIP = 9 +local XKANJI_SKIP = 10 + +local priority_table = { + XKANJI_SKIP, + FROM_JFM + 2, + FROM_JFM + 1, + FROM_JFM, + FROM_JFM - 1, + FROM_JFM - 2, + KANJI_SKIP +} + +local PROCESSED_BEGIN_FLAG = 32 +local function get_attr_icflag(p) + return (node.has_attribute(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG +end + +-- box 内で伸縮された glue の合計値を計算 + +local function get_stretched(q, go, gs) + local qs = q.spec + if not qs.writable then return 0 end + if gs == 1 then -- stretching + if qs.stretch_order == go then return qs.stretch end + else -- shrinking + if qs.shrink_order == go then return qs.shrink end + end +end + +local function get_total_stretched(p) + local go, gf, gs = p.glue_order, p.glue_set, p.glue_sign + local res = { + [0] = 0, + glue_set = gf, name = (gs==1) and 'stretch' or 'shrink' + } + for i=1,#priority_table do res[priority_table[i]]=0 end + if go ~= 0 then return nil end + if gs ~= 1 and gs ~= 2 then return res end + for q in node.traverse_id(id_glue, p.head) do + local a, ic = get_stretched(q, go, gs), get_attr_icflag(q) + --print(ic) + if type(res[ic]) == 'number' then res[ic] = res[ic] + a + else res[0] = res[0] + a + end + end + return res +end + +local function clear_stretch(p, ic, name) + --print('clear ' .. ic) + for q in node.traverse_id(id_glue, p.head) do + if get_attr_icflag(q) == ic then + local qs = q.spec + if qs.writable then + qs[name..'_order'], qs[name] = 0, 0 + end + end + end +end + +local function set_stretch(p, after, before, ic, name) + if before > 0 then + --print (ic, before, after) + local ratio = after/before + for q in node.traverse_id(id_glue, p.head) do + if get_attr_icflag(q) == ic then + local qs = q.spec + if qs.writable and qs[name..'_order'] == 0 then + qs[name] = qs[name]*ratio + end + end + end + end +end + + +function adjust_width(head) + if not head then return head end + for p in node.traverse_id(id_hlist, head) do + local res = get_total_stretched(p) + --print(table.serialize(res)) + if res then + -- 調整量の合計 + local total = 0 + for i,v in pairs(res) do + if type(i)=='number' then + total = total + v + end + end; total = tex.round(total * res.glue_set) + if total <= res[0] then -- 和文処理グルー以外で足りる + for _,v in pairs(priority_table) do clear_stretch(p, v, res.name) end + local f = node.hpack(p.head, p.width, 'exactly') + f.head, p.glue_set, p.glue_sign, p.glue_order + = nil, f.glue_set, f.glue_sign, f.glue_order + node.free(f) + else + total = total - res[0] + for i = 1, #priority_table do + local v = priority_table[i] + if total <= res[v] then + for j = i+1,#priority_table do + clear_stretch(p, priority_table[j], res.name) + end + set_stretch(p, total, res[v], v, res.name) + local f = node.hpack(p.head, p.width, 'exactly') + f.head, p.glue_set, p.glue_sign, p.glue_order + = nil, f.glue_set, f.glue_sign, f.glue_order + node.free(f) + --print(p.glue_set, p.glue_sign, p.glue_order) + return head + end + total = total - res[v] + end + end + end + end + return head +end + diff --git a/test/test17-priority.pdf b/test/test17-priority.pdf index ed8ecc0abfbc41cb2b464672f8912423cf7393e9..06c5c813570d8e530a8c7f02474db64f452f7180 100644 GIT binary patch delta 22274 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 diff --git a/test/test17-priority.tex b/test/test17-priority.tex index 077b7c5..f92e41b 100644 --- a/test/test17-priority.tex +++ b/test/test17-priority.tex @@ -1,142 +1,16 @@ %#!lualatex -%% 行末の句読点の位置によって,全角取りか半角取りかを自動的に調整する -%% 仕様:全調整量が二分以上なら,全角取りにする \documentclass{article} \usepackage{luatexja,luacode,xcolor} -\begin{luacode} -local id_hlist = node.id('hlist') -local id_glue = node.id('glue') -local id_glue_spec = node.id('glue_spec') -local attr_icflag = luatexbase.attributes['ltj@icflag'] -local PACKED = 2 -local PROCESSED_BEGIN_FLAG = 32 -local FROM_JFM = 6 -local KANJI_SKIP = 9 -local XKANJI_SKIP = 10 - -local function get_attr_icflag(p) - return (node.has_attribute(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG -end - --- box 内で伸縮された glue の合計値を計算 - -local function get_stretched(q, go, gs) - local qs = q.spec - if not qs.writable then return 0 end - if gs == 1 then -- stretching - if qs.stretch_order == go then return qs.stretch end - else -- shrinking - if qs.shrink_order == go then return qs.shrink end - end -end - -local function get_total_stretched(p) - local go, gf, gs = p.glue_order, p.glue_set, p.glue_sign - local res = { - other = 0, xkanji = 0, jfm = 0, kanji = 0, - glue_set = gf, glue_sign = gs - } - if go ~= 0 then return nil end - if gs ~= 1 and gs ~= 2 then return res end - for q in node.traverse_id(id_glue, p.head) do - local a, ic = get_stretched(q, go, gs), get_attr_icflag(q) - if ic == KANJI_SKIP then res.kanji = res.kanji + a - elseif ic == XKANJI_SKIP then res.xkanji = res.xkanji + a - elseif ic == FROM_JFM then res.jfm = res.jfm + a - else res.other = res.other + a - end - end - return res -end - -local function clear_stretch(p, ic) - for q in node.traverse_id(id_glue, p.head) do - if get_attr_icflag(q) == ic then - local qs = q.spec - if qs.writable then - qs.stretch_order, qs.shrink_order, qs.stretch, qs.shrink = 0, 0, 0, 0 - end - end - end -end - -local function set_stretch(p, after, before, ic) - if before > 0 then - print (ic, before, after) - local ratio = after/before - for q in node.traverse_id(id_glue, p.head) do - if get_attr_icflag(q) == ic then - local qs = q.spec - if qs.writable then - qs.stretch, qs.shrink = qs.stretch*ratio, qs.shrink*ratio - end - end - end - end -end - -function adjust_width(head) - if not head then return head end - for p in node.traverse_id(id_hlist, head) do - local res = get_total_stretched(p) - if res then - -- 調整量の合計 - local total = tex.round((res.other + res.xkanji + res.jfm + res.kanji) * res.glue_set) - print('before: ', p.glue_set, p.glue_sign, p.glue_order ) - print(total, res.other, res.xkanji, res.jfm, res.kanji) - if total <= res.other then -- 和文処理グルー以外で足りる - clear_stretch(p, KANJI_SKIP) - clear_stretch(p, XKANJI_SKIP) - clear_stretch(p, FROM_JFM) - local f = node.hpack(p.head, p.width, 'exactly') - f.head, p.glue_set, p.glue_sign, p.glue_order - = nil, f.glue_set, f.glue_sign, f.glue_order - node.free(f) - else - total = total - res.other - if total <= res.jfm then -- JFMグルーだけで良い - clear_stretch(p, KANJI_SKIP) - clear_stretch(p, XKANJI_SKIP) - set_stretch(p, total,res.jfm, FROM_JFM) - local f = node.hpack(p.head, p.width, 'exactly') - f.head, p.glue_set, p.glue_sign, p.glue_order - = nil, f.glue_set, f.glue_sign, f.glue_order - node.free(f) - else - total = total - res.jfm - if total <= res.xkanji then -- xkanjiskip まで - clear_stretch(p, KANJI_SKIP) - set_stretch(p, total,res.xkanji, XKANJI_SKIP) - local f = node.hpack(p.head, p.width, 'exactly') - f.head, p.glue_set, p.glue_sign, p.glue_order - = nil, f.glue_set, f.glue_sign, f.glue_order - node.free(f) - else - total = total - res.xkanji - if total <= res.kanji then -- kanjiskip まで - set_stretch(p, total,res.kanji, KANJI_SKIP) - local f = node.hpack(p.head, p.width, 'exactly') - f.head, p.glue_set, p.glue_sign, p.glue_order - = nil, f.glue_set, f.glue_sign, f.glue_order - node.free(f) - else - -- glue_set > 1 なので,どうしようもない - end - end - end - end - print('after: ', p.glue_set, p.glue_sign, p.glue_order ) - end - end - return head -end - - -\end{luacode} - -\def\sq{\hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{ }\hss}} -\def\sb{\hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{■}\hss}} +\RequireLuaTeXjaSubmodule{adjust} + +\def\sq{% + \hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{% +  \hskip\dimexpr-.5\zw-.2pt\vrule width.4pt height.08\zw depth.12\zw% + \hskip\dimexpr.5\zw-.2pt\relax}\hss}} +\def\sb{\hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{% + ■\hskip\dimexpr-.5\zw-.2pt\vrule width.4pt height.08\zw depth.12\zw% + \hskip\dimexpr.5\zw-.2pt\relax}\hss}} \newbox\gridbox \setbox\gridbox=\hbox to 20\zw{\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb} \def\outbox#1{% @@ -145,7 +19,7 @@ end } \def\DisableCB{\directlua{luatexbase.remove_from_callback('post_linebreak_filter', 'Adjust width')}} -\def\EnableCB{\directlua{luatexbase.add_to_callback('post_linebreak_filter', adjust_width, 'Adjust width', 100)}} +\def\EnableCB{\directlua{luatexbase.add_to_callback('post_linebreak_filter', luatexja.adjust.adjust_width, 'Adjust width', 100)}} \long\def\testbox#1{% \EnableCB\setbox0=\vbox{\hsize=20\zw\parfillskip0pt#1}\outbox{ON}\par @@ -156,11 +30,12 @@ end \begin{document} {\tt kanjiskip: \ltjgetparameter{kanjiskip} -\ltjsetparameter{xkanjiskip=.25\zw plus .25\zw minus -.125\zw} +\ltjsetparameter{xkanjiskip=.25\zw plus .25\zw minus .125\zw} xkanjiskip: \ltjgetparameter{xkanjiskip}} \testbox{% -あいうえおかきくけこさしすせそたちつてと +◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ +%あいうえおかきくけこさしすせそたちつてと } \testbox{% @@ -183,4 +58,10 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}} \testbox{% 日本では\pTeX,p\LaTeX がよく使われている。 } + +中点類の空き詰めは括弧類より優先 + +\testbox{% +あいうえおかきくけ・こさしすせそたち「「あ +} \end{document} \ No newline at end of file -- 2.11.0