From ae77474c1513fdada9dde1a239c0c11fc9c112c0 Mon Sep 17 00:00:00 2001 From: Hironori Kitagawa Date: Mon, 1 Aug 2016 10:47:21 +0900 Subject: [PATCH] luatexja-adjust.sty: support \ltjenableadjust[...] MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - [] 内指定可能値:lineend[=], priority[=] - [] なしは all 指定時と同じ - \ltjenableadjust[...]: 現在の状態から更に追加/削除 - \ltjenableadjust*[...]: 有効にする行長補正方法を指定([...] にないものは無効化) --- src/addons/luatexja-adjust.sty | 33 +++++++++++++++++++++++++--- src/ltj-adjust.lua | 50 +++++++++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 21 deletions(-) diff --git a/src/addons/luatexja-adjust.sty b/src/addons/luatexja-adjust.sty index c14c52e..d357799 100644 --- a/src/addons/luatexja-adjust.sty +++ b/src/addons/luatexja-adjust.sty @@ -68,6 +68,7 @@ \fi % % Load core module if not yet. +% xkeyval.sty is already required in luatexja.sty. \ifx\luatexjacoreLoaded\@undefined \ifltj@in@latex %<*LaTeX> \RequirePackage{luatexja}[2016/05/15] @@ -91,12 +92,38 @@ \fi % enable/disable ``advanced'' line adjustment -\protected\def\ltjdisableadjust{\directlua{luatexja.adjust.disable_cb()}} -\protected\def\ltjenableadjust{\directlua{luatexja.adjust.enable_cb()}} +% 1: lineend (aw_step1) +% 2: priority (aw_step2) +% 3: all + +\newcount\ltjadj@status +\define@key[ltj]{adjust}{all}[]{\ltjadj@status=3 } +\define@boolkey[ltj]{adjust}{lineend}[true]{% + \ifltj@adjust@lineend + \ifodd\ltjadj@status\else\advance\ltjadj@status\@ne\fi + \else + \ifodd\ltjadj@status\advance\ltjadj@status\m@ne\fi + \fi\relax} +\define@boolkey[ltj]{adjust}{priority}[true]{% + \ifltj@adjust@priority + \ifnum\ltjadj@status>1\else\advance\ltjadj@status2\fi + \else + \ifnum\ltjadj@status>1\advance\ltjadj@status-2\fi + \fi\relax} +\protected\def\@@ltjenableadjust[#1]{% + \setkeys[ltj]{adjust}{#1}% + \directlua{luatexja.adjust.enable_cb(\the\ltjadj@status)}\ignorespaces +} +\protected\def\ltjdisableadjust{\ltjenableadjust*[]} +\protected\def\ltjenableadjust{% + \ltx@ifnextchar*{\ltjadj@status\z@\ltx@firstoftwo{\@ltjenableadjust}}{\@ltjenableadjust}} +\protected\def\@ltjenableadjust{% + \ltx@ifnextchar[{\@@ltjenableadjust}{\@@ltjenableadjust[all]}}%] + \ltjenableadjust % there is also a key for \ltjsetparameter, for same effect \define@boolkey[ltj]{japaram}{adjust}[true]{% - \ifltj@japaram@adjust\ltjenableadjust\else\ltjdisableadjust\fi + \ifltj@japaram@adjust\ltjenableadjust\else\ltjdisableadjust\fi\relax } diff --git a/src/ltj-adjust.lua b/src/ltj-adjust.lua index acbccf6..49a4334 100644 --- a/src/ltj-adjust.lua +++ b/src/ltj-adjust.lua @@ -194,6 +194,17 @@ local function aw_step1(p, total, ntr) end -- step 2: 行中の glue を変える +local function aw_step2_dummy(p, _, added_flag) + if added_flag then -- 行末に kern 追加したので,それによる補正 + local f = node_hpack(getlist(p), getfield(p, 'width'), 'exactly') + setfield(f, 'head', nil) + setfield(p, 'glue_set', getfield(f, 'glue_set')) + setfield(p, 'glue_order', getfield(f, 'glue_order')) + setfield(p, 'glue_sign', getfield(f, 'glue_sign')) + node_free(f) + return + end +end local function aw_step2(p, total, added_flag) local name = (total>0) and 'stretch' or 'shrink' local res = total_stsh[(total>0) and 1 or 2] @@ -240,33 +251,36 @@ local function aw_step2(p, total, added_flag) end -local ltjs_fast_get_stack_skip = ltjs.fast_get_stack_skip -local function adjust_width(head) - if not head then return head end - local line = 1 - for p in node_traverse_id(id_hlist, to_direct(head)) do - line = line + 1 - aw_step2(p, aw_step1(p, get_total_stretched(p, line))) - end - return to_node(head) -end - do - luatexja.adjust = luatexja.adjust or {} + local myaw_atep1, myaw_step2 + local dummy = function(p,t,n) return t, false end + local ltjs_fast_get_stack_skip = ltjs.fast_get_stack_skip + local function adjust_width(head) + if not head then return head end + local line = 1 + for p in node_traverse_id(id_hlist, to_direct(head)) do + line = line + 1 + myaw_step2(p, myaw_step1(p, get_total_stretched(p, line))) + end + return to_node(head) + end local is_reg = false - function luatexja.adjust.enable_cb() - if not is_reg then + function enable_cb(status) + if status>0 and (not is_reg) then luatexbase.add_to_callback('post_linebreak_filter', adjust_width, 'Adjust width', 100) is_reg = true - end - end - function luatexja.adjust.disable_cb() - if is_reg then + elseif is_reg and status==0 then luatexbase.remove_from_callback('post_linebreak_filter', 'Adjust width') is_reg = false end + myaw_step1 = (status%2>0) and aw_step1 or dummy + myaw_step2 = (status>=2) and aw_step2 or aw_step2_dummy + end + function disable_cb() -- only for compatibility + enable_cs(0) end + luatexja.adjust = luatexja.adjust or {enable_cb=enable_cb, disable_cb=disable_cb} end luatexja.unary_pars.adjust = function(t) -- 2.11.0