+
+
+%<en>\section{Linebreak after Japanese Character}
+%<ja>\section{和文文字直後の改行}
+\label{sec-lbreak}
+%<en>\subsection{Reference: Behavior in \pTeX}
+%<ja>\subsection{参考: \pTeX の挙動}
+%<*en>
+In~\pTeX, a line break after a Japanese character doesn't emit a space,
+since words are not separated by spaces in Japanese writings. However,
+this feature isn't fully implemented in \LuaTeX-ja due to the
+specification of callbacks in~\LuaTeX. To clarify the difference between
+\pTeX~and~\LuaTeX, We briefly describe the handling of a line break in~\pTeX, in
+this subsection.
+
+\pTeX's input processor can be described in terms of a finite state
+automaton, as that of~\TeX\ in~Section~2.5 of~\cite{texbytopic}. The
+internal states are as follows:
+\begin{itemize}
+\item State~$N$: new line
+\item State~$S$: skipping spaces
+\item State~$M$: middle of line
+\item State~$K$: after a Japanese character
+\end{itemize}
+The first three states---$N$, $S$~and~$M$---are as same as \TeX's input
+processor. State~$K$ is similar to state~$M$, and is entered after
+Japanese characters. The diagram of state transitions are indicated in
+Figure~\ref{fig-ptexipro}. Note that \pTeX\ doesn't leave state~$K$
+after `beginning/ending of a group' characters.
+%</en>
+
+%<*ja>
+欧文では文章の改行は単語間でしか行わない.そのため,\TeX では,(文字の直後の)改行は
+空白文字と同じ扱いとして扱われる.一方,和文ではほとんどどこでも改行が可能なため,
+\pTeX では和文文字の直後の改行は単純に無視されるようになっている.
+
+このような動作は,\pTeX が\TeX からエンジンとして拡張されたことによって可能になったことである.
+\pTeX の入力処理部は,\TeX におけるそれと同じように,有限オートマトンとして記述することができ,
+以下に述べるような4状態を持っている.
+
+\begin{itemize}
+\item State~$N$: 行の開始.
+\item State~$S$: 空白読み飛ばし.
+\item State~$M$: 行中.
+\item State~$K$: 行中(和文文字の後).
+\end{itemize}
+また,状態遷移は,図\ref{fig-ptexipro} のようになっており,図中の数字は
+カテゴリーコードを表している.最初の3状態は\TeX の入力処理部と同じであり,
+図中から状態$K$と「$j$」と書かれた矢印を取り除けば,\TeX の入力処理部と同
+じものになる.
+
+この図から分かることは,
+\begin{quote}
+行が和文文字(とグループ境界文字)で終わっていれば,改行は無視される
+\end{quote}
+ということである.
+%</ja>
+
+\begin{figure}[!tb]
+\begin{gather*}
+ \def\sp{\texttt{\char32}}
+ \xymatrix{&&
+ {\text{scan a cs}}\ar@(r,ul)[dr]&\\
+\ar[r]&
+ *++[o][F-]{N}\ar[ur]^0\ar[dd]_{d,\ g}\ar[u]^{5\ (\texttt{\char92par})}
+ \ar@{->}@(d,l)[ddrr]_(0.45){j}&&
+ *++[o][F-]{S}\ar@(l,dr)[ul]^0\ar@(l,ur)[ddll]_{d,\ g}\ar[u]_{5}
+ \ar@{->}@(r,r)[dd]^{j}\\&\\&
+ *++[o][F-]{M}\ar[uuur]^0\ar@(r,dl)[uurr]_(0.55){10\ (\sp)}
+ \ar[d]_{5\ ({\sp})}\ar@{->}@(dr,dl)[rr]_{j}&&
+ *++[o][F-]{K}\ar@{->}@(ul,d)[uuul]^0\ar@{->}[ll]^{d}
+ \ar@{->}@(ur,dr)[uu]^{10\ (\sp)}\ar@{->}[d]_5\\
+ &&&
+ }\\
+ d:=\{3,4,6,7,8,11,12,13\},\quad g:=\{1,2\},\quad j:=(\text{Japanese characters})
+\end{gather*}
+\begin{itemize}
+\item Numbers represent category codes.
+\item Category codes 9~(ignored), 14~(comment)~and~15~(invalid) are omitted in above diagram.
+\end{itemize}
+\caption{State transitions of \pTeX's input processor.}
+\label{fig-ptexipro}
+\end{figure}
+
+
+%<en>\subsection{Behavior in \LuaTeX-ja}
+%<ja>\subsection{\LuaTeX-ja の挙動}
+%<*en>
+States in the input processor of \LuaTeX\ is the same as that of \TeX,
+and they can't be customized by any callbacks. Hence, we can only use
+\verb+process_input_buffer+ and \verb+token_filter+ callbacks for to
+suppress a space by a line break which is after Japanese characters.
+
+However, \verb+token_filter+ callback cannot be used either, since a
+character in category code 5~(end-of-line) is converted into an space
+token \emph{in the input processor}. So we can use only the
+\verb+process_input_buffer+ callback. This means that suppressing a
+space must be done \emph{just before} an input line is read.
+
+Considering these situations, handling of an end-of-line in \LuaTeX-ja are as follows:
+\begin{quote}
+A character U+FFFFF (its category code is set to 14~(comment) by
+\LuaTeX-ja) is appended to an input line, \emph{before \LuaTeX\ actually
+process it}, if and only if the following two conditions are satisfied:
+\begin{enumerate}
+\item The category code of the character $\langle${return}$\rangle$
+ (whose character code is 13) is 5~(end-of-line).
+\item The input line matches the following `regular expression':
+\[
+ (\text{any char})^*(\textbf{JAchar})
+ \bigl(\{\text{catcode}=1\}\cup\{\text{catcode}=2\}\bigr)^*
+\]
+\end{enumerate}
+\end{quote}
+
+\paragraph{Remark}
+The following example shows the major difference from the behavior of \pTeX:
+\begin{LTXexample}
+\ltjsetparameter{autoxspacing=false}
+\ltjsetparameter{jacharrange={-6}}xあ
+y\ltjsetparameter{jacharrange={+6}}zあ
+u
+\end{LTXexample}
+\begin{itemize}
+\item There is no space between `x' and `y', since the line~2 ends with a \textbf{JAchar} `あ'
+(this `あ' considered as an \textbf{JAchar} at the ending of line~1).
+\item There is no space between `あ' (in the line~3) and `u', since the
+ line~3 ends with an \textbf{ALchar}
+(the letter `あ' considered as an \textbf{ALchar} at the ending of line~2).
+\end{itemize}
+%</en>
+
+%<*ja>
+\LuaTeX の入力処理部は\TeX のそれと全く同じであり,callbackによりユーザが
+カスタマイズすることはできない.このため,改行抑制の目的でユーザが利用で
+きそうなcallbackとしては,\verb+process_input_buffer+や
+\verb+token_filter+に限られてしまう.しかし,\TeX の入力処理部をよく見る
+と,後者も役には経たないことが分かる:改行文字は,入力処理部によってトー
+クン化される時に,カテゴリーコード10の32番文字へと置き換えられてしまうた
+め,\verb+token_filter+で非標準なトークン読み出しを行おうとしても,空白文
+字由来のトークンと,改行文字由来のトークンは区別できないのだ.
+
+すると,我々のとれる道は,\verb+process_input_buffer+を用いて
+\LuaTeX の入力処理部に引き渡される前に入力文字列を編集するというものしかない.
+以上を踏まえ,\LuaTeX-jaにおける「和文文字直後の改行抑制」の処理は,次のようになっている:
+
+\begin{quote}
+各入力行に対し,\textbf{その入力行が読まれる前の内部状態で}
+以下の2条件が満たされている場合,\LuaTeX-jaはU+FFFFF番の文字
+\footnote{この文字はコメント文字として扱われるように\LuaTeX-ja内部で設定をしている.}
+を末尾に追加する.よって,その場合に改行は空白とは見做されないこととなる.
+\begin{enumerate}
+\item 改行文字(文字コード13番)のカテゴリーコードが5~(end-of-line)である.
+\item 入力行は次の「正規表現」にマッチしている:
+\[
+ (\text{any char})^*(\textbf{JAchar})
+ \bigl(\{\text{catcode}=1\}\cup\{\text{catcode}=2\}\bigr)^*
+\]
+\end{enumerate}
+\end{quote}
+
+この仕様は,前節で述べた\pTeX の仕様にできるだけ近づけたものとなっている.最初の条件は,
+\texttt{verbatim}系環境などの日本語対応マクロを書かなくてすませるためのものである.
+しかしながら,完全に同じ挙動が実現できたわけではない.
+差異は,次の例が示すように,和文文字の範囲を変更した行の改行において見られる:
+\begin{LTXexample}
+\ltjsetparameter{autoxspacing=false}
+\ltjsetparameter{jacharrange={-6}}xあ
+y\ltjsetparameter{jacharrange={+6}}zあ
+u
+\end{LTXexample}
+もし\pTeX とまったく同じ挙動を示すならば,出力は
+「\hbox{\ltjsetparameter{autoxspacing=false}x yzあu}」となるべきである.しかし,実際には
+上のように異なる挙動となっている.
+\begin{itemize}
+\item 2行目は「あ」という和文文字で終わる(2行目を処理する前の時点では,
+ 「あ」は和文文字扱いである)ため,直後の改行文字は無視される.
+\item 3行目は「あ」という欧文文字で終わる(2行目を処理する前の時点では,
+ 「あ」は欧文文字扱いである)ため,直後の改行文字は空白に置き換わる.
+\end{itemize}
+このため,トラブルを避けるために,和文文字の範囲を\verb+\ltjsetparameter+で編集した場合,
+その行はそこで改行するようにした方がいいだろう.
+%</ja>
+
+
+%<en>\section{Insertion of JFM glues, \Param{kanjiskip} and \Param{xkanjiskip}}
+%<ja>\section{JFM グルーの挿入,\Param{kanjiskip} と \Param{xkanjiskip}}
+%<en>\subsection{Overview}
+%<ja>\subsection{概要}
+
+
+\LuaTeX-ja における和文処理グルーの挿入方法は,\pTeX のそれとは全く異なる.
+\pTeX では次のような仕様であった:
+\begin{itemize}
+\item JFMグルーの挿入は,和文文字を表すトークンを元に水平リストに(文字を表す)<char\_node>を
+追加する過程で行われる.
+\item \Param{xkanjiskip}の挿入は,hboxへのパッケージングや行分割前に行われる.
+\item \Param{kanjiskip}はノードとしては挿入されない.パッケージングや行分割の計算時に
+「和文文字を表す2つの<char\_node>の間には\Param{kanjiskip}がある」ものとみなされる.
+\end{itemize}
+しかし,\LuaTeX-jaでは,hboxへのパッケージングや行分割前に全ての
+\textbf{JAglue},即ちJFMグルー・\Param{xkanjiskip}・\Param{kanjiskip}の
+3種類を一度に挿入することになっている.これは,\LuaTeX において欧文の合字・
+カーニング処理がノードベースになったことに対応する変更である.
+
+\LuaTeX-jaにおける\textbf{JAglue}挿入処理では,次節で定義する
+「クラスタ」を単位にして行われる.大雑把にいうと,「クラスタ」は文字とそれに付随す
+るノード達(アクセント位置補正用のkernや,イタリック補正)をまとめたもの
+であり,2つのクラスタの間には,ペナルティ,\verb+\vadjust+,whatsitなど,行組版
+には関係しないものがある.
+
+
+%<en>\subsection{definition of a `cluster'}
+%<ja>\subsection{「クラスタ」の定義}
+
+\def\OA{$\text{\sf O}_{\text{\sf A}}$}
+\def\OB{$\text{\sf O}_{\text{\sf B}}$}
+\begin{defn}
+A \emph{cluster} is a list of consecutive nodes in one of the following forms,
+with the \textit{id} of it:
+\begin{enumerate}
+\item Nodes whose value of\ \verb+\ltj@icflag+ is in $[3,15)$. These
+ nodes come from a hbox which is already packaged, by unpackaging
+ (\verb+\unhbox+).
+ The \textit{id} is \textit{id\_pbox}.
+\item A inline math formula, including two \textit{math\_node}s at the boundary of it.
+ The \textit{id} is \textit{id\_math}.
+\item A \textit{glyph\_node}~$p$ with nodes which relate with it:
+\begin{enumerate}
+\item A kern for the italic correction of~$p$.
+\item An accent attached to $p$ by \verb+\accent+.
+\end{enumerate}
+\[
+\overbrace{%
+ \Node{kern}{$\mathit{subtype}=2$}\longrightarrow
+\left\{\begin{array}{c}
+\Node{glyph}{accent}\\\noalign{\medskip}
+\Node{hbox}{accent (shifted vert.)}
+\end{array}\right\}\longrightarrow
+\Node{kern}{$\mathit{subtype}=2$}}^{\text{(a)}}
+\longrightarrow
+\Node{glyph}{$p$}\longrightarrow
+\overbrace{%
+\Node{kern}{italic corr.}}^{\text{(b)}}
+\]
+
+The \textit{id} is \textit{id\_jglyph} or
+\textit{id\_glyph}, according to whether the \textit{glyph\_node}
+represents a Japanese character or not.
+\item An box-like node, that is, an hbox, a vbox, a rule (\verb+\vrule+) and an \textit{unset\_node}.
+The \textit{id} is \textit{id\_hlist} if the node is an
+ hbox which is not shifted vertically, or \textit{id\_box\_like}
+ otherwise.
+\item A glue, a kern whose subtype is not 2~(\textit{accent}), and a discretionary break.
+The \textit{id} is \textit{id\_glue}, \textit{id\_kern}
+ and \textit{id\_disc}, respectively.
+\end{enumerate}
+We denote a cluster by \textit{Np}, \textit{Nq} and \textit{Nr}.
+\end{defn}
+
+以降は日本語.
+
+\paragraph{\textit{id}の意味}
+$\mathit{Np}.\mathit{id}$の意味を述べるとともに,
+「先頭の文字」を表す\textit{glyph\_node}~$\mathit{Np}.\mathit{head}$と,
+「最後の文字」を表す\textit{glyph\_node}~$\mathit{Np}.\mathit{tail}$を次のように定義する.
+直感的に言うと,\textit{Np}は$\mathit{Np}.\mathit{head}$で始まり$\mathit{Np}.\mathit{tail}$で終わるような単語,
+と見做すことができる.これら$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$は
+説明用に準備した概念であって,実際の Lua コード中にそのように書かれているわけではないことに注意.
+
+\begin{description}
+\item[\textit{id\_jglyph}] 和文文字.\\
+$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$は,その和文文字を表している
+\textit{glyph\_node}そのものである.
+\item[\textit{id\_glyph}] 和文文字を表していない\textit{glyph\_node}~$p$.\\
+多くの場合,$p$は欧文文字を格納しているが,`ffi'などの合字によって作られた
+\textit{glyph\_node}である可能性もある.
+前者の場合,$\mathit{Np}.\mathit{head}$,~$\mathit{Np}.\mathit{tail} = p$である.
+一方,後者の場合,
+\begin{itemize}
+\item $\mathit{Np}.\mathit{head}$は,
+合字の構成要素の先頭→(その\textit{glyph\_node}における)合字の構成要素の先頭→……
+と再帰的に検索していってたどり着いた\textit{glyph\_node}である.
+\item $\mathit{Np}.\mathit{last}$は,同様に末尾→末尾→と検索してたどり着いた\textit{glyph\_node}である.
+\end{itemize}
+\item[\textit{id\_math}] インライン数式.\\
+便宜的に,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$ともに
+「文字コード$-1$の欧文文字」とおく.
+\item[\textit{id\_hlist}] 縦方向にシフトされていない hbox.\\
+この場合,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$はそれぞれ$p$の内容を表すリストの,
+先頭・末尾のノードである.
+\begin{itemize}
+\item 状況によっては,\TeX ソースで言うと
+\begin{verbatim}
+\hbox{\hbox{abc}...\hbox{\lower1pt\hbox{xyz}}}
+\end{verbatim}
+のように,$p$の内容が別の hbox で開始・終了している可能性も十分あり得る.そのような場合,
+$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$の算出は,\textbf{垂直方向にシフトされていない} hbox の
+場合だけ内部を再帰的に探索する.例えば上の例では,$\mathit{Np}.\mathit{head}$は文字「a」を表すノードであり,
+一方$\mathit{Np}.\mathit{tail}$は垂直方向にシフトされた hbox,\verb+\lower1pt\hbox{xyz}+に対応するノードである.
+\item また,先頭にアクセント付きの文字がきたり,末尾にイタリック補正用の kern が
+来ることもあり得る.この場合は,クラスタの定義のところにもあったように,それらは無視して算出を行う.
+\item 最初・最後のノードが合字によって作られた\textit{glyph\_node}のときは,それぞれに対して\textit{id\_glyph}%
+と同様に再帰的に構成要素をたどっていく.
+\end{itemize}
+\item[\textit{id\_pbox}] 「既に処理された」ノードのリストであり,これらのノードが二度処理を受けないために
+まとめて1つのクラスタとして取り扱うだけである.
+\textit{id\_hlist}と同じ方法で$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$を算出する,
+\item[\textit{id\_disc}] discretionary break (\verb+\discretionary{pre}{post}{nobreak}+).\\
+\textit{id\_hlist}と同じ方法で$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$を算出するが,
+第3引数の \texttt{nobreak}(行分割が行われない時の内容)を使う.言い換えれば,ここで行分割が発生した時の状況は
+全く考慮に入れない.
+\item[\textit{id\_box\_like}] \textit{id\_hlist}とならないboxや,rule.\\
+この場合は,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$のデータは利用されないので,2つの算出は無意味である.
+敢えて明示するならば,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$は共にnil値である.
+\item[他] 以上にない\textit{id}に対しても,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$の算出は無意味.
+\end{description}
+
+\paragraph{クラスタの別の分類}
+さらに,JFMグルー挿入処理の実際の説明により便利なように,\textit{id}とは別のクラスタの分類を行っておく.
+挿入処理では2つの隣り合ったクラスタの間に
+空白等の実際の挿入を行うことは前に書いたが,ここでの説明では,問題にしているクラスタ\textit{Np}は「後ろ側」のクラスタである
+とする.「前側」のクラスタについては,以下の説明で\textit{head}が\textit{last}に置き換わることに注意すること.
+\begin{description}
+\item[和文A] リスト中に直接出現している和文文字.
+\textit{id}が\textit{id\_jglyph}であるか,\\
+\textit{id}が\textit{id\_pbox}であって$\mathit{Np}.\mathit{head}$が\textbf{JAchar}であるとき.
+
+\item[和文B] リスト中のhboxの中身の先頭として出現した和文文字.和文Aとの違いは,これの前に
+JFMグルーの挿入が行われない(\Param{xkanjiskip},~\Param{kanjiskip}は入り得る)ことである.\\
+\textit{id}が\textit{id\_hlist}か\textit{id\_disc}であって$\mathit{Np}.\mathit{head}$が\textbf{JAchar}であるとき.
+
+\item[欧文] リスト中に直接/hboxの中身として出現している欧文文字.次の3つの場合が該当:
+\begin{itemize}
+\item \textit{id}が\textit{id\_glyph}である.
+\item \textit{id}が\textit{id\_math}である.
+\item \textit{id}が\textit{id\_pbox}か\textit{id\_hlist}か\textit{id\_disc}であって,$\mathit{Np}.\mathit{head}$が\textbf{ALchar}.
+\end{itemize}
+\item[箱] box,またはそれに類似するもの.次の2つが該当:
+\begin{itemize}
+\item \textit{id}が\textit{id\_pbox}か\textit{id\_hlist}か\textit{id\_disc}であって,$\mathit{Np}.\mathit{head}$が\textit{glyph\_node}でない.
+\item \textit{id}が\textit{id\_box\_like}である.
+\end{itemize}
+
+\end{description}
+
+\subsection{段落/hboxの先頭や末尾}
+\paragraph{先頭部の処理}
+まず,段落/hboxの一番最初にあるクラスタ\textit{Np}を探索する.
+hboxの場合は何の問題もないが,段落の場合では以下のノード達を事前に読み飛ばしておく:
+\begin{center}
+\verb+\parindent+由来のhbox ($\mathit{subtype}=3$),及び\textit{subtype}が44~(\textit{user\_defined})でない
+ようなwhatsit.
+\end{center}
+これは,\verb+\parindent+由来のhboxがクラスタを構成しないようにするためである.
+
+次に,\textit{Np}の直前に空白$g$を必要なら挿入する:
+\begin{enumerate}
+\item この処理が働くような\textit{Np}は\textsf{和文A}である.
+\item 問題のリストが字下げありの段落(\verb+\parindent+由来のhboxあり)の場合は,
+この空白$g$は「文字コード\texttt{'parbdd'}の文字」と\textit{Np}の間に入るglue/kernである.
+\item そうでないとき(\verb+noindent+で開始された段落や,hbox)は,
+$g$は「文字コード\texttt{'boxbdd'}の文字」と\textit{Np}の間に入るglue/kernである.
+\end{enumerate}
+ただし,もし$g$がglueであった場合,この挿入によって\textit{Np}による行分割が新たに可能になるべきではない.
+そこで,以下の場合には,$g$の直前に\verb+\penalty10000+を挿入する:
+\begin{itemize}
+\item 問題にしているリストが段落であり,かつ
+\item \textit{Np}の前には予めペナルティがなく,$g$はglue.
+\end{itemize}
+
+\paragraph{末尾の処理}
+末尾の処理は,問題のリストが段落のものかhboxのものかによって異なる.
+後者の場合は容易い:最後のクラスタを\textit{Nq}とおくと,\textit{Nq}と「文字コード\texttt{'boxbdd'}の文字」の間に入るglue/kernを,
+\textit{Nq}の直後に挿入するのみである.
+
+一方.前者(段落)の場合は,リストの末尾は常に\verb+\penalty10000+と,
+\verb+\parfillskip+由来のグルーが存在する.よって,最後のクラスタ\textit{Np}は
+この\verb+\parfillskip+由来のグルーとなり,実質的な中身の最後はその1つ前のクラスタ\textit{Nq}となる.
+\begin{enumerate}
+\item まず\textit{Nq}の直後に(後に述べる)\textsf{line-end~[E]}によって定まる空白を挿入する.
+\item 次に,段落の最後の「通常の和文文字${}+{}$句点」が独立した行となるのを防ぐために,
+\Param{jcharwidowpenalty}の値の分だけ適切な場所のペナルティを増やす.
+
+ペナルティ量を増やす場所は,\textit{head}が\textbf{JAchar}であり,かつその文字の\Param{kcatcode}が偶数であるような
+最後のクラスタの直前にあるものたちである\footnote{大雑把に言えば,\Param{kcatcode}が奇数であるような\textbf{JAchar}
+を約物として考えていることになる.\Param{kcatcode}の最下位ビットはこの\Param{jcharwidowpenalty}用にのみ利用される.}.
+\end{enumerate}
+
+\subsection{概観と典型例:2つの「和文A」の場合}
+先に述べたように,2つの隣り合ったクラスタ,\textit{Nq}と\textit{Np}の間には,
+ペナルティ,\verb+\vadjust+,whatsitなど,行組版には関係しないものがある.模式的に表すと,
+\[
+ \Node{cluster}{\textit{Nq}}\longrightarrow
+\overbrace{
+\Node{penalty}{$p$}\longrightarrow \cdots\longrightarrow \Node{whatsit}{}}^{(a)}
+\longrightarrow \Node{cluster}{\textit{Np}}
+\]
+のようになっている.間の(a)に相当する部分には,何のノードもない場合ももちろんあり得る.
+そうして,JFMグルー挿入後には,この2クラスタ間は次のようになる:
+\[
+ \Node{cluster}{\textit{Nq}}\longrightarrow\Node{kern}{左空白}\longrightarrow
+\overbrace{
+\Node{penalty}{$p+x$}\longrightarrow \cdots\longrightarrow \Node{whatsit}{}}^{(a)}
+\longrightarrow \Node{glue or kern}{右空白}\longrightarrow \Node{cluster}{\textit{Np}}
+\]
+
+以後,\textbf{典型的な例として,クラスタ\textit{Nq}と\textit{Np}が共に\textsf{\textmd{和文A}}である場合を見ていこう,}
+この場合が全ての場合の基本となる.
+
+\paragraph{「右空白」の算出}
+まず,「右空白」にあたる量を算出する.通常はこれが,隣り合った2つの和文文字間に入る空白量となる.
+\begin{description}
+\item[JFM由来{[M]}] JFMの文字クラス指定によって入る空白を以下によって求める.この段階で空白量が未定義(未指定)だった場合,
+ デフォルト値\Param{kanjiskip}を採用することとなるので,次へ.
+\begin{enumerate}
+\item もし両クラスタの間で\verb+\inhibitglue+が実行されていた場合(証としてwhatsitノードが自動挿入される),
+ 代わりに\Param{kanjiskip}が挿入されることとなる.次へ.
+\item \textit{Nq}と\textit{Np}が同じJFM・同じ\texttt{jfmvar}キー・同じサイズの和文フォントであったならば,
+ 共通に使っているJFM内で挿入される空白 (glue or kern) が決まっているか調べる.
+\item 1.でも2.でもない場合は,\textit{Nq}と\textit{Np}が違うJFM/\texttt{jfmvar}/サイズである.
+この場合,まず
+\[
+\vcenter{\halign{\hfil$#:={}$&(\inhibitglue#\inhibitglue)\cr
+gb&\textit{Nq}と「文字コードが{\tt'diffmet'}の文字」との間に入るglue/kern\cr
+ga&「文字コードが{\tt'diffmet'}の文字」と\textit{Np}との間に入るglue/kern\cr
+}}
+\]
+として,左側由来・右側由来の空白 (glue/kern) を(それぞれのJFMから)求める.
+$\mathit{ga}$と$\mathit{gb}$のどちらか片方が未定義であるならば,定義されている側の値をそのまま採用する.
+もし$\mathit{ga}$と$\mathit{gb}$が両方決まっているならば,両者の値を平均\footnote{\Param{differentjfm}パラメタの
+値によって,「大きい方」「小さい方」「合計」に変えることができる.}した値を採用する.
+\end{enumerate}
+
+例えば,
+\begin{verbatim}
+\jfont\foo=psft:Ryumin-Light:jfm=ujis
+\jfont\bar=psft:GothicBBB-Medium:jfm=ujis
+\jfont\baz=psft:GothicBBB-Medium:jfm=ujis;jfmvar=piyo
+\end{verbatim}
+という3フォントを考え,
+\[
+ \overbrace{\Node{glyph}{{\tt\char92 foo}, `あ'}}^{p}
+\longrightarrow \overbrace{\Node{glyph}{{\tt\char92 bar}, `い'}}^{q}
+\longrightarrow \overbrace{\Node{glyph}{{\tt\char92 baz}, `う'}}^{r}
+\]
+という3ノードを考える(それぞれ単独でクラスタをなす).
+この場合,$p$と$q$の間は,実フォントが異なるにもかかわらず(2)の状況となる一方で,
+$q$と$r$の間は(実フォントが同じなのに)\texttt{jfmvar}キーの内容が異なるので(3)の状況となる.
+\item[\Param{kanjiskip}~{[K]}] 上の[M]において空白が定まらなかった場合,
+\Param{kanjiskip}の値を以下で定め,それを「右空白」として採用する.
+この段階においては,\verb+\inhibitglue+は効力を持たないため,
+結果として,2つの和文文字間には常に何らかのglue/kernが挿入されることとなる.
+\begin{enumerate}
+\item 両クラスタ(厳密には$\mathit{Nq}.\mathit{tail}$,$\mathit{Np}.\mathit{head}$)の中身の文字コードに対する
+\Param{autospacing}パラメタが両方ともfalseだった場合は,長さ0のglueとする.
+\item ユーザ側から見た\Param{kanjiskip}パラメタの自然長が${\tt \char92 maxdimen}=(2^{30}-1)\,{\rm sp}$で
+なければ,\Param{kanjiskip}パラメタの値を持つglueを採用する.
+\item 2.でない場合は,\textit{Nq}, \textit{Np}で使われているJFMに指定されている\Param{kanjiskip}の値を用いる.
+どちらか片方のクラスタだけが和文文字(\textsf{和文A}・\textsf{和文B})のときは,そちらのクラスタで使われている
+JFM由来の値だけを用いる.もし両者で使われているJFMが異なった場合は,上の[M]~3.と同様の方法を用いて調整する.
+\end{enumerate}
+\end{description}
+\paragraph{「左空白」の算出とそれに伴う補正}
+次に,「左空白」にあたる量を算出する:
+\begin{description}
+\item[line-end~{[E]}]
+\textit{Nq}と\textit{Np}の間で行分割が起きたときに,
+\textit{Nq}と行末の間に入る空白である.ぶら下げ組の組版などに用いられることを期待している.
+\begin{enumerate}
+\item 既に算出した「右空白」がkernである場合は,「左空白」は挿入されない.
+\item 「右空白」がglueか未定義(長さ0のglueとみなす)の場合は,「左空白」は
+\textit{Nq}と「文字コード\texttt{'lineend'}の文字」との間に入るkernとして,JFMから決定される.
+\item 2.で決まった「左空白」の長さが0でなければ,その分だけ先ほど算出した「右空白」の自然長を引く.
+\end{enumerate}
+\end{description}
+\paragraph{禁則用ペナルティの挿入}
+まず,
+\[
+ a:=(\text{\textit{Nq}{\footnotemark}の文字に対する\Param{postbreakpenalty}の値})
++(\text{\textit{Np}{\footnotemark}の文字に対する\Param{prebreakpenalty}の値})
+\]
+とおく\footnotetext{厳密にはそれぞれ$\mathit{Nq}.\mathit{tail}$,$\mathit{Np}.\mathit{head}$.}.
+ペナルティは通常$[-10000,10000]$の整数値をとり,また$\pm 10000$は正負の無限大を意味することになっているが,この$a$の
+算出では単純な整数の加減算を行う.
+
+$a$は禁則処理用に\textit{Nq}と\textit{Np}の間に加えられるべきペナルティ量である.
+\begin{description}
+\item[P-normal~{[PN]}]
+\textit{Nq}と\textit{Np}の間の(a)部分にペナルティ(\textit{penalty\_node})があれば処理は簡単である:
+それらの各ノードにおいて,ペナルティ値を($\pm 10000$を無限大として扱いつつ)$a$だけ増加させればよい.
+また,$10000 + (-10000) = 0$としている.
+
+少々困るのは,(a)部分にペナルティが存在していない場合である.
+直感的に,補正すべき量$a$が0でないとき,その値をもつ\textit{penalty\_node}を作って
+「右空白」の(もし未定義なら\textit{Np}の)直前に挿入……
+ということになるが,実際には僅かにこれより複雑である.
+\begin{itemize}
+\item 「右空白」がkernであるとき,
+それは「\textit{Nq}と\textit{Np}の間で改行は許されない」ことを意図している.そのため,
+この場合は$a\neq 0$であってもペナルティの挿入はしない.
+\item 「左空白」がkernとしてきっちり定義されている時(このとき,「右空白」はkernでない),
+この「左空白」の直後での行分割を許容しないといけないので,$a=0$であっても
+\textit{penalty\_node}を作って挿入する.
+\item 以上のどれでもないときは,$a\neq 0$ならば\textit{penalty\_node}を作って挿入する.
+\end{itemize}
+\end{description}
+
+\def\gkf#1#2#3{\sf$\displaystyle\vphantom{\Bigg(}%
+ \frac{\hbox to 1\zw{#1}\hbox to 4.5\zw{\hss #2}}{\hbox{#3}}$}
+\begin{table}[t]
+\caption{Summary of JFM glues}
+\label{tab-jfmglue}
+\begin{center}
+\small
+\begin{tabular}{>{\sf}c|cccccc}
+\toprule
+{\bf\textit{Np}}↓&\sf 和文A&\sf 和文B&\sf 欧文&\sf 箱&\sf glue&\sf kern\\\midrule
+和文A&
+\gkf{E}{M→K}{PN}&
+\gkf{---}{\OA →K}{PN}&
+\gkf{---}{\OA →X}{PN}&
+\gkf{---}{\OA}{PA}&
+\gkf{---}{\OA}{PN}&
+\gkf{---}{\OA}{PS}\\
+和文B&
+\gkf{E}{\OB→K}{PA}&
+\gkf{---}{K}{PS}&
+\gkf{---}{X}{PS}\\
+欧文&
+\gkf{E}{\OB →X}{PA}&
+\gkf{---}{X}{PS}\cr
+箱&\gkf{E}{\OB}{PA}\\
+glue&\gkf{E}{\OB}{PN}\\
+kern&\gkf{E}{\OB}{PS}\\
+\bottomrule
+\end{tabular}
+\end{center}
+\begin{quote}
+Here {\small\gkf{E}{M→K}{PN}} means that
+\begin{enumerate}
+\item To determine the `right-space', \LuaTeX-ja first attempts by the method `\textsf{JFM-origin~[M]}'.
+If this attempt fails, \LuaTeX-ja use the method `\textsf{\Param{kanjiskip}~[K]}'.
+\item The `left space' between \textit{Nq}~and~\textit{Np} is determined by the method `\textsf{line-end~[E]}'.
+\item \LuaTeX-ja adopts the method `\textsf{P-normal~[PN]}' to adjust the penalty between two clusters for \emph{kinsoku shori}.
+\end{enumerate}
+\end{quote}
+\end{table}
+
+\subsection{その他の場合}
+本節の内容は表\ref{tab-jfmglue}にまとめてある.
+
+\paragraph{和文Aと欧文の間}
+\textit{Nq}が\textsf{和文A}で,\textit{Np}が\textsf{欧文}の場合,JFMグルー挿入処理は次のようにして行われる.
+\begin{itemize}
+\item 「右空白」については,まず以下に述べる\textsf{Boundary-B~[\OB]}により空白を決定しようと試みる.
+それが失敗した場合は,\textsf{\Param{xkanjiskip}~[X]}によって定める.
+\item 「左空白」については,既に述べた\textsf{line-end~[E]}をそのまま採用する.それに伴う「右空白」の補正も同じ.
+\item 禁則用ペナルティも,以前述べた\textsf{P-normal~[PN]}と同じである.
+\end{itemize}
+\begin{description}
+\item[Boundary-B~{[\OB]}] 和文文字と「和文でないもの」との間に入る空白を以下によって求め,
+未定義でなければそれを「右空白」として採用する.
+\textsf{JFM-origin~[M]}の変種と考えて良い.
+これによって定まる空白の典型例は,和文の閉じ括弧と欧文文字の間に入る半角アキである.
+\begin{enumerate}
+\item もし両クラスタの間で\verb+\inhibitglue+が実行されていた場合(証としてwhatsitノードが自動挿入される),次へ.
+\item そうでなければ,
+\textit{Nq}と「文字コードが{\tt'jcharbdd'}の文字」との間に入るglue/kernとして定まる.
+\end{enumerate}
+\item[\Param{xkanjiskip}~{[X]}]
+この段階では,\textsf{\Param{kanjiskip}~[K]}のときと同じように,
+\Param{xkanjiskip}の値を以下で定め,それを「右空白」として採用する.
+この段階で\verb+\inhibitglue+は効力を持たないのも同じである.
+\begin{enumerate}
+\item 以下のいずれかの場合は,\Param{xkanjiskip}の挿入は抑止される.しかし,実際には行分割を許容するために,長さ0のglueを採用する:
+\begin{itemize}
+\item 両クラスタにおいて,それらの中身の文字コードに対する\Param{autoxspacing}パラメタが共にfalseである.
+\item \textit{Nq}の中身の文字コードについて,「直後への\Param{xkanjiskip}の挿入」が禁止されている
+(つまり,\Param{jaxspmode}~(or \Param{alxspmode})パラメタが2以上).
+\item \textit{Np}の中身の文字コードについて,「直前への\Param{xkanjiskip}の挿入」が禁止されている
+(つまり,\Param{jaxspmode}~(or \Param{alxspmode})パラメタが偶数).
+\end{itemize}
+\item ユーザ側から見た\Param{xkanjiskip}パラメタの自然長が${\tt \char92 maxdimen}=(2^{30}-1)\,{\rm sp}$で
+なければ,\Param{xkanjiskip}パラメタの値を持つglueを採用する.
+\item 2.でない場合は,\textit{Nq}, \textit{Np}(\textsf{和文A}/\textsf{和文B}なのは片方だけ)
+で使われているJFMに指定されている\Param{xkanjiskip}の値を用いる.
+\end{enumerate}
+\end{description}
+
+\paragraph{欧文と和文Aの間}
+\textit{Nq}が\textsf{欧文}で,\textit{Np}が\textsf{和文A}の場合,JFMグルー挿入処理は上の場合とほぼ同じである.
+\textsf{和文A}のクラスタが逆になるので,\textsf{Boundary-A~[\OA]}の部分が変わるだけ.
+\begin{itemize}
+\item 「右空白」については,まず以下に述べる\textsf{Boundary-A~[\OA]}により空白を決定しようと試みる.
+それが失敗した場合は,\textsf{\Param{xkanjiskip}~[X]}によって定める.
+\item \textit{Nq}が和文でないので,「左空白」は算出されない.
+\item 禁則用ペナルティは,以前述べた\textsf{P-normal~[PN]}と同じである.
+\end{itemize}
+\begin{description}
+\item[Boundary-A~{[\OA]}] 「和文でないもの」と和文文字との間に入る空白を以下によって求め,
+未定義でなければそれを「右空白」として採用する.
+\textsf{JFM-origin~[M]}の変種と考えて良い.
+これによって定まる空白の典型例は,欧文文字と和文の開き括弧との間に入る半角アキである.
+\begin{enumerate}
+\item もし両クラスタの間で\verb+\inhibitglue+が実行されていた場合(証としてwhatsitノードが自動挿入される),次へ.
+\item そうでなければ,
+「文字コードが{\tt'jcharbdd'}の文字」と\textit{Np}との間に入るglue/kernとして定まる.
+\end{enumerate}
+\end{description}
+
+\paragraph{和文Aと箱・glue・kernの間}
+\textit{Nq}が\textsf{和文A}で,\textit{Np}が\textsf{箱}・glue・kernのいずれかであった場合,
+両者の間に挿入されるJFMグルーについては同じ処理である.しかし,そこでの行分割に対する仕様が異なるので,
+ペナルティの挿入処理は若干異なったものとなっている.
+
+\begin{itemize}
+\item 「右空白」については,既に述べた\textsf{Boundary-B~[\OB]}により空白を決定しようと試みる.
+それが失敗した場合は,「右空白」は挿入されない.
+\item 「左空白」については,既に述べた\textsf{line-end~[E]}の算出方法をそのまま採用する.それに伴う「右空白」の補正も同じ.
+\item 禁則用ペナルティの処理は,後ろのクラスタ\textit{Np}の種類によって異なる.
+なお,$\mathit{Np}.\mathit{head}$は無意味であるから,
+「$\mathit{Np}.\mathit{head}$に対する\Param{prebreakpenalty}の値」は0とみなされる.言い換えれば,
+\[
+ a:=(\text{\textit{Nq}{\footnotemark}の文字に対する\Param{postbreakpenalty}の値}).
+\]
+\begin{description}
+\item[箱] \textit{Np}が\textsf{箱}であった場合は,両クラスタの間での行分割は
+(明示的に両クラスタの間に\verb+\penalty10000+があった場合を除き)いつも許容される.そのため,
+ペナルティ処理は,後に述べる\textsf{P-allow~[PA]}が\textsf{P-normal~[PN]}の代わりに用いられる.
+\item[glue] \textit{Np}がglueの場合,ペナルティ処理は\textsf{P-normal~[PN]}を用いる.
+\item[kern] \textit{Np}がkernであった場合は,両クラスタの間での行分割は
+(明示的に両クラスタの間にペナルティがあった場合を除き)許容されない.
+ペナルティ処理は,後に述べる\textsf{P-suppress~[PS]}を使う.
+\end{description}
+これらの\textsf{P-normal~[PN]},\textsf{P-allow~[PA]},\textsf{P-suppress~[PS]}の違いは,
+\textit{Nq}と\textit{Np}の間(以前の図だと(a)の部分)にペナルティが存在しない場合にのみ存在する.
+\end{itemize}
+
+\begin{description}
+\item[P-allow~{[PA]}]
+\textit{Nq}と\textit{Np}の間の(a)部分にペナルティがあれば,\textsf{P-normal~[PN]}と同様に,
+それらの各ノードにおいてペナルティ値を$a$だけ増加させる.
+
+(a)部分にペナルティが存在していない場合,
+\LuaTeX-ja は\textit{Nq}と\textit{Np}の間の行分割を可能にしようとする.
+そのために,以下の場合に$a$をもつ\textit{penalty\_node}を作って
+「右空白」の(もし未定義なら\textit{Np}の)直前に挿入する:
+\begin{itemize}
+\item 「右空白」がglueでない(kernか未定義)であるとき.
+\item 「左空白」がkernとしてきっちり定義されている時.
+\end{itemize}
+
+\item[P-suppress~{[PS]}]
+\textit{Nq}と\textit{Np}の間の(a)部分にペナルティがあれば,\textsf{P-normal~[PN]}と同様に,
+それらの各ノードにおいてペナルティ値を$a$だけ増加させる.
+
+(a)部分にペナルティが存在していない場合,
+\textit{Nq}と\textit{Np}の間の行分割は元々不可能のはずだったのであるが,
+\LuaTeX-ja はそれをわざわざ行分割可能にはしない.
+そのため,「右空白」がglueであれば,その直前に\verb+\penalty10000+を挿入する.
+\end{description}
+
+なお,「右空白」はkern,「左空白」は未定義の
+\[
+ \overbrace{\Node{glyph}{`あ'}}^{\mathit{Nq}}\longrightarrow \overbrace{\Node{glue}{1\,pt}}^{\mathit{Np}}
+\]
+のような状況を考える.
+このとき,$a$,即ち「あ」の\Param{postbreakpenalty}がいかなる値であっても,
+この2クラスタ間は最終的に
+\begin{equation}
+ \overbrace{\Node{glyph}{`あ'}}^{\mathit{Nq}}\longrightarrow
+\Node{kern}{右空白}\longrightarrow \overbrace{\Node{glue}{1\,pt}}^{\mathit{Np}}
+\label{eq-gref}
+\end{equation}
+となり,$a$分のペナルティは挿入されないことに注意して欲しい.
+\Param{postbreakpenalty}は($a$は)殆どの場合が非負の値と考えられ,そのような場合では
+\eqref{eq-gref}と
+\[
+ \overbrace{\Node{glyph}{`あ'}}^{\mathit{Nq}}\longrightarrow
+\Node{penalty}{$a$}\longrightarrow
+\Node{kern}{右空白}\longrightarrow \overbrace{\Node{glue}{1\,pt}}^{\mathit{Np}}
+\]
+との間に差異は生じない%
+\footnote{kern$\rightarrow$glueが1つの行分割可能点(行分割に伴うペナルティは0)
+であるため,たとえ$a=10000$であっても,\textit{Nq}と\textit{Np}の間で行分割を禁止することはできない.}.
+
+\paragraph{箱・glue・kernと和文Aの間}
+\textit{Np}が\textsf{箱}・glue・kernのいずれかで,\textit{Np}が\textsf{和文A}であった場合は,
+すぐ上の(\textit{Nq}と\textit{Np}の順序が逆になっている)場合とほぼ同じであるが,「左空白」がなくなることにのみ注意.
+\begin{itemize}
+\item 「右空白」については,既に述べた\textsf{Boundary-A~[\OA]}により空白を決定しようと試みる.
+それが失敗した場合は,「右空白」は挿入されない.
+\item \textit{Nq}が和文でないので,「左空白」は算出されない.
+\item 禁則用ペナルティの処理は,\textit{Nq}の種類によって異なる.
+$\mathit{Nq}.\mathit{tail}$は無意味なので,
+\[
+ a:=(\text{\textit{Np}{\footnotemark}の文字に対する\Param{prebreakpenalty}の値}).
+\]
+\begin{description}
+\item[箱] \textit{Nq}が\textsf{箱}の場合は,\textsf{P-allow~[PA]}を用いる.
+\item[glue] \textit{Nq}がglueの場合は,\textsf{P-normal~[PN]}を用いる.
+\item[kern] \textit{Nq}がkernの場合は,\textsf{P-suppress~[PS]}を用いる.
+\end{description}
+\end{itemize}
+
+\paragraph{和文Aと和文Bの違い}
+先に述べたように,\textsf{和文B}はhboxの中身の先頭(or 末尾)として出現している
+和文文字である.リスト内に直接ノードとして現れている和文文字(\textsf{和文A})との違いは,
+\begin{itemize}
+\item \textsf{和文B}に対しては,JFMの文字クラス指定から定まる空白
+\textsf{JFM-origin~[M]},\textsf{Boundary-A~[\OA]},\textsf{Boundary-B~[\OB]})の挿入は行われない.
+「左空白」の算出も行われない.例えば,
+\begin{itemize}
+\item 片方が\textsf{和文A},もう片方が\textsf{和文B}のクラスタの場合,
+\textsf{Boundary-A~[\OA]}または\textsf{Boundary-B~[\OB]}の挿入を試み,それがダメなら
+\Param{kanjiskip}~\textsf{[K]}の挿入を行う.
+\item \textsf{和文B}の2つのクラスタの間には,\Param{kanjiskip}~\textsf{[K]}が自動的に入る.
+\end{itemize}
+\item \textsf{和文B}と箱・glue・kernが隣接したとき(どちらが前かは関係ない),間にJFMグルー・ペナルティの挿入は一切しない.
+\item \textsf{和文B}と\textsf{和文B},また\textsf{和文B}と\textsf{欧文}とが隣接した時は,禁則用ペナルティ挿入処理は
+\textsf{P-suppress~[PS]}が用いられる.
+\item \textsf{和文B}の文字に対する\Param{prebreakpenalty},~\Param{postbreakpenalty}の値は使われず,0として計算される.
+\end{itemize}
+
+
+次が具体例である:
+\begin{LTXexample}
+あ.\inhibitglue A\\
+\hbox{あ.}A\\
+あ.A
+\end{LTXexample}
+\begin{itemize}
+\item 1行目の\verb+\inhibitglue+は\textsf{Boundary-B~[\OB]}の処理のみを抑止するので,ピリオドと「A」の間には
+\Param{xkanjiskip}(四分アキ)が入ることに注意.
+\item 2行目のピリオドと「A」の間においては,前者が\textsf{和文B}となる(hboxの中身の末尾として登場しているから)ので,
+そもそも\textsf{Boundary-B~[\OB]}の処理は行われない.よって,\Param{xkanjiskip}が入ることとなる.
+\item 3行目では,ピリオドの属するクラスタは\textsf{和文A}である.これによって,
+ピリオドと「A」の間には\textsf{Boundary-B~[\OB]}由来の半角アキが入ることになる.
+\end{itemize}
+
+\section{psft}
+\end{document}