summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Master/texmf-dist/doc/luatex/luatexja/README8
-rw-r--r--Master/texmf-dist/doc/luatex/luatexja/jfm-test.lua6
-rw-r--r--Master/texmf-dist/doc/luatex/luatexja/luatexja-en.pdfbin496701 -> 497786 bytes
-rw-r--r--Master/texmf-dist/doc/luatex/luatexja/luatexja-ja.pdfbin582366 -> 645339 bytes
-rw-r--r--Master/texmf-dist/doc/luatex/luatexja/luatexja-zh.pdfbin629648 -> 623993 bytes
-rw-r--r--Master/texmf-dist/doc/luatex/luatexja/luatexja.dtx694
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua2
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty2
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua28
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua25
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua746
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua64
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua14
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua9
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua64
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua105
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua28
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty34
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/luatexja.lua35
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty9
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex75
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty68
22 files changed, 1300 insertions, 716 deletions
diff --git a/Master/texmf-dist/doc/luatex/luatexja/README b/Master/texmf-dist/doc/luatex/luatexja/README
index 811dc4c9a5b..a977a5cca6c 100644
--- a/Master/texmf-dist/doc/luatex/luatexja/README
+++ b/Master/texmf-dist/doc/luatex/luatexja/README
@@ -1,4 +1,4 @@
-The LuaTeX-ja Package 20120623.0
+The LuaTeX-ja Package 20120904.0
--------------------------------
Copyright (c) 2011--2012 The LuaTeX-ja project
License: modified BSD (see COPYING)
@@ -29,9 +29,9 @@ Installation
2. If you must/want to install manually:
a. Download the source archive from CTAN,
- or tagged as 20120623.0 in the Git repository by
+ or tagged as 20120904.0 in the Git repository by
<http://git.sourceforge.jp/view?p=luatex-ja/luatexja.git
- ;a=snapshot;h=refs/tags/20120623.0;sf=tgz>
+ ;a=snapshot;h=refs/tags/20120904.0;sf=tgz>
b. Extract the archive and put src/ into your TEXMF tree.
An example location is TEXMF/tex/luatex/luatexja.
@@ -55,5 +55,5 @@ Simply loading luatexja.sty by \input or \usepackage does the minimal setting.
\jfontspec, which can be used for specifying Japanese fonts.
-Last commit date: Sat Jun 23 13:36:06 2012 +0900
+Last commit date: Tue Sep 4 21:25:01 2012 +0900
diff --git a/Master/texmf-dist/doc/luatex/luatexja/jfm-test.lua b/Master/texmf-dist/doc/luatex/luatexja/jfm-test.lua
index 8d73b958064..fdee46c356e 100644
--- a/Master/texmf-dist/doc/luatex/luatexja/jfm-test.lua
+++ b/Master/texmf-dist/doc/luatex/luatexja/jfm-test.lua
@@ -5,6 +5,7 @@ luatexja.jfont.define_jfm {
xkanjiskip = { 0.31, 0.045, 0.057 },
[0] = {
+ chars = { '漢', 'ヒ*' },
align = 'left', left = 0.0, down = 0.0,
width = 1.0, height = 0.88, depth = 0.12, italic=0.0,
},
@@ -65,6 +66,11 @@ luatexja.jfont.define_jfm {
width = 1.0, height = 0.88, depth = 0.12, italic=0.0,
glue = { [199] = { 0.78, 0, 0} },
},
+ [2000] = {
+ chars = { '。', '、*', 'ヒ' },
+ align = 'left', left = 0.0, down = 0.0,
+ width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
+ },
[100] = {
chars = { '「' },
align = 'right', left = 0.0, down = 0.0,
diff --git a/Master/texmf-dist/doc/luatex/luatexja/luatexja-en.pdf b/Master/texmf-dist/doc/luatex/luatexja/luatexja-en.pdf
index eee00021a54..b12c9f62173 100644
--- a/Master/texmf-dist/doc/luatex/luatexja/luatexja-en.pdf
+++ b/Master/texmf-dist/doc/luatex/luatexja/luatexja-en.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/luatex/luatexja/luatexja-ja.pdf b/Master/texmf-dist/doc/luatex/luatexja/luatexja-ja.pdf
index 9c85e7e02e2..edafedea2fb 100644
--- a/Master/texmf-dist/doc/luatex/luatexja/luatexja-ja.pdf
+++ b/Master/texmf-dist/doc/luatex/luatexja/luatexja-ja.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/luatex/luatexja/luatexja-zh.pdf b/Master/texmf-dist/doc/luatex/luatexja/luatexja-zh.pdf
index fff84f7bdb5..6afb80b14f4 100644
--- a/Master/texmf-dist/doc/luatex/luatexja/luatexja-zh.pdf
+++ b/Master/texmf-dist/doc/luatex/luatexja/luatexja-zh.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/luatex/luatexja/luatexja.dtx b/Master/texmf-dist/doc/luatex/luatexja/luatexja.dtx
index b1ca377a701..b2b9b68e0c7 100644
--- a/Master/texmf-dist/doc/luatex/luatexja/luatexja.dtx
+++ b/Master/texmf-dist/doc/luatex/luatexja/luatexja.dtx
@@ -1892,7 +1892,7 @@ parameters, you have to use commands \verb+\ltjsetparameter+ and
%<en>\subsection{Editing the range of \textbf{JAchar}s}
%<ja>\subsection{\textbf{JAchar}の範囲の設定}
%<zh>\subsection{\textbf{JAchar}范围设定}
-
+\label{ssec-setrange}
%<*en>
To edit the range of \textbf{JAchar}s, you have to assign a non-zero
@@ -2524,7 +2524,7 @@ JFMは「望ましい\Param{kanjiskip}の値」や「望ましい\Param{xkanjisk
%</zh>
%<en>\subsection{Insertion Setting of \Param{xkanjiskip}}
-%<ja>\subsection{\Param{xkanjiskip} の設定の挿入}
+%<ja>\subsection{\Param{xkanjiskip} の挿入設定}
%<zh>\subsection{\Param{xkanjiskip}插入设定}
%<*en>
@@ -2684,59 +2684,6 @@ xyz漢字
\end{LTXexample}
-%<en>\subsection{Cropmark}
-%<ja>\subsection{トンボ}
-%<zh>\subsection{裁剪框标记}
-
-%<*en>
-Cropmark is a mark for indicating 4~corners and horizontal/vertical
-center of the paper. In Japanese, we call cropmark as tombo(w).
-\pLaTeX\ and this \LuaTeX-ja support `tombow' by their kernel.
-The following steps are needed to typeset cropmark:
-%</en>
-%<*ja>
-トンボは用紙の四つ角と水平/垂直方向の中心を表す印である.
-\pLaTeX と \LuaTeX-jaではトンボの出力をサポートしている.
-トンボを出力するためには以下の手順が必要である:
-%</ja>
-%<*zh>
-裁剪框标记是在一页的四角和水平/垂直中央放置的标记。在日文中,裁剪框被称为“トンボ”。
-\pLaTeX 和\LuaTeX-ja均在底层支持裁剪框标记。需要下列步骤来实现:
-%</zh>
-
-\begin{enumerate}
-%<*en>
-\item First, define the banner which will be printed at the upper left
- of the paper. This is done by assigning a token list to
- \verb+\@bannertoken+.
-
-For example, the following sets banner as `\texttt{filename (YYYY-MM-DD hh:mm)}':
-%</en>
-%<*ja>
-\item まず,用紙の左上に印刷されるバナーを定義する.これは \verb+\@bannertoken+
- にトークンリストを与えることでなされる.
-
-例えば,以下はバナーとして`\texttt{filename (YYYY-MM-DD hh:mm)}'を設定する:
-%</ja>
-%<*zh>
-\item 首先,首先定义页面左上角将会出现的注记。这由向\verb!@bannertoken!分配一个token列完成。\\
-例如,下列所示将会设定注记为“\textsf{filename (YYYY-MM-DD hh:mm)}”:
-%</zh>
-
-\begin{verbatim}
-\makeatletter
-
-\hour\time \divide\hour by 60 \@tempcnta\hour \multiply\@tempcnta 60\relax
-\minute\time \advance\minute-\@tempcnta
-\@bannertoken{%
- \jobname\space(\number\year-\two@digits\month-\two@digits\day
- \space\two@digits\hour:\two@digits\minute)}%
-\end{verbatim}
-
-\item ...
-\end{enumerate}
-
-
%<en>\part{Reference}
%<ja>\part{リファレンス}
%<zh>\part{参考指南}
@@ -3187,6 +3134,7 @@ Like the \Param{kanjiskip} field, this field specifies the `ideal'
\end{list}
%<*en>
+\paragraph{Character classes}
Besides from above fields, a JFM file have several sub-tables those
indices are natural numbers. The table indexed by~$i\in\omega$ stores
information of `character class'~$i$. At least, the character class~0 is
@@ -3195,6 +3143,7 @@ always present, so each JFM file must have a sub-table whose index is
the following fields:
%</en>
%<*ja>
+\paragraph{文字クラス}
上記のフィールドに加えて,JFMファイルはそのインデックスが自然数であるいくつかの
サブテーブルを持つ.インデックスが$i\in\omega$であるテーブルは「文字クラス」$i$の
情報を格納する.少なくとも,文字クラス0は常に存在するので,JFMファイルはインデックス
@@ -3202,6 +3151,7 @@ the following fields:
(そのインデックスを$i$で表わす)は以下のフィールドを持つ:
%</ja>
%<*zh>
+\paragraph{Character classes}
除了上面涉及到的内容,JFM文件中还有几个以自然数进行声明的次级表。
这些表依靠满足$i\in\omega$的“字符类”$i$来索引。
一般,最少需要的是字符类0,故每一个JFM文件必须有次级表索引为\texttt{[0]}。
@@ -3215,22 +3165,28 @@ the following fields:
%<*en>
This field is a list of characters which are in this character
- type~$i$. This field is not required if $i=0$, since all
- \textbf{JAchar} which are not in any character class other
+ type~$i$. This field is optional if $i=0$, since all
+ \textbf{JAchar} which do not belong any character classes other
than 0 are in the character class 0
(hence, the character class~0 contains most of
- \textbf{JAchar}s). In the list, a character can be
- specified by its code number, or by the character itself
- (as a string of length~1). Moreover, there are `imaginary
- characters' which specified in the list. We will describe these later.
+ \textbf{JAchar}s). In the list, character(s) can be specified in the following form:
+\begin{itemize}
+\item a Unicode code point
+\item the character itself (as a Lua string, like \verb+'あ'+)
+\item a string like \verb+'あ*'+ (the character followed by an asterisk)
+\item several ``imaginary'' characters (We will describe these later.)
+\end{itemize}
%</en>
%<*ja>
このフィールドは文字クラス$i$に属する文字のリストである.このフィールドは$i=0$の
-場合には必須ではない.なぜならば,文字クラス0には,0以外の文字クラスに属するものを
-除いた全ての\textbf{JAchar}が属するからである(よって,文字クラス0はほとんどの
-\textbf{JAchar}を含む).このリストでは,文字はその文字コードを用いて,もしくは
-文字それ自体(長さ1の文字列)によって指定される.さらに,このリストで指定される
-「仮想的な文字」も存在する.これらについては後に記す.
+場合には任意である(文字クラス0には,0以外の文字クラスに属するものを
+除いた全ての\textbf{JAchar}が属するから).このリスト中で文字を指定するには,以下の方法がある:
+\begin{itemize}
+\item Unicode におけるコード番号
+\item 「\verb+'あ'+」のような,文字それ自体
+\item 「\verb+'あ*'+」のような,文字それ自体の後にアスタリスクをつけたもの
+\item いくつかの「仮想的な文字」(後に説明する)
+\end{itemize}
%</ja>
%<*zh>
这部分为字符集$i$的字符列表。当$i=0$时不需要设定此部分,因为不在字符集0种的\textbf{JAchar}
@@ -3427,6 +3383,66 @@ Furthermore, the glyph is shifted according to values of fields
\item[glue={\{[$j$]=\{<width>, <stretch>, <shrink>\}, ...\}}]
\end{list}
+%<*ja>
+\paragraph{文字クラスの決定}
+文字クラスの決定は少々複雑である.ここでは例を用いて説明しよう.
+
+
+たとえば,次の内容を一部に含んだ \texttt{jfm-test.lua} を考えよう:
+\begin{lstlisting}
+ [0] = {
+ chars = { '漢', 'ヒ*' },
+ align = 'left', left = 0.0, down = 0.0,
+ width = 1.0, height = 0.88, depth = 0.12, italic=0.0,
+ },
+ [2000] = {
+ chars = { '。', '、*', 'ヒ' },
+ align = 'left', left = 0.0, down = 0.0,
+ width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
+ },
+\end{lstlisting}
+句点「。」の幅は二分であるので
+\begin{LTXexample}
+\jfont\a=psft:Ryumin-Light:jfm=test;+vert
+\setbox0\hbox{\a 。\inhibitglue 漢}
+\the\wd0
+\end{LTXexample}
+では,全角二分(15.0\,pt)とならなければおかしいが,上の実行結果では20\,ptとなっている.
+それは以下の事情によるものである:
+\begin{enumerate}
+\item \verb+vert+ featureによって句点が縦書き用のグリフと置き換わる(\Pkg{luaotfload} による処理).
+\item しかしこのグリフは「文字コード」U+F0000以降とみなされている
+(実際にいくらになるかは,フォントによって異なる).
+\item よって,文字クラス0とみなされるため,結果として「。」の幅は全角だと認識されてしまう.
+\end{enumerate}
+
+一方,「\texttt{'、*'}」のようにアスタリスクつきの指定があると,
+状況は異なってくる.
+\begin{LTXexample}
+\jfont\a=psft:Ryumin-Light:jfm=test;+vert
+\a 漢、\inhibitglue 漢
+\end{LTXexample}
+ここで,読点「、」の文字クラスは,以下のようにして決まる.
+\begin{enumerate}
+\item とりあえず句点の時と同じように,\Pkg{luaotfload} によって縦書き用読点のグリフに置き換わる.
+\item 置換後のグリフの「文字コード」はU+F0000以降であり,
+そのままでは文字クラスは0と判定される.
+\item ところが,JFMには「\texttt{'、*'}」指定があるので,置換前の横書き用読点のグリフ「、」(文字コードはU+3001)によって文字クラスを判定する.
+\item 結果として,上の出力例中の読点の文字クラスは2000となる.
+\end{enumerate}
+
+なお,置換後のグリフで判定した文字クラスの値が0でなければ,そちらをそのまま作用する.
+\begin{LTXexample}
+\jfont\a=psft:Ryumin-Light:jfm=test;+hwid
+\a 漢ヒひ
+\end{LTXexample}
+上の例では,
+\texttt{hwid} featureにより,「ヒ」が半角の「ヒ」に置き換わるが,
+文字クラスは「ヒ」の属する0\textbf{ではなく},「ヒ」の属する2000となる.
+%</ja>
+
+%<ja>\paragraph{仮想的な文字}
+%<!ja>\paragraph{Imaginary characters}
%<*en>
As described before, you can specify several `imaginary characters' in
\texttt{chars} field. The most of these characters are regarded as the
@@ -3641,13 +3657,11 @@ this argument has \texttt{chars} field which contains character codes
%<*en>
An example of this callback is the \texttt{ltjarticle} class, with
forcefully assigning character class~0 to \texttt{'parbdd'}
- in the JFM \texttt{jfm-min.lua}. This callback doesn't
- replace any code of \LuaTeX-ja.
+ in the JFM \texttt{jfm-min.lua}.
%</en>
%<*ja>
このコールバックの使用例は\texttt{ltjarticle}クラスにあり,
\texttt{jfm-min.lua}中の\texttt{'parbdd'}を強制的にクラス0に割り当てている.
-このコールバックは\LuaTeX-jaのコードを書き換えない.
%</ja>
%<en>\item[\texttt{luatexja.define\_font} callback]
@@ -3674,18 +3688,38 @@ end
You may assume that \verb+jfont_info+ has the following fields:
%</en>
%<*ja>
-\verb+jfont_info+ は以下のフィールドを持つ:
+\verb+jfont_info+ は以下の2フィールドを持つ:
%</ja>
\begin{description}
-\item[\tt jfm]
-%<en>The index number of JFM.
-%<ja>JFMのインデックス番号.
-%<zh>JFM索引编号。
-
-\item[\tt size]
-%<en>Font size in a scaled point (${}=2^{-16}\,\textrm{pt}$).
-%<ja>スケールド・ポイント(${}=2^{-16}\,\textrm{pt}$)を単位としたフォントのサイズ.
-%<zh>以参照点(${}=2^{-16}\,\textrm{pt}$)为点位的字体大小。
+\item[\tt size\_cache]
+%<*ja>
+使用されているJFMの情報が格納されているテーブルで,
+\textbf{このテーブルを書き換えてはならない}.
+中身はほぼJFMファイルに書かれている唯一のテーブルであるが,次のように若干変わっている:
+\begin{itemize}
+\item 各文字クラス$i$に属する文字達のテーブル
+\texttt{[$i$].chars=\{<character>, ...\}}は,トップレベルにまとめられ,
+\texttt{chars=\{[<character>]=$i$, ...\}}という形になっている.
+\item \texttt{zw},~\texttt{zh}, \texttt{kanjiskip},~\texttt{xkanjiskip} の各フィールドの値は,
+実際に使われるフォントサイズに合わせたsp ($1\,\mathrm{sp}=2^{-6}\,\mathrm{pt}$)単位の長さに変わっている.
+\item 各文字クラス$i$の情報を格納したテーブルも,\texttt{char\_type} フィールドの下にまとめられている.
+例えば,文字クラス1に属する文字の高さは \texttt{char\_type[1].height} で参照できる.
+\item \texttt{dir} フィールドはこのテーブルにはない.
+\end{itemize}
+%</ja>
+%<*en>
+A table which contains the information of a JFM, and \emph{this table must not be changed}.
+The contents of this table are similar to that which is written is the JFM file, but
+the following differ:
+\begin{itemize}
+\item There is a \texttt{chars} table, \dots
+\item The value in \texttt{zw},~\texttt{zh}, \texttt{kanjiskip},~\texttt{xkanjiskip} fields are
+now scaled by real font size, and in scaled-pont unit.
+\item ...
+\item There is no \texttt{dir} field in this table.
+\end{itemize}
+%</en>
+%<zh> ...
\item[\tt var]
%<en>The value specified in \texttt{jfmvar=...} at a call of \verb+\jfont+.
@@ -3694,11 +3728,12 @@ You may assume that \verb+jfont_info+ has the following fields:
\end{description}
%<*en>
-The returned table \verb+new_jfont_info+ also should include these three fields.
+The returned table \verb+new_jfont_info+ also should include these two fields.
The \verb+font_number+ is a font number.
%</en>
%<*ja>
-戻り値の \verb+new_jfont_info+ テーブルもこれら3つのフィールドを含まなければならない.
+戻り値の \verb+new_jfont_info+ テーブルもこれら2つのフィールドを含まなければならないが,
+それ以外にユーザが勝手にフィールドを付け加えることは自由である.
\verb+font_number+ はフォント番号である.
%</ja>
@@ -3712,7 +3747,6 @@ A good example of this and the next callbacks is the \Pkg{luatexja-otf}
これと次のコールバックの良い使用例は\Pkg{luatexja-otf}パッケージであり,
JFM中でAdobe-Japan1 CIDの文字を \verb+"AJ1-xxx"+ の形で指定するために
用いられている.
-このコールバックは\LuaTeX-jaのコードを書き換えない.
%</ja>
%<en>\item[\texttt{luatexja.find\_char\_class} callback]
@@ -3754,16 +3788,6 @@ The argument \verb+char_class+ is the result of \LuaTeX-ja's default
デフォルトルーチンを書き換えることになる.
%</ja>
-%<*en>
-This callback doesn't replace any code of \LuaTeX-ja.
-%</en>
-%<*ja>
-このコールバックは\LuaTeX-jaのコードを書き換えない.
-%</ja>
-%<*zh>
-此回调不会替换\LuaTeX-ja中任何代码。
-%</zh>
-
%<en>\item[\texttt{luatexja.set\_width} callback]
%<ja>\item[\texttt{luatexja.set\_width}コールバック]
%<zh>\item[\texttt{luatexja.set\_width}回调]
@@ -4128,7 +4152,8 @@ JFM(もしくはサイズ)が異なる2つの\textbf{JAchar}の間にグル
%<zh>\subsection{基本语句兼容性}
%<*en>
-The following primitives are implemented for compatibility with \pTeX:
+The following primitives are implemented for compatibility with \pTeX.
+Note that these primitives don't support JIS~X~0213, but only JIS~X~0208.
%</en>
%<*ja>
以下のプリミティブは\pTeX との互換性のために実装されている:
@@ -4204,8 +4229,9 @@ With the help of this example, we remark the specification of \verb+\inhibitglue
%<*ja>
\item \verb+\inhibitglue+ の(制限された)水平モード中での呼び出しはその場でのみ
有効であり,段落の境界を乗り越えない.
- さらに,\verb+\inhibitglue+ は上の例の最終行のようにリガチャとカーニングを
- 打ち消す.
+ さらに,\verb+\inhibitglue+ は上の例の最終行のように(欧文における)リガチャとカーニングを
+ 打ち消す.これは,\verb+\inhibitglue+ が内部的には「現在のリスト中にwhatsitノードを
+ 追加する」ことを行なっているからである.
%</ja>
%<*en>
@@ -4409,19 +4435,15 @@ As closing this subsection, we shall introduce an example of
%</en>
%<*ja>
この節の終わりに,\verb+\SetRelationFont+ と \verb+\userelfont+ の例を
-紹介しておこう.
+紹介しておこう.\verb+\userelfont+ の使用によって,「abc」の部分のフォントが
+Avant Garde (OT1/pag/m/n) に変わっていることがわかる.
%</ja>
\begin{LTXexample}
-\gtfamily{}あいうabc
+\kanjifamily{gt}\selectfont あいうxyz
\SetRelationFont{JY3}{gt}{m}{n}{OT1}{pag}{m}{n}
-\userelfont\selectfont{}あいうabc
+\userelfont\selectfont あいうabc
\end{LTXexample}
-
-%<en>\subsection{Cropmark/`tombow'}
-%<ja>\subsection{トンボ}
-% ToDo
-
%<en>\section{Extensions}
%<ja>\section{拡張}
\subsection{\texttt{luatexja-fontspec.sty}}
@@ -5898,6 +5920,110 @@ $\mathit{Nq}.\mathit{tail}$は無意味なので,
\section{psft}
+%<*ja>
+\section{\Pkg{listings} パッケージへの対応}
+\Pkg{listings} パッケージが,そのままでは日本語をまともに出力できないこと
+はよく知られている,きちんと整形して出力するために,\Pkg{listings}パッケー
+ジは内部で「ほとんどの文字」をアクティブにし,各文字に対してその文字の出
+力命令を割り当てている (\cite{listings}).
+しかし,そこでアクティブにする文字の中に,和文文
+字がないためである.p\TeX 系列では,和文文字をアクティブにする手法がなく,
+\Pkg{jlisting.sty} というパッチ\cite{jlisting}を用いることで無理やり解決していたが,
+\LuaTeX-jaでは,(\LuaTeX がネイティブでUnicodeを理解することから)「和文
+文字をアクティブ化し,それらに対して適切に出力命令を設定する」というより正統的な
+方法を取ることにした.
+
+\LuaTeX-ja で利用される \Pkg{listings} パッケージへのパッチ \Pkg{lltjp-listings.sty} は,
+\Pkg{listings.sty} と\LuaTeX-jaを読み込んでおけば,
+\verb+\begin{document}+ の箇所において自動的に読み込まれるので,通常はあまり
+意識する必要はない.
+
+\paragraph{文字種}
+\Pkg{listings} パッケージの内部では,大雑把に言うと
+\begin{enumerate}
+\item 識別子として使える文字 (``letter'',~``digit'') たちを
+集める.
+\item letterでもdigitでもない文字が現れた時に,収集した文字列を(必要なら修飾して)出力する.
+\item 今度は逆に,letterでない文字たちをletterが現れるまで集める.
+\item letterが出現したら集めた文字列を出力する.
+\item 1.に戻る.
+\end{enumerate}
+という処理が行われている.これにより,識別子の途中では行分割が行われないようになっている.
+直前の文字が識別子として使えるか否かは \verb+\lst@ifletter+ というフラグに格納されている.
+
+さて,日本語の処理である.殆どの和文文字の前後では行分割が可能であるが,その一方で
+括弧類や音引きなどでは禁則処理が必要なことから,\Pkg{lltjp-listings.sty} では,
+直前が和文文字であるかを示すフラグ \verb+lst@kanji+ を新たに導入した.
+以降,説明のために以下のように文字を分類する:
+\begin{center}
+\small
+\begin{tabular}{lccccc}
+\toprule
+&Letter&Other&Kanji&Open&Close\\\midrule
+\verb+\lst@ifletter+&T&F&T&F&T\\
+\verb+\lst@ifkanji+&F&F&T&T&F\\
+意図&識別子中の文字&その他欧文文字&殆どの和文文字&開き括弧類&閉じ括弧類\\
+\bottomrule
+\end{tabular}
+\end{center}
+なお,本来の\Pkg{listings} パッケージでの分類``digit''は,
+出現状況によって,上の表のLetterとOtherのどちらにもなりうる.
+また,KanjiとCloseは \verb+\lst@ifletter+ と \verb+\lst@ifkanji+ の値が一致しているが,
+これは間違いではない.
+
+例えば,Letterの直後にOpenが来た場合を考える.
+文字種Openは和文開き括弧類を想定しているので,Letterの直後では行分割が可能であることが望ましい.
+そのため,この場合では,すでに収集されている文字列を出力することで行分割を許容するようにした.
+同じように,$5\times 5=25$通り全てについて書くと,次のようになる:
+\begin{center}
+\small
+\begin{tabular}{llccccc}
+\toprule
+&&\multicolumn{4}{c}{後ろ側の文字}\\\cmidrule(lr){3-7}
+&&\hbox to 4em{\hss Letter\hss}&\hbox to 4em{\hss Other\hss}
+&\hbox to 4em{\hss Kanji\hss}&\hbox to 4em{\hss Open\hss}&Close\\\midrule
+直&Letter&収集&\multicolumn{3}{c}{\hrulefill \ 出力\ \hrulefill}&収集\\
+前&Other&出力&収集&\multicolumn{2}{c}{\hrulefill \ 出力\ \hrulefill}&収集\\
+文&Kanji&\multicolumn{4}{c}{\hrulefill \ 出力\ \hrulefill}&収集\\
+字&Open&\multicolumn{5}{c}{\hrulefill \ 収集\ \hrulefill}\\
+種&Close&\multicolumn{4}{c}{\hrulefill \ 出力\ \hrulefill}&収集\\
+\bottomrule
+\end{tabular}
+\end{center}
+上の表において,
+\begin{itemize}
+\item 「出力」は,それまでに集めた文字列を出力(≒ここで行分割可能)を意味する.
+\item 「収集」は,後側の文字を,現在収集された文字列に追加(行分割不可)を意味する.
+\end{itemize}
+
+\paragraph{和文文字扱いとなる文字}
+\Pkg{listings} パッケージにおいて和文文字と扱われる
+(前に述べたKanji, Open,あるいは「閉じ括弧類」分類)か否かは,
+通常の\textbf{JAchar}/\textbf{Alchar}の範囲の設定(\ref{ssec-setrange}節)とは全く関係ない.
+
+また,禁則処理に関する\Param{prebreakpenalty},~\Param{postbreakpenalty}の設定も
+\Pkg{listings} パッケージ内部ではまったく影響しない.
+
+\medskip
+現在の実装では,
+\begin{itemize}
+\item 基本多言語面のU+2000--U+FFFF,追加漢字面の文字は,以下の場合を除きKanji扱いとなり,
+また欧文文字2文字分の幅をとる..但し,以下は例外.
+\item U+FF61--U+FF9Fの半角カナはKanji扱いだが,欧文文字1文字分しか幅がない.
+\item 禁則処理のパラメータの標準値を定めている \texttt{luatexja-kinsoku.tex}\ %
+において \Param{prebreakpenalty} が
+10000と設定されている文字はClose扱いである.
+\item \texttt{luatexja-kinsoku.tex} で \Param{postbreakpenalty} が10000
+と設定されている文字はOpen扱いである.
+\end{itemize}
+これらの設定をユーザが\TeX ソースで変更させる仕組みはまだ作成していない.
+
+%</ja>
+%<*en>
+\section{Patch for the \Pkg{listings} package}
+\dots
+%</en>
+
\begin{thebibliography}{99}
\addcontentsline{toc}{section}{\refname}
\bibitem{texbytopic}
@@ -5906,6 +6032,366 @@ Victor Eijkhout, \emph{\TeX\ by Topic, A \TeX nician's Reference}, Addison-Wesl
\newpage
\appendix
+
+%<*ja>
+\section{\LuaTeX-jaにおけるJIS~X~0213非漢字のcatcode}
+
+ここでは,JIS~X~0213の非漢字部分(第1区〜第13区)のうち,
+どの文字が(u)\pTeX や\LuaTeX-jaで制御綴内に使用可能かを表にしてまとめる.
+各文字は
+\begin{center}
+\tt\fboxsep=1pt\fbox{\hbox to \zw{\gt あ\hss}}\,\scriptsize LUP
+\end{center}
+のように表示しており,各文字は次の意味を持っている.
+この表の生成は,JIS X 0208の範囲内の文字については\verb+\jis+命令を使って行なっている.
+\begin{itemize}
+\item 背景が薄く青く塗られている文字は,
+\LuaTeX-ja の標準で\textbf{ALchar}として認識されている文字である.
+\item 1文字目の {\tt L} は,\XeTeX や\LuaTeX-jaにおいてこの文字が制御綴内に
+使用可能(catcodeが11)であることを表している.
+\item 2文字目の{\tt U} は,\upTeX においてこの文字が制御綴内に使用可能(kcatcodeは16,~17)であることを
+表している.この範囲内では,\upTeX は標準で全文字を和文文字として扱うようである.
+\item 3文字目の {\tt P} は,\pTeX においてこの文字が制御綴内に使用可能(kcatcodeは16,~17)であることを
+表している.
+\item 3文字目が{\tt -}となっているもの(本体の文字も赤身がかっている)は,
+JIS~X~0208にないため使用不能と考えて良いものである.
+\item 第4区と第5区にある,鼻濁音の仮名については省略した.
+\end{itemize}
+
+
+\makeatletter
+\def\uplist{% upTeX で \kcatcode!=18 なもの
+ \@elt {8486}\@elt {8491}\@elt {8492}\@elt {8499}\@elt {8500}\@elt {8501}%
+ \@elt {8502}\@elt {8504}\@elt {8508}\@elt {9008}\@elt {9009}\@elt {9010}%
+ \@elt {9011}\@elt {9012}\@elt {9013}\@elt {9014}\@elt {9015}\@elt {9016}%
+ \@elt {9017}\@elt {9025}\@elt {9026}\@elt {9027}\@elt {9028}\@elt {9029}%
+ \@elt {9030}\@elt {9031}\@elt {9032}\@elt {9033}\@elt {9034}\@elt {9035}%
+ \@elt {9036}\@elt {9037}\@elt {9038}\@elt {9039}\@elt {9040}\@elt {9041}%
+ \@elt {9042}\@elt {9043}\@elt {9044}\@elt {9045}\@elt {9046}\@elt {9047}%
+ \@elt {9048}\@elt {9049}\@elt {9050}\@elt {9057}\@elt {9058}\@elt {9059}%
+ \@elt {9060}\@elt {9061}\@elt {9062}\@elt {9063}\@elt {9064}\@elt {9065}%
+ \@elt {9066}\@elt {9067}\@elt {9068}\@elt {9069}\@elt {9070}\@elt {9071}%
+ \@elt {9072}\@elt {9073}\@elt {9074}\@elt {9075}\@elt {9076}\@elt {9077}%
+ \@elt {9078}\@elt {9079}\@elt {9080}\@elt {9081}\@elt {9082}\@elt {9249}%
+ \@elt {9250}\@elt {9251}\@elt {9252}\@elt {9253}\@elt {9254}\@elt {9255}%
+ \@elt {9256}\@elt {9257}\@elt {9258}\@elt {9259}\@elt {9260}\@elt {9261}%
+ \@elt {9262}\@elt {9263}\@elt {9264}\@elt {9265}\@elt {9266}\@elt {9267}%
+ \@elt {9268}\@elt {9269}\@elt {9270}\@elt {9271}\@elt {9272}\@elt {9273}%
+ \@elt {9274}\@elt {9275}\@elt {9276}\@elt {9277}\@elt {9278}\@elt {9279}%
+ \@elt {9280}\@elt {9281}\@elt {9282}\@elt {9283}\@elt {9284}\@elt {9285}%
+ \@elt {9286}\@elt {9287}\@elt {9288}\@elt {9289}\@elt {9290}\@elt {9291}%
+ \@elt {9292}\@elt {9293}\@elt {9294}\@elt {9295}\@elt {9296}\@elt {9297}%
+ \@elt {9298}\@elt {9299}\@elt {9300}\@elt {9301}\@elt {9302}\@elt {9303}%
+ \@elt {9304}\@elt {9305}\@elt {9306}\@elt {9307}\@elt {9308}\@elt {9309}%
+ \@elt {9310}\@elt {9311}\@elt {9312}\@elt {9313}\@elt {9314}\@elt {9315}%
+ \@elt {9316}\@elt {9317}\@elt {9318}\@elt {9319}\@elt {9320}\@elt {9321}%
+ \@elt {9322}\@elt {9323}\@elt {9324}\@elt {9325}\@elt {9326}\@elt {9327}%
+ \@elt {9328}\@elt {9329}\@elt {9330}\@elt {9331}\@elt {9505}\@elt {9506}%
+ \@elt {9507}\@elt {9508}\@elt {9509}\@elt {9510}\@elt {9511}\@elt {9512}%
+ \@elt {9513}\@elt {9514}\@elt {9515}\@elt {9516}\@elt {9517}\@elt {9518}%
+ \@elt {9519}\@elt {9520}\@elt {9521}\@elt {9522}\@elt {9523}\@elt {9524}%
+ \@elt {9525}\@elt {9526}\@elt {9527}\@elt {9528}\@elt {9529}\@elt {9530}%
+ \@elt {9531}\@elt {9532}\@elt {9533}\@elt {9534}\@elt {9535}\@elt {9536}%
+ \@elt {9537}\@elt {9538}\@elt {9539}\@elt {9540}\@elt {9541}\@elt {9542}%
+ \@elt {9543}\@elt {9544}\@elt {9545}\@elt {9546}\@elt {9547}\@elt {9548}%
+ \@elt {9549}\@elt {9550}\@elt {9551}\@elt {9552}\@elt {9553}\@elt {9554}%
+ \@elt {9555}\@elt {9556}\@elt {9557}\@elt {9558}\@elt {9559}\@elt {9560}%
+ \@elt {9561}\@elt {9562}\@elt {9563}\@elt {9564}\@elt {9565}\@elt {9566}%
+ \@elt {9567}\@elt {9568}\@elt {9569}\@elt {9570}\@elt {9571}\@elt {9572}%
+ \@elt {9573}\@elt {9574}\@elt {9575}\@elt {9576}\@elt {9577}\@elt {9578}%
+ \@elt {9579}\@elt {9580}\@elt {9581}\@elt {9582}\@elt {9583}\@elt {9584}%
+ \@elt {9585}\@elt {9586}\@elt {9587}\@elt {9588}\@elt {9589}\@elt {9590}%
+ % ここから JIS X 0213
+ \@elt {8760}\@elt {8761}\@elt {9083}\@elt {9332}\@elt {9333}\@elt {9334}%
+ \@elt {9335}\@elt {9336}\@elt {9337}\@elt {9338}\@elt {9339}\@elt {9591}%
+ \@elt {9592}\@elt {9593}\@elt {9594}\@elt {9595}\@elt {9596}\@elt {9597}%
+ \@elt {9598}\@elt {9838}\@elt {9839}\@elt {9840}\@elt {9841}\@elt {9842}%
+ \@elt {9843}\@elt {9844}\@elt {9845}\@elt {9846}\@elt {9847}\@elt {9848}%
+ \@elt {9849}\@elt {9850}\@elt {9851}\@elt {9852}\@elt {9853}\@elt {9854}%
+ \@elt {10098}\@elt {10099}\@elt {10100}\@elt {10101}%
+}
+\def\plist{% pTeX で \kcatcode!=18 なもの
+ \@elt {8993}\@elt {8994}\@elt {8995}\@elt {8996}\@elt {8997}\@elt {8998}%
+ \@elt {8999}\@elt {9000}\@elt {9001}\@elt {9002}\@elt {9003}\@elt {9004}%
+ \@elt {9005}\@elt {9006}\@elt {9007}\@elt {9008}\@elt {9009}\@elt {9010}%
+ \@elt {9011}\@elt {9012}\@elt {9013}\@elt {9014}\@elt {9015}\@elt {9016}%
+ \@elt {9017}\@elt {9018}\@elt {9019}\@elt {9020}\@elt {9021}\@elt {9022}%
+ \@elt {9023}\@elt {9024}\@elt {9025}\@elt {9026}\@elt {9027}\@elt {9028}%
+ \@elt {9029}\@elt {9030}\@elt {9031}\@elt {9032}\@elt {9033}\@elt {9034}%
+ \@elt {9035}\@elt {9036}\@elt {9037}\@elt {9038}\@elt {9039}\@elt {9040}%
+ \@elt {9041}\@elt {9042}\@elt {9043}\@elt {9044}\@elt {9045}\@elt {9046}%
+ \@elt {9047}\@elt {9048}\@elt {9049}\@elt {9050}\@elt {9051}\@elt {9052}%
+ \@elt {9053}\@elt {9054}\@elt {9055}\@elt {9056}\@elt {9057}\@elt {9058}%
+ \@elt {9059}\@elt {9060}\@elt {9061}\@elt {9062}\@elt {9063}\@elt {9064}%
+ \@elt {9065}\@elt {9066}\@elt {9067}\@elt {9068}\@elt {9069}\@elt {9070}%
+ \@elt {9071}\@elt {9072}\@elt {9073}\@elt {9074}\@elt {9075}\@elt {9076}%
+ \@elt {9077}\@elt {9078}\@elt {9079}\@elt {9080}\@elt {9081}\@elt {9082}%
+ \@elt {9083}\@elt {9084}\@elt {9085}\@elt {9086}\@elt {9249}\@elt {9250}%
+ \@elt {9251}\@elt {9252}\@elt {9253}\@elt {9254}\@elt {9255}\@elt {9256}%
+ \@elt {9257}\@elt {9258}\@elt {9259}\@elt {9260}\@elt {9261}\@elt {9262}%
+ \@elt {9263}\@elt {9264}\@elt {9265}\@elt {9266}\@elt {9267}\@elt {9268}%
+ \@elt {9269}\@elt {9270}\@elt {9271}\@elt {9272}\@elt {9273}\@elt {9274}%
+ \@elt {9275}\@elt {9276}\@elt {9277}\@elt {9278}\@elt {9279}\@elt {9280}%
+ \@elt {9281}\@elt {9282}\@elt {9283}\@elt {9284}\@elt {9285}\@elt {9286}%
+ \@elt {9287}\@elt {9288}\@elt {9289}\@elt {9290}\@elt {9291}\@elt {9292}%
+ \@elt {9293}\@elt {9294}\@elt {9295}\@elt {9296}\@elt {9297}\@elt {9298}%
+ \@elt {9299}\@elt {9300}\@elt {9301}\@elt {9302}\@elt {9303}\@elt {9304}%
+ \@elt {9305}\@elt {9306}\@elt {9307}\@elt {9308}\@elt {9309}\@elt {9310}%
+ \@elt {9311}\@elt {9312}\@elt {9313}\@elt {9314}\@elt {9315}\@elt {9316}%
+ \@elt {9317}\@elt {9318}\@elt {9319}\@elt {9320}\@elt {9321}\@elt {9322}%
+ \@elt {9323}\@elt {9324}\@elt {9325}\@elt {9326}\@elt {9327}\@elt {9328}%
+ \@elt {9329}\@elt {9330}\@elt {9331}\@elt {9332}\@elt {9333}\@elt {9334}%
+ \@elt {9335}\@elt {9336}\@elt {9337}\@elt {9338}\@elt {9339}\@elt {9340}%
+ \@elt {9341}\@elt {9342}\@elt {9505}\@elt {9506}\@elt {9507}\@elt {9508}%
+ \@elt {9509}\@elt {9510}\@elt {9511}\@elt {9512}\@elt {9513}\@elt {9514}%
+ \@elt {9515}\@elt {9516}\@elt {9517}\@elt {9518}\@elt {9519}\@elt {9520}%
+ \@elt {9521}\@elt {9522}\@elt {9523}\@elt {9524}\@elt {9525}\@elt {9526}%
+ \@elt {9527}\@elt {9528}\@elt {9529}\@elt {9530}\@elt {9531}\@elt {9532}%
+ \@elt {9533}\@elt {9534}\@elt {9535}\@elt {9536}\@elt {9537}\@elt {9538}%
+ \@elt {9539}\@elt {9540}\@elt {9541}\@elt {9542}\@elt {9543}\@elt {9544}%
+ \@elt {9545}\@elt {9546}\@elt {9547}\@elt {9548}\@elt {9549}\@elt {9550}%
+ \@elt {9551}\@elt {9552}\@elt {9553}\@elt {9554}\@elt {9555}\@elt {9556}%
+ \@elt {9557}\@elt {9558}\@elt {9559}\@elt {9560}\@elt {9561}\@elt {9562}%
+ \@elt {9563}\@elt {9564}\@elt {9565}\@elt {9566}\@elt {9567}\@elt {9568}%
+ \@elt {9569}\@elt {9570}\@elt {9571}\@elt {9572}\@elt {9573}\@elt {9574}%
+ \@elt {9575}\@elt {9576}\@elt {9577}\@elt {9578}\@elt {9579}\@elt {9580}%
+ \@elt {9581}\@elt {9582}\@elt {9583}\@elt {9584}\@elt {9585}\@elt {9586}%
+ \@elt {9587}\@elt {9588}\@elt {9589}\@elt {9590}\@elt {9591}\@elt {9592}%
+ \@elt {9593}\@elt {9594}\@elt {9595}\@elt {9596}\@elt {9597}\@elt {9598}%
+ \@elt {9761}\@elt {9762}\@elt {9763}\@elt {9764}\@elt {9765}\@elt {9766}%
+ \@elt {9767}\@elt {9768}\@elt {9769}\@elt {9770}\@elt {9771}\@elt {9772}%
+ \@elt {9773}\@elt {9774}\@elt {9775}\@elt {9776}\@elt {9777}\@elt {9778}%
+ \@elt {9779}\@elt {9780}\@elt {9781}\@elt {9782}\@elt {9783}\@elt {9784}%
+ \@elt {9785}\@elt {9786}\@elt {9787}\@elt {9788}\@elt {9789}\@elt {9790}%
+ \@elt {9791}\@elt {9792}\@elt {9793}\@elt {9794}\@elt {9795}\@elt {9796}%
+ \@elt {9797}\@elt {9798}\@elt {9799}\@elt {9800}\@elt {9801}\@elt {9802}%
+ \@elt {9803}\@elt {9804}\@elt {9805}\@elt {9806}\@elt {9807}\@elt {9808}%
+ \@elt {9809}\@elt {9810}\@elt {9811}\@elt {9812}\@elt {9813}\@elt {9814}%
+ \@elt {9815}\@elt {9816}\@elt {9817}\@elt {9818}\@elt {9819}\@elt {9820}%
+ \@elt {9821}\@elt {9822}\@elt {9823}\@elt {9824}\@elt {9825}\@elt {9826}%
+ \@elt {9827}\@elt {9828}\@elt {9829}\@elt {9830}\@elt {9831}\@elt {9832}%
+ \@elt {9833}\@elt {9834}\@elt {9835}\@elt {9836}\@elt {9837}\@elt {9838}%
+ \@elt {9839}\@elt {9840}\@elt {9841}\@elt {9842}\@elt {9843}\@elt {9844}%
+ \@elt {9845}\@elt {9846}\@elt {9847}\@elt {9848}\@elt {9849}\@elt {9850}%
+ \@elt {9851}\@elt {9852}\@elt {9853}\@elt {9854}%
+}
+
+\def\jlist{% JIS X 0213 だけにあるもの
+\@elt{"222F}{"FF07}\@elt{"2230}{"FF02}\@elt{"2231}{"FF0D}\@elt{"2232}{"FF5E}%
+\@elt{"2233}{"3033}\@elt{"2234}{"3034}\@elt{"2235}{"3035}\@elt{"2236}{"303B}%
+\@elt{"2237}{"303C}\@elt{"2238}{"30FF}\@elt{"2239}{"309F}\@elt{"2242}{"2284}%
+\@elt{"2243}{"2285}\@elt{"2244}{"228A}\@elt{"2245}{"228B}\@elt{"2246}{"2209}%
+\@elt{"2247}{"2205}\@elt{"2248}{"2305}\@elt{"2249}{"2306}\@elt{"2251}{"2295}%
+\@elt{"2252}{"2296}\@elt{"2253}{"2297}\@elt{"2254}{"2225}\@elt{"2255}{"2226}%
+\@elt{"2256}{"FF5F}\@elt{"2257}{"FF60}\@elt{"2258}{"3018}\@elt{"2259}{"3019}%
+\@elt{"225A}{"3016}\@elt{"225B}{"3017}\@elt{"226B}{"2262}\@elt{"226C}{"2243}%
+\@elt{"226D}{"2245}\@elt{"226E}{"2248}\@elt{"226F}{"2276}\@elt{"2270}{"2277}%
+\@elt{"2271}{"2194}\@elt{"227A}{"266E}\@elt{"227B}{"266B}\@elt{"227C}{"266C}%
+\@elt{"227D}{"2669}\@elt{"2321}{"25B7}\@elt{"2322}{"25B6}\@elt{"2323}{"25C1}%
+\@elt{"2324}{"25C0}\@elt{"2325}{"2197}\@elt{"2326}{"2198}\@elt{"2327}{"2196}%
+\@elt{"2328}{"2199}\@elt{"2329}{"21C4}\@elt{"232A}{"21E8}\@elt{"232B}{"21E6}%
+\@elt{"232C}{"21E7}\@elt{"232D}{"21E9}\@elt{"232E}{"2934}\@elt{"232F}{"2935}%
+\@elt{"233A}{"29BF}\@elt{"233B}{"25C9}\@elt{"233C}{"303D}\@elt{"233D}{"FE46}%
+\@elt{"233E}{"FE45}\@elt{"233F}{"25E6}\@elt{"2340}{"2022}\@elt{"235B}{"2213}%
+\@elt{"235C}{"2135}\@elt{"235D}{"210F}\@elt{"235E}{"33CB}\@elt{"235F}{"2113}%
+\@elt{"2360}{"2127}\@elt{"237B}{"30A0}\@elt{"237C}{"2013}\@elt{"237D}{"29FA}%
+\@elt{"237E}{"29FB}\@elt{"2474}{"3094}\@elt{"2475}{"3095}\@elt{"2476}{"3096}%
+\@elt{"2639}{"2664}\@elt{"263A}{"2660}\@elt{"263B}{"2662}%
+\@elt{"263C}{"2666}\@elt{"263D}{"2661}\@elt{"263E}{"2665}\@elt{"263F}{"2667}%
+\@elt{"2640}{"2663}\@elt{"2659}{"03C2}\@elt{"265A}{"24F5}\@elt{"265B}{"24F6}%
+\@elt{"265C}{"24F7}\@elt{"265D}{"24F8}\@elt{"265E}{"24F9}\@elt{"265F}{"24FA}%
+\@elt{"2660}{"24FB}\@elt{"2661}{"24FC}\@elt{"2662}{"24FD}\@elt{"2663}{"24FE}%
+\@elt{"2664}{"2616}\@elt{"2665}{"2617}\@elt{"2666}{"3020}\@elt{"2667}{"260E}%
+\@elt{"2668}{"2600}\@elt{"2669}{"2601}\@elt{"266A}{"2602}\@elt{"266B}{"2603}%
+\@elt{"266C}{"2668}\@elt{"266D}{"25B1}\@elt{"266E}{"31F0}\@elt{"266F}{"31F1}%
+\@elt{"2670}{"31F2}\@elt{"2671}{"31F3}\@elt{"2672}{"31F4}\@elt{"2673}{"31F5}%
+\@elt{"2674}{"31F6}\@elt{"2675}{"31F7}\@elt{"2676}{"31F8}\@elt{"2677}{"31F9}%
+\@elt{"2678}{"31F7}\@elt{"2679}{"31FA}\@elt{"267A}{"31FB}\@elt{"267B}{"31FC}%
+\@elt{"267C}{"31FD}\@elt{"267D}{"31FE}\@elt{"267E}{"31FF}\@elt{"2742}{"23BE}%
+\@elt{"2743}{"23BF}\@elt{"2744}{"23C0}\@elt{"2745}{"23C1}\@elt{"2746}{"23C2}%
+\@elt{"2747}{"23C3}\@elt{"2748}{"23C4}\@elt{"2749}{"23C5}\@elt{"274A}{"23C6}%
+\@elt{"274B}{"23C7}\@elt{"274C}{"23C8}\@elt{"274D}{"23C9}\@elt{"274E}{"23CA}%
+\@elt{"274F}{"23CB}\@elt{"2750}{"23CC}\@elt{"2772}{"30F7}\@elt{"2773}{"30F8}%
+\@elt{"2774}{"30F9}\@elt{"2775}{"30FA}\@elt{"2776}{"22DA}\@elt{"2777}{"22DB}%
+\@elt{"2778}{"2153}\@elt{"2779}{"2154}\@elt{"277A}{"2155}\@elt{"277B}{"2713}%
+\@elt{"277C}{"2318}\@elt{"277D}{"2423}\@elt{"277E}{"23CE}\@elt{"2841}{"3251}%
+\@elt{"2842}{"3252}\@elt{"2843}{"3253}\@elt{"2844}{"3254}\@elt{"2845}{"3255}%
+\@elt{"2846}{"3256}\@elt{"2847}{"3257}\@elt{"2848}{"3258}\@elt{"2849}{"3259}%
+\@elt{"284A}{"325A}\@elt{"284B}{"325B}\@elt{"284C}{"325C}\@elt{"284D}{"325D}%
+\@elt{"284E}{"325E}\@elt{"284F}{"325F}\@elt{"2850}{"32B1}\@elt{"2851}{"32B2}%
+\@elt{"2852}{"32B3}\@elt{"2853}{"32B4}\@elt{"2854}{"32B5}\@elt{"2855}{"32B6}%
+\@elt{"2856}{"32B7}\@elt{"2857}{"32B8}\@elt{"2858}{"32B9}\@elt{"2859}{"32BA}%
+\@elt{"285A}{"32BB}\@elt{"285B}{"32BC}\@elt{"285C}{"32BD}\@elt{"285D}{"32BE}%
+\@elt{"285E}{"32BF}\@elt{"2867}{"25D0}\@elt{"2868}{"25D1}\@elt{"2869}{"25D2}%
+\@elt{"286A}{"25D3}\@elt{"286B}{"203C}\@elt{"286C}{"2047}\@elt{"286D}{"2048}%
+\@elt{"286E}{"2049}\@elt{"286F}{"01CD}\@elt{"2870}{"01CE}\@elt{"2871}{"01D0}%
+\@elt{"2872}{"1E3E}\@elt{"2873}{"1E3F}\@elt{"2874}{"01F8}\@elt{"2875}{"01F9}%
+\@elt{"2876}{"01D1}\@elt{"2877}{"01D2}\@elt{"2878}{"01D4}\@elt{"2879}{"01D6}%
+\@elt{"287A}{"01D8}\@elt{"287B}{"01DA}\@elt{"287C}{"01DC}\@elt{"2921}{"20AC}%
+\@elt{"2922}{"00A0}\@elt{"2923}{"00A1}\@elt{"2924}{"00A4}\@elt{"2925}{"00A6}%
+\@elt{"2926}{"00A9}\@elt{"2927}{"00AA}\@elt{"2928}{"00AB}\@elt{"2929}{"00AD}%
+\@elt{"292A}{"00AE}\@elt{"292B}{"00AF}\@elt{"292C}{"00B2}\@elt{"292D}{"00B3}%
+\@elt{"292E}{"00B7}\@elt{"292F}{"00B8}\@elt{"2930}{"00B9}\@elt{"2931}{"00BA}%
+\@elt{"2932}{"00BB}\@elt{"2933}{"00BC}\@elt{"2934}{"00BD}\@elt{"2935}{"00BE}%
+\@elt{"2936}{"00BF}\@elt{"2937}{"00C0}\@elt{"2938}{"00C1}\@elt{"2939}{"00C2}%
+\@elt{"293A}{"00C3}\@elt{"293B}{"00C4}\@elt{"293C}{"00C5}\@elt{"293D}{"00C6}%
+\@elt{"293E}{"00C7}\@elt{"293F}{"00C8}\@elt{"2940}{"00C9}\@elt{"2941}{"00CA}%
+\@elt{"2942}{"00CB}\@elt{"2943}{"00CC}\@elt{"2944}{"00CD}\@elt{"2945}{"00CE}%
+\@elt{"2946}{"00CF}\@elt{"2947}{"00D0}\@elt{"2948}{"00D1}\@elt{"2949}{"00D2}%
+\@elt{"294A}{"00D3}\@elt{"294B}{"00D4}\@elt{"294C}{"00D5}\@elt{"294D}{"00D6}%
+\@elt{"294E}{"00D8}\@elt{"294F}{"00D9}\@elt{"2950}{"00DA}\@elt{"2951}{"00DB}%
+\@elt{"2952}{"00DC}\@elt{"2953}{"00DD}\@elt{"2954}{"00DE}\@elt{"2955}{"00DF}%
+\@elt{"2956}{"00E0}\@elt{"2957}{"00E1}\@elt{"2958}{"00E2}\@elt{"2959}{"00E3}%
+\@elt{"295A}{"00E4}\@elt{"295B}{"00E5}\@elt{"295C}{"00E6}\@elt{"295D}{"00E7}%
+\@elt{"295E}{"00E8}\@elt{"295F}{"00E9}\@elt{"2960}{"00EA}\@elt{"2961}{"00EB}%
+\@elt{"2962}{"00EC}\@elt{"2963}{"00ED}\@elt{"2964}{"00EE}\@elt{"2965}{"00EF}%
+\@elt{"2966}{"00F0}\@elt{"2967}{"00F1}\@elt{"2968}{"00F2}\@elt{"2969}{"00F3}%
+\@elt{"296A}{"00F4}\@elt{"296B}{"00F5}\@elt{"296C}{"00F6}\@elt{"296D}{"00F8}%
+\@elt{"296E}{"00F9}\@elt{"296F}{"00FA}\@elt{"2970}{"00FB}\@elt{"2971}{"00FC}%
+\@elt{"2972}{"00FD}\@elt{"2973}{"00FE}\@elt{"2974}{"00FF}\@elt{"2975}{"0100}%
+\@elt{"2976}{"012A}\@elt{"2977}{"016A}\@elt{"2978}{"0112}\@elt{"2979}{"014C}%
+\@elt{"297A}{"0101}\@elt{"297B}{"012B}\@elt{"297C}{"016B}\@elt{"297D}{"0113}%
+\@elt{"297E}{"014D}\@elt{"2A21}{"0104}\@elt{"2A22}{"02D8}\@elt{"2A23}{"0141}%
+\@elt{"2A24}{"013D}\@elt{"2A25}{"015A}\@elt{"2A26}{"0160}\@elt{"2A27}{"015E}%
+\@elt{"2A28}{"0164}\@elt{"2A29}{"0179}\@elt{"2A2A}{"017D}\@elt{"2A2B}{"017B}%
+\@elt{"2A2C}{"0105}\@elt{"2A2D}{"02DB}\@elt{"2A2E}{"0142}\@elt{"2A2F}{"013E}%
+\@elt{"2A30}{"015B}\@elt{"2A31}{"02C7}\@elt{"2A32}{"0161}\@elt{"2A33}{"015F}%
+\@elt{"2A34}{"0165}\@elt{"2A35}{"017A}\@elt{"2A36}{"02DD}\@elt{"2A37}{"017E}%
+\@elt{"2A38}{"017C}\@elt{"2A39}{"0154}\@elt{"2A3A}{"0102}\@elt{"2A3B}{"0139}%
+\@elt{"2A3C}{"0106}\@elt{"2A3D}{"010C}\@elt{"2A3E}{"0118}\@elt{"2A3F}{"011A}%
+\@elt{"2A40}{"010E}\@elt{"2A41}{"0143}\@elt{"2A42}{"0147}\@elt{"2A43}{"0150}%
+\@elt{"2A44}{"0158}\@elt{"2A45}{"016E}\@elt{"2A46}{"0170}\@elt{"2A47}{"0162}%
+\@elt{"2A48}{"0155}\@elt{"2A49}{"0103}\@elt{"2A4A}{"013A}\@elt{"2A4B}{"0107}%
+\@elt{"2A4C}{"010D}\@elt{"2A4D}{"0119}\@elt{"2A4E}{"011B}\@elt{"2A4F}{"010F}%
+\@elt{"2A50}{"0111}\@elt{"2A51}{"0144}\@elt{"2A52}{"0148}\@elt{"2A53}{"0151}%
+\@elt{"2A54}{"0159}\@elt{"2A55}{"016F}\@elt{"2A56}{"0171}\@elt{"2A57}{"0163}%
+\@elt{"2A58}{"02D9}\@elt{"2A59}{"0108}\@elt{"2A5A}{"011C}\@elt{"2A5B}{"0124}%
+\@elt{"2A5C}{"0134}\@elt{"2A5D}{"015C}\@elt{"2A5E}{"016C}\@elt{"2A5F}{"0109}%
+\@elt{"2A60}{"011D}\@elt{"2A61}{"0125}\@elt{"2A62}{"0135}\@elt{"2A63}{"015D}%
+\@elt{"2A64}{"016D}\@elt{"2A65}{"0271}\@elt{"2A66}{"028B}\@elt{"2A67}{"027E}%
+\@elt{"2A68}{"0283}\@elt{"2A69}{"0292}\@elt{"2A6A}{"026C}\@elt{"2A6B}{"026E}%
+\@elt{"2A6C}{"0279}\@elt{"2A6D}{"0288}\@elt{"2A6E}{"0256}\@elt{"2A6F}{"0273}%
+\@elt{"2A70}{"027D}\@elt{"2A71}{"0282}\@elt{"2A72}{"0290}\@elt{"2A73}{"027B}%
+\@elt{"2A74}{"026D}\@elt{"2A75}{"025F}\@elt{"2A76}{"0272}\@elt{"2A77}{"029D}%
+\@elt{"2A78}{"028E}\@elt{"2A79}{"0261}\@elt{"2A7A}{"014B}\@elt{"2A7B}{"0270}%
+\@elt{"2A7C}{"0281}\@elt{"2A7D}{"0127}\@elt{"2A7E}{"0295}\@elt{"2B21}{"0294}%
+\@elt{"2B22}{"0266}\@elt{"2B23}{"0298}\@elt{"2B24}{"01C2}\@elt{"2B25}{"0253}%
+\@elt{"2B26}{"0257}\@elt{"2B27}{"0284}\@elt{"2B28}{"0260}\@elt{"2B29}{"0193}%
+\@elt{"2B2A}{"0153}\@elt{"2B2B}{"0152}\@elt{"2B2C}{"0268}\@elt{"2B2D}{"0289}%
+\@elt{"2B2E}{"0258}\@elt{"2B2F}{"0275}\@elt{"2B30}{"0259}\@elt{"2B31}{"025C}%
+\@elt{"2B32}{"025E}\@elt{"2B33}{"0250}\@elt{"2B34}{"026F}\@elt{"2B35}{"028A}%
+\@elt{"2B36}{"0264}\@elt{"2B37}{"028C}\@elt{"2B38}{"0254}\@elt{"2B39}{"0251}%
+\@elt{"2B3A}{"0252}\@elt{"2B3B}{"028D}\@elt{"2B3C}{"0265}\@elt{"2B3D}{"02A2}%
+\@elt{"2B3E}{"02A1}\@elt{"2B3F}{"0255}\@elt{"2B40}{"0291}\@elt{"2B41}{"027A}%
+\@elt{"2B42}{"0267}\@elt{"2B43}{"025A}\@elt{"2B44}{"00E6}\@elt{"2B45}{"01FD}%
+\@elt{"2B46}{"1F70}\@elt{"2B47}{"1F71}\@elt{"2B48}{"0254}\@elt{"2B49}{"0254}%
+\@elt{"2B4A}{"028C}\@elt{"2B4B}{"028C}\@elt{"2B4C}{"0259}\@elt{"2B4D}{"0259}%
+\@elt{"2B4E}{"025A}\@elt{"2B4F}{"025A}\@elt{"2B50}{"1F72}\@elt{"2B51}{"1F73}%
+\@elt{"2B52}{"0361}\@elt{"2B53}{"02C8}\@elt{"2B54}{"02CC}\@elt{"2B55}{"02D0}%
+\@elt{"2B56}{"02D1}\@elt{"2B57}{"0306}\@elt{"2B58}{"203F}\@elt{"2B59}{"030B}%
+\@elt{"2B5A}{"0301}\@elt{"2B5B}{"0304}\@elt{"2B5C}{"0300}\@elt{"2B5D}{"030F}%
+\@elt{"2B5E}{"030C}\@elt{"2B5F}{"0302}\@elt{"2B60}{"02E5}\@elt{"2B61}{"02E6}%
+\@elt{"2B62}{"02E7}\@elt{"2B63}{"02E8}\@elt{"2B64}{"02E9}\@elt{"2B65}{"02E9}%
+\@elt{"2B66}{"02E5}\@elt{"2B67}{"0325}\@elt{"2B68}{"032C}\@elt{"2B69}{"0339}%
+\@elt{"2B6A}{"031C}\@elt{"2B6B}{"031F}\@elt{"2B6C}{"0320}\@elt{"2B6D}{"0308}%
+\@elt{"2B6E}{"033D}\@elt{"2B6F}{"0329}\@elt{"2B70}{"032F}\@elt{"2B71}{"02DE}%
+\@elt{"2B72}{"0324}\@elt{"2B73}{"0330}\@elt{"2B74}{"033C}\@elt{"2B75}{"0334}%
+\@elt{"2B76}{"031D}\@elt{"2B77}{"031E}\@elt{"2B78}{"0318}\@elt{"2B79}{"0319}%
+\@elt{"2B7A}{"032A}\@elt{"2B7B}{"033A}\@elt{"2B7C}{"033B}\@elt{"2B7D}{"0303}%
+\@elt{"2B7E}{"031A}\@elt{"2C21}{"2776}\@elt{"2C22}{"2777}\@elt{"2C23}{"2778}%
+\@elt{"2C24}{"2779}\@elt{"2C25}{"277A}\@elt{"2C26}{"277B}\@elt{"2C27}{"277C}%
+\@elt{"2C28}{"277D}\@elt{"2C29}{"277E}\@elt{"2C2A}{"277F}\@elt{"2C2B}{"24EB}%
+\@elt{"2C2C}{"24EC}\@elt{"2C2D}{"24ED}\@elt{"2C2E}{"24EE}\@elt{"2C2F}{"24EF}%
+\@elt{"2C30}{"24F0}\@elt{"2C31}{"24F1}\@elt{"2C32}{"24F2}\@elt{"2C33}{"24F3}%
+\@elt{"2C34}{"24F4}\@elt{"2C35}{"2170}\@elt{"2C36}{"2171}\@elt{"2C37}{"2172}%
+\@elt{"2C38}{"2173}\@elt{"2C39}{"2174}\@elt{"2C3A}{"2175}\@elt{"2C3B}{"2176}%
+\@elt{"2C3C}{"2177}\@elt{"2C3D}{"2178}\@elt{"2C3E}{"2179}\@elt{"2C3F}{"217A}%
+\@elt{"2C40}{"217B}\@elt{"2C41}{"24D0}\@elt{"2C42}{"24D1}\@elt{"2C43}{"24D2}%
+\@elt{"2C44}{"24D3}\@elt{"2C45}{"24D4}\@elt{"2C46}{"24D5}\@elt{"2C47}{"24D6}%
+\@elt{"2C48}{"24D7}\@elt{"2C49}{"24D8}\@elt{"2C4A}{"24D9}\@elt{"2C4B}{"24DA}%
+\@elt{"2C4C}{"24DB}\@elt{"2C4D}{"24DC}\@elt{"2C4E}{"24DD}\@elt{"2C4F}{"24DE}%
+\@elt{"2C50}{"24DF}\@elt{"2C51}{"24E0}\@elt{"2C52}{"24E1}\@elt{"2C53}{"24E2}%
+\@elt{"2C54}{"24E3}\@elt{"2C55}{"24E4}\@elt{"2C56}{"24E5}\@elt{"2C57}{"24E6}%
+\@elt{"2C58}{"24E7}\@elt{"2C59}{"24E8}\@elt{"2C5A}{"24E9}\@elt{"2C5B}{"32D0}%
+\@elt{"2C5C}{"32D1}\@elt{"2C5D}{"32D2}\@elt{"2C5E}{"32D3}\@elt{"2C5F}{"32D4}%
+\@elt{"2C60}{"32D5}\@elt{"2C61}{"32D6}\@elt{"2C62}{"32D7}\@elt{"2C63}{"32D8}%
+\@elt{"2C64}{"32D9}\@elt{"2C65}{"32DA}\@elt{"2C66}{"32DB}\@elt{"2C67}{"32DC}%
+\@elt{"2C68}{"32DD}\@elt{"2C69}{"32DE}\@elt{"2C6A}{"32DF}\@elt{"2C6B}{"32E0}%
+\@elt{"2C6C}{"32E1}\@elt{"2C6D}{"32E2}\@elt{"2C6E}{"32E3}\@elt{"2C6F}{"32FA}%
+\@elt{"2C70}{"32E9}\@elt{"2C71}{"32E5}\@elt{"2C72}{"32ED}\@elt{"2C73}{"32EC}%
+\@elt{"2C7D}{"2051}\@elt{"2C7E}{"2042}\@elt{"2D21}{"2460}\@elt{"2D22}{"2461}%
+\@elt{"2D23}{"2462}\@elt{"2D24}{"2463}\@elt{"2D25}{"2464}\@elt{"2D26}{"2465}%
+\@elt{"2D27}{"2466}\@elt{"2D28}{"2467}\@elt{"2D29}{"2468}\@elt{"2D2A}{"2469}%
+\@elt{"2D2B}{"246A}\@elt{"2D2C}{"246B}\@elt{"2D2D}{"246C}\@elt{"2D2E}{"246D}%
+\@elt{"2D2F}{"246E}\@elt{"2D30}{"246F}\@elt{"2D31}{"2470}\@elt{"2D32}{"2471}%
+\@elt{"2D33}{"2472}\@elt{"2D34}{"2473}\@elt{"2D35}{"2160}\@elt{"2D36}{"2161}%
+\@elt{"2D37}{"2162}\@elt{"2D38}{"2163}\@elt{"2D39}{"2164}\@elt{"2D3A}{"2165}%
+\@elt{"2D3B}{"2166}\@elt{"2D3C}{"2167}\@elt{"2D3D}{"2168}\@elt{"2D3E}{"2169}%
+\@elt{"2D3F}{"216A}\@elt{"2D40}{"3349}\@elt{"2D41}{"3314}\@elt{"2D42}{"3322}%
+\@elt{"2D43}{"334D}\@elt{"2D44}{"3318}\@elt{"2D45}{"3327}\@elt{"2D46}{"3303}%
+\@elt{"2D47}{"3336}\@elt{"2D48}{"3351}\@elt{"2D49}{"3357}\@elt{"2D4A}{"330D}%
+\@elt{"2D4B}{"3326}\@elt{"2D4C}{"3323}\@elt{"2D4D}{"332B}\@elt{"2D4E}{"334A}%
+\@elt{"2D4F}{"333B}\@elt{"2D50}{"339C}\@elt{"2D51}{"339D}\@elt{"2D52}{"339E}%
+\@elt{"2D53}{"338E}\@elt{"2D54}{"338F}\@elt{"2D55}{"33C4}\@elt{"2D56}{"33A1}%
+\@elt{"2D57}{"216B}\@elt{"2D5F}{"337B}\@elt{"2D60}{"301D}\@elt{"2D61}{"301F}%
+\@elt{"2D62}{"2116}\@elt{"2D63}{"33CD}\@elt{"2D64}{"2121}\@elt{"2D65}{"32A4}%
+\@elt{"2D66}{"32A5}\@elt{"2D67}{"32A6}\@elt{"2D68}{"32A7}\@elt{"2D69}{"32A8}%
+\@elt{"2D6A}{"3231}\@elt{"2D6B}{"3232}\@elt{"2D6C}{"3239}\@elt{"2D6D}{"337E}%
+\@elt{"2D6E}{"337D}\@elt{"2D6F}{"337C}\@elt{"2D73}{"222E}\@elt{"2D78}{"221F}%
+\@elt{"2D79}{"22BF}\@elt{"2D7D}{"2756}\@elt{"2D7E}{"261E}%
+}
+
+\newcount\cntA
+\newcount\cntB
+\newcount\flag
+\def\chk@in@#1#2{{\global\flag=0\relax%
+ \def\@elt##1{\ifnum#2=##1\global\flag=1 \fi}%
+ #1}}
+\def\get@in@#1#2{{%
+ \global\flag=0\relax%
+ \def\@elt##1##2{\ifnum#2=##1\global\flag##2 \fi}%
+ #1}}
+
+\def\outi{%
+\get@in@{\jlist}{\cntA}\cntB=\flag
+\ifnum\cntB=0{}%
+ \cntB=\jis\cntA{}%
+ \ifnum\cntB=0 \else
+ \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{\cntB}}=0
+ \def\@@@tmp{white}\else\def\@@@tmp{white!85!blue}\fi
+ \fcolorbox{black}{\@@@tmp}{%
+ \hbox to \zw{\gt  \hskip-\zw\ltjjachar\cntB  \hss}}\,\scriptsize%
+ \ifnum\catcode\cntB=11 L\else\ \fi
+ \chk@in@{\uplist}{\cntA}\ifnum\flag=1 U\else~\fi
+ \chk@in@{\plist}{\cntA}\ifnum\flag=1 P\else~\fi
+ \fi
+\else
+ \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{\cntB}}=0
+ \def\@@@tmp{white}\else\def\@@@tmp{white!85!blue}\fi
+ \fcolorbox{black}{\@@@tmp}{\color{red!50!black}%
+ \hbox to \zw{\gt  \hskip-\zw\ltjjachar\cntB  \hss}}\,\scriptsize%
+ \ifnum\catcode\cntB=11 L\else~\fi
+ \chk@in@{\uplist}{\cntA}\ifnum\flag=1 U\else~\fi-%
+\fi\global\advance\cntA1 }
+
+\def\out#1#2{%
+\midrule\global\cntA=\numexpr 8192+#1*256+#2*16\relax
+"#2{}x&\ifnum#2=2\global\advance\cntA1\else\outi\fi&\outi&\outi&\outi&\outi&\outi&\outi&\outi%"
+&\outi&\outi&\outi&\outi&\outi&\outi&\outi&\ifnum#2=7\global\advance\cntA1\else\outi\fi\\
+}
+
+\def\test#1{{%
+\subsection*{第#1区}\tt\small\fboxsep=1pt\centering\tabcolsep=0.25\zw
+\begin{tabular}{ccccccccccccccccc}\toprule&"0&"1&"2&"3&"4&"5&"6&"7&"8&"9&"A&"B&"C&"D&"E&"F\\
+\out{#1}{2}\out{#1}{3}\out{#1}{4}\out{#1}{5}\out{#1}{6}\out{#1}{7}\bottomrule
+\end{tabular}\par}\medskip}
+
+\test{1}\test{2}\test{3}\test{4}\test{5}\test{6}\test{7}\test{8}
+\test{9}\test{10}\test{11}\test{12}\test{13}
+
+%</ja>
+
+
\section{Package versions used in this document}
This document was typeset using the following packages:
@@ -5932,7 +6418,7 @@ This document was typeset using the following packages:
%%
%% config file for showexpl.sty
%%
-%% Copyright The LuaTeX-ja project team, 2005
+%% Copyright The LuaTeX-ja project team, 2012
%%
\ProvidesFile{showexpl.cfg}
[2012/05/20 v0.01 Definitions for the showexpl package (luatexja)]
diff --git a/Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua b/Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua
index 4b984c56aa1..d2cd13b6d91 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua
@@ -30,7 +30,7 @@ luatexja.jfont.define_jfm {
[2] = { -- 閉じ括弧類
chars = {
'’', '”', '、', '〉', '》', '」', '』', '】', '〕',
- '〗', '〙', '〟', ')', ',', ']', '}', '⦆'
+ '〗', '〙', '〟', ')', ',*', ']', '}', '⦆',
},
align = 'left', left = 0.0, down = 0.0,
width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty b/Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty
index a69fcb63e80..17f69a86878 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-base.sty
@@ -19,7 +19,7 @@
%%------------------ Tiny helpers
%% Registers
-\newcount\ltj@tempcnta
+%\newcount\ltj@tempcnta % defined at luatexja-core.sty
\newcount\ltj@tempcntb
\newcount\ltj@tempcntc
\newdimen\ltj@tempdima
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua
index 6d7f5c32023..d976cb3debd 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-charrange.lua
@@ -13,7 +13,15 @@ local err, warn, info, log = luatexbase.errwarinf(_NAME)
luatexja.load_module('base'); local ltjb = luatexja.base
local floor = math.floor
+local pow = math.pow
local has_attr = node.has_attribute
+local kcat_attr_table = {}
+local pow_table = {}
+for i = 0, 216 do
+ kcat_attr_table[i] = luatexbase.attributes['ltj@kcat'..floor(i/31)]
+ pow_table[i] = pow(2, i%31)
+end
+pow_table[217] = pow(2, 31)
-- jcr_table_main[chr_code] = index
-- index : internal 0, 1, 2, ..., 216 0: 'other'
@@ -54,27 +62,22 @@ function char_to_range(c) -- return the (external) range number
'So I changed this one to zero.'})
c=0
elseif c<0x80 then return -1
- else
- local i = jcr_table_main[c] or 0
- if i==0 then return 217 else return i end
- end
+ else return jcr_table_main[c] or 0 end
end
function get_range_setting(i) -- i: internal range number
- return floor(tex.getattribute(
- luatexbase.attributes['ltj@kcat'..floor(i/31)])
- /math.pow(2, i%31))%2
+ return floor(tex.getattribute(kcat_attr_table[i])/pow_table[i])%2
end
-- glyph_node p は和文文字か?
function is_ucs_in_japanese_char(p)
local c = p.char
- if c<0x80 then return false
+ if c<0x80 then
+ return false
else
local i=jcr_table_main[c]
return (floor(
- has_attr(p, luatexbase.attributes['ltj@kcat'..floor(i/31)])
- /math.pow(2, i%31))%2 ~= jcr_noncjk)
+ has_attr(p, kcat_attr_table[i])/pow_table[i])%2 ~= jcr_noncjk)
end
end
@@ -89,10 +92,9 @@ function toggle_char_range(g, i) -- i: external range number
local kc
if i>0 then kc=0 else kc=1; i=-i end
if i>216 then i=0 end
- local attr = luatexbase.attributes['ltj@kcat'..floor(i/31)]
+ local attr = kcat_attr_table[i]
local a = tex.getattribute(attr)
- local k = math.pow(2, i%31)
- tex.setattribute(g,attr,(floor(a/k/2)*2+kc)*k+a%k)
+ tex.setattribute(g,attr,(floor(a/pow_table[i+1])*2+kc)*pow_table[i]+a%pow_table[i])
end
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua
index 6032b5067bf..d23d21c8648 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-inputbuf.lua
@@ -15,6 +15,7 @@ luatexja.load_module('charrange'); local ltjc = luatexja.charrange
local node_new = node.new
local id_glyph = node.id('glyph')
local getcatcode = tex.getcatcode
+local ltjc_is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char
--- the following function is modified from jafontspec.lua (by K. Maeda).
--- Instead of "%", we use U+FFFFF for suppressing spaces.
@@ -26,18 +27,20 @@ function add_comment(buffer)
end
if i>0 then
local c = utf.byte(buffer, i)
- local ct = getcatcode(c)
- local te = tex.endlinechar
- local ctl = (te ~= -1) and (getcatcode(te)==5) and (getcatcode(0xFFFFF)==14)
- -- Is the catcode of endline character is 5 (end-of-line)?
- -- Is the catcode of U+FFFFF (new comment char) is 14 (comment)?
- if ((ct==11) or (ct==12)) and ctl then
- local p = node_new(id_glyph)
- p.char = c
- if ltjc.is_ucs_in_japanese_char(p) then
- buffer = buffer .. string.char(0xF3,0xBF,0xBF,0xBF) -- U+FFFFF
+ if c>0x80 then
+ local ct = getcatcode(c)
+ local te = tex.endlinechar
+ local ctl = (te ~= -1) and (getcatcode(te)==5) and (getcatcode(0xFFFFF)==14)
+ -- Is the catcode of endline character is 5 (end-of-line)?
+ -- Is the catcode of U+FFFFF (new comment char) is 14 (comment)?
+ if ((ct==11) or (ct==12)) and ctl then
+ local p = node_new(id_glyph)
+ p.char = c
+ if ltjc_is_ucs_in_japanese_char(p) then
+ buffer = buffer .. string.char(0xF3,0xBF,0xBF,0xBF) -- U+FFFFF
+ end
+ node.free(p)
end
- node.free(p)
end
end
return buffer
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
index be9515e57fa..fdf878eb919 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfmglue.lua
@@ -3,33 +3,30 @@
--
luatexbase.provides_module({
name = 'luatexja.jfmglue',
- date = '2012/04/25',
- version = '0.4',
+ date = '2012/07/19',
+ version = '0.5',
description = 'Insertion process of JFM glues and kanjiskip',
})
module('luatexja.jfmglue', package.seeall)
local err, warn, info, log = luatexbase.errwarinf(_NAME)
-luatexja.load_module('base'); local ltjb = luatexja.base
luatexja.load_module('stack'); local ltjs = luatexja.stack
luatexja.load_module('jfont'); local ltjf = luatexja.jfont
luatexja.load_module('pretreat'); local ltjp = luatexja.pretreat
-local node_type = node.type
-local node_new = node.new
-local node_remove = node.remove
-local node_prev = node.prev
-local node_next = node.next
-local node_copy = node.copy
-local node_tail = node.tail
-local node_free = node.free
local has_attr = node.has_attribute
local set_attr = node.set_attribute
-local node_insert_before = node.insert_before
-local node_insert_after = node.insert_after
+local insert_before = node.insert_before
+local node_next = node.next
local round = tex.round
-local table_insert = table.insert
-local uniq_id = 0 -- unique id
+local ltjs_fast_get_penalty_table = ltjs.fast_get_penalty_table
+local ltjf_font_metric_table = ltjf.font_metric_table
+local ltjf_find_char_class = ltjf.find_char_class
+local node_new = node.new
+local node_copy = node.copy
+
+local ligature_head = 1
+local ligature_tail = 2
local id_glyph = node.id('glyph')
local id_hlist = node.id('hlist')
@@ -67,31 +64,31 @@ local XKANJI_SKIP = 7
local PROCESSED = 8
local IC_PROCESSED = 9
local BOXBDD = 15
+local PROCESSED_BEGIN_FLAG = 16
local kanji_skip
local xkanji_skip
-local attr_jchar_class = luatexbase.attributes['ltj@charclass']
+local attr_orig_char = luatexbase.attributes['ltj@origchar']
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local attr_icflag = luatexbase.attributes['ltj@icflag']
local attr_autospc = luatexbase.attributes['ltj@autospc']
local attr_autoxspc = luatexbase.attributes['ltj@autoxspc']
-local attr_uniqid = luatexbase.attributes['ltj@uniqid']
local max_dimen = 1073741823
-local ltjs_get_penalty_table = ltjs.get_penalty_table
-local ltjs_get_skip_table = ltjs.get_skip_table
-local ltjf_find_char_class = ltjf.find_char_class
-local ltjf_font_metric_table = ltjf.font_metric_table
-local ltjf_metrics = ltjf.metrics
-local box_stack_level
-local par_indented -- is the paragraph indented?
+local function get_attr_icflag(p)
+ return (has_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG
+end
-------------------- Helper functions
+local function copy_attr(new, old)
+ -- 仕様が決まるまで off にしておく
+end
+
-- This function is called only for acquiring `special' characters.
local function fast_find_char_class(c,m)
- return m.chars[c] or 0
+ return m.size_cache.chars[c] or 0
end
local spec_zero_glue = node_new(id_glue_spec)
@@ -103,13 +100,13 @@ local function get_zero_spec()
end
local function skip_table_to_spec(n)
- local g = node_new(id_glue_spec)
- local st = ltjs_get_skip_table(n, box_stack_level)
+ local g, st = node_new(id_glue_spec), ltjs.fast_get_skip_table(n)
g.width = st.width; g.stretch = st.stretch; g.shrink = st.shrink
g.stretch_order = st.stretch_order; g.shrink_order = st.shrink_order
return g
end
+
-- penalty 値の計算
local function add_penalty(p,e)
if p.penalty>=10000 then
@@ -127,7 +124,7 @@ end
-- 「異なる JFM」の間の調整方法
diffmet_rule = math.two_average
function math.two_add(a,b) return a+b end
-function math.two_average(a,b) return (a+b)/2 end
+function math.two_average(a,b) return (a+b)*0.5 end
-------------------- idea
-- 2 node の間に glue/kern/penalty を挿入する.
@@ -162,8 +159,6 @@ function math.two_average(a,b) return (a+b)/2 end
-- *: jfm glue はここに入る
local head -- the head of current list
-local last -- the last node of current list
-local lp -- 外側での list 走査時のカーソル
local Np, Nq, Bp
local widow_Bp, widow_Np -- \jcharwidowpenalty 挿入位置管理用
@@ -183,13 +178,9 @@ local function check_box(box_ptr, box_end)
end
while p and p~=box_end do
local pid = p.id
- if pid==id_kern then
- if p.subtype==2 then
- p = node_next(node_next(node_next(p))); pid = p.id
- elseif has_attr(p, attr_icflag)==IC_PROCESSED then
- p = node_next(p); pid = p.id
- end
- end
+ if pid==id_kern and p.subtype==2 then
+ p = node_next(node_next(node_next(p))); pid = p.id -- p must be glyph_node
+ end
if pid==id_glyph then
repeat
if find_first_char then
@@ -198,16 +189,16 @@ local function check_box(box_ptr, box_end)
last_char = p; found_visible_node = true; p=node_next(p)
if (not p) or p==box_end then return found_visible_node end
until p.id~=id_glyph
- pid = p.id
+ pid = p.id -- p must be non-nil
end
- if pid==id_hlist then
- if has_attr(p, attr_icflag)==PACKED then
- for q in node.traverse_id(id_glyph, p.head) do
- if find_first_char then
- first_char = q; find_first_char = false
- end
- last_char = q; found_visible_node = true; break
+ if pid==id_kern and get_attr_icflag(p)==IC_PROCESSED then
+ p = node_next(p);
+ elseif pid==id_hlist then
+ if PACKED == get_attr_icflag(p) then
+ if find_first_char then
+ first_char = p.head; find_first_char = false
end
+ last_char = p.head; found_visible_node = true
else
if p.shift==0 then
if check_box(p.head, nil) then found_visible_node = true end
@@ -250,272 +241,251 @@ end
-------------------- Np の計算と情報取得
luatexbase.create_callback("luatexja.jfmglue.whatsit_getinfo", "data",
- function (Np, lp, Nq, box_stack_level)
- if Np.nuc then return Np
- else
- return Np -- your code
- end
- end)
+ function (Np, lp, Nq)
+ if Np.nuc then return Np
+ else
+ return Np -- your code
+ end
+ end)
luatexbase.create_callback("luatexja.jfmglue.whatsit_after", "data",
- function (stat, Nq, Np, box_stack_level) return false end)
+ function (stat, Nq, Np) return false end)
-- calc next Np
+do
+
local function set_attr_icflag_processed(p)
- local a = has_attr(p, attr_icflag) or 0
- if a<= ITALIC then
- set_attr(p, attr_uniqid, uniq_id)
+ if get_attr_icflag(p)<= ITALIC then
set_attr(p, attr_icflag, PROCESSED)
end
end
-local function check_next_ickern()
- if lp.id == id_kern and has_attr(lp, attr_icflag)==ITALIC then
- set_attr(lp, attr_icflag, IC_PROCESSED)
- set_attr(lp, attr_uniqid, uniq_id)
- Np.last = lp; lp = node_next(lp)
- else Np.last = Np.nuc end
+local function check_next_ickern(lp)
+ if lp.id == id_kern and ITALIC == get_attr_icflag(lp) then
+ set_attr(lp, attr_icflag, IC_PROCESSED)
+ Np.last = lp; return node_next(lp)
+ else
+ Np.last = Np.nuc; return lp
+ end
end
-local function calc_np_pbox()
- local uid = has_attr(lp, attr_uniqid)
+local function calc_np_pbox(lp, last)
Np.first = Np.first or lp; Np.id = id_pbox
- lpa = KINSOKU -- dummy=
- while lp~=last and lpa>=PACKED and lpa~=BOXBDD
- and has_attr(lp, attr_uniqid) == uid do
- Np.nuc = lp; set_attr(lp, attr_uniqid, uniq_id)
- lp = node_next(lp); lpa = has_attr(lp, attr_icflag) or 0
+ local lpa = KINSOKU -- dummy=
+ set_attr(lp, attr_icflag, get_attr_icflag(lp));
+ while lp~=last and lpa>=PACKED and lpa<BOXBDD do
+ Np.nuc = lp;
+ lp = node_next(lp); lpa = has_attr(lp, attr_icflag)
+ -- get_attr_icflag() ではいけない!
end
- check_next_ickern()
+ return check_next_ickern(lp)
end
+
local calc_np_auxtable = {
- [id_glyph] = function()
- Np.first = Np.first or lp
- if lp.font == has_attr(lp, attr_curjfnt) then
- Np.id = id_jglyph
- else
- Np.id = id_glyph
- end
- Np.nuc = lp; set_attr_icflag_processed(lp)
- lp = node_next(lp); check_next_ickern(); return true
+ [id_glyph] = function (lp)
+ Np.first, Np.nuc = (Np.first or lp), lp;
+ Np.id = (lp.font == has_attr(lp, attr_curjfnt)) and id_jglyph or id_glyph
+ --set_attr_icflag_processed(lp) treated in ltj-setwidth.lua
+ return true, check_next_ickern(node_next(lp));
end,
- [id_hlist] = function()
+ [id_hlist] = function(lp)
Np.first = Np.first or lp; Np.last = lp; Np.nuc = lp;
set_attr_icflag_processed(lp)
- if lp.shift~=0 then
- Np.id = id_box_like
- else
- Np.id = id_hlist
- end
- lp = node_next(lp); return true
+ Np.id = (lp.shift~=0) and id_box_like or id_hlist
+ return true, node_next(lp)
end,
- [id_vlist] = function()
- Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
- Np.id = id_box_like; set_attr_icflag_processed(lp);
- lp = node_next(lp); return true
- end,
- [id_rule] = function()
- Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
- Np.id = id_box_like; set_attr_icflag_processed(lp);
- lp = node_next(lp); return true
- end,
- [id_ins] = function()
- set_attr_icflag_processed(lp); lp = node_next(lp)
- return false
+ box_like = function(lp)
+ Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
+ Np.id = id_box_like; set_attr_icflag_processed(lp);
+ return true, node_next(lp);
end,
- [id_mark] = function()
- set_attr_icflag_processed(lp); lp = node_next(lp)
- return false
- end,
- [id_adjust] = function()
- set_attr_icflag_processed(lp); lp = node_next(lp)
- return false
- end,
- [id_disc] = function()
- Np.first = Np.first or lp;
- Np.nuc = lp; set_attr_icflag_processed(lp);
- Np.last = lp; Np.id = id_disc; lp = node_next(lp); return true
- end,
- [id_whatsit] = function()
+ skip = function(lp)
+ set_attr_icflag_processed(lp); return false, node_next(lp)
+ end,
+ [id_whatsit] = function(lp)
if lp.subtype==sid_user then
if lp.user_id==30111 then
- local lq = node_next(lp)
- head = node_remove(head, lp); node_free(lp); lp = lq; ihb_flag = true
+ local lq = node_next(lp);
+ head = node.remove(head, lp); node.free(lp); ihb_flag = true
+ return false, lq;
else
set_attr_icflag_processed(lp)
- luatexbase.call_callback("luatexja.jfmglue.whatsit_getinfo"
- , Np, lp, Nq, box_stack_level)
- lp = node_next(lp)
+ luatexbase.call_callback("luatexja.jfmglue.whatsit_getinfo",
+ Np, lp, Nq)
if Np.nuc then
- Np.id = id_pbox_w; Np.first = Np.nuc; Np.last = Np.nuc; return true
+ Np.id = id_pbox_w; Np.first = Np.nuc; Np.last = Np.nuc;
+ return true, node_next(lp)
+ else
+ return false, node_next(lp)
end
end
else
- -- we do special treatment for these whatsit nodes.
- if lp.subtype == sid_start_link or lp.subtype == sid_start_thread then
- Np.first = lp
- elseif lp.subtype == sid_end_link or lp.subtype == sid_end_thread then
- Nq.last = lp; Np.first = nil
- end
- set_attr_icflag_processed(lp); lp = node_next(lp)
+ -- we do special treatment for these whatsit nodes.
+ if lp.subtype == sid_start_link or lp.subtype == sid_start_thread then
+ Np.first = lp
+ elseif lp.subtype == sid_end_link or lp.subtype == sid_end_thread then
+ Np.first, Nq.last = nil, lp;
+ end
+ set_attr_icflag_processed(lp); return false, node_next(lp)
end
- return false
end,
- [id_math] = function()
- Np.first = Np.first or lp; Np.nuc = lp;
+ [id_math] = function(lp)
+ Np.first, Np.nuc = (Np.first or lp), lp;
set_attr_icflag_processed(lp); lp = node_next(lp)
while lp.id~=id_math do
set_attr_icflag_processed(lp); lp = node_next(lp)
end
set_attr_icflag_processed(lp);
- Np.last = lp; Np.id = id_math; lp = node_next(lp);
- return true
+ Np.last, Np.id = lp, id_math;
+ return true, node_next(lp);
end,
- [id_glue] = function()
- Np.first = Np.first or lp; Np.nuc = lp; set_attr_icflag_processed(lp);
- Np.last = lp; Np.id = id_glue; lp = node_next(lp); return true
+ discglue = function(lp)
+ Np.first, Np.nuc, Np.last = (Np.first or lp), lp, lp;
+ Np.id = lp.id; set_attr_icflag_processed(lp); return true, node_next(lp)
end,
- [id_kern] = function()
+ [id_kern] = function(lp)
Np.first = Np.first or lp
if lp.subtype==2 then
set_attr_icflag_processed(lp); lp = node_next(lp)
set_attr_icflag_processed(lp); lp = node_next(lp)
set_attr_icflag_processed(lp); lp = node_next(lp)
set_attr_icflag_processed(lp); Np.nuc = lp
- if lp.font == has_attr(lp, attr_curjfnt) then
- Np.id = id_jglyph
- else
- Np.id = id_glyph
- end
- lp = node_next(lp); check_next_ickern();
+ Np.id = (lp.font == has_attr(lp, attr_curjfnt)) and id_jglyph or id_glyph
+ return true, check_next_ickern(node_next(lp));
else
Np.id = id_kern; set_attr_icflag_processed(lp);
- Np.last = lp; lp = node_next(lp)
+ Np.last = lp; return true, node_next(lp)
end
- return true
end,
- [id_penalty] = function()
+ [id_penalty] = function(lp)
Bp[#Bp+1] = lp; set_attr_icflag_processed(lp);
- lp = node_next(lp); return false
+ return false, node_next(lp)
end,
- [13] = function()
- Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
- Np.id = id_box_like; set_attr_icflag_processed(lp);
- lp = node_next(lp); return true
- end,
}
-
-local function calc_np()
+calc_np_auxtable[id_vlist] = calc_np_auxtable.box_like
+calc_np_auxtable[id_rule] = calc_np_auxtable.box_like
+calc_np_auxtable[13] = calc_np_auxtable.box_like
+calc_np_auxtable[id_ins] = calc_np_auxtable.skip
+calc_np_auxtable[id_mark] = calc_np_auxtable.skip
+calc_np_auxtable[id_adjust] = calc_np_auxtable.skip
+calc_np_auxtable[id_disc] = calc_np_auxtable.discglue
+calc_np_auxtable[id_glue] = calc_np_auxtable.discglue
+
+local pairs = pairs
+function calc_np(lp, last)
+ local k
-- We assume lp = node_next(Np.last)
- local lpi, lpa, Nr
- Nr = Nq; for k in pairs(Nr) do Nr[k] = nil end
- Nq = Np; Np = Nr
- for k in pairs(Bp) do Bp[k] = nil end
- ihb_flag = false
+ Np, Nq, ihb_flag = Nq, Np, false
+ -- We clear `predefined' entries of Np before pairs() loop,
+ -- because using only pairs() loop is slower.
+ Np.post, Np.pre, Np.xspc = nil, nil, nil
+ Np.first, Np.id, Np.last, Np.lend, Np.met = nil, nil, nil, nil
+ Np.auto_kspc, Np.auto_xspc, Np.char, Np.class, Np.nuc = nil, nil, nil, nil, nil
+ for k in pairs(Np) do Np[k] = nil end
+
+ for k = 1,#Bp do Bp[k] = nil end
while lp ~= last do
- lpa = has_attr(lp, attr_icflag) or 0
+ local lpa = has_attr(lp, attr_icflag) or 0
+ -- unbox 由来ノードの検出
if lpa>=PACKED then
if lpa == BOXBDD then
- local lq = node_next(lp)
- head = node_remove(head, lp); node_free(lp); lp = lq
- else calc_np_pbox(); return
+ local lq = node_next(lp)
+ head = node.remove(head, lp); node.free(lp); lp = lq
+ else return calc_np_pbox(lp, last)
end -- id_pbox
- elseif calc_np_auxtable[lp.id]() then return end
+ else
+ k, lp = calc_np_auxtable[lp.id](lp)
+ if k then return lp end
+ end
end
- Np = nil; return
+ Np = nil; return lp
+end
+
end
+local calc_np = calc_np
-- extract informations from Np
-- We think that "Np is a Japanese character" if Np.met~=nil,
-- "Np is an alphabetic character" if Np.pre~=nil,
-- "Np is not a character" otherwise.
+do
-- 和文文字のデータを取得
-function set_np_xspc_jachar(Nx, x)
- local z = ltjf_font_metric_table[x.font]
- local c = x.char
- local cls = ltjf_find_char_class(c, z)
- local m = ltjf_metrics[z.jfm]
- set_attr(x, attr_jchar_class, cls)
- Nx.class = cls
- Nx.char = c
- Nx.size= z.size
- Nx.met = m
- Nx.var = z.var
- Nx.pre = ltjs_get_penalty_table('pre', c, 0, box_stack_level)
- Nx.post = ltjs_get_penalty_table('post', c, 0, box_stack_level)
- z = fast_find_char_class('lineend', m)
- local y = m.size_cache[Nx.size].char_type[Nx.class]
- if y.kern and y.kern[z] then
- Nx.lend = y.kern[z]
- else
- Nx.lend = 0
- end
- y = ltjs_get_penalty_table('xsp', c, 3, box_stack_level)
- Nx.xspc_before = (y%2==1)
- Nx.xspc_after = (y>=2)
- Nx.auto_kspc = (has_attr(x, attr_autospc)==1)
- Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1)
-end
+ local attr_jchar_class = luatexbase.attributes['ltj@charclass']
+ function set_np_xspc_jachar(Nx, x)
+ local m = ltjf_font_metric_table[x.font]
+ local c = has_attr(x, attr_orig_char) or x.char
+ local cls = ltjf_find_char_class(x.char, m)
+ if c ~= x.char and cls==0 then cls = ltjf_find_char_class(-c, m) end
+ Nx.class = cls; set_attr(x, attr_jchar_class, cls)
+ Nx.lend = m.size_cache.char_type[cls].kern[fast_find_char_class('lineend', m)] or 0
+ Nx.met, Nx.var, Nx.char = m, m.var, c
+ Nx.pre = ltjs_fast_get_penalty_table('pre', c) or 0
+ Nx.post = ltjs_fast_get_penalty_table('post', c) or 0
+ Nx.xspc = ltjs_fast_get_penalty_table('xsp', c) or 3
+ Nx.auto_kspc, Nx.auto_xspc = (has_attr(x, attr_autospc)==1), (has_attr(x, attr_autoxspc)==1)
+ end
+ local set_np_xspc_jachar = set_np_xspc_jachar
-- 欧文文字のデータを取得
-local ligature_head = 1
-local ligature_tail = 2
-function set_np_xspc_alchar(Nx, c,x, lig)
- if c~=-1 then
- if lig == ligature_head then
- while x.components and x.subtype and math.floor(x.subtype/2)%2==1 do
- x = x.components; c = x.char
+ local floor = math.floor
+ function set_np_xspc_alchar(Nx, c,x, lig)
+ if c~=-1 then
+ if lig == ligature_head then
+ while x.components and x.subtype and math.floor(x.subtype*0.5)%2==1 do
+ x = x.components; c = x.char
+ end
+ else
+ while x.components and x.subtype and math.floor(x.subtype*0.5)%2==1 do
+ x = node.tail(x.components); c = x.char
+ end
end
+ Nx.pre = ltjs_fast_get_penalty_table('pre', c) or 0
+ Nx.post = ltjs_fast_get_penalty_table('post', c) or 0
+ Nx.char = 'jcharbdd'
else
- while x.components and x.subtype and math.floor(x.subtype/2)%2==1 do
- x = node_tail(x.components); c = x.char
- end
+ Nx.pre, Nx.post, Nx.char = 0, 0, -1
end
- Nx.pre = ltjs_get_penalty_table('pre', c, 0, box_stack_level)
- Nx.post = ltjs_get_penalty_table('post', c, 0, box_stack_level)
- Nx.char = 'jcharbdd'
- else
- Nx.pre = 0; Nx.post = 0; Nx.char = -1
+ Nx.met = nil
+ Nx.xspc = ltjs_fast_get_penalty_table('xsp', c) or 3
+ Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1)
end
- Nx.met = nil
- local y = ltjs_get_penalty_table('xsp', c, 3, box_stack_level)
- Nx.xspc_before = (y%2==1)
- Nx.xspc_after = (y>=2)
- Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1)
-end
+ local set_np_xspc_alchar = set_np_xspc_alchar
-- Np の情報取得メインルーチン
-local function extract_np()
- local x = Np.nuc;
- if Np.id == id_jglyph then set_np_xspc_jachar(Np, x)
- elseif Np.id == id_glyph then set_np_xspc_alchar(Np, x.char, x, ligature_head)
- elseif Np.id == id_hlist then Np.last_char = check_box_high(Np, x.head, nil)
- elseif Np.id == id_pbox then Np.last_char = check_box_high(Np, Np.first, node.next(Np.last))
- elseif Np.id == id_disc then Np.last_char = check_box_high(Np, x.replace, nil)
- elseif Np.id == id_math then set_np_xspc_alchar(Np, -1, x)
+ function extract_np()
+ local x, i = Np.nuc, Np.id;
+ if i == id_jglyph then return set_np_xspc_jachar(Np, x)
+ elseif i == id_glyph then return set_np_xspc_alchar(Np, x.char, x, ligature_head)
+ elseif i == id_hlist then Np.last_char = check_box_high(Np, x.head, nil)
+ elseif i == id_pbox then Np.last_char = check_box_high(Np, Np.first, node_next(Np.last))
+ elseif i == id_disc then Np.last_char = check_box_high(Np, x.replace, nil)
+ elseif i == id_math then return set_np_xspc_alchar(Np, -1, x)
+ end
end
-end
-
--- change the information for the next loop
--- (will be done if Nx is an alphabetic character or a hlist)
-function after_hlist(Nx)
- if Nx.last_char then
- if Nx.last_char.font == has_attr(Nx.last_char, attr_curjfnt) then
- set_np_xspc_jachar(Nx, Nx.last_char);
+
+ -- change the information for the next loop
+ -- (will be done if Nx is an alphabetic character or a hlist)
+ function after_hlist(Nx)
+ local s = Nx.last_char
+ if s then
+ if s.font == has_attr(s, attr_curjfnt) then
+ set_np_xspc_jachar(Nx, s)
+ else
+ set_np_xspc_alchar(Nx, s.char, s, ligature_tail)
+ end
else
- set_np_xspc_alchar(Nx, Nx.last_char.char,Nx.last_char, ligature_tail)
+ Nx.pre, Nx.met = nil, nil
end
- else
- Nx.pre = nil; Nx.met = nil
end
-end
+
+ function after_alchar(Nx)
+ local x = Nx.nuc
+ return set_np_xspc_alchar(Nx, x.char,x, ligature_tail)
+ end
-local function after_alchar(Nx)
- local x = Nx.nuc
- set_np_xspc_alchar(Nx, x.char,x, ligature_tail)
end
-
+local after_hlist, after_alchar, extract_np = after_hlist, after_alchar, extract_np
-------------------- 最下層の処理
@@ -524,11 +494,9 @@ local function lineend_fix(g)
Nq.lend = 0
elseif Nq.lend~=0 then
if not g then
- g = node_new(id_kern); g.subtype = 1; g.kern = -Nq.lend;
- set_attr(g, attr_icflag, LINEEND)
- set_attr(g, attr_uniqid, uniq_id)
- elseif g.id==id_kern then
- g.kern = g.kern - Nq.lend
+ g = node_new(id_kern); --copy_attr(g, Nq.nuc);
+ g.subtype = 1; g.kern = -Nq.lend;
+ set_attr(g, attr_icflag, LINEEND)
else
g.spec.width = g.spec.width - Nq.lend
end
@@ -541,15 +509,14 @@ local function handle_penalty_normal(post, pre, g)
local a = (pre or 0) + (post or 0)
if #Bp == 0 then
if (a~=0 and not(g and g.id==id_kern)) or Nq.lend~=0 then
- local p = node_new(id_penalty)
+ local p = node_new(id_penalty); --copy_attr(p, Nq.nuc)
if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end
p.penalty = a
- head = node_insert_before(head, Np.first, p)
- table_insert(Bp, p);
- set_attr(p, attr_icflag, KINSOKU)
- set_attr(p, attr_uniqid, uniq_id)
+ head = insert_before(head, Np.first, p)
+ Bp[1]=p;
+ set_attr(p, attr_icflag, KINSOKU)
end
- else for i, v in pairs(Bp) do add_penalty(v,a) end
+ else for _, v in pairs(Bp) do add_penalty(v,a) end
end
end
@@ -557,15 +524,14 @@ local function handle_penalty_always(post, pre, g)
local a = (pre or 0) + (post or 0)
if #Bp == 0 then
if not (g and g.id==id_glue) or Nq.lend~=0 then
- local p = node_new(id_penalty)
+ local p = node_new(id_penalty); --copy_attr(p, Nq.nuc)
if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end
p.penalty = a
- head = node_insert_before(head, Np.first, p)
- table_insert(Bp, p)
- set_attr(p, attr_icflag, KINSOKU)
- set_attr(p, attr_uniqid, uniq_id)
+ head = insert_before(head, Np.first, p)
+ Bp[1]=p
+ set_attr(p, attr_icflag, KINSOKU)
end
- else for i, v in pairs(Bp) do add_penalty(v,a) end
+ else for _, v in pairs(Bp) do add_penalty(v,a) end
end
end
@@ -573,35 +539,26 @@ local function handle_penalty_suppress(post, pre, g)
local a = (pre or 0) + (post or 0)
if #Bp == 0 then
if g and g.id==id_glue then
- local p = node_new(id_penalty)
- p.penalty = 10000; head = node_insert_before(head, Np.first, p)
- table_insert(Bp, p);
- set_attr(p, attr_icflag, KINSOKU)
- set_attr(p, attr_uniqid, uniq_id)
+ local p = node_new(id_penalty); --copy_attr(p, Nq.nuc)
+ p.penalty = 10000; head = insert_before(head, Np.first, p)
+ Bp[1]=p
+ set_attr(p, attr_icflag, KINSOKU)
end
- else for i, v in pairs(Bp) do add_penalty(v,a) end
+ else for _, v in pairs(Bp) do add_penalty(v,a) end
end
end
-- 和文文字間の JFM glue を node 化
local function new_jfm_glue(Nn, bc, ac)
-- bc, ac: char classes
- local g = nil
- local z = Nn.met.size_cache[Nn.size].char_type[bc]
- if z.glue and z.glue[ac] then
- local h = node_new(id_glue_spec)
- h.width = z.glue[ac][1]
- h.stretch = z.glue[ac][2]
- h.shrink = z.glue[ac][3]
- h.stretch_order=0; h.shrink_order=0
- g = node_new(id_glue)
- g.subtype = 0; g.spec = h
- elseif z.kern and z.kern[ac] then
- g = node_new(id_kern)
+ local z = Nn.met.size_cache.char_type[bc]
+ local g = z.glue[ac]
+ if g then
+ g = node_copy(g); g.spec = node.copy(g.spec);
+ elseif z.kern[ac] then
+ g = node_new(id_kern); --copy_attr(g, Nn.nuc)
g.subtype = 1; g.kern = z.kern[ac]
- end
- if g then
- set_attr(g, attr_icflag, FROM_JFM); set_attr(g, attr_uniqid, uniq_id)
+ set_attr(g, attr_icflag, FROM_JFM);
end
return g
end
@@ -609,40 +566,40 @@ end
-- Nq.last (kern w) .... (glue/kern g) Np.first
local function real_insert(w, g)
if w~=0 then
- local h = node_new(id_kern)
+ local h = node_new(id_kern); --copy_attr(h, Nq.nuc)
set_attr(h, attr_icflag, LINE_END)
- set_attr(h, attr_uniqid, uniq_id)
h.kern = w; h.subtype = 1
- head = node_insert_after(head, Nq.last, h)
+ head = node.insert_after(head, Nq.last, h)
end
if g then
- head = node_insert_before(head, Np.first, g)
+ head = insert_before(head, Np.first, g)
Np.first = g
end
end
+
-------------------- 和文文字間空白量の決定
-- get kanjiskip
-local function get_kanji_skip_from_jfm(Nn)
- local i = Nn.met.size_cache[Nn.size].kanjiskip
- if i then
- return { i[1], i[2], i[3] }
- else return nil
- end
+local get_kanjiskip
+
+local function get_kanjiskip_normal()
+ local g = node_new(id_glue); --copy_attr(g, Nq.nuc)
+ g.spec = (Np.auto_kspc or Nq.auto_kspc) and node_copy(kanji_skip) or get_zero_spec()
+ set_attr(g, attr_icflag, KANJI_SKIP)
+ return g
end
-local function get_kanjiskip()
- local g = node_new(id_glue)
+local function get_kanjiskip_jfm()
+ local g = node_new(id_glue); --copy_attr(g, Nq.nuc)
if Np.auto_kspc or Nq.auto_kspc then
- if kanji_skip.width == max_dimen then
local gx = node_new(id_glue_spec);
- gx.stretch_order = 0; gx.shrink_order = 0
- local bk = get_kanji_skip_from_jfm(Nq)
+ gx.stretch_order, gx.shrink_order = 0, 0
+ local bk = Nq.met.size_cache.kanjiskip
local ak
- if (Np.met==Nq.met) and (Nq.size==Np.size) and (Nq.var==Np.var) then
+ if (Np.met.size_cache==Nq.met.size_cache) and (Nq.var==Np.var) then
ak = nil
else
- ak = get_kanji_skip_from_jfm(Np)
+ ak = Np.met.size_cache.kanjiskip
end
if bk then
if ak then
@@ -654,15 +611,14 @@ local function get_kanjiskip()
end
elseif ak then
gx.width = ak[1]; gx.stretch = ak[2]; gx.shrink = ak[3]
- else node_free(gx); gx = get_zero_spec() -- fallback
+ else
+ gx.width, gx.stretch, gx.shrink = 0, 0, 0
end
g.spec = gx
- else g.spec=node_copy(kanji_skip); node_free(gx) end
else
- g.spec = get_zero_spec(); node_free(gx)
+ g.spec = get_zero_spec()
end
set_attr(g, attr_icflag, KANJI_SKIP)
- set_attr(g, attr_uniqid, uniq_id)
return g
end
@@ -677,26 +633,26 @@ local function calc_ja_ja_aux(gb,ga)
gb.spec.width = round(diffmet_rule(gb.spec.width, ga.spec.width))
gb.spec.stretch = round(diffmet_rule(gb.spec.stretch,ga.spec.shrink))
gb.spec.shrink = -round(diffmet_rule(-gb.spec.shrink, -ga.spec.shrink))
- node_free(ga)
+ node.free(ga)
return gb
elseif k == 'kernkern' then
-- 両方とも kern.
gb.kern = round(diffmet_rule(gb.kern, ga.kern))
- node_free(ga)
+ node.free(ga)
return gb
elseif k == 'kernglue' then
-- gb: kern, ga: glue
ga.spec.width = round(diffmet_rule(gb.kern,ga.spec.width))
ga.spec.stretch = round(diffmet_rule(ga.spec.stretch, 0))
ga.spec.shrink = -round(diffmet_rule(-ga.spec.shrink, 0))
- node_free(gb)
+ node.free(gb)
return ga
else
-- gb: glue, ga: kern
gb.spec.width = round(diffmet_rule(ga.kern, gb.spec.width))
gb.spec.stretch = round(diffmet_rule(gb.spec.stretch, 0))
gb.spec.shrink = -round(diffmet_rule(-gb.spec.shrink, 0))
- node_free(ga)
+ node.free(ga)
return gb
end
end
@@ -704,105 +660,101 @@ end
local function calc_ja_ja_glue()
if ihb_flag then return nil
- elseif (Nq.size==Np.size) and (Nq.met==Np.met) and (Nq.var==Np.var) then
+ elseif (Nq.met.size_cache==Np.met.size_cache) and (Nq.var==Np.var) then
return new_jfm_glue(Nq, Nq.class, Np.class)
else
- local g = new_jfm_glue(Nq, Nq.class,
- fast_find_char_class('diffmet',Nq.met))
- local h = new_jfm_glue(Np, fast_find_char_class('diffmet',Np.met),
- Np.class)
- return calc_ja_ja_aux(g,h)
+ return calc_ja_ja_aux(new_jfm_glue(Nq, Nq.class, fast_find_char_class('diffmet',Nq.met)),
+ new_jfm_glue(Np, fast_find_char_class('diffmet',Np.met), Np.class))
end
end
-------------------- 和欧文間空白量の決定
-- get xkanjiskip
-local function get_xkanji_skip_from_jfm(Nn)
- local i = Nn.met.size_cache[Nn.size].xkanjiskip
- if i then
- return { i[1], i[2], i[3] }
- else return nil
+local get_xkanjiskip
+local function get_xkanjiskip_normal(Nn)
+ local g = node_new(id_glue); --copy_attr(g, Nn.nuc)
+ local gx = node_new(id_glue_spec); g.spec = gx
+ if (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then
+ g.spec = node_copy(xkanji_skip)
+ else
+ g.spec = get_zero_spec()
end
+ set_attr(g, attr_icflag, XKANJI_SKIP)
+ return g
end
-local function get_xkanjiskip(Nn)
- local g = node_new(id_glue)
- if Nq.xspc_after and Np.xspc_before and (Nq.auto_xspc or Np.auto_xspc) then
- if xkanji_skip.width == max_dimen then
- local gx = node_new(id_glue_spec);
- gx.stretch_order = 0; gx.shrink_order = 0
- local bk = get_xkanji_skip_from_jfm(Nn)
- if bk then
- gx.width = bk[1]; gx.stretch = bk[2]; gx.shrink = bk[3]
- else node_free(gx); gx = get_zero_spec() -- fallback
- end
- g.spec = gx
- else g.spec=node_copy(xkanji_skip) end
+local function get_xkanjiskip_jfm(Nn)
+ local g = node_new(id_glue); --copy_attr(g, Nn.nuc)
+ if (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then
+ local gx = node_new(id_glue_spec);
+ gx.stretch_order, gx.shrink_order = 0, 0
+ local bk = Nn.met.size_cache.xkanjiskip
+ if bk then
+ gx.width = bk[1]; gx.stretch = bk[2]; gx.shrink = bk[3]
+ else
+ gx.width, gx.stretch, gx.shrink = 0, 0, 0
+ end
+ g.spec = gx
else
g.spec = get_zero_spec()
end
set_attr(g, attr_icflag, XKANJI_SKIP)
- set_attr(g, attr_uniqid, uniq_id)
return g
end
+
-------------------- 隣接した「塊」間の処理
local function get_OA_skip()
if not ihb_flag then
- local c = Nq.char or 'jcharbdd'
- return new_jfm_glue(Np, fast_find_char_class(c,Np.met), Np.class)
+ return new_jfm_glue(Np,
+ fast_find_char_class(((Nq.id == id_math and -1) or 'jcharbdd'), Np.met), Np.class)
else return nil
end
end
local function get_OB_skip()
if not ihb_flag then
- local c = Np.char or 'jcharbdd'
- return new_jfm_glue(Nq, Nq.class, fast_find_char_class(c,Nq.met))
+ return new_jfm_glue(Nq, Nq.class,
+ fast_find_char_class(((Np.id == id_math and -1) or'jcharbdd'), Nq.met))
else return nil
end
end
-- (anything) .. jachar
-local function handle_np_jachar()
- local g
+local function handle_np_jachar(mode)
if Nq.id==id_jglyph or ((Nq.id==id_pbox or Nq.id==id_pbox_w) and Nq.met) then
- g = calc_ja_ja_glue() or get_kanjiskip() -- M->K
- g = lineend_fix(g)
+ local g = lineend_fix(calc_ja_ja_glue() or get_kanjiskip()) -- M->K
handle_penalty_normal(Nq.post, Np.pre, g); real_insert(Nq.lend, g)
elseif Nq.met then -- Nq.id==id_hlist
- g = get_OA_skip() or get_kanjiskip() -- O_A->K
+ local g = get_OA_skip() or get_kanjiskip() -- O_A->K
handle_penalty_normal(0, Np.pre, g); real_insert(0, g)
elseif Nq.pre then
- g = get_OA_skip() or get_xkanjiskip(Np) -- O_A->X
+ local g = get_OA_skip() or get_xkanjiskip(Np) -- O_A->X
if Nq.id==id_hlist then Nq.post = 0 end
handle_penalty_normal(Nq.post, Np.pre, g); real_insert(0, g)
else
- g = get_OA_skip() -- O_A
+ local g = get_OA_skip() -- O_A
if Nq.id==id_glue then handle_penalty_normal(0, Np.pre, g)
elseif Nq.id==id_kern then handle_penalty_suppress(0, Np.pre, g)
else handle_penalty_always(0, Np.pre, g)
end
real_insert(0, g)
end
- -- \jcharwidowpenalty 挿入予定箇所更新
- if mode and ltjs_get_penalty_table('kcat', Np.char, 0, box_stack_level)%2~=1 then
- widow_Np.first = Np.first;
- local Bpr = widow_Bp; widow_Bp = Bp; Bp = Bpr
+ if mode and (ltjs_fast_get_penalty_table('kcat', Np.char) or 0)%2~=1 then
+ widow_Np.first, widow_Bp, Bp = Np.first, Bp, widow_Bp
end
end
+
-- jachar .. (anything)
local function handle_nq_jachar()
- local g
- if Np.pre then
+ if Np.pre then
if Np.id==id_hlist then Np.pre = 0 end
- g = get_OB_skip() or get_xkanjiskip(Nq) -- O_B->X
- g = lineend_fix(g)
+ local g = lineend_fix(get_OB_skip() or get_xkanjiskip(Nq)) -- O_B->X
handle_penalty_normal(Nq.post, Np.pre, g); real_insert(Nq.lend, g)
else
- g = get_OB_skip(); g = lineend_fix(g) -- O_B
+ local g = lineend_fix(get_OB_skip()) -- O_B
if Np.id==id_glue then handle_penalty_normal(Nq.post, 0, g)
elseif Np.id==id_kern then handle_penalty_suppress(Nq.post, 0, g)
else handle_penalty_always(Nq.post, 0, g)
@@ -811,27 +763,24 @@ local function handle_nq_jachar()
end
end
--- (anything) .. (和文文字で終わる hlist)
+-- (anything) .. (和文文字で始まる hlist)
local function handle_np_ja_hlist()
- local g
if Nq.id==id_jglyph or ((Nq.id==id_pbox or Nq.id == id_pbox_w) and Nq.met) then
- g = get_OB_skip() or get_kanjiskip() -- O_B->K
- g = lineend_fix(g)
+ local g = lineend_fix(get_OB_skip() or get_kanjiskip()) -- O_B->K
handle_penalty_normal(Nq.post, 0, g); real_insert(Nq.lend, g)
elseif Nq.met then -- Nq.id==id_hlist
- g = get_kanjiskip() -- K
+ local g = get_kanjiskip() -- K
handle_penalty_suppress(0, 0, g); real_insert(0, g)
elseif Nq.pre then
- g = get_xkanjiskip(Np) -- X
+ local g = get_xkanjiskip(Np) -- X
handle_penalty_suppress(0, 0, g); real_insert(0, g)
end
end
-- (和文文字で終わる hlist) .. (anything)
local function handle_nq_ja_hlist()
- local g = nil
if Np.pre then
- g = get_xkanjiskip(Nq) -- X
+ local g = get_xkanjiskip(Nq) -- X
handle_penalty_suppress(0, 0, g); real_insert(0, g)
end
end
@@ -842,29 +791,30 @@ local function adjust_nq()
elseif Nq.id==id_hlist or Nq.id==id_pbox or Nq.id==id_disc then after_hlist(Nq)
elseif Nq.id == id_pbox_w then
luatexbase.call_callback("luatexja.jfmglue.whatsit_after",
- false, Nq, Np, box_stack_level)
+ false, Nq, Np)
end
end
-------------------- 開始・終了時の処理
-- リスト末尾の処理
-local function handle_list_tail()
+local function handle_list_tail(mode)
adjust_nq(); Np = Nq
if mode then
-- the current list is to be line-breaked:
if Np.id == id_jglyph or (Np.id==id_pbox and Np.met) then
if Np.lend~=0 then
g = node_new(id_kern); g.subtype = 0; g.kern = Np.lend
- set_attr(g, attr_icflag, BOXBDD)
- node_insert_after(head, Np.last, g)
+ --copy_attr(g, Np.nuc);
+ set_attr(g, attr_icflag, BOXBDD)
+ node.insert_after(head, Np.last, g)
end
end
-- Insert \jcharwidowpenalty
Bp = widow_Bp; Np = widow_Np; Nq.lend = 0
if Np.first then
handle_penalty_normal(0,
- ltjs_get_penalty_table('jwp', 0, 0, box_stack_level))
+ ltjs_fast_get_penalty_table('jwp', 0) or 0)
end
else
-- the current list is the contents of a hbox
@@ -872,73 +822,71 @@ local function handle_list_tail()
local g = new_jfm_glue(Np, Np.class, fast_find_char_class('boxbdd',Np.met))
if g then
set_attr(g, attr_icflag, BOXBDD)
- head = node_insert_after(head, Np.last, g)
+ head = node.insert_after(head, Np.last, g)
end
end
end
end
-- リスト先頭の処理
-local function handle_list_head()
+local function handle_list_head(par_indented)
if Np.id == id_jglyph or (Np.id==id_pbox and Np.met) then
if not ihb_flag then
- local g
- if par_indented then
- g = new_jfm_glue(Np, fast_find_char_class('parbdd',Np.met), Np.class)
- else
- g = new_jfm_glue(Np, fast_find_char_class('boxbdd',Np.met), Np.class)
- end
+ local g = new_jfm_glue(Np, fast_find_char_class(par_indented, Np.met), Np.class)
if g then
set_attr(g, attr_icflag, BOXBDD)
if g.id==id_glue and #Bp==0 then
- local h = node_new(id_penalty)
+ local h = node_new(id_penalty); --copy_attr(h, Np.nuc)
h.penalty = 10000; set_attr(h, attr_icflag, BOXBDD)
end
- head = node_insert_before(head, Np.first, g)
+ head = insert_before(head, Np.first, g)
end
end
end
end
-- initialize
-local function init_var()
- uniq_id = uniq_id +1
- if uniq_id == 0x7FFFFFF then uniq_id = 0 end
- lp = head; Bp = {}; widow_Bp = {}; widow_Np = {first = nil}
- par_indented = false
- box_stack_level = ltjp.box_stack_level
+-- return value: (the initial cursor lp), (last node)
+local function init_var(mode)
+ Bp, widow_Bp, widow_Np = {}, {}, {first = nil}
kanji_skip=skip_table_to_spec('kanjiskip')
+ get_kanjiskip = (kanji_skip.width == max_dimen)
+ and get_kanjiskip_jfm or get_kanjiskip_normal
xkanji_skip=skip_table_to_spec('xkanjiskip')
+ get_xkanjiskip = (xkanji_skip.width == max_dimen)
+ and get_xkanjiskip_jfm or get_xkanjiskip_normal
Np = {
auto_kspc=nil, auto_xspc=nil, char=nil, class=nil,
first=nil, id=nil, last=nil, lend=0, met=nil, nuc=nil,
- post=nil, pre=nil, var=nil, xspc_after=nil, xspc_before=nil,
+ post=nil, pre=nil, xspc=nil,
}
Nq = {
auto_kspc=nil, auto_xspc=nil, char=nil, class=nil,
first=nil, id=nil, last=nil, lend=0, met=nil, nuc=nil,
- post=nil, pre=nil, var=nil, xspc_after=nil, xspc_before=nil,
+ post=nil, pre=nil, xspc=nil,
}
if mode then
-- the current list is to be line-breaked:
-- hbox from \parindent is skipped.
+ local lp, par_indented = head, 'boxbdd'
while lp and ((lp.id==id_whatsit and lp.subtype~=sid_user)
or ((lp.id==id_hlist) and (lp.subtype==3))) do
- if (lp.id==id_hlist) and (lp.subtype==3) then par_indented = true end
+ if (lp.id==id_hlist) and (lp.subtype==3) then par_indented = 'parbdd' end
lp=node_next(lp) end
- last=node.tail(head)
+ return lp, node.tail(head), par_indented
else
-- the current list is the contents of a hbox:
- -- insert a sentinelEG
- last=node.tail(head); local g = node_new(id_kern)
- node_insert_after(head, last, g); last = g
+ -- insert a sentinel
+ local g = node_new(id_kern)
+ node.insert_after(head, node.tail(head), g); last = g
+ return head, g, 'boxbdd'
end
end
-local function cleanup()
+local function cleanup(mode, last)
-- adjust attr_icflag for avoiding error
- tex.attribute[attr_icflag] = -(0x7FFFFFFF)
- node_free(kanji_skip); node_free(xkanji_skip)
+ tex.setattribute('global', attr_icflag, 0)
+ node.free(kanji_skip); node.free(xkanji_skip)
if mode then
local h = node_next(head)
if h.id == id_penalty and h.penalty == 10000 then
@@ -949,27 +897,31 @@ local function cleanup()
end
return head
else
- head = node_remove(head, last); node_free(last);-- remove the sentinel
+ head = node.remove(head, last); node.free(last);-- remove the sentinel
+ set_attr(head, attr_icflag,
+ get_attr_icflag(head) + PROCESSED_BEGIN_FLAG);
return head
end
end
-------------------- 外部から呼ばれる関数
-- main interface
-function main(ahead, amode)
+function main(ahead, mode)
if not ahead then return ahead end
- head = ahead; mode = amode; init_var(); calc_np()
+ head = ahead;
+ local lp, last, par_indented = init_var(mode);
+ lp = calc_np(lp, last)
if Np then
- extract_np(); handle_list_head()
+ extract_np(); handle_list_head(par_indented)
else
- return cleanup()
+ return cleanup(mode, last)
end
- calc_np()
+ lp = calc_np(lp, last)
while Np do
extract_np(); adjust_nq()
- -- 挿入部
+ -- 挿入部
if Np.id == id_jglyph then
- handle_np_jachar()
+ handle_np_jachar(mode)
elseif Np.met then
if Np.id==id_hlist then handle_np_ja_hlist()
else handle_np_jachar() end
@@ -977,10 +929,10 @@ function main(ahead, amode)
if Nq.id==id_hlist then handle_nq_ja_hlist()
else handle_nq_jachar() end
end
- calc_np()
+ lp = calc_np(lp, last)
end
- handle_list_tail()
- return cleanup()
+ handle_list_tail(mode)
+ return cleanup(mode, last)
end
-- \inhibitglue
@@ -999,24 +951,25 @@ function create_beginpar_node()
node.write(tn)
end
-local function whatsit_callback(Np, lp, Nq, bsl)
+do
+
+local function whatsit_callback(Np, lp, Nq)
if Np and Np.nuc then return Np
elseif Np and lp.user_id == 30114 then
Np.first = lp; Np.nuc = lp; Np.last = lp
Np.char = 'parbdd'
Np.met = nil
Np.pre = 0; Np.post = 0
- Np.xspc_before = false
- Np.xspc_after = false
+ Np.xspc = 0
Np.auto_xspc = false
return Np
end
end
-local function whatsit_after_callback(s, Nq, Np, bsl)
+local function whatsit_after_callback(s, Nq, Np)
if not s and Nq.nuc.user_id == 30114 then
local x, y = node.prev(Nq.nuc), Nq.nuc
Nq.first, Nq.nuc, Nq.last = x, x, x
- head = node_remove(head, y)
+ head = node.remove(head, y)
end
return s
end
@@ -1026,3 +979,4 @@ luatexbase.add_to_callback("luatexja.jfmglue.whatsit_getinfo", whatsit_callback,
luatexbase.add_to_callback("luatexja.jfmglue.whatsit_after", whatsit_after_callback,
"luatexja.beginpar.np_info_after", 1)
+end \ No newline at end of file
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua
index 2ca43daa0b7..e15563a0cef 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-jfont.lua
@@ -14,14 +14,18 @@ luatexja.load_module('charrange'); local ltjc = luatexja.charrange
local node_new = node.new
local has_attr = node.has_attribute
+local set_attr = node.set_attribute
local round = tex.round
local attr_icflag = luatexbase.attributes['ltj@icflag']
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local id_glyph = node.id('glyph')
local id_kern = node.id('kern')
+local id_glue_spec = node.id('glue_spec')
+local id_glue = node.id('glue')
local cat_lp = luatexbase.catcodetables['latex-package']
local ITALIC = 1
+local FROM_JFM = 4
------------------------------------------------------------------------
-- LOADING JFM
------------------------------------------------------------------------
@@ -56,6 +60,13 @@ function define_jfm(t)
real_char = true;
elseif type(w) == 'string' and utf.len(w)==1 then
real_char = true; w = utf.byte(w)
+ elseif type(w) == 'string' and utf.len(w)==2 and utf.sub(w,2) == '*' then
+ real_char = true; w = utf.byte(utf.sub(w,1,1))
+ if not t.chars[-w] then
+ t.chars[-w] = i
+ else
+ defjfm_res= nil; return
+ end
end
if not t.chars[w] then
t.chars[w] = i
@@ -82,17 +93,17 @@ function define_jfm(t)
if type(v.down)~='number' then
v.down = 0.0
end
- if type(v.align)=='nil' then
+ if type(v.align)~='string' then
v.align = 'left'
end
end
end
v.chars = nil
end
- if v.kern and v.glue then
- for j,w in pairs(v.glue) do
- if v.kern[j] then defjfm_res= nil; return end
- end
+ if not v.kern then v.kern = {} end
+ if not v.glue then v.glue = {} end
+ for j in pairs(v.glue) do
+ if v.kern[j] then defjfm_res= nil; return end
end
t.char_type[i] = v
t[i] = nil
@@ -111,8 +122,8 @@ local function mult_table(old,scale) -- modified from table.fastcopy
new[k] = mult_table(v,scale)
elseif type(v) == "number" then
new[k] = round(v*scale)
- else
- new[k] = v
+ else
+ new[k] = v
end
end
return new
@@ -121,12 +132,24 @@ end
local function update_jfm_cache(j,sz)
if metrics[j].size_cache[sz] then return end
- metrics[j].size_cache[sz] = {}
- metrics[j].size_cache[sz].char_type = mult_table(metrics[j].char_type, sz)
- metrics[j].size_cache[sz].kanjijskip = mult_table(metrics[j].kanjiskip, sz)
- metrics[j].size_cache[sz].xkanjiskip = mult_table(metrics[j].xkanjiskip,sz)
- metrics[j].size_cache[sz].zw = round(metrics[j].zw*sz)
- metrics[j].size_cache[sz].zh = round(metrics[j].zh*sz)
+ local t = {}
+ metrics[j].size_cache[sz] = t
+ t.chars = metrics[j].chars
+ t.char_type = mult_table(metrics[j].char_type, sz)
+ for i,v in pairs(t.char_type) do
+ if type(i) == 'number' then -- char_type
+ for k,w in pairs(v.glue) do
+ local g, h = node.new(id_glue), node_new(id_glue_spec); v.glue[k] = g
+ h.width, h.stretch, h.shrink = w[1], w[2], w[3]
+ h.stretch_order, h.shrink_order = 0, 0
+ g.subtype = 0; g.spec = h; set_attr(g, attr_icflag, FROM_JFM);
+ end
+ end
+ end
+ t.kanjiskip = mult_table(metrics[j].kanjiskip, sz)
+ t.xkanjiskip = mult_table(metrics[j].xkanjiskip,sz)
+ t.zw = round(metrics[j].zw*sz)
+ t.zh = round(metrics[j].zh*sz)
end
luatexbase.create_callback("luatexja.find_char_class", "data",
@@ -135,9 +158,9 @@ luatexbase.create_callback("luatexja.find_char_class", "data",
end)
function find_char_class(c,m)
--- c: character code, m: index in font_metric table
- if not metrics[m.jfm] then return 0 end
- return metrics[m.jfm].chars[c] or
+-- c: character code, m:
+ if not m then return 0 end
+ return m.size_cache.chars[c] or
luatexbase.call_callback("luatexja.find_char_class", 0, m, c)
end
@@ -193,7 +216,8 @@ function jfontdefY() -- for horizontal font
return
end
update_jfm_cache(j, f.size)
- local fmtable = { jfm = j, size = f.size, var = jfm_var }
+ local fmtable = { jfm = j, size = f.size, var = jfm_var,
+ size_cache = metrics[j].size_cache[f.size] }
fmtable = luatexbase.call_callback("luatexja.define_jfont", fmtable, fn)
font_metric_table[fn]=fmtable
tex.sprint(cat_lp, luatexja.is_global .. '\\protected\\expandafter\\def\\csname '
@@ -204,7 +228,7 @@ end
function load_zw()
local a = font_metric_table[tex.attribute[attr_curjfnt]]
if a then
- tex.setdimen('ltj@zw', metrics[a.jfm].size_cache[a.size].zw)
+ tex.setdimen('ltj@zw', a.size_cache.zw)
else
tex.setdimen('ltj@zw',0)
end
@@ -213,7 +237,7 @@ end
function load_zh()
local a = font_metric_table[tex.attribute[attr_curjfnt]]
if a then
- tex.setdimen('ltj@zh', metrics[a.jfm].size_cache[a.size].zh)
+ tex.setdimen('ltj@zh', a.size_cache.zh)
else
tex.setdimen('ltj@zh',0)
end
@@ -269,7 +293,7 @@ function append_italic()
f = has_attr(p, attr_curjfnt)
local j = font_metric_table[f]
local c = find_char_class(p.char, j)
- g.kern = metrics[j.jfm].size_cache[j.size].char_type[c].italic
+ g.kern = j.size_cache.char_type[c].italic
else
g.kern = font.fonts[f].characters[p.char].italic
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua
index 8252bac3432..fd77dc450d7 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-math.lua
@@ -3,8 +3,8 @@
--
luatexbase.provides_module({
name = 'luatexja.math',
- date = '2011/08/14',
- version = '0.1',
+ date = '2012/07/19',
+ version = '0.2',
description = 'Handling routines for Japanese characters in math mode',
})
module('luatexja.math', package.seeall)
@@ -20,6 +20,7 @@ local node_next = node.next
local node_free = node.free
local has_attr = node.has_attribute
local set_attr = node.set_attribute
+local tex_getcount = tex.getcount
local attr_jchar_class = luatexbase.attributes['ltj@charclass']
local attr_icflag = luatexbase.attributes['ltj@icflag']
@@ -102,18 +103,15 @@ function (p, sty)
if sty == 0 then mode = 'mjtext'
elseif sty == 1 then mode = 'mjscr'
end
- local f = ltjs.get_penalty_table(mode, fam, -1, tex.getcount('ltj@@stack'))
+ local f = ltjs.get_penalty_table(mode, fam, -1, tex_getcount('ltj@@stack'))
if f ~= -1 then
local q = node_new(id_sub_box)
local r = node_new(id_glyph); r.next = nil
r.char = p.char; r.font = f; r.subtype = 256
+ set_attr(r, attr_ykblshift, 0)
set_attr(r, attr_icflag, PROCESSED)
- set_attr(r, attr_yablshift, 0)
local met = ltjf_font_metric_table[f]
- local class = ltjf_find_char_class(p.char, met)
- set_attr(r, attr_jchar_class, class)
- ltjw.char_data = ltjf.metrics[met.jfm].size_cache[met.size].char_type[class]
- ltjw.head = r; ltjw.capsule_glyph(r, tex.mathdir , true, met, class);
+ ltjw.head = r; ltjw.capsule_glyph(r, tex.mathdir , true, met, ltjf_find_char_class(p.char, met));
q.head = ltjw.head; node_free(p); p=q;
end
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua
index 792c46a2701..71f974979e9 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-otf.lua
@@ -66,15 +66,14 @@ function cid(key)
end
function extract(head)
- local p = head, v
+ local p = head
+ local v
while p do
if p.id==id_whatsit then
if p.subtype==sid_user and p.user_id==30113 then
local g = node_new(id_glyph)
g.subtype = 0; g.char = p.value
v = has_attr(p, attr_curjfnt); g.font = v
- set_attr(g, attr_jchar_class,
- ltjf_find_char_class(g.char, ltjf_font_metric_table[v]))
set_attr(g, attr_curjfnt, v)
v = has_attr(p, attr_yablshift)
if v then
@@ -113,7 +112,7 @@ local function cid_to_char(fmtable, fn)
local fi = fonts.ids[fn]
if fi.cidinfo and fi.cidinfo.ordering == "Japan1" then
fmtable.cid_char_type = {}
- for i, v in pairs(ltjf.metrics[fmtable.jfm].chars) do
+ for i, v in pairs(fmtable.size_cache.chars) do
local j = string.match(i, "^AJ1%-([0-9]*)")
if j then
j = tonumber(fi.unicodes['Japan1.'..tostring(j)])
@@ -135,7 +134,7 @@ end
local function cid_set_char_class(arg, fmtable, char)
if arg~=0 then return arg
- elseif fmtable.cid_char_type then
+ elseif fmtable.cid_char_type then
return fmtable.cid_char_type[char] or 0
else return 0
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
index aa8ddf427b3..18a1df06e78 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
@@ -3,8 +3,8 @@
--
luatexbase.provides_module({
name = 'luatexja.pretreat',
- date = '2011/06/27',
- version = '0.1',
+ date = '2012/07/19',
+ version = '0.2',
description = '',
})
module('luatexja.pretreat', package.seeall)
@@ -14,13 +14,15 @@ luatexja.load_module('charrange'); local ltjc = luatexja.charrange
luatexja.load_module('jfont'); local ltjf = luatexja.jfont
luatexja.load_module('stack'); local ltjs = luatexja.stack
+local floor = math.floor
local has_attr = node.has_attribute
local set_attr = node.set_attribute
-local unset_attr = node.unset_attribute
+local node_traverse = node.traverse
local node_type = node.type
local node_remove = node.remove
local node_next = node.next
local node_free = node.free
+local tex_getcount = tex.getcount
local id_glyph = node.id('glyph')
local id_math = node.id('math')
@@ -29,39 +31,33 @@ local sid_user = node.subtype('user_defined')
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local attr_icflag = luatexbase.attributes['ltj@icflag']
-local attr_yablshift = luatexbase.attributes['ltj@yablshift']
-local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
local ltjf_font_metric_table = ltjf.font_metric_table
+local ltjc_is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char
+local attr_orig_char = luatexbase.attributes['ltj@origchar']
------------------------------------------------------------------------
-- MAIN PROCESS STEP 1: replace fonts
------------------------------------------------------------------------
-box_stack_level = 0
--- This is used in jfmglue.lua.
+local wt
local function suppress_hyphenate_ja(head)
- local non_math = true
- for p in node.traverse(head) do
- if p.id == id_glyph and non_math then
- local i = has_attr(p, attr_icflag) or 0
- if i==0 and ltjc.is_ucs_in_japanese_char(p) then
- local v = has_attr(p, attr_curjfnt)
- if v then
- p.font = v
- end
- v = has_attr(p, attr_ykblshift)
- if v then
- set_attr(p, attr_yablshift, v)
- else
- unset_attr(p, attr_yablshift)
- end
- if p.subtype%2==1 then p.subtype = p.subtype - 1 end
- -- p.lang=lang_ja
+ local non_math, p = true, head
+ wt = {}
+ while p do
+ if p.id == id_glyph then
+ if (has_attr(p, attr_icflag) or 0)<=0 and ltjc_is_ucs_in_japanese_char(p) then
+ p.font = has_attr(p, attr_curjfnt) or p.font
+ p.subtype = floor(p.subtype*0.5)*2
+ set_attr(p, attr_orig_char, p.char)
end
elseif p.id == id_math then
- non_math = (p.subtype ~= 0)
+ p = node_next(p) -- skip math on
+ while p and p.id~=id_math do p = node_next(p) end
+ elseif p.id == id_whatsit and p.subtype==sid_user and p.user_id==30112 then
+ wt[#wt+1] = p; head = node_remove(head, p)
end
+ p = node_next(p)
end
lang.hyphenate(head)
return head
@@ -69,21 +65,11 @@ end
-- mode: true iff this function is called from hpack_filter
function set_box_stack_level(head, mode)
- local box_set = false
- local p = head
- local cl = tex.currentgrouplevel + 1
- for p in node.traverse_id(id_whatsit, head) do
- if p.subtype==sid_user and p.user_id==30112 then
- local g = p
- if mode and g.value==cl then box_set = true end
- head, p = node_remove(head, g); node_free(g); break
- end
- end
- if box_set then
- box_stack_level = tex.getcount('ltj@@stack') + 1
- else
- box_stack_level = tex.getcount('ltj@@stack')
+ local box_set, cl = 0, tex.currentgrouplevel + 1
+ for _,p in pairs(wt) do
+ if mode and p.value==cl then box_set = 1 end; node_free(p)
end
+ ltjs.report_stack_level(tex_getcount('ltj@@stack') + box_set)
return head
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua
index 457ecd806ca..57db242c19f 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-setwidth.lua
@@ -3,8 +3,8 @@
--
luatexbase.provides_module({
name = 'luatexja.setwidth',
- date = '2011/06/28',
- version = '0.1',
+ date = '2012/07/19',
+ version = '0.2',
description = '',
})
module('luatexja.setwidth', package.seeall)
@@ -23,6 +23,7 @@ local node_insert_before = node.insert_before
local node_insert_after = node.insert_after
local round = tex.round
+
local id_glyph = node.id('glyph')
local id_kern = node.id('kern')
local id_hlist = node.id('hlist')
@@ -33,20 +34,26 @@ local id_math = node.id('math')
local attr_jchar_class = luatexbase.attributes['ltj@charclass']
local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
local attr_yablshift = luatexbase.attributes['ltj@yablshift']
+local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
local attr_icflag = luatexbase.attributes['ltj@icflag']
-local attr_uniqid = luatexbase.attributes['ltj@uniqid']
local ltjf_font_metric_table = ltjf.font_metric_table
local PACKED = 2
+local PROCESSED = 8
+local IC_PROCESSED = 9
+local PROCESSED_BEGIN_FLAG = 16
-char_data = {}
-head = nil
-
--- return true if and only if p is a Japanese character node
-local function is_japanese_glyph_node(p)
- return p.font==has_attr(p, attr_curjfnt)
+do
+ local floor = math.floor
+ function get_pr_begin_flag(p)
+ return floor((has_attr(p, attr_icflag) or 0)
+ /PROCESSED_BEGIN_FLAG)*PROCESSED_BEGIN_FLAG
+ end
end
+local get_pr_begin_flag = get_pr_begin_flag
+
+head = nil
luatexbase.create_callback("luatexja.set_width", "data",
function (fstable, fmtable, jchar_class)
@@ -54,51 +61,37 @@ luatexbase.create_callback("luatexja.set_width", "data",
end)
local fshift = { down = 0, left = 0}
+
-- mode: true iff p will be always encapsuled by a hbox
function capsule_glyph(p, dir, mode, met, class)
- local h, box, q, fwidth
- if char_data.width ~= 'prop' then
- fwidth = char_data.width
- else fwidth = p.width end
- local fheight = char_data.height
- local fdepth = char_data.depth
+ local char_data = met.size_cache.char_type[class]
+ if not char_data then return node_next(p) end
+ local fwidth = (char_data.width ~= 'prop') and char_data.width or p.width
+ local fheight, fdepth = char_data.height, char_data.depth
fshift.down = char_data.down; fshift.left = char_data.left
fshift = luatexbase.call_callback("luatexja.set_width", fshift, met, class)
--- local ti =
- p.xoffset= p.xoffset - fshift.left
- if mode or p.width ~= fwidth or p.height ~= fheight or p.depth ~= fdepth then
- local y_shift = - p.yoffset + (has_attr(p,attr_yablshift) or 0)
- p.yoffset = -fshift.down
- head, q = node.remove(head, p)
- local total = fwidth - p.width
- if total == 0 then
- h = p; p.next = nil
- else
- h = node_new(id_kern); h.subtype = 0
- if char_data.align=='right' then
- h.kern = total; p.next = nil; h.next = p
- elseif char_data.align=='middle' then
- h.kern = round(total/2); p.next = h
- h = node_new(id_kern); h.subtype = 0
- h.kern = total - round(total/2); h.next = p
- else -- left
- h.kern = total; p.next = h; h = p
- end
- end
- box = node_new(id_hlist);
- box.width = fwidth; box.height = fheight; box.depth = fdepth
- box.glue_set = 0; box.glue_order = 0; box.head = h
- box.shift = y_shift; box.dir = dir or 'TLT'
- set_attr(box, attr_icflag, PACKED)
- set_attr(box, attr_uniqid, has_attr(p, attr_uniqid) or 0)
- if q then
- head = node_insert_before(head, q, box)
+ if (mode or p.width ~= fwidth or p.height ~= fheight or p.depth ~= fdepth) then
+ local y_shift, total = - p.yoffset + (has_attr(p,attr_ykblshift) or 0), fwidth - p.width
+ local q; head, q = node.remove(head, p)
+ p.yoffset, p.next = -fshift.down, nil
+ if total ~= 0 and char_data.align~='left' then
+ p.xoffset = p.xoffset - fshift.left
+ + (((char_data.align=='right') and total) or round(total*0.5))
else
- head = node_insert_after(head, node_tail(head), box)
+ p.xoffset = p.xoffset - fshift.left
end
+ local box = node_new(id_hlist);
+ box.width, box.height, box.depth = fwidth, fheight, fdepth
+ box.head, box.shift, box.dir = p, y_shift, (dir or 'TLT')
+ box.glue_set, box.glue_order = 0, 0
+ set_attr(box, attr_icflag, PACKED + get_pr_begin_flag(p))
+ head = q and node_insert_before(head, q, box)
+ or node_insert_after(head, node_tail(head), box)
return q
else
- p.yoffset = p.yoffset - (has_attr(p, attr_yablshift) or 0) - fshift.down
+ set_attr(p, attr_icflag, PROCESSED + get_pr_begin_flag(p))
+ p.xoffset = p.xoffset - fshift.left
+ p.yoffset = p.yoffset - (has_attr(p, attr_ykblshift) or 0) - fshift.down
return node_next(p)
end
end
@@ -107,17 +100,13 @@ function set_ja_width(ahead, dir)
local p = ahead; head = ahead
local m = false -- is in math mode?
while p do
- if p.id==id_glyph then
- if is_japanese_glyph_node(p) then
- local met = ltjf_font_metric_table[p.font]
- local class = has_attr(p, attr_jchar_class)
- char_data = ltjf.metrics[met.jfm].size_cache[met.size].char_type[class]
- if char_data then
- p = capsule_glyph(p, dir, false, met, class)
- else
- p = node_next(p)
- end
- else
+ if (p.id==id_glyph)
+ and ((has_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG)<=0 then
+ if p.font == has_attr(p, attr_curjfnt) then
+ p = capsule_glyph(p, dir, false, ltjf_font_metric_table[p.font],
+ has_attr(p, attr_jchar_class))
+ else
+ set_attr(p, attr_icflag, PROCESSED + get_pr_begin_flag(p))
p.yoffset = p.yoffset - (has_attr(p,attr_yablshift) or 0); p = node_next(p)
end
elseif p.id==id_math then
@@ -135,6 +124,6 @@ function set_ja_width(ahead, dir)
end
end
-- adjust attr_icflag
- tex.attribute[attr_icflag] = -(0x7FFFFFFF)
+ tex.setattribute('global', attr_icflag, 0)
return head
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua
index 88d2a67f8a6..c7f52c93fb6 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-stack.lua
@@ -121,7 +121,7 @@ function set_stack_font(g,m,c,p)
charprop_stack_table[i][m] = {}
end
charprop_stack_table[i][m][c] = p
- if g=='global' then
+ if g=='global' then
for j,v in pairs(charprop_stack_table) do
if not charprop_stack_table[j][m] then charprop_stack_table[j][m] = {} end
charprop_stack_table[j][m][c] = p
@@ -153,17 +153,29 @@ function set_stack_skip(g,m,sp)
end
end
--- mode: nil iff it is called in callbacks
-function get_skip_table(m, idx)
- local i = charprop_stack_table[idx][m]
- return i or { width = 0, stretch = 0, shrink = 0,
- stretch_order = 0, shrink_order = 0 }
+-- These three functions are used in ltj-jfmglue.lua.
+local table_current_stack
+function report_stack_level(bsl)
+ table_current_stack = charprop_stack_table[bsl]
+end
+function fast_get_skip_table(m)
+ return table_current_stack[m]
+ or { width = 0, stretch = 0, shrink = 0, stretch_order = 0, shrink_order = 0 }
+end
+function fast_get_penalty_table(m,c)
+ local i = table_current_stack[m]
+ return (i and i[c])
end
+-- For other situations, use the following instead:
+function get_skip_table(m, idx)
+ return charprop_stack_table[idx][m]
+ or { width = 0, stretch = 0, shrink = 0, stretch_order = 0, shrink_order = 0 }
+end
function get_penalty_table(m,c,d, idx)
local i = charprop_stack_table[idx][m]
- if i then i=i[c] end
- return i or d
+ return (i and i[c]) or d
end
+
-- EOF
diff --git a/Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty b/Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty
index 2559aaf4b67..53ef07766c2 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/luatexja-core.sty
@@ -134,13 +134,25 @@
%%%%%%%% Attributes for Japanese typesetting.
\newluatexattribute\ltj@curjfnt % index for ``current Japanese font''
\newluatexattribute\jfam % index for current jfam
-\newluatexattribute\ltj@uniqid % unique id of box/paragraph
\newluatexattribute\ltj@charclass %
+\newluatexattribute\ltj@origchar %
\newluatexattribute\ltj@yablshift % attribute for \yabaselineshift
\newluatexattribute\ltj@ykblshift % attribute for \ykbaselineshift
\newluatexattribute\ltj@autospc % attribute for autospacing
\newluatexattribute\ltj@autoxspc % attribute for autoxspacing
\newluatexattribute\ltj@icflag % attribute for italic correction
+\ltj@icflag=0 \ltj@origchar=0
+
+%%%%%%%% Attributes for character ranges
+\newcount\ltj@tempcnta
+\ltj@tempcnta=0
+\loop\ifnum\ltj@tempcnta<7
+ \expandafter\newluatexattribute%
+ \csname ltj@kcat\the\ltj@tempcnta\endcsname
+ \csname ltj@kcat\the\ltj@tempcnta\endcsname=0
+ \advance\ltj@tempcnta by1
+\repeat
+
%%%%%%%% Loading luatexja.lua
%% Quark tokens needed in ltj-base
@@ -173,15 +185,6 @@
\fi %</LaTeX>
-%%%%%%%% Attributes for character ranges
-\ltj@tempcnta=0
-\loop\ifnum\ltj@tempcnta<7
- \expandafter\newluatexattribute%
- \csname ltj@kcat\the\ltj@tempcnta\endcsname
- \csname ltj@kcat\the\ltj@tempcnta\endcsname=0
- \advance\ltj@tempcnta by1
-\repeat
-
%%%%%%%% \asluastring
\def\asluastring#1{'\luaescapestring{\detokenize{#1}}'}
@@ -203,9 +206,8 @@
\protected\def\ltj@reset@globaldefs{%
\directlua{luatexja.global_temp = tex.globaldefs; tex.globaldefs = 0}}
\protected\def\ltj@restore@globaldefs{\directlua{tex.globaldefs = luatexja.global_temp}}
-\let\new@everypar=\everypar
\protected\def\inhibitglue{\ifhmode\ltj@@ihb\fi}
-\def\ltj@@ihb{\directlua{luatexja.jfmglue.create_inhibitglue_node()}}
+\def\ltj@@ihb{\relax\directlua{luatexja.jfmglue.create_inhibitglue_node()}}
%%%%%%%% \yoko, \tate, \ifydir, \iftdir
%% At this moment, tategaki mode is not implemented;
@@ -257,7 +259,7 @@
\expandafter\ltj@@set@stackfont#1:{mjscr}}
\define@key[ltj]{japaram}{jascriptscriptfont}{%
\expandafter\ltj@@set@stackfont#1:{mjss}}
-\def\ltj@@set@stackfont#1,#2:#3{%
+\protected\def\ltj@@set@stackfont#1,#2:#3{%
\ltj@reset@globaldefs
\ltj@tempcnta=\ltj@curjfnt\ltj@curjfnt=-1 #2%
\ifnum\ltj@curjfnt=-1
@@ -364,9 +366,11 @@
\fi\next
}
-\protected\def\ltjsetparameter#1{%
+\protected\def\ltj@setpar@global{%
\ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}\else\directlua{luatexja.isglobal=''}\fi
- \setkeys[ltj]{japaram}{#1}\ignorespaces}
+}
+\protected\def\ltjsetparameter#1{%
+ \ltj@setpar@global\setkeys[ltj]{japaram}{#1}\ignorespaces}
\protected\def\ltjglobalsetparameter#1{%
\ifnum\globaldefs<0\directlua{luatexja.isglobal=''}\else\directlua{luatexja.isglobal='global'}\fi
\setkeys[ltj]{japaram}{#1}\ignorespaces}
diff --git a/Master/texmf-dist/tex/luatex/luatexja/luatexja.lua b/Master/texmf-dist/tex/luatex/luatexja/luatexja.lua
index 7b608d50df4..98b0ae7dc5d 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/luatexja.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/luatexja.lua
@@ -86,6 +86,7 @@ local XKANJI_SKIP = 7
local PROCESSED = 8
local IC_PROCESSED = 9
local BOXBDD = 15
+local PROCESSED_BEGIN_FLAG = 16
-- Three aux. functions, bollowed from tex.web
@@ -120,7 +121,7 @@ local function print_glue(d,order)
return out
end
-local function print_spec(p)
+function print_spec(p)
local out=print_scaled(p.width)..'pt'
if p.stretch~=0 then
out=out..' plus '..print_glue(p.stretch,p.stretch_order)
@@ -131,8 +132,6 @@ local function print_spec(p)
return out
end
-function math.two_add(a,b) return a+b end
-function math.two_average(a,b) return (a+b)/2 end
---- table: charprop_stack_table [stack_level].{pre|post|xsp}[chr_code]
@@ -214,7 +213,7 @@ end
-- EXT: print \global if necessary
function luatexja.ext_print_global()
- if isglobal=='global' then tex.sprint(cat_lp, '\\global') end
+ if luatexja.isglobal=='global' then tex.sprint(cat_lp, '\\global') end
end
-- main process
@@ -242,16 +241,20 @@ luatexbase.add_to_callback('hpack_filter',
'luaotfload.hpack_filter') + 1)
-- debug
+local function get_attr_icflag(p)
+ return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+end
+
local debug_depth
local function debug_show_node_X(p,print_fn)
local k = debug_depth
local s
local pt=node_type(p.id)
- local base = debug_depth .. string.format('%X', has_attr(p,attr_icflag) or 0)
- .. ' ' .. tostring(p)
+ local base = debug_depth .. string.format('%X', get_attr_icflag(p))
+ .. ' ' .. pt .. ' ' .. tostring(p.subtype) .. ' '
if pt == 'glyph' then
- s = base .. ' ' .. utf.char(p.char) .. ' ' .. tostring(p.font)
+ s = base .. ' ' .. utf.char(p.char) .. ' ' .. tostring(p.font)
.. ' (' .. print_scaled(p.height) .. '+'
.. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
print_fn(s)
@@ -272,7 +275,7 @@ local function debug_show_node_X(p,print_fn)
for i = 2, p.glue_order do s = s .. 'l' end
end
end
- if has_attr(p, attr_icflag, PACKED) then
+ if get_attr_icflag(p) == PACKED then
s = s .. ' (packed)'
end
print_fn(s)
@@ -284,11 +287,11 @@ local function debug_show_node_X(p,print_fn)
debug_depth=k
elseif pt == 'glue' then
s = base .. ' ' .. print_spec(p.spec)
- if has_attr(p, attr_icflag)==FROM_JFM then
+ if get_attr_icflag(p)==FROM_JFM then
s = s .. ' (from JFM)'
- elseif has_attr(p, attr_icflag)==KANJI_SKIP then
+ elseif get_attr_icflag(p)==KANJI_SKIP then
s = s .. ' (kanjiskip)'
- elseif has_attr(p, attr_icflag)==XKANJI_SKIP then
+ elseif get_attr_icflag(p)==XKANJI_SKIP then
s = s .. ' (xkanjiskip)'
end
print_fn(s)
@@ -296,19 +299,19 @@ local function debug_show_node_X(p,print_fn)
s = base .. ' ' .. print_scaled(p.kern) .. 'pt'
if p.subtype==2 then
s = s .. ' (for accent)'
- elseif has_attr(p, attr_icflag)==IC_PROCESSED then
+ elseif get_attr_icflag(p)==IC_PROCESSED then
s = s .. ' (italic correction)'
- -- elseif has_attr(p, attr_icflag)==ITALIC then
+ -- elseif get_attr_icflag(p)==ITALIC then
-- s = s .. ' (italic correction)'
- elseif has_attr(p, attr_icflag)==FROM_JFM then
+ elseif get_attr_icflag(p)==FROM_JFM then
s = s .. ' (from JFM)'
- elseif has_attr(p, attr_icflag)==LINE_END then
+ elseif get_attr_icflag(p)==LINE_END then
s = s .. " (from 'lineend' in JFM)"
end
print_fn(s)
elseif pt == 'penalty' then
s = base .. ' ' .. tostring(p.penalty)
- if has_attr(p, attr_icflag)==KINSOKU then
+ if get_attr_icflag(p)==KINSOKU then
s = s .. ' (for kinsoku)'
end
print_fn(s)
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
index de5e38e7c1d..e0d8ee84b1a 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
@@ -621,10 +621,11 @@
\pickup@jfont\let\scriptfont@name\font@name
\xdef\font@name{\csname \string#2/\ssf@size\endcsname}%
\pickup@jfont
- \edef\math@fonts{\math@fonts\ltjsetparameter{%
- jatextfont={#1,\textfont@name},%
- jascriptfont={#1,\scriptfont@name},%
- jascriptscriptfont={#1,\font@name}}}%
+ \edef\math@fonts{\math@fonts\ltj@setpar@global%
+ \ltj@@set@stackfont#1,\textfont@name:{mjtext}%
+ \ltj@@set@stackfont#1,\scriptfont@name:{mjscr}%
+ \ltj@@set@stackfont#1,\font@name:{mjss}%
+ }%
}
\def\getanddefine@fonts#1#2{%
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex
index e5b4827ea49..505ea3882aa 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings-jpt.tex
@@ -963,4 +963,79 @@
\ltj@@listing@jpsetN{65280}{65376}{\lst@ProcessJALetter}
\ltj@@listing@jpsetN{65377}{65439}{\lst@ProcessJALetterHalf}
\ltj@@listing@jpsetN{65504}{65509}{\lst@ProcessJALetter}
+
+\message{Opening and Closing brackets}
+\@temptokena{}% DO NOT REMOVE THIS LINE
+
+\ltj@@listing@jpsetN@{`,}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`。}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`,}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`.}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`・}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`:}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`;}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`?}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`!}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`゛}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"212B
+\ltj@@listing@jpsetN@{`゜}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"212C
+\ltj@@listing@jpsetN@{`´}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"212D
+\ltj@@listing@jpsetN@{``}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"212E
+\ltj@@listing@jpsetN@{`々}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2139
+\ltj@@listing@jpsetN@{`…}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2144
+\ltj@@listing@jpsetN@{`‥}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2145
+\ltj@@listing@jpsetN@{`‘}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2146
+\ltj@@listing@jpsetN@{`’}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2147
+\ltj@@listing@jpsetN@{`“}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2148
+\ltj@@listing@jpsetN@{`”}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2149
+\ltj@@listing@jpsetN@{`)}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`(}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`}}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`{}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`]}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`[}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`〔}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"214C
+\ltj@@listing@jpsetN@{`〕}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"214D
+\ltj@@listing@jpsetN@{`〈}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2152
+\ltj@@listing@jpsetN@{`〉}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2153
+\ltj@@listing@jpsetN@{`《}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2154
+\ltj@@listing@jpsetN@{`》}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2155
+\ltj@@listing@jpsetN@{`「}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2156
+\ltj@@listing@jpsetN@{`」}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2157
+\ltj@@listing@jpsetN@{`『}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"2158
+\ltj@@listing@jpsetN@{`』}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"2159
+\ltj@@listing@jpsetN@{`【}{\lst@ProcessJALetter@inhibit@postbreak}%\jis"215A
+\ltj@@listing@jpsetN@{`】}{\lst@ProcessJALetter@inhibit@prebreak}%\jis"215B
+\ltj@@listing@jpsetN@{`ー}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〳}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〴}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〵}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〻}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⦅}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`⦆}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⦅}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`⦆}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〘}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`〙}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〖}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`〗}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`«}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`»}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`〝}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`〟}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`‼}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⁇}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⁈}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`⁉}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`¡}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`¿}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`ː}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`ª}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`º}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`¹}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`²}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`³}{\lst@ProcessJALetter@inhibit@prebreak}
+\ltj@@listing@jpsetN@{`€}{\lst@ProcessJALetter@inhibit@postbreak}
+\ltj@@listing@jpsetN@{`™}{\lst@ProcessJALetter@inhibit@prebreak}
+
+\ltj@@listing@jpset@after{other}% DO NOT REMOVE THIS LINE
\message{done.}
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty
index 5059ef9d53e..aa8c2bd3fda 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty
@@ -17,33 +17,75 @@
\setcatcoderange{"20000}{"2FFFF}{13}}
% lowest level
+\def\lst@kanjitrue{\let\lst@ifkanji\iftrue}
+\def\lst@kanjifalse{\let\lst@ifkanji\iffalse}
+\lst@AddToHook{InitVars}{\lst@kanjifalse}
+
+\def\lst@AppendOther{%
+ \lst@ifletter\lst@Output\lst@letterfalse\fi\lst@kanjifalse
+ \futurelet\lst@lastother\lst@Append}
+\def\lst@AppendLetter{%
+ \lst@ifletter
+ \lst@ifkanji\lst@Output\lst@kanjifalse
+ \fi
+ \else
+ \lst@lettertrue\lst@ifkanji\lst@kanjifalse\else\lst@OutputOther\fi
+ \fi
+ \lst@Append}
+
\def\lst@ProcessJALetter{\lst@whitespacefalse \lst@AppendJALetter}
+\def\lst@ProcessJALetterHalf{\lst@whitespacefalse \lst@AppendJALetterHalf}
+\def\lst@ProcessJALetter@inhibit@prebreak{%
+ \lst@whitespacefalse \lst@AppendJALetter@inhibit@prebreak}
+\def\lst@ProcessJALetter@inhibit@postbreak{%
+ \lst@whitespacefalse \lst@AppendJALetter@inhibit@postbreak}
+
\def\lst@AppendJALetter{%
- \lst@ifletter \lst@Output\else\lst@OutputOther\fi\lst@lettertrue
+ \lst@ifletter
+ \lst@Output
+ \else
+ \lst@ifkanji\else\lst@OutputOther\fi\lst@lettertrue
+ \fi\lst@kanjitrue
\advance\lst@length\@ne\lst@Append}
-\def\lst@ProcessJALetterHalf{\lst@whitespacefalse \lst@AppendJALetterHalf}
\def\lst@AppendJALetterHalf{%
- \lst@ifletter \lst@Output\else\lst@OutputOther\fi\lst@lettertrue
+ \lst@ifletter
+ \lst@Output
+ \else
+ \lst@ifkanji\else\lst@OutputOther\fi\lst@lettertrue
+ \fi\lst@kanjitrue
\lst@Append}
+\def\lst@AppendJALetter@inhibit@prebreak{%
+ \lst@ifletter\else\lst@lettertrue\fi\lst@kanjitrue
+ \advance\lst@length\@ne\lst@Append}
+\def\lst@AppendJALetter@inhibit@postbreak{%
+ \lst@ifletter
+ \lst@Output
+ \else
+ \lst@ifkanji\else\lst@OutputOther\fi
+ \fi\lst@letterfalse\lst@kanjitrue
+ \advance\lst@length\@ne\lst@Append}
+
% loading lltjp-listing-jpt.tex
\def\ltj@@listing@jpset#1#2{% fast: #2-#1+1 must be a multiple of 16
\@tempcnta=#1 \@tempcntb=#2 \@temptokena{}%
\loop\relax\ifnum\@tempcnta<\@tempcntb\relax
\ltj@@listing@jpset@\global\advance\@tempcnta\sixt@@n\repeat
- \expandafter\edef\csname ltj@@listing@jpcmd@i#1\endcsname{\the\@temptokena}%
- \toks@\expandafter\expandafter\expandafter\expandafter%
- \expandafter\expandafter\expandafter{\expandafter\expandafter%
- \expandafter\the\expandafter\toks@\csname ltj@@listing@jpcmd@i#1\endcsname}%
+ \ltj@@listing@jpset@after{#1}
}
-\def\ltj@@listing@jpsetN#1#2#3{%
- \@tempcnta=#1 \@tempcntb=#2 \@temptokena{}%
+\def\ltj@@listing@jpsetN#1#2#3{% for (not large) range
+ \@tempcnta=#1 \@tempcntb=\numexpr 1+#2\relax \@temptokena{}%
\loop \global\advance\@tempcnta\@ne\ifnum\@tempcnta<\@tempcntb\relax
- \ltj@@listing@jpsetN@#3\repeat
+ \ltj@@listing@jpsetN@{\@tempcnta}{#3}\repeat
+ \ltj@@listing@jpset@after{#1}
+}
+
+\def\ltj@@listing@jpset@after#1{%
\expandafter\edef\csname ltj@@listing@jpcmd@i#1\endcsname{\the\@temptokena}%
\toks@\expandafter\expandafter\expandafter\expandafter%
\expandafter\expandafter\expandafter{\expandafter\expandafter%
\expandafter\the\expandafter\toks@\csname ltj@@listing@jpcmd@i#1\endcsname}%
+ \@temptokena{}%
}
\begingroup
@@ -87,9 +129,9 @@
\expandafter\expandafter\expandafter{\expandafter\expandafter%
\expandafter\the\expandafter\@temptokena\@temp}%
}
-\gdef\ltj@@listing@jpsetN@#1{{%
- \lccode`\~=\@tempcnta \lccode`\/=\@tempcnta
- \lowercase{\gdef\@temp{\gdef~{#1/}}}}%
+\gdef\ltj@@listing@jpsetN@#1#2{{%
+ \@tempcnta=#1 \lccode`\~=\@tempcnta \lccode`\/=\@tempcnta
+ \lowercase{\gdef\@temp{\gdef~{#2/}}}}%
\@temptokena\expandafter\expandafter\expandafter\expandafter%
\expandafter\expandafter\expandafter{\expandafter\expandafter%
\expandafter\the\expandafter\@temptokena\@temp}%