• R/O
  • HTTP
  • SSH
  • HTTPS

luatexja: コミット

ソースコードの管理場所


コミットメタ情報

リビジョン223f533c15b0e1d641c1afd677d399a4914af7a9 (tree)
日時2011-04-23 12:50:36
作者Hironori Kitagawa <h_kitagawa2001@yaho...>
コミッターHironori Kitagawa

ログメッセージ

Implemented \jcharwidowpenalty, and fixed the treatment of character ranges.

変更サマリ

差分

--- a/doc/s1sty.tex
+++ b/doc/s1sty.tex
@@ -103,9 +103,12 @@
103103
104104 {\catcode`\_=\active \global\catcode`\<=\active
105105 \gdef<{\begingroup\catcode`\_=\active\let_=\_\it\@arg}
106-\gdef\@arg#1>{$\langle$#1$\rangle$\endgroup}
106+\gdef\@arg#1>{$\langle$#1\/$\rangle$\endgroup}
107107 }
108108
109+\def\lvert{\delimiter"426A30C }
110+\def\rvert{\delimiter"526A30C }
111+
109112 % itemize
110113 \newcount\enumi\enumi=0
111114 \def\item{\par\medskip\leftskip=2\zw\noindent\hskip-1\zw\hbox to 1\zw{\hss$\bullet$\hss}}
--- a/doc/sample1.log
+++ b/doc/sample1.log
@@ -1,4 +1,4 @@
1-This is LuaTeX, Version beta-0.66.0-2011032121 (rev 4093) (format=luatex 2011.3.21) 20 APR 2011 15:10
1+This is LuaTeX, Version beta-0.66.0-2011032121 (rev 4093) (format=luatex 2011.4.20) 23 APR 2011 12:48
22 restricted \write18 enabled.
33 **sample1
44 (./sample1.tex (./s1sty.tex
@@ -170,10 +170,11 @@ Package: infwarerr 2010/04/08 v1.3 Providing info/warning/message (HO)
170170 )
171171 \luatexja@tempcnta=\count281
172172 \luatexja@tempcntb=\count282
173+\luatexja@tempcntc=\count283
173174 \luatexja@tempdima=\dimen256
174-\luatexja@autospc=\count283
175-\luatexja@autoxspc=\count284
176-\jcharwidowpenalty=\count285
175+\luatexja@autospc=\count284
176+\luatexja@autoxspc=\count285
177+\jcharwidowpenalty=\count286
177178 \kanjiskip=\skip256
178179 \xkanjiskip=\skip257
179180 \zw=\dimen257
@@ -186,11 +187,6 @@ Package: infwarerr 2010/04/08 v1.3 Providing info/warning/message (HO)
186187 \luatexja@ykblshift=\luatexattribute12
187188 \luatexja@icflag=\luatexattribute13
188189 \luatexja@japanese=\language87
189-\luatexja@kcat0=\luatexattribute14
190-\luatexja@kcat1=\luatexattribute15
191-\luatexja@kcat2=\luatexattribute16
192-\luatexja@kcat3=\luatexattribute17
193-\luatexja@kcat4=\luatexattribute18
194190
195191 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-rmlgbm.lua)
196192 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-rmlgbm-data.lu
@@ -208,17 +204,23 @@ Module luatexbase-mcb info: inserting 'ltj.hyphenate'
208204 (luatexbase-mcb) at position 1 in 'hyphenate'
209205 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-jfont.lua)
210206 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-core-aux.lua)
211-\ltj@stack@pbp=\count286
212-\ltj@group@level@pbp=\count287
207+\luatexja@kcat0=\luatexattribute14
208+\luatexja@kcat1=\luatexattribute15
209+\luatexja@kcat2=\luatexattribute16
210+\luatexja@kcat3=\luatexattribute17
211+\luatexja@kcat4=\luatexattribute18
212+\luatexja@kcat5=\luatexattribute19
213+\luatexja@kcat6=\luatexattribute20
214+\ltj@stack@pbp=\count287
215+\ltj@group@level@pbp=\count288
213216
214217 plain format: loading luatexja-plain.tex
215218 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-plain.tex
216-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua) (other)
217-(iso8859-1)
219+(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)
218220 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-kinsoku.tex)))
219221 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-mono.lua)
220222 \vspbox=\box256
221-\enumi=\count288
223+\enumi=\count289
222224 ) BB AA
223225 特徴 制限 ファイル構成 使用方法 [1{/opt/texlive/p2010/texmf-var/f
224226 onts/map/pdftex/updmap/pdftex.map
@@ -240,26 +242,9 @@ x.map): fontmap entry for `bchri8r' already exists, duplicates ignored
240242 LuaTeX warning (file /opt/texlive/p2010/texmf-var/fonts/map/pdftex/updmap/pdfte
241243 x.map): fontmap entry for `bchro8r' already exists, duplicates ignored
242244 }] 和文フォントの定義 「和文文字の範囲」の設定 [2]
243-組版パラメタの調整 [3] その他の命令 [4] JFMについて
244-大まかな処理の流れ [5]
245-Overfull \hbox (16.21461pt too wide) in paragraph at lines 336--340
246- [][]\tenmin こ の 段 階 の 前 で は[] 和 文 文 字 で あっ て
247-も[] そ れ を 内 部 で 表 し て い る \tentt glyph[]node $\teni p$
248-\tenmin は[] []\tentt \tenrm \tenjtt あ[]
249-
250-\hbox(8.45029+2.22223)x412.9118, glue set - 1.0, direction TLT
251-.\glue(\leftskip) 19.2052
252-.\whatsit
253-..\localinterlinepenalty=0
254-..\localbrokenpenalty=0
255-..\localleftbox=null
256-..\localrightbox=null
257-.\hbox(0.0+0.0)x9.6026, direction TLT
258-.\tenmin こ
259-.\glue 0.0 plus 0.4 minus 0.4
260-.etc.
261-
262-[6] [7] 名称について 表記法 読み方 機能 [8] 数式の表示例
245+組版パラメタの調整 [3] 組版パラメタの取得 [4]
246+その他の命令 JFMについて [5] 大まかな処理の流れ [6] [7]
247+名称について 表記法 読み方 機能 [8] 数式の表示例
263248 生い立ち T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emXの日本語化
264249 [9]
265250 T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emXによる組版の作業工
@@ -279,7 +264,7 @@ opt/texlive/p2010/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></opt/te
279264 xlive/p2010/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb></opt/texlive/
280265 p2010/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb></opt/texlive/p2010/t
281266 exmf-dist/fonts/type1/hoekwater/manfnt/manfnt.pfb>
282-Output written on sample1.pdf (11 pages, 213643 bytes).
267+Output written on sample1.pdf (11 pages, 218012 bytes).
283268 PDF statistics: 114 PDF objects out of 1000 (max. 8388607)
284269 82 compressed objects within 1 object stream
285270 0 named destinations out of 1000 (max. 131072)
Binary files a/doc/sample1.pdf and b/doc/sample1.pdf differ
--- a/doc/sample1.tex
+++ b/doc/sample1.tex
@@ -130,50 +130,29 @@ PSフォント名<PSfont_name>を直接指定することもでき,
130130 (|test01-noembed.pdf|を参照).
131131 \enditem
132132
133+\item 不良なJFMを用いた場合,エラーを返すとともに,<font>の意味は|\relax|となる.
134+
133135 \beginparagraph 「和文文字の範囲」の設定
134136
135-\item |\defcharrange{<name>}{<char_range>}|: 文字範囲の定義.
136-\itemitem <name>: 範囲を参照するためにつけるkey.
137-\itemitem <range>: 文字範囲を|"100-"200, 800, 1701-|のように指定する.
137+\item |\defcharrange{<number>}{<char_range>}|: 文字範囲の新規定義/追加.
138+\itemitem <number>: 文字範囲の番号で,1--216の整数値で指定.
139+\itemitem <range>: 文字コードの範囲を|"100-"200, 800, 1701-|のように指定する.
138140 \itemT ASCII codeの範囲 (|0x00|--|0x7F|) は指定できない.
139-\itemT 既に他の文字範囲に使われている領域を指定することはできない.
140-また,内部処理の都合上,引数に指定している範囲達はdisjointでなければならない.
141-\item 各「文字範囲」ごとに,以下の5種類の取り扱い方を設定できる.
142-{\bf 下表の3, 4列目の部分についてはまだ未実装である.}
143-
144-\medskip
145-
146-\vbox{\leavevmode\hfill\leftskip=0pt\vbox{\lineskiplimit=\maxdimen\lineskip=0pt\halign{%
147-\quad\hfil#\hskip.5\zw\vrule height 1.38\zh depth 0.62\zh%
148-\hskip.5\zw&\hfil#\hfil\quad&\hfil#\hfil\quad&\hfil#\hfil\quad\cr
149-\noalign{\hrule height 0.8pt}
150- &\bf 和文文字扱い&|\catcode|&\bf |\jcharwidowpenalty|無視\cr
151-\noalign{\hrule}
152-|punct| &○ &12 &○ \cr
153-\noalign{\hrule}
154-|letter|&○ &12 &NO \cr
155-\noalign{\hrule}
156-|kanji| &○ &11 &NO \cr
157-\noalign{\hrule}
158-|kana| &○ &11 &NO \cr
159-\noalign{\hrule}
160-|noncjk|&NO &|\catcode|依存&---\cr
161-\noalign{\hrule height 0.8pt}
162-}}\hfill\null}
163-
164-Lua\TeX-ja では文字範囲の設定用に5つのattributeを確保しており,
165-{\bf 1つの文書中に設定できる文字範囲の数は49個までである.}
166-
167-\item デフォルトでは,|0x100|以降の文字コードは全部|kanji|扱いであり,さらに文字範囲として,
141+\itemT 既に他の$n$番の文字範囲に使われている領域を指定した場合は,
142+その領域は$n$番の文字範囲からは除外される.即ち,後に定義した文字範囲の方が優先度が高い.
143+\itemitem 定義した文字範囲ごとに,「和文扱い」「欧文扱い」をlocalに指定できる.
144+% 216 = (31*7-1)
145+
146+\item デフォルトでは,|U+0100|以降の文字は全部和文扱いであり,さらに文字範囲として,
168147 \begintt
169- \defcharrange{iso88591}{"80-"FF}
170- \setjaparameter{jcharrange={iso8859-1=noncjk}}
148+ \defcharrange{1}{"80-"FF}
149+ \setjaparameter{jcharrange={-1}}
171150 \endtt
172-が定義されている{\small(つまり|0x80|--|0xFF|の範囲は欧文扱い)\inhibitglue}.
151+と指定している{\small(つまりLatin-1 Supplementの範囲は欧文扱い)\inhibitglue}.
173152
174-TODO: 「{\setjaparameter{jcharrange={iso8859-1=kanji}}× (|U+00D7|)}」等,ISO 8859-1領域
153+TODO: 「{\setjaparameter{jcharrange={1}}× (|U+00D7|)}」等,ISO 8859-1領域
175154 にマッピングされた文字の扱い.
176-「{\setjaparameter{jcharrange={iso8859-1=kanji}}¢ (|U+00A2|)}」はHalfwidth and
155+「{\setjaparameter{jcharrange={1}}¢ (|U+00A2|)}」はHalfwidth and
177156 Fullwidth Formsに全角形(\char"FFE0)があるから%"
178157 luaotfloadの置換処理に割り込めばよいが…….
179158 \enditem
@@ -206,15 +185,29 @@ p\TeX の|\prebreakpenalty|に対応した設定項目である.
206185 p\TeX では,同一文字に対して|\prebreakpenalty|, |\postbreakpenalty|の両方を定義する
207186 ことはできなかったが,Lua\TeX-jaでは可能である.
208187
188+\item |kcatcode={<chr_code>, <kind>}|★\par\noindent
189+文字コード<chr_code>の文字が和文文字扱いされている時,
190+「和文文字の種類」を|0|--|"7FFFFFFF|の自然数値<kind>で指定する.%"
191+\itemitem 最下位bitはウィドウ防止用penaltyの挿入処理に関係する.
192+\itemitem デフォルトでは,次の3つのUnicodeの範囲において,|kcatcode=1|としている.
193+\itemT |U+2000|--|U+206F| (General Punctuation)
194+\itemT |U+3000|--|U+303F| (CJK Symbols and Punctuation)
195+\itemT |U+FF00|--|U+FFEF| (Halfwidth and Fullwidth Forms)
196+
209197 \item |cjkxspmode={<chr_code>, <mode>}|★\par\noindent
210198 p\TeX の|\inhibitxspcode|に対応した設定項目である.<mode>で許される値は,
211-\itemitem 0, 1, 2, 3: p\TeX の対応するprimitiveと同じ意味.
212-\itemitem |inhibit|: 前後の欧文文字との間の|\xkanjiskip|自動挿入を禁止.
213-\itemitem |preonly|: 前の欧文文字との間の|\xkanjiskip|自動挿入のみを許可.
214-\itemitem |postonly|: 後の欧文文字との間の|\xkanjiskip|自動挿入のみを許可.
215-\itemitem |allow|: 前後の欧文文字との間の|\xkanjiskip|自動挿入を許可.
199+\itemitem |0|, |inhibit|: 前後の欧文文字との間の|\xkanjiskip|自動挿入を禁止.
200+\itemitem |2|, |preonly|: 前の欧文文字との間の|\xkanjiskip|自動挿入のみを許可.
201+\itemitem |1|, |postonly|: 後の欧文文字との間の|\xkanjiskip|自動挿入のみを許可.
202+\itemitem |3|, |allow|: 前後の欧文文字との間の|\xkanjiskip|自動挿入を許可.
216203 \item |asciixspmode={<chr_code>, <mode>}|★\par\noindent
217204 同様に,p\TeX の|\xspcode|に対応した設定項目である.
205+<mode>で許される値は,
206+\itemitem |0|, |inhibit|: 前後の和文文字との間の|\xkanjiskip|自動挿入を禁止.
207+\itemitem |1|, |preonly|: 前の和文文字との間の|\xkanjiskip|自動挿入のみを許可.
208+\itemitem |2|, |postonly|: 後の和文文字との間の|\xkanjiskip|自動挿入のみを許可.
209+\itemitem |3|, |allow|: 前後の和文文字との間の|\xkanjiskip|自動挿入を許可.
210+
218211 \item |yabaselineshift=<dimen>|:
219212 p\TeX の|\yabaselineshift|に対応したものであり,欧文文字のベースライン補正量をdimensionで指定する.
220213 \itemitem 正の値を指定すると,その分だけ欧文文字は下にずれることとなる.
@@ -229,9 +222,10 @@ p\TeX では「和文が主」という考えからか,常に和文文字の
229222 また,この値を適切に調整することで,%
230223 {\small 異なる文字サイズの文字を「上下中央揃え」で組む}ことも可能である.
231224
232-\item |kanjiskip=<skip>|★\inhibitglue: |\kanjiskip=<skip>|と同じ意味.
233-\item |xkanjiskip=<skip>|★\inhibitglue: |\xkanjiskip=<skip>|と同じ意味.
234-\item |jcharwidowpenalty=<penalty>|★\inhibitglue: |\jcharwidowpenalty=<penalty>|と同じ意味.
225+\item |kanjiskip=<skip>|★\inhibitglue: 後に述べる|\kanjiskip=<skip>|と同じ意味.
226+\item |xkanjiskip=<skip>|★\inhibitglue: 後に述べる|\xkanjiskip=<skip>|と同じ意味.
227+\item |jcharwidowpenalty=<penalty>|★\inhibitglue:
228+後に述べる|\jcharwidowpenalty=<penalty>|と同じ意味.
235229 \item |autospacing[=<bool>]|★◎\par\noindent
236230 %\item |autospacing[=<bool>]|★\par\noindent
237231 和文文字間のglue(|\kanjiskip|)の自動挿入をするかしないかを制御.
@@ -248,20 +242,54 @@ glue/kernの計算方法を設定する.
248242 \itemitem {\tt average}: 両者の相加平均.
249243 \itemitem {\tt both}: 両者の合計値の幅をもつglue/kernを挿入する.
250244
251-\item |setjcharrange={<range_name>=<mode>}|:
252-\itemitem <range_name>: |\defcharrange|で定義した「文字コードの範囲」か,|other|を指定する.
253-|other|は,今まで定義した文字範囲の中に属さないような文字コード
254-$c\in [\hbox{\tt 0x100},\infty)$全体の集合を表す.
255-\itemitem <mode>: <range_name>で指定した範囲の文字の取扱を指定.
245+\item |jcharrange={<range_num>,<range_num>,...}|:
246+$\lvert\hbox{<range_num>}\rvert$番の文字範囲の文字を和文扱いするか欧文扱いするかを設定する.
247+\itemitem $\lvert\hbox{<range_num>}\rvert>216$の場合,
248+「どの文字範囲にも属さない|U+0100|以降の文字」に
249+対しての処理を行う.
250+\itemitem 正値が指定されたら,$\lvert\hbox{<range_num>}\rvert$番の文字範囲は和文文字扱いとなる.
251+\itemitem 負値が指定されたら,$\lvert\hbox{<range_num>}\rvert$番の文字範囲は欧文文字扱いとなる.
252+\itemitem $\hbox{<range_num>}=0$の場合は,単に無視される.
253+\enditem
256254
255+\beginparagraph 組版パラメタの取得
257256
258-\enditem
257+日本語組版用の各種パラメタの取得には,次の命令を用いる.
258+\begintt
259+ \getjaparameter{<key>} or \getjaparameter{<key>}{<chr_code>}
260+\endtt
261+戻り値は全て「空白は|\catcode=10|,それ以外の文字は全て|\catcode=12|」の文字列である.
262+
263+<key>に指定できる値は,説明がない限りは|\setjaparameter|で指定できる<key>と同じで,次の通りである,
264+
265+\item |kanjiskip|, |xkanjiskip|, |yabaselineshift|, |ykbaselineshift|, |jcharwidowpenalty|%
266+\par\noindent
267+それぞれ値を表現する文字列を返す.
268+
269+\item |differentjfm|: 戻り値は{\tt large}, {\tt small}, {\tt average}, {\tt both}の
270+4つの文字列のいずれか.
271+
272+\item |prebreakpenalty|, |postbreakpenalty|, |kcatcode|, |cjkxspmode|, |asciixspmode|
273+\par\noindent
274+これらは各文字コード別に設定される値であるので,文字コード<chr_code>を第2引数にとる.
275+指定されている整数値を表す文字列を返す.
276+
277+\item |jcharrange|: 文字範囲の番号$n$を第2引数にとり,$n$番の文字範囲が
278+和文文字扱いされていれば|0|,欧文文字扱いされていれば|1|を返す.
279+$n\notin [1,216]$の場合は,「どの文字範囲にも属さない|U+0100|以降の文字」に対しての結果を返す.
280+
281+\item |chartorange|: 文字コード<chr_code>を第2引数にとり,それが属している文字範囲の番号を返す.
282+\itemitem <chr_code>がUnicodeの範囲外または|0x80|未満ならば,|-1|を返す.
283+\itemitem 上の場合以外で,<chr_code>の文字がどの文字範囲にも属さない場合は,|217|を返す.
259284
260285 \beginparagraph その他の命令
261286
262287 \item skip |\kanjiskip|: 和文文字同士の間に入る空白量を指定.p\TeX の同名の命令と同様.
263288 \item skip |\xkanjiskip|: 和文文字と欧文文字の間に入る空白量.p\TeX の同名の命令と同様.
264-\item count |\jcharwidowpenalty|: {\bf 未実装}
289+\item count |\jcharwidowpenalty|: 段落において「最後の1文字のみが次の行に」くることを
290+抑制するためのpenalty値.このpenaltyは,段落内にある,最後の「|kcatcode|の最下位bitが
291+1で{\bf ない}ような和文文字」の直前に挿入される.
292+
265293 \item dimen |\zw|, |\zh|: 現在の和文フォントの「幅」/「高さ」(メトリックから指定)
266294 \item dimen |\jQ|, |\jH|${}= 0.25\,{\rm mm}$.
267295 \item |\inhibitglue|:
@@ -395,6 +423,7 @@ Lua\TeX で文字を表す|glyph_node|には|y_offset| fieldがあるので,
395423
396424 \enditem
397425
426+
398427 \vfill\eject
399428 \leftline{{\big 組版サンプル}\hfill
400429 \noindent 出典: 日本語Wikipediaの「\TeX」の項,2011/3/10}
--- a/src/luatexja-core.lua
+++ b/src/luatexja-core.lua
@@ -5,6 +5,7 @@ local node_insert_after = node.insert_after
55 local node_hpack = node.hpack
66 local round = tex.round
77 local node_new = node.new
8+local id_penalty = node.id('penalty')
89 local id_glyph = node.id('glyph')
910 local id_glue_spec = node.id('glue_spec')
1011 local id_glue = node.id('glue')
@@ -13,6 +14,7 @@ local next_node = node.next
1314 local attr_jchar_class = luatexbase.attributes['luatexja@charclass']
1415 local attr_curjfnt = luatexbase.attributes['luatexja@curjfnt']
1516 local attr_yablshift = luatexbase.attributes['luatexja@yablshift']
17+local attr_icflag = luatexbase.attributes['luatexja@icflag']
1618
1719 -- error messages
1820 function ltj.error(s,t)
@@ -75,7 +77,7 @@ end
7577
7678 ltj.stack_ch_table={}; ltj.stack_ch_table[0]={}
7779
78-local function new_stack_level()
80+local function get_stack_level()
7981 local i = tex.getcount('ltj@stack@pbp')
8082 if tex.currentgrouplevel > tex.getcount('ltj@group@level@pbp') then
8183 i = i+1 -- new stack level
@@ -88,9 +90,20 @@ local function new_stack_level()
8890 end
8991 return i
9092 end
91-function ltj.set_ch_table(g,m,c,p)
92- local i = new_stack_level()
93- if not ltj.stack_ch_table[i][c] then ltj.stack_ch_table[i][c] = {} end
93+function ltj.set_ch_table(g,m,c,p,lb,ub)
94+ local i = get_stack_level()
95+ if p<lb or p>ub then
96+ ltj.error('Invalid code (' .. p .. '), should in the range '
97+ .. tostring(lb) .. '..' .. tostring(ub) .. '.',
98+ {"I'm going to use 0 instead of that illegal code value."})
99+ p=0
100+ elseif c<0 or c>0x10FFFF then
101+ ltj.error('Invalid character code (' .. p
102+ .. '), should in the range 0.."10FFFF.',{})
103+ return
104+ elseif not ltj.stack_ch_table[i][c] then
105+ ltj.stack_ch_table[i][c] = {}
106+ end
94107 ltj.stack_ch_table[i][c][m] = p
95108 if g=='global' then
96109 for j,v in pairs(ltj.stack_ch_table) do
@@ -101,15 +114,13 @@ function ltj.set_ch_table(g,m,c,p)
101114 end
102115
103116 local function get_penalty_table(m,c)
104- local i = tex.getcount('ltj@stack@pbp')
105- i = ltj.stack_ch_table[i][c]
117+ local i = ltj.stack_ch_table[tex.getcount('ltj@stack@pbp')][c]
106118 if i then i=i[m] end
107119 return i or 0
108120 end
109121
110122 local function get_inhibit_xsp_table(c)
111- local i = tex.getcount('ltj@stack@pbp')
112- i = ltj.stack_ch_table[i][c]
123+ local i = ltj.stack_ch_table[tex.getcount('ltj@stack@pbp')][c]
113124 if i then i=i.xsp end
114125 return i or 3
115126 end
@@ -145,24 +156,29 @@ function ltj.out_ja_parameter_one(k)
145156 end
146157 end
147158
159+
160+
148161 function ltj.out_ja_parameter_two(k,c)
149- if k == 'prebreakpenalty' then
150- tex.write(get_penalty_table('pre',c))
151- elseif k == 'postbreakpenalty' then
152- tex.write(get_penalty_table('post',c))
153- elseif k == 'cjkxspmode' then
154- local i = get_inhibit_xsp_table(c)
155- if i==0 then tex.write('inhibit')
156- elseif i==1 then tex.write('postonly')
157- elseif i==2 then tex.write('preonly')
158- else tex.write('allow')
162+ if k == 'jcharrange' then
163+ if c<0 or c>216 then c=0 end
164+ tex.write(ltj.get_jcr_setting(c))
165+ else
166+ if c<0 or c>0x10FFFF then
167+ ltj.error('Invalid character code (' .. c
168+ .. '), should in the range 0.."10FFFF.',
169+ {"I'm going to use 0 instead of that illegal character code."})
170+ c=0
159171 end
160- elseif k == 'asciixspmode' then
161- local i = get_inhibit_xsp_table(c)
162- if i==0 then tex.write('inhibit')
163- elseif i==2 then tex.write('postonly')
164- elseif i==1 then tex.write('preonly')
165- else tex.write('allow')
172+ if k == 'prebreakpenalty' then
173+ tex.write(get_penalty_table('pre',c))
174+ elseif k == 'postbreakpenalty' then
175+ tex.write(get_penalty_table('post',c))
176+ elseif k == 'kcatcode' then
177+ tex.write(get_penalty_table('kcat',c))
178+ elseif k == 'chartorange' then
179+ tex.write(ltj.get_char_jcrnumber(c))
180+ elseif k == 'cjkxspmode' or k == 'asciixspmode' then
181+ tex.write(get_inhibit_xsp_table(c))
166182 end
167183 end
168184 end
@@ -213,9 +229,11 @@ end
213229 function calc_between_two_jchar(q,p)
214230 -- q, p: node (possibly null)
215231 local ps,pm,qs,qm,g,h
216- if not p then -- q is the last node
232+ if (not p) or (p.id==id_glue and p.subtype==15) then
233+ -- q is the last node
234+ -- (p is nil or \parfillskip)
217235 qs, qm = find_size_metric(q)
218- if not qm then
236+ if not qm then
219237 return nil
220238 else
221239 g=new_jfm_glue(qs,qm,
@@ -263,6 +281,7 @@ function calc_between_two_jchar(q,p)
263281 g=ltj.calc_between_two_jchar_aux(g,h)
264282 end
265283 end
284+ if g then node.set_attribute(g,attr_icflag,2) end
266285 return g
267286 end
268287
@@ -271,7 +290,7 @@ end
271290 -- o a hbox by \parindent
272291 -- o a whatsit node which contains local paragraph materials.
273292 -- When we insert jfm glues, we ignore these nodes.
274-function ltj.is_parindent_box(p)
293+local function parindent_box(p)
275294 if node_type(p.id)=='hlist' then
276295 return (p.subtype==3)
277296 -- hlist (subtype=3) is a box by \parindent
@@ -285,10 +304,10 @@ local function add_kinsoku_penalty(head,p)
285304 local e = get_penalty_table('pre',c)
286305 if e~=0 then
287306 local q = node.prev(p)
288- if q and node_type(q.id)=='penalty' then
307+ if q and q.id==id_penalty then
289308 q.penalty=q.penalty+e
290309 else
291- q=node_new(node.id('penalty'))
310+ q=node_new(id_penalty)
292311 q.penalty=e
293312 node_insert_before(head,p,q)
294313 end
@@ -296,11 +315,11 @@ local function add_kinsoku_penalty(head,p)
296315 e = get_penalty_table('post',c)
297316 if e~=0 then
298317 local q = next_node(p)
299- if q and node_type(q.id)=='penalty' then
318+ if q and q.id==id_penalty then
300319 q.penalty=q.penalty+e
301320 return false
302321 else
303- q=node_new(node.id('penalty'))
322+ q=node_new(id_penalty)
304323 q.penalty=e
305324 node_insert_after(head,p,q)
306325 return true
@@ -308,19 +327,47 @@ local function add_kinsoku_penalty(head,p)
308327 end
309328 end
310329
311--- Insert jfm glue: main routine
330+local function insert_widow_penalty(head,jq)
331+ if not jq then
332+ return head
333+ end
334+ local p = node.prev(jq)
335+ local jwp=tex.getcount('jcharwidowpenalty')
336+ if p and has_attr(p,attr_icflag)==2 then
337+ jq=p -- the case where jq has the non-zero \prebreakpenalty.
338+ end
339+ if jq.id==id_penalty then
340+ jq.penalty=jq.penalty + jwp
341+ return head
342+ else
343+ local g = node.new(id_penalty)
344+ g.penalty=jwp
345+ return node_insert_before(head,jq,g)
346+ end
347+end
312348
313-local function insert_jfm_glue(head)
349+local depth=""
350+
351+-- Insert jfm glue: main routine
352+-- mode = true iff insert_jfm_glue is called from pre_linebreak_filter
353+local function insert_jfm_glue(head, mode)
314354 local p = head
315355 local q = nil -- the previous node of p
356+ local jq = nil -- 最後の「句読点扱いでない」和文文字
316357 local g
317358 local ihb_flag = false
318- local inserted_after_penalty = false
319- if not p then
320- return head
359+ local pn = nil
360+ if not p then return head
361+ elseif mode then
362+ while p and parindent_box(p) do p=next_node(p) end
363+ pn=node.tail(head)
364+ if pn and pn.id==id_glue and pn.subtype==15 then
365+ pn=node.prev(pn)
366+ while (pn and pn.id==id_penalty) do pn=node.prev(pn) end
367+ end
368+ if pn then pn=next_node(pn) end
321369 end
322- while p and ltj.is_parindent_box(p) do p=next_node(p) end
323- while p do
370+ while p~=pn do
324371 if p.id==id_whatsit and p.subtype==node.subtype('user_defined')
325372 and p.user_id==30111 then
326373 g=p; p=next_node(p);
@@ -333,15 +380,14 @@ local function insert_jfm_glue(head)
333380 -- If p is the first node (=head), the skip is inserted
334381 -- before head. So we must change head.
335382 end
336- --if is_japanese_glyph_node(q) then
337- -- node.insert(q, inserted_after_penalty)
338- --end
339383 q=p; ihb_flag=false;
340- if is_japanese_glyph_node(p)
341- and add_kinsoku_penalty(head,p) then
342- p=next_node(p); inserted_after_penalty = true
343- else
344- inserted_after_penalty = false
384+ if is_japanese_glyph_node(p) then
385+ if get_penalty_table('kcat',p.char)%2~=1 then
386+ jq=p
387+ end
388+ if add_kinsoku_penalty(head,p) then
389+ p=next_node(p)
390+ end
345391 end
346392 p=next_node(p)
347393 end
@@ -349,6 +395,11 @@ local function insert_jfm_glue(head)
349395 -- Insert skip after the last node
350396 g=calc_between_two_jchar(q,nil)
351397 if g then h = node_insert_after(head,q,g) end
398+
399+ if mode then
400+ -- Insert \jcharwidowpenalty
401+ head = insert_widow_penalty(head,jq)
402+ end
352403 return head
353404 end
354405
@@ -518,7 +569,7 @@ local function insks_around_penalty(head,q,p)
518569 if r and r.id==id_glyph then
519570 if is_japanese_glyph_node(r) then
520571 cx=r.char
521- if is_japanese_glyph_node(p) then
572+ if is_japanese_glyph_node(q) then
522573 local g = node_new(id_glue)
523574 g.subtype=0; g.spec=node.copy(kanji_skip)
524575 node_insert_before(head,r,g)
@@ -539,7 +590,7 @@ end
539590 -- Insert \xkanjiskip around p, a kern
540591 local function insks_around_kern(head,q,p)
541592 if p.subtype==1 then -- \kern or \/
542- if not has_attr(p,luatexbase.attributes['luatexja@icflag']) then
593+ if not has_attr(p,attr_icflag) then
543594 insert_skip=no_skip
544595 end
545596 elseif p.subtype==2 then -- \accent: We ignore the accent character.
@@ -680,9 +731,10 @@ local function set_ja_width(head)
680731 end
681732
682733 -- main process
683-local function main_process(head)
734+-- mode = true iff main_process is called from pre_linebreak_filter
735+local function main_process(head, mode)
684736 local p = head
685- p = insert_jfm_glue(p)
737+ p = insert_jfm_glue(p,mode)
686738 p = insert_kanji_skip(p)
687739 p = baselineshift(p)
688740 p = set_ja_width(p)
@@ -690,7 +742,6 @@ local function main_process(head)
690742 end
691743
692744 -- debug
693-local depth=""
694745 function ltj.show_node_list(head)
695746 local p =head; local k = depth
696747 depth=depth .. '.'
@@ -708,8 +759,10 @@ function ltj.show_node_list(head)
708759 print(depth .. ' whatsit', p.subtype)
709760 elseif pt == 'glue' then
710761 print(depth .. ' glue', p.subtype, print_spec(p.spec))
762+ elseif pt == 'penalty' then
763+ print(depth .. ' penalty', p.penalty)
711764 else
712- print(depth .. ' ' .. s, s.subtype)
765+ print(depth .. ' ' .. node.type(p.id), p.subtype)
713766 end
714767 p=next_node(p)
715768 end
@@ -766,11 +819,11 @@ luatexbase.add_to_callback('process_input_buffer',
766819
767820 luatexbase.add_to_callback('pre_linebreak_filter',
768821 function (head,groupcode)
769- return main_process(head)
822+ return main_process(head, true)
770823 end,'ltj.pre_linebreak_filter',2)
771824 luatexbase.add_to_callback('hpack_filter',
772825 function (head,groupcode,size,packtype)
773- return main_process(head)
826+ return main_process(head, false)
774827 end,'ltj.hpack_filter',2)
775828
776829 --insert before callbacks from luaotfload
--- a/src/luatexja-core.sty
+++ b/src/luatexja-core.sty
@@ -11,6 +11,7 @@
1111
1212 \newcount\luatexja@tempcnta
1313 \newcount\luatexja@tempcntb
14+\newcount\luatexja@tempcntc
1415 \newdimen\luatexja@tempdima
1516
1617 \newcount\luatexja@autospc
@@ -31,16 +32,6 @@
3132 \newluatexattribute\luatexja@ykblshift % attribute for \ykbaselineshift
3233 \newluatexattribute\luatexja@icflag % attribute for italic correction
3334 \newlanguage\luatexja@japanese
34-\expandafter\newluatexattribute\csname luatexja@kcat0\endcsname
35-\expandafter\newluatexattribute\csname luatexja@kcat1\endcsname
36-\expandafter\newluatexattribute\csname luatexja@kcat2\endcsname
37-\expandafter\newluatexattribute\csname luatexja@kcat3\endcsname
38-\expandafter\newluatexattribute\csname luatexja@kcat4\endcsname
39-\csname luatexja@kcat0\endcsname='0
40-\csname luatexja@kcat1\endcsname='0
41-\csname luatexja@kcat2\endcsname=0
42-\csname luatexja@kcat3\endcsname=0
43-\csname luatexja@kcat4\endcsname=0
4435
4536 %%%%%%%% Loading lua files
4637 \directlua{%
@@ -54,13 +45,23 @@
5445 end
5546 require('lualibs')
5647 ltj.loadlua('luatexja-rmlgbm.lua')
57- % This file must be read before luatexja-jfont.lua. For Ryumin-Light and GothicBBB-Medium.
48+ % For Ryumin-Light and GothicBBB-Medium.
5849 ltj.loadlua('luatexja-core.lua')
5950 ltj.loadlua('luatexja-jfont.lua')
6051 ltj.loadlua('luatexja-core-aux.lua')
6152 ltj.ja_lang_number=\the\luatexja@japanese
6253 }
6354
55+
56+%%%%%%%% Attributes for character ranges
57+\luatexja@tempcnta=0
58+\loop\ifnum\luatexja@tempcnta<7
59+ \expandafter\newluatexattribute%
60+ \csname luatexja@kcat\the\luatexja@tempcnta\endcsname
61+ \csname luatexja@kcat\the\luatexja@tempcnta\endcsname=0
62+ \advance\luatexja@tempcnta by1
63+\repeat
64+
6465 %%%%%%%% \asluastring
6566 \def\asluastring#1{'\luaescapestring{\detokenize{#1}}'}
6667
@@ -77,8 +78,7 @@
7778
7879 %%%%%%%% \defcharrange<name>{100-200,3000-,5000,...}
7980 \def\defcharrange#1#2{%
80- \def\ltj@nametemp{#1}\expandafter\ltj@dcrange#2,,\relax
81- \ltj@defcrkey{#1}\relax}
81+ \ltj@tempcntc=#1 \expandafter\ltj@dcrange#2,,\ignorespaces}
8282 \def\ltj@dcrange#1,{\def\ltj@temp{#1}%
8383 \ifx\ltj@temp\empty\let\@next=\relax\else
8484 \ltj@@dcrange{#1}\let\@next=\ltj@dcrange\fi\@next}
@@ -92,8 +92,8 @@
9292 \def\ltj@temp{#2}%
9393 \ifx\ltj@temp\empty\luatexja@tempcntb="10FFFF \else\luatexja@tempcntb=#2 \fi%"
9494 \fi
95- \directlua{ltj.def_jchar_range(\the\luatexja@tempcnta,\the\luatexja@tempcntb,
96- '\ltj@nametemp')}%
95+ \directlua{ltj.def_char_range(\the\luatexja@tempcnta,\the\luatexja@tempcntb,
96+ \the\luatexja@tempcntc)}%
9797 }
9898
9999 %%%%%%%% \setjaparameter
@@ -101,15 +101,17 @@
101101 \ltj@group@level@pbp=0 \ltj@stack@pbp=0
102102
103103 % prebreakpenalty = {<char_code>, <penalty>}
104+\define@key[ltj]{japaram}{kcatcode}{%
105+ \expandafter\luatexja@setbp#1:{kcat}{0}{0x7FFFFFFF}}
104106 \define@key[ltj]{japaram}{prebreakpenalty}{%
105- \expandafter\luatexja@setbp#1:{pre}}
107+ \expandafter\luatexja@setbp#1:{pre}{-10000}{10000}}
106108 \define@key[ltj]{japaram}{postbreakpenalty}{%
107- \expandafter\luatexja@setbp#1:{post}}
108-\def\luatexja@setbp#1,#2:#3{
109+ \expandafter\luatexja@setbp#1:{post}{-10000}{10000}}
110+\def\luatexja@setbp#1,#2:#3#4#5{
109111 \luatexja@tempcnta=#1\relax
110112 \luatexja@tempcntb=#2\relax
111113 \directlua{ltj.set_ch_table(ltj.isglobal, \asluastring{#3},
112- tex.getcount('luatexja@tempcnta'),tex.getcount('luatexja@tempcntb'))}}
114+ tex.getcount('luatexja@tempcnta'),tex.getcount('luatexja@tempcntb'),#4,#5)}}
113115
114116 % yabaselineshift = <dimen>
115117 \define@key[ltj]{japaram}{yabaselineshift}{%
@@ -136,7 +138,7 @@
136138 \def\ltj@tempa{allow}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{3}\fi
137139 \luatexja@tempcnta=#1\relax\luatexja@tempcntb=\ltj@temp\relax
138140 \directlua{ltj.set_ch_table(ltj.isglobal, 'xsp', tex.getcount('luatexja@tempcnta'),
139- tex.getcount('luatexja@tempcntb'))}}
141+ tex.getcount('luatexja@tempcntb'),0,3)}}
140142
141143 % asciixspmode = {<char_code>, <mode>}
142144 % mode: inhibit, preonly, postonly, allow
@@ -151,7 +153,7 @@
151153 \def\ltj@tempa{allow}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{3}\fi
152154 \luatexja@tempcnta=#1\relax\luatexja@tempcntb=\ltj@temp\relax
153155 \directlua{ltj.set_ch_table(ltj.isglobal, 'xsp', tex.getcount('luatexja@tempcnta'),
154- tex.getcount('luatexja@tempcntb'))}}
156+ tex.getcount('luatexja@tempcntb'),0,3)}}
155157
156158 % autospacing = <bool> (default: true)
157159 \define@boolkey[ltj]{japaram}{autospacing}[true]{%
@@ -191,16 +193,24 @@
191193 % large, small, average, both
192194
193195
194-% jcharrange = { <range_name> = { kanji | kana | letter | punct | noncjk} }
195-\def\ltj@defcrkey#1{\message{(#1)}\define@choicekey*+[ltj]{charrange}{#1}[\ltj@temp\ltj@result]%
196- {kanji,kana,letter,punct,noncjk}{%
197- \directlua{ltj.set_jchar_range(ltj.isglobal, '#1',\ltj@result)}}\relax}
198-\define@key[ltj]{japaram}{jcharrange}{\setkeys[ltj]{charrange}{#1}}
196+% jcharrange = { +-<range_number> }
197+\define@key[ltj]{japaram}{jcharrange}{\expandafter\@setjcharrange#1,,}
198+\def\@setjcharrange#1,{%
199+ \edef\ltj@temp{#1}%
200+ \ifx\ltj@temp\empty\let\next=\relax\else\let\next=\@setjcharrange
201+ \luatexja@tempcnta=#1 \directlua{ltj.set_jchar_range(%
202+ ltj.is_global,tex.getcount('luatexja@tempcnta'))}%
203+ \fi\next
204+}
205+
206+
207+
208+
199209
200210 \def\setjaparameter#1{\directlua{ltj.isglobal=''}%
201- \setkeys[ltj]{japaram}{#1}}
211+ \setkeys[ltj]{japaram}{#1}\ignorespaces}
202212 \def\globalsetjaparameter#1{\directlua{ltj.isglobal='global'}%
203- \setkeys[ltj]{japaram}{#1}}
213+ \setkeys[ltj]{japaram}{#1}\ignorespaces}
204214
205215 %%%%%%%%
206216 \def\getjaparameter#1{%
@@ -209,12 +219,15 @@
209219 \def\ltj@tempa{postbreakpenalty}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
210220 \def\ltj@tempa{cjkxspmode}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
211221 \def\ltj@tempa{asciixspmode}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
222+ \def\ltj@tempa{kcatcode}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
223+ \def\ltj@tempa{jcharrange}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
224+ \def\ltj@tempa{chartorange}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
212225 \@next
213226 }
214227 \def\getjaparameter@one{\directlua{ltj.out_ja_parameter_one('\ltj@temp')}}
215228 \def\getjaparameter@two#1{%
216229 \luatexja@tempcnta=#1
217- \directlua{ltj.out_ja_parameter_two('\ltj@temp', tex.getcount('luatexja@tempcnta'))}%
230+ \directlua{ltj.out_ja_parameter_two('\ltj@temp', tex.getcount('luatexja@tempcnta'))}
218231 }
219232
220233
--- a/src/luatexja-jfont.lua
+++ b/src/luatexja-jfont.lua
@@ -106,6 +106,8 @@ function ltj.jfontdefY() -- for horizontal font
106106 ltj.error("bad JFM '" .. jfmfname .. "'",
107107 {[1]='The JFM file you specified is not valid JFM file.',
108108 [2]='Defining Japanese font is cancelled.'})
109+ tex.sprint(ltj.is_global .. '\\expandafter\\let\\csname '
110+ .. ltj.cstemp .. '\\endcsname=\\relax')
109111 return
110112 end
111113 ltj.font_metric_table[fn]={}
@@ -156,107 +158,69 @@ end
156158
157159
158160 --====== Range of Japanese characters.
159-local threshold = 0x100 -- must be >=0x100
160--- below threshold: kcat_table_main[chr_code] = index
161--- above threshold: kcat_table_range =
162--- { [1] = {b_1, b_2, ...},
163--- [2] = {i_1, i_2, ...} }
164--- ( Characters b_i<=chr_code <b_{i+1} have the index i_i )
165--- kcat_table_index = index1, index2, ...
161+-- jcr_table_main[chr_code] = index
162+-- index : internal 0, 1, 2, ..., 216 0: 'other'
163+-- external 1 2 216, (out of range): 'other'
166164
167--- init
165+-- init:
168166 local ucs_out = 0x110000
169-local kcat_table_main = {}
170-kcat_table_range = { [1] = {threshold,ucs_out}, [2] = {0,-1} }
171-kcat_table_index = { [0] = 'other' ,
172- [1] = 'iso8859-1'}
173-
174-local kc_kanji = 0
175-local kc_kana = 1
176-local kc_letter = 2
177-local kc_punct = 3
178-local kc_noncjk = 4
167+local jcr_table_main = {}
168+local jcr_cjk = 0
169+local jcr_noncjk = 1
179170
180171 for i=0x80,0xFF do
181- kcat_table_main[i]=1
182-end
183-for i=0x100,threshold-1 do
184- kcat_table_main[i]=0
172+ jcr_table_main[i]=1
185173 end
186-
187-local function add_jchar_range(b,e,ind)
188- -- We assume that e>=b
189- if b<threshold then
190- for i=math.max(0x80,b),math.min(threshold-1,e) do
191- kcat_table_main[i]=ind
192- end
193- if e<threshold then return true else b=threshold end
194- end
195- local insp
196- for i,v in ipairs(kcat_table_range[1]) do
197- if v>e then
198- insp = i-1; break
199- end
200- end
201- if kcat_table_range[1][insp]>b or kcat_table_range[2][insp]>1 then
202- ltj.error("Bad character range",{}); return nil -- error
203- end
204- if kcat_table_range[1][insp]<b then
205- -- now [insp]← <b .. b .. [insp+1]← >e
206- table.insert(kcat_table_range[1],insp+1,b)
207- table.insert(kcat_table_range[2], insp+1, kcat_table_range[2][insp])
208- insp=insp+1
209- end
210- -- [insp]← =b .. e .. [insp+1]← >e
211- table.insert(kcat_table_range[1], insp+1,e+1)
212- table.insert(kcat_table_range[2], insp+1, kcat_table_range[2][insp])
213- kcat_table_range[2][insp]=ind
174+for i=0x100,ucs_out-1 do
175+ jcr_table_main[i]=0
214176 end
215177
216-function ltj.def_jchar_range(b,e,name)
217- local ind = #kcat_table_index+1
218- for i,v in pairs(kcat_table_index) do
219- if v==name then ind=i; break end
220- end
221- if ind>=50 then
222- ltj.error("No room for new character range",{}); return -- error
178+function ltj.def_char_range(b,e,ind) -- ind: external range number
179+ if ind<0 or ind>216 then
180+ ltj.error('Invalid range number (' .. ind .. '), should be in the range 1..216.',
181+ {}); return
223182 end
224- if ind == #kcat_table_index+1 then
225- table.insert(kcat_table_index, name)
226- print('New char range: ' .. name, ind)
183+ for i=math.max(0x80,b),math.min(ucs_out-1,e) do
184+ jcr_table_main[i]=ind
227185 end
228- add_jchar_range(b,e,ind)
229186 end
230187
231-local function get_char_kcatcode(p)
188+local function get_char_jcrcode(p) -- for internal use
232189 local i
233190 local c = p.char
234- if c<0x80 then return kc_noncjk
235- elseif c<threshold then i=kcat_table_main[c]
236- else
237- for j,v in ipairs(kcat_table_range[1]) do
238- if v>c then
239- i = kcat_table_range[2][j-1]; break
240- end
241- end
242- end
191+ if c<0x80 then return jcr_noncjk else i=jcr_table_main[c] end
243192 return math.floor(has_attr(p,
244- luatexbase.attributes['luatexja@kcat'..math.floor(i/10)])
245- /math.pow(8, i%10))%8
193+ luatexbase.attributes['luatexja@kcat'..math.floor(i/31)])
194+ /math.pow(2, i%31))%2
195+end
196+
197+function ltj.get_char_jcrnumber(c) -- return the (external) range number
198+ if c<0x80 or c>=ucs_out then return -1
199+ else
200+ local i = jcr_table_main[c] or 0
201+ if i==0 then return 217 else return i end
202+ end
203+end
204+
205+function ltj.get_jcr_setting(i) -- i: internal range number
206+ return math.floor(tex.getattribute(luatexbase.attributes['luatexja@kcat'..math.floor(i/31)])
207+ /math.pow(2, i%31))%2
246208 end
247209
248210 -- 和文文字と認識する unicode の範囲
249211 function ltj.is_ucs_in_japanese_char(p)
250- return (get_char_kcatcode(p)~=kc_noncjk)
212+ return (get_char_jcrcode(p)~=jcr_noncjk)
251213 end
252214
253-function ltj.set_jchar_range(g, name,kc)
254- local ind = 0
255- for i,v in pairs(kcat_table_index) do
256- if v==name then ind=i; break end
215+function ltj.set_jchar_range(g, i) -- i: external range number
216+ if i==0 then return
217+ else
218+ local kc
219+ if i>0 then kc=0 else kc=1; i=-i end
220+ if i>216 then i=0 end
221+ local attr = luatexbase.attributes['luatexja@kcat'..math.floor(i/31)]
222+ local a = tex.getattribute(attr)
223+ local k = math.pow(2, i%31)
224+ tex.setattribute(g,attr,(math.floor(a/k/2)*2+kc)*k+a%k)
257225 end
258- local attr = luatexbase.attributes['luatexja@kcat'..math.floor(ind/10)]
259- local a = tex.getattribute(attr)
260- local k = math.pow(8, ind%10)
261- tex.setattribute(g,attr,(math.floor(a/k/8)*8+kc)*k+a%k)
262226 end
\ No newline at end of file
--- a/src/luatexja-plain.tex
+++ b/src/luatexja-plain.tex
@@ -10,15 +10,30 @@
1010 \let\mc=\tenmin
1111 \let\gt=\tengt
1212 \mc
13-\catcode`\@=11\ltj@defcrkey{other} \ltj@defcrkey{iso8859-1}\catcode`\@=12
14-\setjaparameter{jcharrange={iso8859-1=noncjk}}
1513 \setjaparameter{kanjiskip=0pt plus 0.4pt minus 0.4pt,
1614 xkanjiskip=.25\zw plus 1pt minus 1pt,
17- autospacing, autoxspacing,
15+ autospacing, autoxspacing, jcharrange={-1},
1816 yabaselineshift=0pt, ykbaselineshift=0pt,
1917 jcharwidowpenalty=500, differentjfm=average
2018 }
2119
2220 \input luatexja-kinsoku.tex
2321
22+\luatexja@tempcnta="2000%"
23+\loop\ifnum\luatexja@tempcnta<"2070%"
24+ \setjaparameter{kcatcode={\luatexja@tempcnta,1}}%
25+ \advance\luatexja@tempcnta by1
26+\repeat
27+
28+\luatexja@tempcnta="3000%"
29+\loop\ifnum\luatexja@tempcnta<"3040%"
30+ \setjaparameter{kcatcode={\luatexja@tempcnta,1}}%
31+ \advance\luatexja@tempcnta by1
32+\repeat
33+
34+\luatexja@tempcnta="FF00%"
35+\loop\ifnum\luatexja@tempcnta<"FFF0%"
36+ \setjaparameter{kcatcode={\luatexja@tempcnta,1}}%
37+ \advance\luatexja@tempcnta by1
38+\repeat
2439 \endinput
\ No newline at end of file
Binary files a/test/test03-after.pdf and b/test/test03-after.pdf differ
--- a/test/test03-after.tex
+++ b/test/test03-after.tex
@@ -3,6 +3,8 @@
33 \def\\{\hfill\break}
44 \tentt\tenmin
55
6+{\tengt ■パラメタ代入テスト}
7+
68 \catcode`\@=11
79 \the\luatexja@ykblshift
810 \setjaparameter{ykbaselineshift=\maxdimen,autoxspacing=false}
@@ -10,16 +12,18 @@
1012 \getjaparameter{ykbaselineshift}
1113
1214 \getjaparameter{kanjiskip},
13-\getjaparameter{xkanjiskip},
15+\getjaparameter{xkanjiskip}
16+
1417 \getjaparameter{autospacing},
15-\getjaparameter{autoxspacing},
18+\getjaparameter{autoxspacing}
19+
1620 \getjaparameter{differentjfm}.
1721 \setjaparameter{ykbaselineshift=0pt,autoxspacing=true}
1822
1923
20-あいうえお{\setjaparameter{ykbaselineshift=2pt}かきくけこ}さしすせそ
24+あいうえお{\setjaparameter{ykbaselineshift=2pt}かきくけこ}さしすせそ: local
2125
22-あいうえお{\globalsetjaparameter{ykbaselineshift=2pt}かきくけこ}さしすせそ
26+あいうえお{\globalsetjaparameter{ykbaselineshift=2pt}かきくけこ}さしすせそ: global
2327
2428 \getjaparameter{prebreakpenalty}{`(},
2529 \getjaparameter{prebreakpenalty}{`)},
@@ -32,6 +36,9 @@
3236
3337 a\inhibitglue (a)\inhibitglue aあa〜a
3438
39+\medskip
40+xspmode
41+
3542 \getjaparameter{cjkxspmode}{`(},
3643 \getjaparameter{cjkxspmode}{`)},
3744 \getjaparameter{cjkxspmode}{`あ},
@@ -48,6 +55,9 @@ a\inhibitglue (a)\inhibitglue aあa〜a
4855 {\setjaparameter{kanjiskip=0pt plus 1fi minus 1fil}\getjaparameter{kanjiskip}\par}
4956 {x\setjaparameter{kanjiskip=0pt plus 1fill minus 1filll}\getjaparameter{kanjiskip}\par}
5057
58+\medskip
59+{\tengt ■合字テスト}
60+
5161 \tenrm
5262 {\setjaparameter{asciixspmode={`i,preonly},ykbaselineshift=0pt}
5363 あiあfiあffiあ\par}
@@ -55,6 +65,6 @@ a\inhibitglue (a)\inhibitglue aあa〜a
5565 {\setjaparameter{asciixspmode={`f,postonly},ykbaselineshift=0pt}
5666 あfあfiあffiあ\par}
5767
58-\setjaparameter{asciixspmode={-1,inhibit}}
68+\setjaparameter{asciixspmode={0,inhibit}}
5969 あ$a$あ
6070 \end
--- a/test/test04-jfm.log
+++ b/test/test04-jfm.log
@@ -1,4 +1,4 @@
1-This is LuaTeX, Version beta-0.66.0-2011032121 (rev 4093) (format=luatex 2011.3.21) 19 APR 2011 21:02
1+This is LuaTeX, Version beta-0.66.0-2011032121 (rev 4093) (format=luatex 2011.4.20) 23 APR 2011 12:44
22 restricted \write18 enabled.
33 **test04-jfm.tex
44 (./test04-jfm.tex
@@ -170,18 +170,27 @@ Package: infwarerr 2010/04/08 v1.3 Providing info/warning/message (HO)
170170 )
171171 \luatexja@tempcnta=\count281
172172 \luatexja@tempcntb=\count282
173+\luatexja@tempcntc=\count283
173174 \luatexja@tempdima=\dimen256
174-\luatexja@autospc=\count283
175-\luatexja@autoxspc=\count284
176-\jcharwidowpenalty=\count285
175+\luatexja@autospc=\count284
176+\luatexja@autoxspc=\count285
177+\jcharwidowpenalty=\count286
177178 \kanjiskip=\skip256
178179 \xkanjiskip=\skip257
179180 \zw=\dimen257
180181 \zh=\dimen258
181182 \jQ=\dimen259
182183 \jH=\dimen260
184+\luatexja@curjfnt=\luatexattribute9
185+\luatexja@charclass=\luatexattribute10
186+\luatexja@yablshift=\luatexattribute11
187+\luatexja@ykblshift=\luatexattribute12
188+\luatexja@icflag=\luatexattribute13
189+\luatexja@japanese=\language87
183190
184191 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-rmlgbm.lua)
192+(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-rmlgbm-data.lu
193+a)
185194 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-core.lua)
186195 Module luatexbase-mcb info: inserting 'ltj.process_input_buffer'
187196 (luatexbase-mcb) at position 1 in 'process_input_buffer'
@@ -195,32 +204,23 @@ Module luatexbase-mcb info: inserting 'ltj.hyphenate'
195204 (luatexbase-mcb) at position 1 in 'hyphenate'
196205 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-jfont.lua)
197206 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-core-aux.lua)
198-\luatexja@curjfnt=\luatexattribute9
199-\luatexja@charclass=\luatexattribute10
200-\luatexja@yablshift=\luatexattribute11
201-\luatexja@ykblshift=\luatexattribute12
202-\luatexja@icflag=\luatexattribute13
203-\luatexja@japanese=\language87
204-\ltj@stack@pbp=\count286
205-\ltj@group@level@pbp=\count287
207+\luatexja@kcat0=\luatexattribute14
208+\luatexja@kcat1=\luatexattribute15
209+\luatexja@kcat2=\luatexattribute16
210+\luatexja@kcat3=\luatexattribute17
211+\luatexja@kcat4=\luatexattribute18
212+\luatexja@kcat5=\luatexattribute19
213+\luatexja@kcat6=\luatexattribute20
214+\ltj@stack@pbp=\count287
215+\ltj@group@level@pbp=\count288
206216
207217 plain format: loading luatexja-plain.tex
208218 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-plain.tex
209-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-rmlgbm-data.lu
210-a)
211-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)
212-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)
213-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)
214-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)
215-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)
216219 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)
217220 (/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/luatexja-kinsoku.tex)))
218-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)(load: /ho
219-me/h7k/.texlive2010/texmf-var/luatex-cache/generic/fonts/otf/temp-ipam.lua)
220-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)(load: /ho
221-me/h7k/.texlive2010/texmf-var/luatex-cache/generic/fonts/otf/temp-kozminpr6n-re
222-gular.lua)
223-(/opt/texlive/p2010/../texmf-local/tex/generic/luatexja/jfm-ujis.lua)
221+(load: /home/h7k/.texlive2010/texmf-var/luatex-cache/generic/fonts/otf/temp-ipa
222+m.lua)(load: /home/h7k/.texlive2010/texmf-var/luatex-cache/generic/fonts/otf/te
223+mp-kozminpr6n-regular.lua)
224224 (./jfm-bad.lua)
225225 ! LuaTeX-ja error: bad JFM 'bad'.
226226 \@jfont ->\directlua {ltj.jfontdefY()}
@@ -228,11 +228,31 @@ gular.lua)
228228 <to be read again>
229229 \rml
230230 l.15 \rml
231- あ󿿿
232-? h
231+ あ123 % \rml は未定義となる󿿿
233232 The JFM file you specified is not valid JFM file.
234233 Defining Japanese font is cancelled.
235-?
234+
235+(load: /home/h7k/.texlive2010/texmf-var/luatex-cache/generic/fonts/otf/temp-ipa
236+exg.lua)
237+! Undefined control sequence.
238+\defcharrange #1#2->\ltj@tempcntc
239+ =#1 \expandafter \ltj@dcrange #2,,\ignores...
240+l.25 \defcharrange{2}{`あ,"E0-"FF}
241+
242+The control sequence at the end of the top line
243+of your error message was never \def'ed. If you have
244+misspelled it (e.g., `\hobx'), type `I' and the correct
245+spelling (e.g., `I\hbox'). Otherwise just continue,
246+and I'll forget about whatever was undefined.
247+
248+! LuaTeX-ja error: Invalid character code (-1), should in the range 0.."10FFFF.
249+.
250+\@next ...p ', tex.getcount('luatexja@tempcnta'))}
251+
252+l.46 \getjaparameter{chartorange}{-1}
253+ % must be -1
254+I'm going to use 0 instead of that illegal character code.
255+
236256 [1{/opt/texlive/p2010/texmf-var/fonts/map/pdftex/updmap/pdftex.map
237257 LuaTeX warning (file /opt/texlive/p2010/texmf-var/fonts/map/pdftex/updmap/pdfte
238258 x.map): fontmap entry for `bchb8r' already exists, duplicates ignored
@@ -251,12 +271,13 @@ x.map): fontmap entry for `bchri8r' already exists, duplicates ignored
251271
252272 LuaTeX warning (file /opt/texlive/p2010/texmf-var/fonts/map/pdftex/updmap/pdfte
253273 x.map): fontmap entry for `bchro8r' already exists, duplicates ignored
254-}] )</opt/texlive/p2010/texmf/fonts/opentype/test/kozuka/KozMinPr6N-Regular.otf
255-></opt/texlive/p2010/texmf/fonts/truetype/test/ipam.ttf></opt/texlive/p2010/tex
256-mf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
257-Output written on test04-jfm.pdf (1 page, 163518 bytes).
258-PDF statistics: 31 PDF objects out of 1000 (max. 8388607)
259- 19 compressed objects within 1 object stream
274+}] )</opt/texlive/p2010/texmf/fonts/truetype/test/ipaexg.ttf></opt/texlive/p201
275+0/texmf/fonts/opentype/test/kozuka/KozMinPr6N-Regular.otf></opt/texlive/p2010/t
276+exmf/fonts/truetype/test/ipam.ttf></opt/texlive/p2010/texmf-dist/fonts/type1/pu
277+blic/amsfonts/cm/cmr10.pfb>
278+Output written on test04-jfm.pdf (1 page, 283021 bytes).
279+PDF statistics: 43 PDF objects out of 1000 (max. 8388607)
280+ 27 compressed objects within 1 object stream
260281 0 named destinations out of 1000 (max. 131072)
261282 1 words of extra memory for PDF output out of 10000 (max. 10000000)
262283
Binary files a/test/test04-jfm.pdf and b/test/test04-jfm.pdf differ
--- a/test/test04-jfm.tex
+++ b/test/test04-jfm.tex
@@ -11,6 +11,43 @@
1111 \rml あ\inhibitglue\char"201Cあ←KozMinPr6N-Regular
1212
1313 \scrollmode
14-\jfont\rml={psft:GothicBBB-Medium:jfm=bad} at 10pt
15-\rml あ
14+\jfont\rml={psft:GothicBBB-Medium:jfm=bad} at 10pt % must be error
15+\rml あ123 % \rml は未定義となる
16+
17+\bigskip
18+\font\rml={file:ipaexg.ttf} at 10pt\rml
19+
20+ここからは,欧文文字フォントはIPA EXゴシック
21+
22+
23+\medskip{\tengt 文字範囲の代入/取得テスト}
24+
25+\defcharrange{2}{`あ,"E0-"FF}
26+「\char"F4」は2番の文字範囲なので,和文扱いのはず
27+
28+{iso8859-1 和文扱い:\setjaparameter{jcharrange={1}}%
29+\getjaparameter{jcharrange}{1}%
30+§ ¶ ° £ ¥ \char"F4}
31+
32+{iso8859-1 欧文扱い:\setjaparameter{jcharrange={-1}}%
33+\getjaparameter{jcharrange}{1}%
34+§ ¶ ° £ ¥ \char"F4}
35+
36+
37+\medskip{\tengt 文字範囲の状況取得}
38+\getjaparameter{jcharrange}{0}
39+\getjaparameter{jcharrange}{1}
40+\getjaparameter{jcharrange}{2}
41+
42+\medskip{\tengt 文字コード→文字範囲}
43+\getjaparameter{chartorange}{`い} % must be 217
44+\getjaparameter{chartorange}{`§} % must be 1
45+\getjaparameter{chartorange}{"F7} % must be 2
46+\getjaparameter{chartorange}{-1} % must be -1
47+
48+\medskip
49+\setjaparameter{jcharrange={-217}}
50+ほとんど欧文扱い.2番は別(「あ」)
51+\setjaparameter{jcharrange={218}}
52+和文扱いにもどる
1653 \end
旧リポジトリブラウザで表示