OSDN Git Service

JFM version 2: priority={<stretch>, <shrink>}
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 21 Aug 2016 01:36:01 +0000 (10:36 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Sun, 21 Aug 2016 01:36:01 +0000 (10:36 +0900)
doc/luatexja.dtx
src/addons/luatexja-adjust.sty
src/ltj-adjust.lua
src/ltj-jfont.lua
src/ltj-ruby.lua
src/luatexja.lua
test/test17-priority.pdf
test/test17-priority.tex

index 304d76f..ebea7a5 100644 (file)
@@ -4610,12 +4610,16 @@ we specify <ratio> to $0.25/(0.5+0.25)=1/3$.
 次のキーを指定できる,
 \begin{cslist}[style=standard]
 \item[priority=<priority>]
-             \Pkg{luatexja-adjust} による優先順位付き
-            行長調整(\ref{ssec-adj}節)の際に使われる値であり,
-行調整処理におけるこのglueの優先
-             度を$-2$から$+2$の間の整数で指定する.大きい値ほど「伸びやすく,縮みやすい」
-             ことを意味する.省略時の値
-             は0であり,範囲外の値が指定されたときの動作は未定義である.
+             \Pkg{luatexja-adjust}による優先順位付き
+            行長調整(\ref{ssec-adj}節)において,このグルーの優先度を指定する.許される値は以下の通り:
+  \begin{description}
+    \item[バージョン1のとき] $-4$から$+3$の間の整数
+    \item[バージョン2のとき] $-4$から$+3$の間の整数の2つ組\texttt{\{<stretch>, <shrink>\}}か,
+    または$-4$から$+3$の間の整数.<stretch>, <shrink>はそれぞれこのグルーが伸びるときの優先度,縮むときの
+    優先度であり,単に整数$i$が指定された場合は\texttt{\{$i$, $i$\}}であると解釈される.
+  \end{description}
+  ここで指定する値は,大きい値ほど「先に伸ばされる」「先に縮ませる」ことを意味しており,省略時の値
+             は0である.範囲外の値が指定されたときの動作は未定義である.
 \item[kanjiskip\_natural=<num>\textrm{, }%
   kanjiskip\_stretch=<num>\textrm{, }kanjiskip\_shrink=<num>]\leavevmode
   \label{pg:ksp_nat}
@@ -4652,10 +4656,12 @@ In case of glue, one can specify following additional keys in each \texttt{[$j$]
             subtable:
 \begin{cslist}[style=standard]
 \item[priority=<priority>]
-An integer in $[-2,2]$ (treated as 0 if omitted), and this is
+An integer in $[-4,3]$ (treated as 0 if omitted), or
+a pair of these integers \texttt{\{<stretch>, <shrink>\}} (version~2 only).
+This is
 used only in line adjustment with priority by \Pkg{luatexja-adjust}
 (see Subsection~\ref{ssec-adj}). Higher value means the glue is easy to stretch,
-and is also easy to shrink.
+and is also easy to shrink. 
 \item[kanjiskip\_natural=<num>\textrm{, }%
   kanjiskip\_stretch=<num>\textrm{, }kanjiskip\_shrink=<num>]\leavevmode
 
@@ -9362,12 +9368,13 @@ the \texttt{lstlisting} environment or other environments/commands.
 \item \textbf{JAglue}ではないグルー
 \item JFMグルー(優先度\footnote{%
   \ref{ssec-jfm-str}節にあるように,
-  各JFMグルーには$-2$から2までの優先度がついている.}%
+  各JFMグルーには$-4$から3までの優先度がついている.場合によっては
+  伸びと縮みで異なる優先度が付いているかもしれない.}%
 別にまとめられる)
 \item 和欧文間空白(\Param{xkanjiskip})
 \item 和文間空白(\Param{kanjiskip})
 \end{itemize}
-の$1+1+5+1=8$つに類別する.
+の$1+1+8+1=10$つに類別する.
 そして許容されている伸び量(\texttt{stretch}の値)の合計を
 無限のレベルごとに
 \begin{align*}
@@ -9456,20 +9463,24 @@ $n$個あるペナルティの箇所が改行可能箇所である.いずれ
 段落最終行の行末文字の位置調整は,すでに述べた「行分割後の場合」における最終行の処理をそのまま用いている.
 
 \subsection{グルーの調整}
-$|\textit{total}|$の分だけが,行中のグルーの伸び量に応じて負担されることになる.
+$|\textit{total}|$の分だけが,行中のグルーの伸び量,あるいは縮み量に応じて負担されることになる.
 以下,$\textit{total}\geq 0$であると仮定して話を進めるが,負のときも同様である.
-負担するグルーの優先度は以下の順であり,
-できるだけ \Param{kanjiskip} を自然長のままにすることを
-試みている.
+\Pkg{luatexja-adjust}の初期値では以下の順に伸び量を負担するようになっており,
+(優先度$-4$のJFMグルーは例外として)できるだけ\Param{kanjiskip}を自然長のままにすることを
+試みている.この順番は\Param{stretch\_priority}(縮み量については\Param{shrink\_priority})
+パラメータで変更可能である.
 \begin{enumerate}\def\labelenumi{(\Alph{enumi})}
  \item \textbf{JAglue}以外のグルー
+ \item 優先度3のJFMグルー
  \item 優先度2のJFMグルー
  \item 優先度1のJFMグルー
  \item 優先度0のJFMグルー
  \item 優先度$-1$のJFMグルー
  \item 優先度$-2$のJFMグルー
  \item \Param{xkanjiskip}
+ \item 優先度$-3$のJFMグルー
  \item \Param{kanjiskip}
+ \item 優先度$-4$のJFMグルー
 \end{enumerate}
 \begin{enumerate}
  \item 行末の\textbf{JAchar}を移動したことで$\textit{total}=0$となれば,
@@ -9486,7 +9497,7 @@ $|\textit{total}|$の分だけが,行中のグルーの伸び量に応じて
 \texttt{glue\_set}, \texttt{glue\_sign}, \texttt{glue\_order}を再計算する.
 これによって,\textit{total}は\textbf{JAglue}以外のグルーによって負担される.
 \end{enumerate}
-\item \textit{total}が「(A)の伸び量の合計」以上ならば,(A)--(H)のどこまで負担すれば
+\item \textit{total}が「(A)の伸び量の合計」以上ならば,(A)--(K)のどこまで負担すれば
 \textit{total}以上になるかを計算する.
 例えば,
 \[\catcode`\<=12
@@ -9497,17 +9508,17 @@ $|\textit{total}|$の分だけが,行中のグルーの伸び量に応じて
 \begin{itemize}
  \item (A),~(B)に属するグルーは各グルーで許された伸び量まで伸ばす.
  \item (C)に属するグルーはそれぞれ$p\times (\text{伸び量})$だけ伸びる.
- \item (D)--(H)に属するグルーは自然長のまま.
+ \item (D)--(K)に属するグルーは自然長のまま.
 \end{itemize}
 実際には,前に述べた「設計」に従い,次のように処理している:
 \begin{enumerate}
 \item (C)に属するグルーの伸び量を$p$倍する.
-\item (D)--(H)に属するグルーの伸び量を0とする.
+\item (D)--(K)に属するグルーの伸び量を0とする.
 \item 行が格納されているhboxの
 \texttt{glue\_set}, \texttt{glue\_sign}, \texttt{glue\_order}を再計算する.
 これによって,\textit{total}は\textbf{JAglue}以外のグルーによって負担される.
 \end{enumerate}
-\item \textit{total}が(A)--(H)の伸び量の合計よりも大きい場合,どうしようもないので
+\item \textit{total}が(A)--(K)の伸び量の合計よりも大きい場合,どうしようもないので
       \verb+^^;+何もしない.
 \end{enumerate}
 
index 6337e82..be15fbb 100644 (file)
   \begingroup\count@=2 \setkeys[ltj]{adjpri}{#1}\relax
   \directlua{luatexja.adjust.make_priority_table(2)}\endgroup}
 \ltjsetparameter{%
-  stretch_priority={kanjiskip=-40, xkanjiskip=-30, others=50},
-   shrink_priority={kanjiskip=-40, xkanjiskip=-30, others=50},
+  stretch_priority={kanjiskip=-35, xkanjiskip=-25, others=50},
+   shrink_priority={kanjiskip=-35, xkanjiskip=-25, others=50},
 }
 
 
index 81a9ea8..7131bbc 100644 (file)
@@ -67,7 +67,11 @@ do
    local function cmp(a,b) return a[1]>b[1] end -- 大きいほうが先!
    local function make_priority_table(glue_sign)
       for i,_ in pairs(tmp) do tmp[i]=nil end
-      for i=-2,2 do tmp[#tmp+1] = { i, FROM_JFM+i } end
+      if glue_sign==2 then -- shrink
+        for i=0,63 do tmp[#tmp+1] = { (i%8)-4, FROM_JFM+i } end
+      else -- stretch
+        for i=0,63 do tmp[#tmp+1] = { math.floor(i/8)-4, FROM_JFM+i } end
+      end    
       local pt = priority_table[glue_sign]
       tmp[#tmp+1] = { pt[2]/10, XKANJI_SKIP }
       tmp[#tmp+1] = { pt[2]/10, XKANJI_SKIP_JFM }
index d1ae0ee..7355c9e 100644 (file)
@@ -132,7 +132,21 @@ function define_jfm(t)
         for j,x in pairs(v.glue) do
            if v.kern[j] then defjfm_res= nil; return end
            x.ratio, x[5] = (x.ratio or (x[5] and 0.5*(1+x[5]) or 0.5)), nil
-           x.priority, x[4] = (x.priority or x[4] or 0), nil
+           do
+              local xp
+              xp, x[4] = (x.priority or x[4]), nil
+              if type(xp)=='table' and t.version>=2 then
+                 if type(xp[1])~='number' or xp[1]<-4 or xp[1]>3 then defjfm_res=nil end  -- stretch
+                 if type(xp[2])~='number' or xp[2]<-4 or xp[2]>3 then defjfm_res=nil end  -- shrink
+                 xp = (xp[1]+4)*8+(xp[2]+4)
+              elseif xp and type(xp)~='number' then
+                 defjfm_res = nil
+              else
+                 xp = (xp or 0)*9+36   
+                 if xp<0 or xp>=64 then defjfm_res=nil end 
+              end
+              x.priority = xp
+           end
            x.kanjiskip_natural = norm_val(x.kanjiskip_natural)
            x.kanjiskip_stretch = norm_val(x.kanjiskip_stretch)
            x.kanjiskip_shrink = norm_val(x.kanjiskip_shrink)
index 67474d3..85f7568 100644 (file)
@@ -205,7 +205,7 @@ do
          local hic = has_attr(hx, attr_icflag)
         if (hic == KANJI_SKIP) or (hic == KANJI_SKIP_JFM)
             or (hic == XKANJI_SKIP) or (hic == XKANJI_SKIP_JFM)
-            or ((hic<=FROM_JFM+2) and (hic>=FROM_JFM-2)) then
+            or ((hic<=FROM_JFM+63) and (hic>=FROM_JFM)) then
            -- この 5 種類の空白をのばす
               if getid(hx) == id_kern then
                  local k = node_new(id_glue)
@@ -215,7 +215,7 @@ do
                  h = insert_after(h, hx, k);
                  h = node_remove(h, hx); node_free(hx); hx = k
               else -- glue
-                 setglue(hx, getfield(hx, 'width'), round(middle*65536), 0,
+                  setglue(hx, getfield(hx, 'width'), round(middle*65536), 0,
                             2, 0)
               end
         end
index 1f62c2b..a85e089 100644 (file)
@@ -47,18 +47,18 @@ luatexja.icflag_table = icflag_table
 icflag_table.ITALIC          = 1
 icflag_table.PACKED          = 2
 icflag_table.KINSOKU         = 3
-icflag_table.FROM_JFM        = 6
+icflag_table.FROM_JFM        = 4
 -- FROM_JFM: 4, 5, 6, 7, 8 →優先度高(伸びやすく,縮みやすい)
 -- 6 が標準
-icflag_table.KANJI_SKIP      = 9
-icflag_table.KANJI_SKIP_JFM  = 10
-icflag_table.XKANJI_SKIP     = 11
-icflag_table.XKANJI_SKIP_JFM = 12
-icflag_table.LINEEND         = 13
-icflag_table.PROCESSED       = 14
-icflag_table.IC_PROCESSED    = 15
-icflag_table.BOXBDD          = 16
-icflag_table.PROCESSED_BEGIN_FLAG = 128
+icflag_table.KANJI_SKIP      = 68 -- = 4+64
+icflag_table.KANJI_SKIP_JFM  = 69
+icflag_table.XKANJI_SKIP     = 70
+icflag_table.XKANJI_SKIP_JFM = 71
+icflag_table.LINEEND         = 72
+icflag_table.PROCESSED       = 73
+icflag_table.IC_PROCESSED    = 74
+icflag_table.BOXBDD          = 75
+icflag_table.PROCESSED_BEGIN_FLAG = 4096 -- sufficiently large power of 2
 
 local stack_table_index = {}
 luatexja.stack_table_index = stack_table_index
index 9c4052d..26eab79 100644 (file)
Binary files a/test/test17-priority.pdf and b/test/test17-priority.pdf differ
index 38f5771..241468e 100644 (file)
@@ -2,6 +2,7 @@
 
 \documentclass{ltjsarticle}
 \usepackage{luatexja-fontspec,luatexja-adjust,xcolor,amsmath,amssymb}
+
 \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%
 \jfontspec[YokoFeatures={JFM=hang}]{ipam.ttf}
 
 \ltjsetparameter{kanjiskip=.0\zw plus .4pt minus .5pt}
-{\tt kanjiskip: \ltjgetparameter{kanjiskip}
+
+\twocolumn[{\tt kanjiskip: \ltjgetparameter{kanjiskip}
 
 \ltjsetparameter{xkanjiskip=.25\zw plus .25\zw minus .125\zw}
 xkanjiskip: \ltjgetparameter{xkanjiskip}}
 
 このテストでは,行末の句読点・中点類の位置調整を有効にした
 \texttt{jfm-hang.lua}を用いている.
-\begin{itemize}
+{\begin{itemize}
 \item 句点は,調整量に合わせて,ぶら下げ,全角取りの2種類から選択される.
 \item 読点は,調整量に合わせて,ぶら下げ,二分取り,全角取りの3種類から選択される.
 \item 中点類は,行末に四分空きを追加することのみ対応.
@@ -51,7 +53,7 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}}
 行われる条件は,
 \begin{description}
 \item[最終行以外] 無限大の伸長度を持つグルーが関わっていない
-\item[最終行] 無限大の伸長度を持つグルーは\verb+\parfillskip+のみで,かつ
+\item[最終行] 無限大の伸長度を持つグルーは\texttt{\textbackslash parfillskip}のみで,かつ
 \begin{align*}
  \min\{(\hbox{許される最小の行末文字と行末の間}),0\}
   &\leq(\hbox{\texttt{\textbackslash parfillskip}のこの行における実際の長さ})\\
@@ -63,7 +65,7 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}}
 \item \texttt{lineend=extended}のときは,\TeX による行分割の時点で行末位置の文字調整を考慮
       する.但し,段落の最後の文字については例外的に行わず,代わりに
 上の「\texttt{lineend=true}の場合」の最終行のときと同じ補正を行う.
-\end{itemize}
+\end{itemize}}]
 
 \testbox{%
 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
@@ -101,10 +103,10 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}}
 あいうえおかきくけ・こさしすせそたち「「あ
 }
 
-中点類の後ろ空き(\verb+\parfillskip+を0にしている)
+次の例では\verb+\parfillskip+を0にしている
 
 \testbox{%
-\parfillskip0pt日本では\pTeX,p\LaTeX が使われている。
+あいうえおかきくけこさしすせそたちつて・
 }
 \testbox{%
 \parfillskip0ptあいうえおかきくけこさしすせそたちつて・
@@ -149,6 +151,21 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}}
 }
 
 
+伸び縮みで異なる優先度.
+
+以下の例では,「ぱ」と鍵括弧の間は自然長・伸び・縮み全部半角.
+\texttt{kanjiskip}より伸びる時の優先度は高く,
+縮むときの優先度は低い.
+
+{\ltjsetparameter{kanjiskip=0pt plus 1.5pt minus 1.5pt}
+\testbox{%
+  \parfillskip0ptあいうえおかきくけこ\<\vrule width7.5\zw\<ぱ「
+}
+\testbox{%
+  \parfillskip0ptあいうえおかきくけこ\<\vrule width9\zw\<ぱ「
+}
+}
+
 次ページ以降の出典:
   Wikisource日本語版「竹取物語」(一部),2016/08/11閲覧\\
 {\catcode`\%=11\texttt{https://ja.wikisource.org/wiki/%E7%AB%B9%E5%8F%96%E7%89%A9%E8%AA%9E}}
@@ -189,7 +206,7 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}}
      local t = tex.getbox(a)
      local x = {}
      for n in node.traverse_id(node.id('hlist'), t.head) do
-        local b = n.glue_order>0 and 0 or 100*math.pow(n.glue_set, 3);
+        local b = n.glue_order>0 and 0 or math.floor(100*math.pow(n.glue_set, 3)+0.5);
         if b<=12 then x[#x+1]={2,b}    % decent
         elseif n.glue_sign==1 and b>=100 then x[#x+1]={0,b} %very loose
         elseif n.glue_sign==1 then x[#x+1]={1,b} % loose
@@ -198,7 +215,7 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}}
      x[0]={2, 0}
      local d = 0
      for i=1,#x do
-       d = d + math.pow(tex.linepenalty + x[i][2], 2)
+       d = d + math.floor(math.pow(tex.linepenalty + x[i][2], 2)+0.5)
        if math.abs(x[i][1]-x[i-1][1])>=1 then d = d + tex.adjdemerits end
      end
      tex.sprint(-2,tostring(d) )