• R/O
  • HTTP
  • SSH
  • HTTPS

luatexja: コミット

ソースコードの管理場所


コミットメタ情報

リビジョン4020822f42038618f0ca8b4d36c6bbd79a50ab41 (tree)
日時2011-03-24 21:48:10
作者Hironori Kitagawa <h_kitagawa2001@yaho...>
コミッターHironori Kitagawa

ログメッセージ

luaotfload の callback によるグリフ置換と共存可能に

変更サマリ

差分

Binary files a/src/doc-sample.pdf and b/src/doc-sample.pdf differ
--- a/src/doc-sample.tex
+++ b/src/doc-sample.tex
@@ -1,6 +1,7 @@
1-%#! luatex doc-sample
1+%#! time luatex doc-sample
22 \input doc-sampsty.tex % style file
33
4+\message{BB}
45 \overfullrule=0pt
56 \def\LaTeX{L\kern-.36em\setbox0=\hbox{T}\vbox to\ht0{\hbox{\sevenrm A}\vss}\kern-.15em\TeX}
67 \xkanjiskip=0.25\zw plus .10\zw minus .10\zw
@@ -17,10 +18,14 @@
1718 \centerline{\big Lua\TeX-jaパッケージ}\bigskip
1819 \centerline{\large\the\year/\the\month/\the\day}\medskip
1920
21+\message{AA}
2022 \bigskip
23+
2124 本パッケージは,(最低でもp\TeX と同等の水準の)日本語組版をLua\TeX 上で実現させることを
2225 目標としたマクロである.まだまだ足りないところはあるが,とりあえず動くようになった?ので公開する.
2326
27+%{\showboxdepth=10000\showboxbreadth=10000\tracingonline=1\scrollmode\showlists}\end
28+
2429 \beginparagraph 特徴
2530
2631 \item 欧文フォント/和文フォントの内部独立管理.
@@ -48,6 +53,7 @@
4853 \itemitem 縦組み関連一式.|\tate|, |\tfont|, |\tbaselineshift|, |\dtou|,$\,\ldots$
4954 \enditem
5055
56+
5157 \beginparagraph ファイル構成
5258
5359
@@ -72,7 +78,7 @@
7278 \font\tenipam={file:ipam.ttf}at13.5\jQ
7379 \jfont\tenipam{mt} % 和文フォントとして認識
7480 \tenipam\parindent=1\zw
75-\yabaselineshift=32768 % 32768 sp = 0.5 pt
81+\yabaselineshift=32768 % (例)32768 sp = 0.5 pt
7682
7783 \rm abcほげほげ)(あいう本文本文……
7884 \endtt
@@ -82,16 +88,18 @@
8288 \beginparagraph attributes, dimensions,$\,\ldots$
8389
8490 以下はLua\TeX-jaパッケージ内で使用するattributeやその他の種類のレジスタである.
85-上3つは内部処理用なので利用者が意識することはない.それ以外は,p\TeX に類似の名前の
91+上4つは内部処理用なので利用者が意識することはない.それ以外は,p\TeX に類似の名前の
8692 primitiveがあることから,意味は容易にわかるだろう:
8793
8894 \item attribute |\luatexja@curjfn|: 現在の和文フォント番号
8995
9096 p\TeX では内部のグローバル変数で「現在の横組/縦組和文フォント」をそれぞれ保持していたが,
9197 当然ながら欧文用\TeX ではそのようなことはそのままではできない.
92-node $p$が保持しているattribute |\luatexja@curjfn|の値$k$は,
98+node~$p$が保持しているattribute |\luatexja@curjfn|の値$k$は,
9399 「もし$p$の中身が和文文字であれば,そのフォントは$k$番の番号のフォントである」という意味をもつ.
94100
101+\item attribute |\luatexja@charclass|: (和文文字の)文字クラス
102+
95103 \item attribute |\luatexja@icflag|: この属性をもつkernはイタリック補正由来である
96104
97105 p\TeX では,|\kern|由来のkernと,イタリック補正由来のkernを内部で区別していた.しかし,
@@ -100,10 +108,10 @@ p\TeX では,|\kern|由来のkernと,イタリック補正由来のkernを
100108 \item language |\luatexja@japanese|: 「日本語」に対応する|\language|番号
101109
102110 \item attribute |\yabaselineshift|: 欧文文字ベースラインの補正量.
103-\itemitem {\bf sp${}=2^{-16}\,{\rm pt}$単位の整数値}で指定.
104-正値を指定すると,欧文文字は下にずれる.
105-\itemitem 数式中では,boxやruleもこの量だけずれる
106-(よって,行中数式は全体が|\yabaselineshift|だけずれたように見えるだろう).
111+\itemitem {\bf sp$\fam\bffam {}=2^{-16}\,{\bf pt}$単位の整数値}で指定.
112+正の値を指定すると,その分だけ欧文文字は下にずれる.
113+\itemitem 数式中では,boxやruleもこの量だけずれる\hfil\break
114+(よって,行中数式は全体が|\yabaselineshift|だけずれたように見える).
107115 \item attribute |\ykbaselineshift|: 和文文字ベースラインの補正量.
108116
109117 p\TeX では「和文が主」という考えからか,常に和文文字のベースラインが基準であり,
@@ -129,15 +137,20 @@ p\TeX における{\tt JFM}ファイルのようなものと考えてよい.
129137
130138 このため,和文フォントを使うには,以下のような手順が必要である.
131139
132-\enum |\font<font>={file: <fontfile>} at 13.5\jQ|
140+\enum |\font<font>={file:<fontfile>} [at <size>]|
133141
134142 \TeX の|\font| primitiveを用いてひとまずフォントを読み込む.和文フォントの場合は,
135-このようにTrueType/OpenTypeフォントをこのように読み込むことになると思われる%
136-{\small(システムにインストールされているフォントの指定も可能と思われる)\inhibitglue}.
143+このようにluaotfloadパッケージの機能を用いてTrueType/OpenTypeフォントを読み込むことになる.
137144
138-この段階では,制御綴<font>は「現在の欧文フォントを変更する」意味である.
145+\itemitem この段階では,制御綴<font>はまだ「現在の(欧文)フォントを変更する」意味である.
146+\itemitem 例えば,
147+\begintt
148+ \font\tenipam={file:ipaexm.ttf:script=latn;+jp90}
149+\endtt
150+のように各種のfeatureを用いてもよい.{\bf 本文書では全てのフォントに|jp90| featureを
151+適用させている{\small\rm (「辻」など)\inhibitglue}.}
139152
140-\enum |\loadjcharmetric{<key>}{<file>}|
153+\enum |\loadjfontmetric{<key>}{<file>}|
141154
142155 Luaソース|luatj-<file>.lua|に書かれたメトリック情報を読み込む.
143156 内部では<key>というキーで参照されることとなる.同じkeyで2回以上読み込むことはできないが,
@@ -146,27 +159,27 @@ Luaソース|luatj-<file>.lua|に書かれたメトリック情報を読み込
146159 \enum |\jfont<font>{<key>}|
147160
148161 制御綴<font>を「metric keyが<key>の和文フォント」と認識させる.
149-\itemitem 制御綴<font>で指定されるフォントから,
150-<key>で参照されるメトリックの字幅情報のみを反映させた仮想フォント$v$を作る.
151-\itemitem 制御綴<font>の意味を,「$\hbox{|\luatexja@curjfn|}\leftarrow v$」というように変更する.
162+正確に言うと,制御綴<font>の意味を,「$\hbox{|\luatexja@curjfn|}\leftarrow v$」というように変更する.
152163 これにより,以後<font>を発行しても,欧文フォントは変わらない.
153164
154165 \enditem
155166
156167 \beginparagraph その他命令類
157168
158-\item |\inhibitxspcode{<code>}{<num>}|, |\xspcode{<code>}{<num>}|,\hfil\break
159-|\prebreakpenalty{<code>}{<num>}|, |\postbreakpenalty{<code>}{<num>}|
169+\item |\(set/get)inhibitxspcode{<code>}{<num>}|, \hfil\break
170+|\(set/get)xspcode{<code>}{<num>}|,\hfil\break
171+|\(set/get)prebreakpenalty{<code>}{<num>}|,\hfil\break
172+|\(set/get)postbreakpenalty{<code>}{<num>}|
160173
161-これらはp\TeX の対応する命令と意味は概ね同じであるが,以下の点が異なる.
174+これらはp\TeX の(|set|/|get|を抜かした)命令と意味は概ね同じであるが,以下の点が異なる.
162175
163176 \itemitem 同じ文字コードについて|\prebreakpenalty|, |\postbreakpenalty|を両方指定することが
164177 可能.
165-\itemitem |\xspcode|(欧文文字用)は|\inhibitxspcode|(和文文字用)の別名であり,
178+\itemitem |\(set/get)xspcode|(欧文文字用)は|\(set/get)inhibitxspcode|(和文文字用)の別名であり,
166179 \begintt
167-\xspcode{12289}{1} \inhibitxspcode{12289}{1}
180+\setxspcode{12289}{1} \setinhibitxspcode{12289}{1}
168181 \endtt
169-は全く同じ意味である.|\xspcode|, |\inhibitxspcode|の第2引数の意味は異なるが,
182+は全く同じ意味である.|\setxspcode|, |\setinhibitxspcode|の第2引数の意味は異なるが,
170183 両者の意味は文字コードにより判断している.
171184
172185 \item |\inhibitglue|: 指定箇所での和文フォントメトリック由来のglue/kernの挿入を禁止する.
@@ -194,14 +207,18 @@ Lua\TeX-jaパッケージでは,次のような流れで処理を行う.
194207
195208 \item 和文フォントへの置換: |hyphenate|, |hpack_filter| callbacks
196209
197-この段階の前では,和文文字であっても,それを内部で表している|glyph_node| $p$は,
210+この段階の前では,和文文字であっても,それを内部で表している|glyph_node|~$p$は,
198211 「|\temrm あ|」のように,欧文フォントが指定されている状態になっている.しかし,
199212 $p$は「現在の和文フォント」の番号もattribute |\luatexja@curjfn|として保持している.そのため,
200-この段階では,「和文文字が格納されている」|glyph_node| $p$に対して,次を行う.
213+この段階では,「和文文字が格納されている」|glyph_node|~$p$に対して,次を行う.
201214
202215 \itemitem $p$のフォントをattribute |\luatexja@curjfn|の値に置換.
203216 \itemitem $p$の|language| fieldを|\luatexja@japanese|の値に置換.
204217 誤って和文文字間でハイフネーションがされてしまうのを防止するため.
218+\itemitem $p$の文字の文字クラスを計算し,その値をattribute |\luatexja@charclass|に格納.
219+これにより,|jp90|等のfeatureによりグリフが置換されても,文字クラスの値は保たれる.
220+
221+\item (luaotfloadパッケージによるグリフ置換等の処理はこの位置で行われる)
205222
206223 \item メトリック由来glue/kernの挿入: |pre_linebreak_filter|, |hpack_filter|
207224
@@ -221,7 +238,7 @@ $p$は「現在の和文フォント」の番号もattribute |\luatexja@curjfn|
221238
222239 \item |\kanjiskip|, |\xkanjiskip|の挿入: |pre_linebreak_filter|, |hpack_filter|
223240
224-p\TeX の|adjust_hlist| procedureと同様の処理を用いて,
241+p\TeX の|adjust_hlist| procedureとほぼ同様の処理を用いて,
225242 和文間glue |\kanjiskip|や和欧文間glue |\xkanjiskip|を
226243 挿入する.
227244 \itemitem p\TeX と同様に,これらの自動挿入は(box/段落ごとに)
@@ -244,6 +261,13 @@ Lua\TeX で文字を表す|glyph_node|には|y_offset| fieldがあるので,
244261 さて,実際に補正されるのは次の場合である:
245262 \itemitem 文字 (|glyph_node|)
246263 \itemitem ボックス・rule(文中数式内部).これによって,数式全体が下がったように見えるはず.
264+
265+\item 和文文字の幅の補正: |pre_linebreak_filter|, |hpack_filter|
266+
267+例えば,括弧類は「フォント中では全角幅だが,組版では半角幅として扱う」ことが多いが,このように
268+文字幅を補正する処理を最後に行う.jafontspecパッケージのように,補正対象となる|glyph_node|~$p$%
269+を,しかるべき量のglueと共に|\hbox|にカプセル化して行っている.
270+
247271 \enditem
248272
249273 \beginparagraph 和文フォントメトリックについて
@@ -266,13 +290,15 @@ p\TeX 用{\tt JFM}で言うところの「文字クラス」を定義する.
266290 \itemT |'\boxbdd'|: 水平ボックスの先頭/末尾,段落の先頭/末尾.
267291 \itemT |'jcharbdd'|: 和文文字達の連続の境界.
268292 \itemT |'diffmet'|: 異なるメトリックの和文文字間に入るglueの計算に使われる.
269-\item |jfm.define_type_dim(<class>, <left>, <width>, <height>, <depth>, <italic>)|
293+
294+\item |jfm.define_type_dim(<class>,<left>,<down>,<width>,<height>,<depth>,<italic>)|
270295
271296 文字クラス<class>ごとに,文字の寸法のフォントサイズに対する割合を記述する.
272297 \itemitem <left>: 例えば開き括弧類は組版をする際には半角幅だが,TrueTypeフォント内では
273298 左に半角空白が付け加わって全角幅となっていることが多い.このような場合,逆に
274299 TrueTypeフォントを基準にすると,「左に半角幅ずらす」ことをしないといけない.
275300 <left>はその「左へのずらし量」を指定する.
301+\itemitem <down>: 同様に,「下へのずらし量」を指定する.
276302 \itemitem <width>, <height>, <depth>: それぞれ幅,高さ,深さ.
277303 \itemitem <italic>: イタリック補正値.
278304
@@ -285,7 +311,6 @@ TrueTypeフォントを基準にすると,「左に半角幅ずらす」こと
285311
286312 文字クラス<bclass>の文字と<aclass>の文字の間に,幅<width>のkernを挿入.
287313
288-
289314 \enditem
290315
291316
--- a/src/doc-sampsty.tex
+++ b/src/doc-sampsty.tex
@@ -23,8 +23,8 @@
2323 \input luatexja-core.sty
2424 \loadjfontmetric{mt}{ujis}
2525 \loadjfontmetric{zero}{mono}
26-\def\minfnt{file:ipam.ttf }
27-\def\gothfnt{file:ipag.ttf }
26+\def\minfnt{file:ipaexm.ttf:script=latn;+jp90 }
27+\def\gothfnt{file:ipaexg.ttf:script=latn;+jp90 }
2828 \font\eightipam=\minfnt at 10.5\jQ\jfont\eightipam{mt}
2929 \font\eightipag=\gothfnt at 10.5\jQ\jfont\eightipag{mt}
3030 \font\tenipam=\minfnt at 13.5\jQ\jfont\tenipam{mt}
@@ -103,10 +103,10 @@
103103
104104 % itemize
105105 \newcount\enumi\enumi=0
106-\def\item{\par\medskip\leftskip=3\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss$\bullet$\hss}\kern-1\zw }
107-\def\itemitem{\par\leftskip=5\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss$-$\hss}\kern-1\zw }
108-\def\itemT{\par\leftskip=7\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss$\bullet$\hss}\kern-1\zw }
109-\def\enum{\par\medskip\advance\enumi1\leftskip=3\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss\the\enumi.\kern0.5\zw}\kern-1\zw }
106+\def\item{\par\medskip\leftskip=3\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss$\bullet$\hss}}
107+\def\itemitem{\par\leftskip=5\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss$-$\hss}}
108+\def\itemT{\par\leftskip=7\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss$\bullet$\hss}}
109+\def\enum{\par\medskip\advance\enumi1\leftskip=3\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss\the\enumi.\kern0.5\zw}}
110110 \def\enditem{\medskip\par\enumi=0\leftskip=0pt\parskip=0pt\noindent}
111111
112112
--- /dev/null
+++ b/src/luatexja-compat-ptex.tex
@@ -0,0 +1,13 @@
1+%%% luatexja-compat-ptex.tex:
2+
3+
4+\def\getprebreakpenalty#1{\prebreakpenalty#1 }
5+\def\getpostbreakpenalty#1{\postbreakpenalty#1 }
6+\def\setprebreakpenalty#1#2{\prebreakpenalty#1=#2 }
7+\def\setpostbreakpenalty#1#2{\postbreakpenalty#1=#2 }
8+\def\getinhibitxspcode#1{\inhibitxspcode#1 }
9+\def\setinhibitxspcode#1#2{\inhibitxspcode#1=#2 }
10+\def\getxspcode#1{\xspcode#1 }
11+\def\setxspcode#1#2{\xspcode#1=#2 }
12+
13+\endinput
\ No newline at end of file
--- a/src/luatexja-core.lua
+++ b/src/luatexja-core.lua
@@ -10,10 +10,11 @@ function jfm.define_char_type(t,lt)
1010 if not jfm.char_type[t] then jfm.char_type[t]={} end
1111 jfm.char_type[t].chars=lt
1212 end
13-function jfm.define_type_dim(t,l,w,h,d,i)
13+function jfm.define_type_dim(t,l,x,w,h,d,i)
1414 if not jfm.char_type[t] then jfm.char_type[t]={} end
1515 jfm.char_type[t].width=w; jfm.char_type[t].height=h;
16- jfm.char_type[t].depth=d; jfm.char_type[t].italic=i; jfm.char_type[t].left=l
16+ jfm.char_type[t].depth=d; jfm.char_type[t].italic=i;
17+ jfm.char_type[t].left=l; jfm.char_type[t].down=x
1718 end
1819 function jfm.define_glue(b,a,w,st,sh)
1920 local j=b*0x800+a
@@ -27,32 +28,43 @@ function jfm.define_kern(b,a,w)
2728 end
2829
2930 -- procedures for \loadjfontmetric
30-ltj.metrics={} -- this table stores all metric information
31+ltj.metrics={} -- this table stores all metric informations
32+ltj.font_metric_table={}
33+
34+function ltj.search_metric(key)
35+ for i,v in ipairs(ltj.metrics) do
36+ if v.name==key then return i end
37+ end
38+ return nil
39+end
3140
3241 function ltj.loadjfontmetric()
3342 if string.len(jfm.name)==0 then
3443 ltj.error("the key of font metric is null"); return nil
35- elseif ltj.metrics[jfm.name] then
44+ elseif ltj.search_metric(jfm.name) then
3645 ltj.error("the metric '" .. jfm.name .. "' is already loaded"); return nil
3746 end
38- ltj.metrics[jfm.name]={}
3947 if jfm.dir~='yoko' then
4048 ltj.error("jfm.dir must be 'yoko'"); return nil
4149 end
42- ltj.metrics[jfm.name].dir=jfm.dir
43- ltj.metrics[jfm.name].zw=jfm.zw
44- ltj.metrics[jfm.name].zh=jfm.zh
45- ltj.metrics[jfm.name].char_type=jfm.char_type
46- ltj.metrics[jfm.name].glue=jfm.glue
47- ltj.metrics[jfm.name].kern=jfm.kern
48-end
49-
50-function ltj.find_char_type(c,metrickey)
51--- c: character code, metrickey: key
52- for i, v in pairs(ltj.metrics[metrickey].char_type) do
50+ local t={}
51+ t.name=jfm.name
52+ t.dir=jfm.dir
53+ t.zw=jfm.zw
54+ t.zh=jfm.zh
55+ t.char_type=jfm.char_type
56+ t.glue=jfm.glue
57+ t.kern=jfm.kern
58+ table.insert(ltj.metrics,t)
59+end
60+
61+function ltj.find_char_type(c,m)
62+-- c: character code, m
63+ if not ltj.metrics[m] then return 0 end
64+ for i, v in pairs(ltj.metrics[m].char_type) do
5365 if i~=0 then
5466 for j,w in pairs(v.chars) do
55- if w==c then return i; end
67+ if w==c then return i end
5668 end
5769 end
5870 end
@@ -68,92 +80,26 @@ function ltj.jfontdefA(b)
6880 -- font.id() does not seem to work in my environment...
6981 end
7082 function ltj.jfontdefB(s) -- for horizontal font
71- if not ltj.metrics[s] then
83+ local j=ltj.search_metric(s)
84+ if not j then
7285 ltj.error("metric named '" .. s .. "' didn't loaded")
7386 return
7487 end
75- local i = ltj.transform_jfont(font.current(), s)
88+ local fn=font.current()
89+ local f = font.fonts[fn]
90+ ltj.font_metric_table[fn]={}
91+ ltj.font_metric_table[fn].jfm=j; ltj.font_metric_table[fn].size=f.size
7692 tex.sprint('\\expandafter\\def\\csname ' .. ltj.cstemp .. '\\endcsname'
77- .. '{\\csname luatexja@curjfnt\\endcsname=' .. i
78- .. '\\zw=' .. font.fonts[i].parameters.quad .. 'sp'
79- .. '\\zh=' .. font.fonts[i].parameters.x_height .. 'sp\\relax}')
93+ .. '{\\csname luatexja@curjfnt\\endcsname=' .. fn
94+ .. ' \\zw=' .. tex.round(f.size*ltj.metrics[j].zw) .. 'sp'
95+ .. '\\zh=' .. tex.round(f.size*ltj.metrics[j].zh) .. 'sp\\relax}')
8096 font.current(ltj.fntbki); ltj.fntbk = {}; ltj.cstemp = {}
8197 end
8298
83--- "transform" font according to a font metric
84-function ltj.transform_jfont(index,metrickey)
85- local f = {}
86- local of=font.fonts[index]
87- f.name = of.name
88- f.fullname = metrickey
89- f.size = of.size
90- f.parameters = {}
91- f.parameters.quad=tex.round(f.size*ltj.metrics[metrickey].zw)
92- f.parameters.x_height=tex.round(f.size*ltj.metrics[metrickey].zh)
93- f.designsize = of.designsize
94- f.type = 'virtual'
95- f.characters = {}
96- f.fonts = { { id = index } }
97- for i,v in pairs(of.characters) do
98- f.characters[i]={}
99- local ci = ltj.metrics[metrickey].char_type[ltj.find_char_type(i,metrickey)]
100- if ci.left~=0.0 then
101- f.characters[i].commands = {
102- {'right', tex.round(-ci.left*f.size)},
103- {'char',i}
104- }
105- else
106- f.characters[i].commands = { {'char',i} }
107- end
108- f.characters[i].italic = tex.round(ci.italic*f.size)
109- f.characters[i].width = tex.round(ci.width*f.size)
110- f.characters[i].height = tex.round(ci.height*f.size)
111- f.characters[i].depth = tex.round(ci.depth*f.size)
112- end
113- if not f.characters[0x3000] then
114- f.characters[0x3000]={}
115- local ci = ltj.metrics[metrickey].char_type[ltj.find_char_type(0x3000,metrickey)]
116- f.characters[0x3000].commands = {{'right', tex.round(ci.width*f.size)} }
117- f.characters[0x3000].italic = tex.round(ci.italic*f.size)
118- f.characters[0x3000].width = tex.round(ci.width*f.size)
119- f.characters[0x3000].height = tex.round(ci.height*f.size)
120- f.characters[0x3000].depth = tex.round(ci.depth*f.size)
121- end
122- return font.define(f)
123-end
124-
125-
126--- Replace font in nodes which character code is in the range of
127--- Japanese characters, using two attributes
128-function ltj.replace_ja_font(head)
129- local p=head
130- while p do
131- if node.type(p.id)=='glyph' then
132- if ltj.is_ucs_in_japanese_char(p.char) then
133- local v = node.has_attribute(p,luatexbase.attributes['luatexja@curjfnt'])
134- if v then p.font=v end
135- v=node.has_attribute(p,luatexbase.attributes['luatexja@ykblshift'])
136- if v then
137- node.set_attribute(p,luatexbase.attributes['luatexja@yablshift'],v)
138- else
139- node.unset_attribute(p,luatexbase.attributes['luatexja@yablshift'])
140- end
141- end
142- end
143- p=node.next(p)
144- end
145- return head
146-end
147-
148-
14999 -- return true if and only if p is a Japanese character node
150100 function ltj.is_japanese_glyph_node(p)
151- if not p then return false
152- elseif node.type(p.id)~='glyph' then return false
153- elseif p.font==node.has_attribute(p,luatexbase.attributes['luatexja@curjfnt']) then
154- return true
155- else return false
156- end
101+ return p and (node.type(p.id)=='glyph')
102+ and (p.font==node.has_attribute(p,luatexbase.attributes['luatexja@curjfnt']))
157103 end
158104
159105 ---------- Kinsoku
@@ -167,11 +113,24 @@ function ltj.set_penalty_table(m,c,p)
167113 ltj.penalty_table[c].post=p
168114 end
169115 end
116+function ltj.get_penalty_table(m,c)
117+ local i=ltj.penalty_table[c]
118+ if i then
119+ i=(ltj.penalty_table[c])[m]
120+ end
121+ if not i then i=0 end
122+ tex.swrite(i)
123+end
170124
171125 ltj.inhibit_xsp_table = {}
172126 function ltj.set_inhibit_xsp_table(c,p)
173127 ltj.inhibit_xsp_table[c]=p
174128 end
129+function ltj.get_inhibit_xsp_table(c,p)
130+ local i=ltj.inhibit_xsp_table[c]
131+ if not i then i=3 end
132+ tex.swrite(i)
133+end
175134
176135 ----------
177136 ----------
@@ -182,9 +141,9 @@ function ltj.create_ihb_node()
182141 end
183142
184143 -- The fullname field of virtual font expresses its metric
185-function ltj.find_size_metrickey(p)
186- if ltj.is_japanese_glyph_node(p) then
187- return font.fonts[p.font].size, font.fonts[p.font].fullname
144+function ltj.find_size_metric(px)
145+ if ltj.is_japanese_glyph_node(px) then
146+ return ltj.font_metric_table[px.font].size, ltj.font_metric_table[px.font].jfm
188147 else
189148 return nil, nil
190149 end
@@ -216,53 +175,52 @@ function ltj.calc_between_two_jchar(q,p)
216175 -- q, p: node (possibly null)
217176 local ps,pm,qs,qm,g,h
218177 if not p then -- q is the last node
219- qs, qm = ltj.find_size_metrickey(q)
178+ qs, qm = ltj.find_size_metric(q)
220179 if not qm then
221180 return nil
222181 else
223182 g=ltj.new_jfm_glue(qs,qm,
224- ltj.find_char_type(q.char,qm),
183+ node.has_attribute(q,luatexbase.attributes['luatexja@charclass']),
225184 ltj.find_char_type('boxbdd',qm))
226185 end
227186 elseif not q then
228187 -- p is the first node etc.
229- if q then print(node.type(q.id)) end
230- ps, pm = ltj.find_size_metrickey(p)
188+ ps, pm = ltj.find_size_metric(p)
231189 if not pm then
232190 return nil
233191 else
234192 g=ltj.new_jfm_glue(ps,pm,
235193 ltj.find_char_type('boxbdd',pm),
236- ltj.find_char_type(p.char,pm))
194+ node.has_attribute(p,luatexbase.attributes['luatexja@charclass']))
237195 end
238196 else -- p and q are not nil
239- qs, qm = ltj.find_size_metrickey(q)
240- ps, pm = ltj.find_size_metrickey(p)
197+ qs, qm = ltj.find_size_metric(q)
198+ ps, pm = ltj.find_size_metric(p)
241199 if (not pm) and (not qm) then
242200 -- Both p and q are NOT Japanese glyph node
243201 return nil
244202 elseif (qs==ps) and (qm==pm) then
245203 -- Both p and q are Japanese glyph node, and same metric and size
246204 g=ltj.new_jfm_glue(ps,pm,
247- ltj.find_char_type(q.char,qm),
248- ltj.find_char_type(p.char,pm))
205+ node.has_attribute(q,luatexbase.attributes['luatexja@charclass']),
206+ node.has_attribute(p,luatexbase.attributes['luatexja@charclass']))
249207 elseif not qm then
250208 -- q is not Japanese glyph node
251209 g=ltj.new_jfm_glue(ps,pm,
252- ltj.find_char_type('jcharbdd',pm),
253- ltj.find_char_type(p.char,pm))
210+ ltj.find_char_type('jcharbdd',pm),
211+ node.has_attribute(p,luatexbase.attributes['luatexja@charclass']))
254212 elseif not pm then
255213 -- p is not Japanese glyph node
256214 g=ltj.new_jfm_glue(qs,qm,
257- ltj.find_char_type(q.char,qm),
258- ltj.find_char_type('jcharbdd',qm))
215+ node.has_attribute(q,luatexbase.attributes['luatexja@charclass']),
216+ ltj.find_char_type('jcharbdd',qm))
259217 else
260218 g=ltj.new_jfm_glue(qs,qm,
261- ltj.find_char_type(q.char,qm),
262- ltj.find_char_type('diffmet',qm))
219+ node.has_attribute(q,luatexbase.attributes['luatexja@charclass']),
220+ ltj.find_char_type('diffmet',qm))
263221 h=ltj.new_jfm_glue(ps,pm,
264- ltj.find_char_type('diffmet',pm),
265- ltj.find_char_type(p.char,pm))
222+ ltj.find_char_type('diffmet',pm),
223+ node.has_attribute(p,luatexbase.attributes['luatexja@charclass']))
266224 g=ltj.calc_between_two_jchar_aux(g,h)
267225 end
268226 end
@@ -288,7 +246,7 @@ function ltj.add_kinsoku_penalty(head,p)
288246 if not ltj.penalty_table[c] then return false; end
289247 if ltj.penalty_table[c].pre then
290248 local q = node.prev(p)
291- if (not q) and node.type(q.id)=='penalty' then
249+ if q and node.type(q.id)=='penalty' then
292250 q.penalty=q.penalty+ltj.penalty_table[c].pre
293251 else
294252 q=node.new(node.id('penalty'))
@@ -298,7 +256,7 @@ function ltj.add_kinsoku_penalty(head,p)
298256 end
299257 if ltj.penalty_table[c].post then
300258 local q = node.next(p)
301- if (not q) and node.type(q.id)=='penalty' then
259+ if q and node.type(q.id)=='penalty' then
302260 q.penalty=q.penalty+ltj.penalty_table[c].post
303261 return false
304262 else
@@ -563,7 +521,7 @@ end
563521 -- Insert \xkanjiskip around p, a penalty
564522 function ltj.insks_around_penalty(head,q,p)
565523 local r=node.next(p)
566- if (not r) and node.type(r.id)=='glyph' then
524+ if r and node.type(r.id)=='glyph' then
567525 local a=ltj.inhibit_xsp_table[r.char]
568526 if ltj.is_japanese_glyph_node(r) then
569527 ltj.cx=r.char
@@ -650,14 +608,88 @@ function ltj.main_process(head)
650608 p = ltj.insert_jfm_glue(p)
651609 p = ltj.insert_kanji_skip(p)
652610 p = ltj.baselineshift(p)
611+ p = ltj.set_ja_width(p)
653612 return p
654613 end
655614
615+-- TeX's \hss
616+function ltj.get_hss()
617+ local hss = node.new(node.id("glue"))
618+ local hss_spec = node.new(node.id("glue_spec"))
619+ hss_spec.width = 0
620+ hss_spec.stretch = 65536
621+ hss_spec.stretch_order = 2
622+ hss_spec.shrink = 65536
623+ hss_spec.shrink_order = 2
624+ hss.spec = hss_spec
625+ return hss
626+end
627+
628+function ltj.set_ja_width(head)
629+ local p = head
630+ local t,s,th, g, q,a
631+ while p do
632+ if ltj.is_japanese_glyph_node(p) then
633+ t=ltj.metrics[ltj.font_metric_table[p.font].jfm]
634+ s=t.char_type[node.has_attribute(p,luatexbase.attributes['luatexja@charclass'])]
635+ if not(s.left==0.0 and s.down==0.0
636+ and tex.round(s.width*ltj.font_metric_table[p.font].size)==p.width) then
637+ -- must be encapsuled by a \hbox
638+ head, q = node.remove(head,p)
639+ p.next=nil
640+ p.yoffset=tex.round(p.yoffset-ltj.font_metric_table[p.font].size*s.down)
641+ p.xoffset=tex.round(p.xoffset-ltj.font_metric_table[p.font].size*s.left)
642+ node.insert_after(p,p,ltj.get_hss())
643+ g=node.hpack(p, tex.round(ltj.font_metric_table[p.font].size*s.width)
644+ , 'exactly')
645+ g.height=tex.round(ltj.font_metric_table[p.font].size*s.height)
646+ g.depth=tex.round(ltj.font_metric_table[p.font].size*s.depth)
647+ head,p = node.insert_before(head,q,g)
648+ p=q
649+ else p=node.next(p)
650+ end
651+ else p=node.next(p)
652+ end
653+ end
654+ return head
655+end
656+
657+-- debug
658+ltj.depth=""
659+function ltj.to_pt(a)
660+ return math.floor(a/65536*100000)/100000
661+end
662+function ltj.show_node_list(head)
663+ local p =head
664+ local k=ltj.depth
665+ ltj.depth=ltj.depth .. '.'
666+ while p do
667+ local s=node.type(p.id)
668+ if s == 'glyph' then
669+ print(ltj.depth .. ' glyph', p.subtype, unicode.utf8.char(p.char), p.font)
670+ elseif s=='hlist' then
671+ print(ltj.depth .. ' hlist', p.subtype, '(' .. ltj.to_pt(p.height)
672+ .. '+' .. ltj.to_pt(p.depth)
673+ .. ')x' .. ltj.to_pt(p.width) )
674+ ltj.show_node_list(p.head)
675+ ltj.depth=k
676+ elseif s=='whatsit' then
677+ print(ltj.depth .. ' whatsit', p.subtype)
678+ elseif s=='glue' then
679+ print(ltj.depth .. ' glue', p.subtype, ltj.to_pt(p.spec.width))
680+ else
681+ print(ltj.depth .. ' ' .. s, s.subtype)
682+ end
683+ p=node.next(p)
684+ end
685+end
686+
687+
688+
656689 --- the following function is modified from jafontspec.lua (by K. Maeda).
657690 --- Instead of "%", we use U+FFFFF for suppressing spaces.
658691 utf = unicode.utf8
659692 function ltj.process_input_buffer(buffer)
660--- print(utf.byte(buffer, utf.len(buffer)))
661693 if utf.len(buffer) > 0
662694 and ltj.is_ucs_in_japanese_char(utf.byte(buffer, utf.len(buffer))) then
663695 buffer = buffer .. string.char(0xF3,0xBF,0xBF,0xBF) -- U+FFFFF
@@ -674,7 +706,12 @@ function ltj.suppress_hyphenate_ja(head)
674706 while p do
675707 if node.type(p.id)=='glyph' and ltj.is_ucs_in_japanese_char(p.char) then
676708 local v = node.has_attribute(p,luatexbase.attributes['luatexja@curjfnt'])
677- if v then p.font=v end
709+ if v then
710+ p.font=v
711+ local l=ltj.find_char_type(p.char,ltj.font_metric_table[v].jfm)
712+ if not l then l=0 end
713+ node.set_attribute(p,luatexbase.attributes['luatexja@charclass'],l)
714+ end
678715 v=node.has_attribute(p,luatexbase.attributes['luatexja@ykblshift'])
679716 if v then
680717 node.set_attribute(p,luatexbase.attributes['luatexja@yablshift'],v)
@@ -685,22 +722,30 @@ function ltj.suppress_hyphenate_ja(head)
685722 end
686723 p=node.next(p)
687724 end
688- lang.hyphenate(head)
725+ lang.hyphenate(head)
726+ return head -- 共通化のため値を返す
689727 end
690728
691--- callback
729+-- callbacks
692730 luatexbase.add_to_callback('process_input_buffer',
693731 function (buffer)
694732 return ltj.process_input_buffer(buffer)
695733 end,'ltj.process_input_buffer')
734+
696735 luatexbase.add_to_callback('pre_linebreak_filter',
697736 function (head,groupcode)
698737 return ltj.main_process(head)
699- end,'ltj.pre_linebreak_filter')
738+ end,'ltj.pre_linebreak_filter',2)
739+luatexbase.add_to_callback('hpack_filter',
740+ function (head,groupcode,size,packtype)
741+ return ltj.main_process(head)
742+ end,'ltj.hpack_filter',2)
743+
744+--insert before callbacks from luaotfload
700745 luatexbase.add_to_callback('hpack_filter',
701746 function (head,groupcode,size,packtype)
702- return ltj.main_process(ltj.replace_ja_font(head))
703- end,'ltj.hpack_filter')
747+ return ltj.suppress_hyphenate_ja(head)
748+ end,'ltj.hpack_filter_pre',0)
704749 luatexbase.add_to_callback('hyphenate',
705750 function (head,tail)
706751 return ltj.suppress_hyphenate_ja(head)
--- a/src/luatexja-core.sty
+++ b/src/luatexja-core.sty
@@ -31,6 +31,7 @@
3131
3232 % Attributes for Japanese typesetting.
3333 \newluatexattribute\luatexja@curjfnt % index for ``current Japanese font''
34+\newluatexattribute\luatexja@charclass %
3435 \newluatexattribute\luatexja@yablshift % attribute for \yabaselineshift
3536 \newluatexattribute\luatexja@ykblshift % attribute for \ykbaselineshift
3637
@@ -64,11 +65,15 @@
6465 \luatexja@yablshift=0 \luatexja@ykblshift=0
6566
6667 % \inhibitxspcode, \xspcode
67-\def\inhibitxspcode#1#2{\directlua{ltj.set_inhibit_xsp_table(#1,#2)}}
68-\let\xspcode=\inhibitxspcode
68+\def\setinhibitxspcode#1#2{\directlua{ltj.set_inhibit_xsp_table(#1,#2)}}
69+\def\getinhibitxspcode#1{\directlua{ltj.get_inhibit_xsp_table(#1)}}
70+\let\setxspcode=\setinhibitxspcode
71+\let\getxspcode=\getinhibitxspcode
6972 % \prebreakpenalty, \postbreakpenalty
70-\def\prebreakpenalty#1#2{\directlua{ltj.set_penalty_table('pre',#1,#2)}}
71-\def\postbreakpenalty#1#2{\directlua{ltj.set_penalty_table('post',#1,#2)}}
73+\def\setprebreakpenalty#1#2{\directlua{ltj.set_penalty_table('pre',#1,#2)}}
74+\def\setpostbreakpenalty#1#2{\directlua{ltj.set_penalty_table('post',#1,#2)}}
75+\def\getprebreakpenalty#1{\directlua{ltj.get_penalty_table('pre',#1)}}
76+\def\getpostbreakpenalty#1{\directlua{ltj.get_penalty_table('post',#1)}}
7277
7378 \def\autospacing{\luatexja@autospc=0 }
7479 \def\noautospacing{\luatexja@autospc=1 }
--- a/src/luatexja-kinsoku.tex
+++ b/src/luatexja-kinsoku.tex
@@ -1,352 +1,352 @@
11 %0}{0}
2-\prebreakpenalty{33}{10000}
3-\prebreakpenalty{34}{10000}
4-\postbreakpenalty{35}{500}
5-\postbreakpenalty{36}{500}
6-\postbreakpenalty{37}{500}
7-\postbreakpenalty{38}{500}
8-\postbreakpenalty{96}{10000}
9-\prebreakpenalty{39}{10000}
10-\prebreakpenalty{41}{10000}
11-\postbreakpenalty{40}{10000}
12-\prebreakpenalty{42}{500}
13-\prebreakpenalty{43}{500}
14-\prebreakpenalty{45}{10000}
15-\prebreakpenalty{46}{10000}
16-\prebreakpenalty{44}{10000}
17-\prebreakpenalty{47}{500}
18-\prebreakpenalty{59}{10000}
19-\prebreakpenalty{63}{10000}
20-\prebreakpenalty{58}{10000}
21-\prebreakpenalty{93}{10000}
22-\postbreakpenalty{91}{10000}
23-\prebreakpenalty{12289}{10000}
24-\prebreakpenalty{12290}{10000}
25-\prebreakpenalty{65292}{10000}
26-\prebreakpenalty{65294}{10000}
27-\prebreakpenalty{12539}{10000}
28-\prebreakpenalty{65306}{10000}
29-\prebreakpenalty{65307}{10000}
30-\prebreakpenalty{65311}{10000}
31-\prebreakpenalty{65281}{10000}
32-\prebreakpenalty{12443}{10000}
33-\prebreakpenalty{12444}{10000}
34-\prebreakpenalty{180}{10000}
35-\postbreakpenalty{65344}{10000}
36-\prebreakpenalty{12293}{10000}
37-\prebreakpenalty{8230}{250}
38-\prebreakpenalty{8229}{250}
39-\postbreakpenalty{8216}{10000}
40-\prebreakpenalty{8217}{10000}
41-\postbreakpenalty{8220}{10000}
42-\prebreakpenalty{8221}{10000}
43-\prebreakpenalty{65289}{10000}
44-\postbreakpenalty{65288}{10000}
45-\prebreakpenalty{65373}{10000}
46-\postbreakpenalty{65371}{10000}
47-\prebreakpenalty{65341}{10000}
48-\postbreakpenalty{65339}{10000}
49-\postbreakpenalty{12308}{10000}
50-\prebreakpenalty{12309}{10000}
51-\postbreakpenalty{12296}{10000}
52-\prebreakpenalty{12297}{10000}
53-\postbreakpenalty{12298}{10000}
54-\prebreakpenalty{12299}{10000}
55-\postbreakpenalty{12300}{10000}
56-\prebreakpenalty{12301}{10000}
57-\postbreakpenalty{12302}{10000}
58-\prebreakpenalty{12303}{10000}
59-\postbreakpenalty{12304}{10000}
60-\prebreakpenalty{12305}{10000}
61-\prebreakpenalty{12540}{10000}
62-\prebreakpenalty{65291}{200}
63-\prebreakpenalty{8722}{200}
64-\prebreakpenalty{65293}{200}
65-\prebreakpenalty{65309}{200}
66-\postbreakpenalty{65283}{200}
67-\postbreakpenalty{65284}{200}
68-\postbreakpenalty{65285}{200}
69-\postbreakpenalty{65286}{200}
70-\prebreakpenalty{12353}{150}
71-\prebreakpenalty{12355}{150}
72-\prebreakpenalty{12357}{150}
73-\prebreakpenalty{12359}{150}
74-\prebreakpenalty{12361}{150}
75-\prebreakpenalty{12387}{150}
76-\prebreakpenalty{12419}{150}
77-\prebreakpenalty{12421}{150}
78-\prebreakpenalty{12423}{150}
79-\prebreakpenalty{12430}{150}
80-\prebreakpenalty{12449}{150}
81-\prebreakpenalty{12451}{150}
82-\prebreakpenalty{12453}{150}
83-\prebreakpenalty{12455}{150}
84-\prebreakpenalty{12457}{150}
85-\prebreakpenalty{12483}{150}
86-\prebreakpenalty{12515}{150}
87-\prebreakpenalty{12517}{150}
88-\prebreakpenalty{12519}{150}
89-\prebreakpenalty{12526}{150}
90-\prebreakpenalty{12533}{150}
91-\prebreakpenalty{12534}{150}
92-\prebreakpenalty{12541}{10000}
93-\prebreakpenalty{12542}{10000}
94-\prebreakpenalty{12445}{10000}
95-\prebreakpenalty{12446}{10000}
96-\prebreakpenalty{12339}{10000}
97-\prebreakpenalty{12340}{10000}
98-\prebreakpenalty{12341}{10000}
99-\prebreakpenalty{12347}{10000}
100-\postbreakpenalty{10629}{10000}
101-\prebreakpenalty{10630}{10000}
102-\postbreakpenalty{65375}{10000}
103-\prebreakpenalty{65376}{10000}
104-\postbreakpenalty{12312}{10000}
105-\prebreakpenalty{12313}{10000}
106-\postbreakpenalty{12310}{10000}
107-\prebreakpenalty{12311}{10000}
108-\postbreakpenalty{171}{10000}
109-\prebreakpenalty{187}{10000}
110-\postbreakpenalty{12317}{10000}
111-\prebreakpenalty{12319}{10000}
112-\prebreakpenalty{8252}{10000}
113-\prebreakpenalty{8263}{10000}
114-\prebreakpenalty{8264}{10000}
115-\prebreakpenalty{8265}{10000}
116-\postbreakpenalty{161}{10000}
117-\postbreakpenalty{191}{10000}
118-\prebreakpenalty{720}{10000}
119-\prebreakpenalty{170}{10000}
120-\prebreakpenalty{186}{10000}
121-\prebreakpenalty{185}{10000}
122-\prebreakpenalty{178}{10000}
123-\prebreakpenalty{179}{10000}
124-\postbreakpenalty{8364}{10000}
125-\prebreakpenalty{12437}{150}
126-\prebreakpenalty{12438}{150}
127-\prebreakpenalty{12784}{150}
128-\prebreakpenalty{12785}{150}
129-\prebreakpenalty{12786}{150}
130-\prebreakpenalty{12787}{150}
131-\prebreakpenalty{12788}{150}
132-\prebreakpenalty{12789}{150}
133-\prebreakpenalty{12790}{150}
134-\prebreakpenalty{12791}{150}
135-\prebreakpenalty{12792}{150}
136-\prebreakpenalty{12793}{150}
137-\prebreakpenalty{12794}{150}
138-\prebreakpenalty{12795}{150}
139-\prebreakpenalty{12796}{150}
140-\prebreakpenalty{12797}{150}
141-\prebreakpenalty{12798}{150}
142-\prebreakpenalty{12799}{150}
143-\prebreakpenalty{8482}{10000}
144-\prebreakpenalty{65377}{10000}
145-\prebreakpenalty{65380}{10000}
146-\prebreakpenalty{65438}{10000}
147-\prebreakpenalty{65439}{10000}
148-\prebreakpenalty{65379}{10000}
149-\postbreakpenalty{65378}{10000}
150-\xspcode{40}{1}
151-\xspcode{41}{2}
152-\xspcode{91}{1}
153-\xspcode{93}{2}
154-\xspcode{96}{1}
155-\xspcode{39}{2}
156-\xspcode{59}{2}
157-\xspcode{44}{2}
158-\xspcode{46}{2}
159-\xspcode{128}{3}
160-\xspcode{129}{3}
161-\xspcode{130}{3}
162-\xspcode{131}{3}
163-\xspcode{132}{3}
164-\xspcode{133}{3}
165-\xspcode{134}{3}
166-\xspcode{135}{3}
167-\xspcode{136}{3}
168-\xspcode{137}{3}
169-\xspcode{138}{3}
170-\xspcode{139}{3}
171-\xspcode{140}{3}
172-\xspcode{141}{3}
173-\xspcode{142}{3}
174-\xspcode{143}{3}
175-\xspcode{144}{3}
176-\xspcode{145}{3}
177-\xspcode{146}{3}
178-\xspcode{147}{3}
179-\xspcode{148}{3}
180-\xspcode{149}{3}
181-\xspcode{150}{3}
182-\xspcode{151}{3}
183-\xspcode{152}{3}
184-\xspcode{153}{3}
185-\xspcode{154}{3}
186-\xspcode{155}{3}
187-\xspcode{156}{3}
188-\xspcode{157}{3}
189-\xspcode{158}{3}
190-\xspcode{159}{3}
191-\xspcode{160}{3}
192-\xspcode{161}{3}
193-\xspcode{162}{3}
194-\xspcode{163}{3}
195-\xspcode{164}{3}
196-\xspcode{165}{3}
197-\xspcode{166}{3}
198-\xspcode{167}{3}
199-\xspcode{168}{3}
200-\xspcode{169}{3}
201-\xspcode{170}{3}
202-\xspcode{171}{3}
203-\xspcode{172}{3}
204-\xspcode{173}{3}
205-\xspcode{174}{3}
206-\xspcode{175}{3}
207-\xspcode{176}{3}
208-\xspcode{177}{3}
209-\xspcode{178}{3}
210-\xspcode{179}{3}
211-\xspcode{180}{3}
212-\xspcode{181}{3}
213-\xspcode{182}{3}
214-\xspcode{183}{3}
215-\xspcode{184}{3}
216-\xspcode{185}{3}
217-\xspcode{186}{3}
218-\xspcode{187}{3}
219-\xspcode{188}{3}
220-\xspcode{189}{3}
221-\xspcode{190}{3}
222-\xspcode{191}{3}
223-\xspcode{192}{3}
224-\xspcode{193}{3}
225-\xspcode{194}{3}
226-\xspcode{195}{3}
227-\xspcode{196}{3}
228-\xspcode{197}{3}
229-\xspcode{198}{3}
230-\xspcode{199}{3}
231-\xspcode{200}{3}
232-\xspcode{201}{3}
233-\xspcode{202}{3}
234-\xspcode{203}{3}
235-\xspcode{204}{3}
236-\xspcode{205}{3}
237-\xspcode{206}{3}
238-\xspcode{207}{3}
239-\xspcode{208}{3}
240-\xspcode{209}{3}
241-\xspcode{210}{3}
242-\xspcode{211}{3}
243-\xspcode{212}{3}
244-\xspcode{213}{3}
245-\xspcode{214}{3}
246-\xspcode{215}{3}
247-\xspcode{216}{3}
248-\xspcode{217}{3}
249-\xspcode{218}{3}
250-\xspcode{219}{3}
251-\xspcode{220}{3}
252-\xspcode{221}{3}
253-\xspcode{222}{3}
254-\xspcode{223}{3}
255-\xspcode{224}{3}
256-\xspcode{225}{3}
257-\xspcode{226}{3}
258-\xspcode{227}{3}
259-\xspcode{228}{3}
260-\xspcode{229}{3}
261-\xspcode{230}{3}
262-\xspcode{231}{3}
263-\xspcode{232}{3}
264-\xspcode{233}{3}
265-\xspcode{234}{3}
266-\xspcode{235}{3}
267-\xspcode{236}{3}
268-\xspcode{237}{3}
269-\xspcode{238}{3}
270-\xspcode{239}{3}
271-\xspcode{240}{3}
272-\xspcode{241}{3}
273-\xspcode{242}{3}
274-\xspcode{243}{3}
275-\xspcode{244}{3}
276-\xspcode{245}{3}
277-\xspcode{246}{3}
278-\xspcode{247}{3}
279-\xspcode{248}{3}
280-\xspcode{249}{3}
281-\xspcode{250}{3}
282-\xspcode{251}{3}
283-\xspcode{252}{3}
284-\xspcode{253}{3}
285-\xspcode{254}{3}
286-\xspcode{255}{3}
287-\inhibitxspcode{12289}{1}
288-\inhibitxspcode{12290}{1}
289-\inhibitxspcode{65292}{1}
290-\inhibitxspcode{65294}{1}
291-\inhibitxspcode{65307}{1}
292-\inhibitxspcode{65311}{1}
293-\inhibitxspcode{65289}{1}
294-\inhibitxspcode{65288}{2}
295-\inhibitxspcode{65341}{1}
296-\inhibitxspcode{65339}{2}
297-\inhibitxspcode{65373}{1}
298-\inhibitxspcode{65371}{2}
299-\inhibitxspcode{8216}{2}
300-\inhibitxspcode{8217}{1}
301-\inhibitxspcode{8220}{2}
302-\inhibitxspcode{8221}{1}
303-\inhibitxspcode{12308}{2}
304-\inhibitxspcode{12309}{1}
305-\inhibitxspcode{12296}{2}
306-\inhibitxspcode{12297}{1}
307-\inhibitxspcode{12298}{2}
308-\inhibitxspcode{12299}{1}
309-\inhibitxspcode{12300}{2}
310-\inhibitxspcode{12301}{1}
311-\inhibitxspcode{12302}{2}
312-\inhibitxspcode{12303}{1}
313-\inhibitxspcode{12304}{2}
314-\inhibitxspcode{12305}{1}
315-\inhibitxspcode{8212}{0}
316-\inhibitxspcode{8213}{0}
317-\inhibitxspcode{12316}{0}
318-\inhibitxspcode{65374}{0}
319-\inhibitxspcode{8230}{0}
320-\inhibitxspcode{165}{0}
321-\inhibitxspcode{65509}{0}
322-\inhibitxspcode{176}{1}
323-\inhibitxspcode{8242}{1}
324-\inhibitxspcode{8243}{1}
325-\inhibitxspcode{10629}{2}
326-\inhibitxspcode{10630}{1}
327-\inhibitxspcode{65375}{2}
328-\inhibitxspcode{65376}{1}
329-\inhibitxspcode{12312}{2}
330-\inhibitxspcode{12313}{1}
331-\inhibitxspcode{12310}{2}
332-\inhibitxspcode{12311}{1}
333-\inhibitxspcode{171}{2}
334-\inhibitxspcode{187}{1}
335-\inhibitxspcode{12317}{2}
336-\inhibitxspcode{12319}{1}
337-\inhibitxspcode{8252}{1}
338-\inhibitxspcode{8263}{1}
339-\inhibitxspcode{8264}{1}
340-\inhibitxspcode{8265}{1}
341-\inhibitxspcode{161}{2}
342-\inhibitxspcode{191}{2}
343-\inhibitxspcode{170}{1}
344-\inhibitxspcode{186}{1}
345-\inhibitxspcode{185}{1}
346-\inhibitxspcode{178}{1}
347-\inhibitxspcode{179}{1}
348-\inhibitxspcode{8364}{2}
349-\inhibitxspcode{8482}{1}
350-\inhibitxspcode{65377}{1}
351-\inhibitxspcode{65380}{1}
352-\inhibitxspcode{65378}{2}
2+\setprebreakpenalty{33}{10000}
3+\setprebreakpenalty{34}{10000}
4+\setpostbreakpenalty{35}{500}
5+\setpostbreakpenalty{36}{500}
6+\setpostbreakpenalty{37}{500}
7+\setpostbreakpenalty{38}{500}
8+\setpostbreakpenalty{96}{10000}
9+\setprebreakpenalty{39}{10000}
10+\setprebreakpenalty{41}{10000}
11+\setpostbreakpenalty{40}{10000}
12+\setprebreakpenalty{42}{500}
13+\setprebreakpenalty{43}{500}
14+\setprebreakpenalty{45}{10000}
15+\setprebreakpenalty{46}{10000}
16+\setprebreakpenalty{44}{10000}
17+\setprebreakpenalty{47}{500}
18+\setprebreakpenalty{59}{10000}
19+\setprebreakpenalty{63}{10000}
20+\setprebreakpenalty{58}{10000}
21+\setprebreakpenalty{93}{10000}
22+\setpostbreakpenalty{91}{10000}
23+\setprebreakpenalty{12289}{10000}
24+\setprebreakpenalty{12290}{10000}
25+\setprebreakpenalty{65292}{10000}
26+\setprebreakpenalty{65294}{10000}
27+\setprebreakpenalty{12539}{10000}
28+\setprebreakpenalty{65306}{10000}
29+\setprebreakpenalty{65307}{10000}
30+\setprebreakpenalty{65311}{10000}
31+\setprebreakpenalty{65281}{10000}
32+\setprebreakpenalty{12443}{10000}
33+\setprebreakpenalty{12444}{10000}
34+\setprebreakpenalty{180}{10000}
35+\setpostbreakpenalty{65344}{10000}
36+\setprebreakpenalty{12293}{10000}
37+\setprebreakpenalty{8230}{250}
38+\setprebreakpenalty{8229}{250}
39+\setpostbreakpenalty{8216}{10000}
40+\setprebreakpenalty{8217}{10000}
41+\setpostbreakpenalty{8220}{10000}
42+\setprebreakpenalty{8221}{10000}
43+\setprebreakpenalty{65289}{10000}
44+\setpostbreakpenalty{65288}{10000}
45+\setprebreakpenalty{65373}{10000}
46+\setpostbreakpenalty{65371}{10000}
47+\setprebreakpenalty{65341}{10000}
48+\setpostbreakpenalty{65339}{10000}
49+\setpostbreakpenalty{12308}{10000}
50+\setprebreakpenalty{12309}{10000}
51+\setpostbreakpenalty{12296}{10000}
52+\setprebreakpenalty{12297}{10000}
53+\setpostbreakpenalty{12298}{10000}
54+\setprebreakpenalty{12299}{10000}
55+\setpostbreakpenalty{12300}{10000}
56+\setprebreakpenalty{12301}{10000}
57+\setpostbreakpenalty{12302}{10000}
58+\setprebreakpenalty{12303}{10000}
59+\setpostbreakpenalty{12304}{10000}
60+\setprebreakpenalty{12305}{10000}
61+\setprebreakpenalty{12540}{10000}
62+\setprebreakpenalty{65291}{200}
63+\setprebreakpenalty{8722}{200}
64+\setprebreakpenalty{65293}{200}
65+\setprebreakpenalty{65309}{200}
66+\setpostbreakpenalty{65283}{200}
67+\setpostbreakpenalty{65284}{200}
68+\setpostbreakpenalty{65285}{200}
69+\setpostbreakpenalty{65286}{200}
70+\setprebreakpenalty{12353}{150}
71+\setprebreakpenalty{12355}{150}
72+\setprebreakpenalty{12357}{150}
73+\setprebreakpenalty{12359}{150}
74+\setprebreakpenalty{12361}{150}
75+\setprebreakpenalty{12387}{150}
76+\setprebreakpenalty{12419}{150}
77+\setprebreakpenalty{12421}{150}
78+\setprebreakpenalty{12423}{150}
79+\setprebreakpenalty{12430}{150}
80+\setprebreakpenalty{12449}{150}
81+\setprebreakpenalty{12451}{150}
82+\setprebreakpenalty{12453}{150}
83+\setprebreakpenalty{12455}{150}
84+\setprebreakpenalty{12457}{150}
85+\setprebreakpenalty{12483}{150}
86+\setprebreakpenalty{12515}{150}
87+\setprebreakpenalty{12517}{150}
88+\setprebreakpenalty{12519}{150}
89+\setprebreakpenalty{12526}{150}
90+\setprebreakpenalty{12533}{150}
91+\setprebreakpenalty{12534}{150}
92+\setprebreakpenalty{12541}{10000}
93+\setprebreakpenalty{12542}{10000}
94+\setprebreakpenalty{12445}{10000}
95+\setprebreakpenalty{12446}{10000}
96+\setprebreakpenalty{12339}{10000}
97+\setprebreakpenalty{12340}{10000}
98+\setprebreakpenalty{12341}{10000}
99+\setprebreakpenalty{12347}{10000}
100+\setpostbreakpenalty{10629}{10000}
101+\setprebreakpenalty{10630}{10000}
102+\setpostbreakpenalty{65375}{10000}
103+\setprebreakpenalty{65376}{10000}
104+\setpostbreakpenalty{12312}{10000}
105+\setprebreakpenalty{12313}{10000}
106+\setpostbreakpenalty{12310}{10000}
107+\setprebreakpenalty{12311}{10000}
108+\setpostbreakpenalty{171}{10000}
109+\setprebreakpenalty{187}{10000}
110+\setpostbreakpenalty{12317}{10000}
111+\setprebreakpenalty{12319}{10000}
112+\setprebreakpenalty{8252}{10000}
113+\setprebreakpenalty{8263}{10000}
114+\setprebreakpenalty{8264}{10000}
115+\setprebreakpenalty{8265}{10000}
116+\setpostbreakpenalty{161}{10000}
117+\setpostbreakpenalty{191}{10000}
118+\setprebreakpenalty{720}{10000}
119+\setprebreakpenalty{170}{10000}
120+\setprebreakpenalty{186}{10000}
121+\setprebreakpenalty{185}{10000}
122+\setprebreakpenalty{178}{10000}
123+\setprebreakpenalty{179}{10000}
124+\setpostbreakpenalty{8364}{10000}
125+\setprebreakpenalty{12437}{150}
126+\setprebreakpenalty{12438}{150}
127+\setprebreakpenalty{12784}{150}
128+\setprebreakpenalty{12785}{150}
129+\setprebreakpenalty{12786}{150}
130+\setprebreakpenalty{12787}{150}
131+\setprebreakpenalty{12788}{150}
132+\setprebreakpenalty{12789}{150}
133+\setprebreakpenalty{12790}{150}
134+\setprebreakpenalty{12791}{150}
135+\setprebreakpenalty{12792}{150}
136+\setprebreakpenalty{12793}{150}
137+\setprebreakpenalty{12794}{150}
138+\setprebreakpenalty{12795}{150}
139+\setprebreakpenalty{12796}{150}
140+\setprebreakpenalty{12797}{150}
141+\setprebreakpenalty{12798}{150}
142+\setprebreakpenalty{12799}{150}
143+\setprebreakpenalty{8482}{10000}
144+\setprebreakpenalty{65377}{10000}
145+\setprebreakpenalty{65380}{10000}
146+\setprebreakpenalty{65438}{10000}
147+\setprebreakpenalty{65439}{10000}
148+\setprebreakpenalty{65379}{10000}
149+\setpostbreakpenalty{65378}{10000}
150+\setxspcode{40}{1}
151+\setxspcode{41}{2}
152+\setxspcode{91}{1}
153+\setxspcode{93}{2}
154+\setxspcode{96}{1}
155+\setxspcode{39}{2}
156+\setxspcode{59}{2}
157+\setxspcode{44}{2}
158+\setxspcode{46}{2}
159+\setxspcode{128}{3}
160+\setxspcode{129}{3}
161+\setxspcode{130}{3}
162+\setxspcode{131}{3}
163+\setxspcode{132}{3}
164+\setxspcode{133}{3}
165+\setxspcode{134}{3}
166+\setxspcode{135}{3}
167+\setxspcode{136}{3}
168+\setxspcode{137}{3}
169+\setxspcode{138}{3}
170+\setxspcode{139}{3}
171+\setxspcode{140}{3}
172+\setxspcode{141}{3}
173+\setxspcode{142}{3}
174+\setxspcode{143}{3}
175+\setxspcode{144}{3}
176+\setxspcode{145}{3}
177+\setxspcode{146}{3}
178+\setxspcode{147}{3}
179+\setxspcode{148}{3}
180+\setxspcode{149}{3}
181+\setxspcode{150}{3}
182+\setxspcode{151}{3}
183+\setxspcode{152}{3}
184+\setxspcode{153}{3}
185+\setxspcode{154}{3}
186+\setxspcode{155}{3}
187+\setxspcode{156}{3}
188+\setxspcode{157}{3}
189+\setxspcode{158}{3}
190+\setxspcode{159}{3}
191+\setxspcode{160}{3}
192+\setxspcode{161}{3}
193+\setxspcode{162}{3}
194+\setxspcode{163}{3}
195+\setxspcode{164}{3}
196+\setxspcode{165}{3}
197+\setxspcode{166}{3}
198+\setxspcode{167}{3}
199+\setxspcode{168}{3}
200+\setxspcode{169}{3}
201+\setxspcode{170}{3}
202+\setxspcode{171}{3}
203+\setxspcode{172}{3}
204+\setxspcode{173}{3}
205+\setxspcode{174}{3}
206+\setxspcode{175}{3}
207+\setxspcode{176}{3}
208+\setxspcode{177}{3}
209+\setxspcode{178}{3}
210+\setxspcode{179}{3}
211+\setxspcode{180}{3}
212+\setxspcode{181}{3}
213+\setxspcode{182}{3}
214+\setxspcode{183}{3}
215+\setxspcode{184}{3}
216+\setxspcode{185}{3}
217+\setxspcode{186}{3}
218+\setxspcode{187}{3}
219+\setxspcode{188}{3}
220+\setxspcode{189}{3}
221+\setxspcode{190}{3}
222+\setxspcode{191}{3}
223+\setxspcode{192}{3}
224+\setxspcode{193}{3}
225+\setxspcode{194}{3}
226+\setxspcode{195}{3}
227+\setxspcode{196}{3}
228+\setxspcode{197}{3}
229+\setxspcode{198}{3}
230+\setxspcode{199}{3}
231+\setxspcode{200}{3}
232+\setxspcode{201}{3}
233+\setxspcode{202}{3}
234+\setxspcode{203}{3}
235+\setxspcode{204}{3}
236+\setxspcode{205}{3}
237+\setxspcode{206}{3}
238+\setxspcode{207}{3}
239+\setxspcode{208}{3}
240+\setxspcode{209}{3}
241+\setxspcode{210}{3}
242+\setxspcode{211}{3}
243+\setxspcode{212}{3}
244+\setxspcode{213}{3}
245+\setxspcode{214}{3}
246+\setxspcode{215}{3}
247+\setxspcode{216}{3}
248+\setxspcode{217}{3}
249+\setxspcode{218}{3}
250+\setxspcode{219}{3}
251+\setxspcode{220}{3}
252+\setxspcode{221}{3}
253+\setxspcode{222}{3}
254+\setxspcode{223}{3}
255+\setxspcode{224}{3}
256+\setxspcode{225}{3}
257+\setxspcode{226}{3}
258+\setxspcode{227}{3}
259+\setxspcode{228}{3}
260+\setxspcode{229}{3}
261+\setxspcode{230}{3}
262+\setxspcode{231}{3}
263+\setxspcode{232}{3}
264+\setxspcode{233}{3}
265+\setxspcode{234}{3}
266+\setxspcode{235}{3}
267+\setxspcode{236}{3}
268+\setxspcode{237}{3}
269+\setxspcode{238}{3}
270+\setxspcode{239}{3}
271+\setxspcode{240}{3}
272+\setxspcode{241}{3}
273+\setxspcode{242}{3}
274+\setxspcode{243}{3}
275+\setxspcode{244}{3}
276+\setxspcode{245}{3}
277+\setxspcode{246}{3}
278+\setxspcode{247}{3}
279+\setxspcode{248}{3}
280+\setxspcode{249}{3}
281+\setxspcode{250}{3}
282+\setxspcode{251}{3}
283+\setxspcode{252}{3}
284+\setxspcode{253}{3}
285+\setxspcode{254}{3}
286+\setxspcode{255}{3}
287+\setinhibitxspcode{12289}{1}
288+\setinhibitxspcode{12290}{1}
289+\setinhibitxspcode{65292}{1}
290+\setinhibitxspcode{65294}{1}
291+\setinhibitxspcode{65307}{1}
292+\setinhibitxspcode{65311}{1}
293+\setinhibitxspcode{65289}{1}
294+\setinhibitxspcode{65288}{2}
295+\setinhibitxspcode{65341}{1}
296+\setinhibitxspcode{65339}{2}
297+\setinhibitxspcode{65373}{1}
298+\setinhibitxspcode{65371}{2}
299+\setinhibitxspcode{8216}{2}
300+\setinhibitxspcode{8217}{1}
301+\setinhibitxspcode{8220}{2}
302+\setinhibitxspcode{8221}{1}
303+\setinhibitxspcode{12308}{2}
304+\setinhibitxspcode{12309}{1}
305+\setinhibitxspcode{12296}{2}
306+\setinhibitxspcode{12297}{1}
307+\setinhibitxspcode{12298}{2}
308+\setinhibitxspcode{12299}{1}
309+\setinhibitxspcode{12300}{2}
310+\setinhibitxspcode{12301}{1}
311+\setinhibitxspcode{12302}{2}
312+\setinhibitxspcode{12303}{1}
313+\setinhibitxspcode{12304}{2}
314+\setinhibitxspcode{12305}{1}
315+\setinhibitxspcode{8212}{0}
316+\setinhibitxspcode{8213}{0}
317+\setinhibitxspcode{12316}{0}
318+\setinhibitxspcode{65374}{0}
319+\setinhibitxspcode{8230}{0}
320+\setinhibitxspcode{165}{0}
321+\setinhibitxspcode{65509}{0}
322+\setinhibitxspcode{176}{1}
323+\setinhibitxspcode{8242}{1}
324+\setinhibitxspcode{8243}{1}
325+\setinhibitxspcode{10629}{2}
326+\setinhibitxspcode{10630}{1}
327+\setinhibitxspcode{65375}{2}
328+\setinhibitxspcode{65376}{1}
329+\setinhibitxspcode{12312}{2}
330+\setinhibitxspcode{12313}{1}
331+\setinhibitxspcode{12310}{2}
332+\setinhibitxspcode{12311}{1}
333+\setinhibitxspcode{171}{2}
334+\setinhibitxspcode{187}{1}
335+\setinhibitxspcode{12317}{2}
336+\setinhibitxspcode{12319}{1}
337+\setinhibitxspcode{8252}{1}
338+\setinhibitxspcode{8263}{1}
339+\setinhibitxspcode{8264}{1}
340+\setinhibitxspcode{8265}{1}
341+\setinhibitxspcode{161}{2}
342+\setinhibitxspcode{191}{2}
343+\setinhibitxspcode{170}{1}
344+\setinhibitxspcode{186}{1}
345+\setinhibitxspcode{185}{1}
346+\setinhibitxspcode{178}{1}
347+\setinhibitxspcode{179}{1}
348+\setinhibitxspcode{8364}{2}
349+\setinhibitxspcode{8482}{1}
350+\setinhibitxspcode{65377}{1}
351+\setinhibitxspcode{65380}{1}
352+\setinhibitxspcode{65378}{2}
--- a/src/luatexja-kinsoku_make.tex
+++ b/src/luatexja-kinsoku_make.tex
@@ -3,10 +3,10 @@
33 \tt\catcode`\_=12
44 \def\{{\char'173 }\def\}{\char'175}
55 \toks0={\%}
6-\def\postbreakpenalty{\out\toks0={\string\postbreakpenalty\{}\count600 }%
7-\def\prebreakpenalty{\out\toks0={\string\prebreakpenalty\{}\count600 }%
8-\def\inhibitxspcode{\out\toks0={\string\inhibitxspcode\{}\count600 }%
9-\def\xspcode{\out\toks0={\string\xspcode\{}\count600 }%
6+\def\postbreakpenalty{\out\toks0={\string\setpostbreakpenalty\{}\count600 }%
7+\def\prebreakpenalty{\out\toks0={\string\setprebreakpenalty\{}\count600 }%
8+\def\inhibitxspcode{\out\toks0={\string\setinhibitxspcode\{}\count600 }%
9+\def\xspcode{\out\toks0={\string\setxspcode\{}\count600 }%
1010 \catcode`\=13
1111 \def={\count601 }%\
1212 \def\out{\par\the\toks0 \the\count600\}\{\the\count601\}}
--- a/src/luatj-mono.lua
+++ b/src/luatj-mono.lua
@@ -1,3 +1,3 @@
11 jfm.dir = 'yoko'
22 jfm.zw= 1.0; jfm.zh = 1.0
3-jfm.define_type_dim(0, 0.0 , 1.0 , 0.88, 0.12, 0.0)
\ No newline at end of file
3+jfm.define_type_dim(0, 0.0 , 0.0 , 1.0 , 0.88, 0.12, 0.0)
\ No newline at end of file
--- a/src/luatj-ujis.lua
+++ b/src/luatj-ujis.lua
@@ -14,15 +14,25 @@ jfm.zw= 1.0; jfm.zh = 1.0
1414 jfm.define_char_type(1, {
1515 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016,
1616 0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F
17- })
17+ }) -- 開き括弧類
1818 jfm.define_char_type(2, {
1919 0x2019, 0x201D, 0x3001, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015,
2020 0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60
21- })
22-jfm.define_char_type(3, {0x30FB, 0xFF1A, 0xFF1B})
23-jfm.define_char_type(4, {0x3002, 0xFF0E})
24-jfm.define_char_type(5, {0x2015, 0x2025, 0x2026})
21+ }) -- 閉じ括弧類
22+jfm.define_char_type(3, {0x30FB, 0xFF1A, 0xFF1B}) -- 中点類
23+jfm.define_char_type(4, {0x3002, 0xFF0E}) -- 句点類
24+jfm.define_char_type(5, {0x2015, 0x2025, 0x2026}) -- ダッシュ
2525 jfm.define_char_type(6, {'boxbdd'})
26+jfm.define_char_type(7, {
27+ 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69,
28+ 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0xFF72,
29+ 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B,
30+ 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84,
31+ 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D,
32+ 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96,
33+ 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F
34+}) -- 半角カナ
35+
2636
2737 -- 'boxbdd' matches
2838 -- o the beginning of paragraphs and hboxes
@@ -36,32 +46,39 @@ jfm.define_char_type(6, {'boxbdd'})
3646 -- and a material which is not a Japanese character.
3747
3848 -- dimension
39--- jfm.define_type_dim(<type>, <left>, <width>, <height>, <depth>, <italic correction>)
40-jfm.define_type_dim(0, 0.0 , 1.0 , 0.88, 0.12, 0.0)
41-jfm.define_type_dim(1, 0.5 , 0.5 , 0.88, 0.12, 0.0)
42-jfm.define_type_dim(2, 0.0 , 0.5 , 0.88, 0.12, 0.0)
43-jfm.define_type_dim(3, 0.25, 0.5 , 0.88, 0.12, 0.0)
44-jfm.define_type_dim(4, 0.0 , 0.5 , 0.88, 0.12, 0.0)
45-jfm.define_type_dim(5, 0.0 , 1.0 , 0.88, 0.12, 0.0)
46--- jfm.define_type_dim(6, 0.0 , 1.0 , 0.88, 0.12, 0.0): does not needed
49+-- jfm.define_type_dim(<type>, <left>, <down>, <width>,
50+-- <height>, <depth>, <italic correction>)
51+jfm.define_type_dim(0, 0.0 , 0.0 , 1.0 , 0.88, 0.12, 0.0)
52+jfm.define_type_dim(1, 0.5 , 0.0 , 0.5 , 0.88, 0.12, 0.0)
53+jfm.define_type_dim(2, 0.0 , 0.0 , 0.5 , 0.88, 0.12, 0.0)
54+jfm.define_type_dim(3, 0.25, 0.0 , 0.5 , 0.88, 0.12, 0.0)
55+jfm.define_type_dim(4, 0.0 , 0.0 , 0.5 , 0.88, 0.12, 0.0)
56+jfm.define_type_dim(5, 0.0 , 0.0 , 1.0 , 0.88, 0.12, 0.0)
57+-- jfm.define_type_dim(6, 0.0 , 0.0 , 1.0 , 0.88, 0.12, 0.0): does not needed
58+jfm.define_type_dim(7, 0.0 , 0.0 , 0.5 , 0.88, 0.12, 0.0)
4759
4860 -- glue/kern
4961 -- jfm.define_glue(<btype>, <atype>, <width>, <stretch>, <shrink>)
5062 -- jfm.define_kern(<btype>, <atype>, <width>)
5163 jfm.define_glue(0,1, 0.5 , 0.0, 0.5 )
64+jfm.define_glue(7,1, 0.5 , 0.0, 0.5 )
5265 jfm.define_glue(0,3, 0.25, 0.0, 0.25)
66+jfm.define_glue(7,3, 0.25, 0.0, 0.25)
5367 jfm.define_glue(1,3, 0.25, 0.0, 0.25)
5468 jfm.define_glue(2,0, 0.5 , 0.0, 0.5 )
69+jfm.define_glue(2,7, 0.5 , 0.0, 0.5 )
5570 jfm.define_glue(2,1, 0.5 , 0.0, 0.5 )
5671 jfm.define_glue(2,3, 0.25, 0.0, 0.25)
5772 jfm.define_glue(2,5, 0.5 , 0.0, 0.5 )
5873 jfm.define_glue(3,0, 0.25, 0.0, 0.25)
74+jfm.define_glue(3,7, 0.25, 0.0, 0.25)
5975 jfm.define_glue(3,1, 0.25, 0.0, 0.25)
6076 jfm.define_glue(3,2, 0.25, 0.0, 0.25)
6177 jfm.define_glue(3,3, 0.5 , 0.0, 0.5 )
6278 jfm.define_glue(3,4, 0.25, 0.0, 0.25)
6379 jfm.define_glue(3,5, 0.25, 0.0, 0.25)
6480 jfm.define_glue(4,0, 0.5 , 0.0, 0.0 )
81+jfm.define_glue(4,7, 0.5 , 0.0, 0.0 )
6582 jfm.define_glue(4,1, 0.5 , 0.0, 0.0 )
6683 jfm.define_glue(4,3, 0.75, 0.0, 0.25)
6784 jfm.define_glue(4,5, 0.5 , 0.0, 0.0 )
Binary files /dev/null and b/src/test-feature.pdf differ
--- /dev/null
+++ b/src/test-feature.tex
@@ -0,0 +1,54 @@
1+%#! luatex
2+\input luatexja-core.sty
3+
4+\loadjfontmetric{mt}{ujis}
5+\font\tenmin={file:ipaexm.ttf}\jfont\tenmin{mt}\tenmin
6+\font\tengoth={file:ipaexg.ttf}\jfont\tengoth{mt}
7+\font\jisninety={file:ipaexm.ttf:script=latn;+jp90}\jfont\jisninety{mt}
8+\font\jisexpt={file:ipaexm.ttf:script=latn;+expt}\jfont\jisexpt{mt}
9+\font\jishwid={file:ipaexm.ttf:script=latn;+hwid}\jfont\jishwid{mt}
10+%\font\tmihwid={file:ipaexm.ttf:script=latn;+hwid}
11+\font\jisnalt={file:ipaexm.ttf:script=latn;+nalt}\jfont\jisnalt{mt}
12+\font\jistrad={file:ipaexm.ttf:script=latn;+trad}\jfont\jistrad{mt}
13+\font\jissups={file:ipaexm.ttf:script=latn;+sups}\jfont\jissups{mt}
14+\font\jisliga={file:ipaexm.ttf:script=latn;+liga}\jfont\jisliga{mt}
15+%\font\tmiliga={file:ipaexm.ttf:script=latn;+liga}
16+\font\jisvert={file:ipaexm.ttf:script=latn;+vert}\jfont\jisvert{mt}
17+\parskip=\smallskipamount\parindent=1\zw
18+
19+{\noindent\bf\tengoth luatj-ujis.lua を使用}
20+
21+\bigskip
22+
23+{\noindent\bf\tengoth luaotf\/load による feature との共存状況}
24+
25+{\tentt expt} feature: 剥→{\jisexpt 剥}
26+
27+{\tentt jp90} feature: 辻→{\jisninety 辻}
28+
29+{\tentt hwid} feature: アイウエ→{\jishwid アイウエ}\hfil\break
30+↑文字クラスが変わらないので幅も変わらない.
31+
32+{\tentt nalt} feature: 男→{\jisnalt 男}
33+
34+{\tentt trad} feature: 医学→{\jistrad 医学}
35+
36+{\tentt sups} feature: 注1注1→{\jissups 注1注1}\hfil\break
37+↑文字クラスが変わらないので幅も変わらない.
38+
39+{\tentt liga} feature: か゜き゜く゜け゜こ゜→{\jisliga か゜き゜く゜け゜こ゜}\hfil\break
40+↑なぜかうまくいかない.%比較:{\tmiliga か゜き゜く゜け゜こ゜}
41+
42+{\tentt vert} feature: あ(㌢㍍),い→{\jisvert あ(㌢㍍),い}\hfil\break
43+↑縦組み時に気にすればいいか.
44+
45+\bigskip
46+
47+\noindent あいうえお
48+
49+「あいうえお←全角下がりが正しい({\tt'boxbdd'}のテスト1)
50+
51+{\tt'boxbdd'}のテスト2: \vrule\hbox{「」}\vrule ←正しい実装ならば2本の罫線の間は全角幅
52+
53+\end
54+
旧リポジトリブラウザで表示