次のキーを指定できる,
\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}
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
\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*}
段落最終行の行末文字の位置調整は,すでに述べた「行分割後の場合」における最終行の処理をそのまま用いている.
\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$となれば,
\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
\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}
\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},
}
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 }
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)
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)
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
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
\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 中点類は,行末に四分空きを追加することのみ対応.
行われる条件は,
\begin{description}
\item[最終行以外] 無限大の伸長度を持つグルーが関わっていない
-\item[最終行] 無限大の伸長度を持つグルーは\verb+\parfillskip+のみで,かつ
+\item[最終行] 無限大の伸長度を持つグルーは\texttt{\textbackslash parfillskip}のみで,かつ
\begin{align*}
\min\{(\hbox{許される最小の行末文字と行末の間}),0\}
&\leq(\hbox{\texttt{\textbackslash parfillskip}のこの行における実際の長さ})\\
\item \texttt{lineend=extended}のときは,\TeX による行分割の時点で行末位置の文字調整を考慮
する.但し,段落の最後の文字については例外的に行わず,代わりに
上の「\texttt{lineend=true}の場合」の最終行のときと同じ補正を行う.
-\end{itemize}
+\end{itemize}}]
\testbox{%
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
あいうえおかきくけ・こさしすせそたち「「あ
}
-中点類の後ろ空き(\verb+\parfillskip+を0にしている)
+次の例では\verb+\parfillskip+を0にしている
\testbox{%
-\parfillskip0pt日本では\pTeX,p\LaTeX が使われている。
+あいうえおかきくけこさしすせそたちつて・
}
\testbox{%
\parfillskip0ptあいうえおかきくけこさしすせそたちつて・
}
+伸び縮みで異なる優先度.
+
+以下の例では,「ぱ」と鍵括弧の間は自然長・伸び・縮み全部半角.
+\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}}
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
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) )