+%<*en>
+\subsection{Lua Functions of the Stack System}
+In this subsection, we will see how a user use \LuaTeX-ja's stack system to
+store some data which obeys the grouping of \TeX.
+%</en>
+%<*ja>
+\subsection{スタックシステムで使用される関数}
+本節では,ユーザが\LuaTeX-jaのスタックシステムを使用して,
+\TeX のグルーピングに従うような
+独自のデータを取り扱う方法を述べる.
+%</ja>
+
+%<*en>
+The following function can be used to store data into a stack:
+\begin{verbatim}
+luatexja.stack.set_stack_table(index, <any> data)
+\end{verbatim}
+Any values which except \texttt{nil}~and~NaN are usable as \textit{index}.
+However, a user should use only negative integers or strings as \textit{index},
+since natural numbers are used by \LuaTeX-ja itself.
+Also, whether \textit{data} is stored locally or globally
+is determined by \texttt{luatexja.isglobal}
+(stored globally if and only if \texttt{luatexja.isglobal == 'global'}).
+%</en>
+%<*ja>
+スタックに値を設定するには,以下のLua関数を呼びだせば良い:
+\begin{verbatim}
+luatexja.stack.set_stack_table(<any> index, <any> data)
+\end{verbatim}
+直感的には,スタックテーブル中のインデックス\textit{index}の値を\textit{data}にする,という意味である.
+\textit{index}の値としては \texttt{nil} とNaN以外の任意の値を使えるが,
+自然数は\LuaTeX-jaが使用する(将来の拡張用も含む)ので,
+ユーザが使用する場合は負の整数値か文字列の値にすることが望ましい.
+また,ローカルに設定されるかグローバルに設定されるかは,\texttt{luatexja.isglobal} の値に依存する
+(グローバルに設定されるのは,\texttt{luatexja.isglobal == 'global'} であるちょうどその時).
+%</ja>
+
+%<*en>
+Stored data can be obtained as the return value of
+\begin{verbatim}
+luatexja.stack.get_stack_table(index, <any> default, <number> level)
+\end{verbatim}
+where \textit{level} is the stack level, which is usually the value of \verb+\ltj@@stack+,
+and \textit{default} is the default value which will be returned if no values are stored
+in the stack table whose level is \textit{level}.
+%</en>
+%<*ja>
+スタックの値は,
+\begin{verbatim}
+luatexja.stack.get_stack_table(<any> index, <any> default, <number> level)
+\end{verbatim}
+の戻り値で取得できる.\textit{level}はスタックレベルであり,
+通常は \verb+\ltj@@stack+ の値を指定することになるだろう.
+\textit{default}はレベル\textit{level}のスタックに値が設定されていなかった場合に
+返すデフォルト値である.
+%</ja>
+
+\begin{figure}[tb]
+\begin{lstlisting}[numbers=left, firstnumber=380]
+\protected\def\ltj@setpar@global{%
+ \relax\ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}%
+ \else\directlua{luatexja.isglobal=''}\fi
+}
+\protected\def\ltjsetparameter#1{%
+ \ltj@setpar@global\setkeys[ltj]{japaram}{#1}\ignorespaces}
+\protected\def\ltjglobalsetparameter#1{%
+ \relax\ifnum\globaldefs<0\directlua{luatexja.isglobal=''}%
+ \else\directlua{luatexja.isglobal='global'}\fi%
+ \setkeys[ltj]{japaram}{#1}\ignorespaces}
+\end{lstlisting}
+%<ja>\caption{パラメータ設定命令の定義}
+%<en>\caption{Definiton of parameter setting commands}
+\label{fig:setpar-def}
+\end{figure}
+
+%<*en>
+\subsection{Extending Parameters}
+Keys for \verb+\ltjsetparameter+~and~\verb+\ltjgetparameter+ can be extended,
+as in \Pkg{luatexja-adjust}.
+%</en>
+%<*ja>
+\subsection{パラメータの拡張}
+ここでは,\Pkg{luatexja-adjust}で行なっているように,
+\verb+\ltjsetparameter+,~\verb+\ltjgetparameter+に指定可能なキーを追加する方法
+を述べる.
+%</ja>
+
+%<*en>
+\paragraph{Setting parameters}
+Figure~\ref{fig:setpar-def} shows the ``most outer'' definition of
+two commands,
+\verb+\ltjsetparameter+ and \verb+\ltjglobalsetparameter+.
+Most important part is the last \verb+\setkeys+,
+which is offered by the \Pkg{xkeyval} package.
+
+Hence, to add a key in \verb+\ltjsetparameter+, one only have to add a key
+whose prefix is \texttt{ltj} and whose family is \texttt{japaram}, as the following.
+\begin{verbatim}
+\define@key[ltj]{japaram}{...}{...}
+\end{verbatim}
+
+\verb+\ltjsetparameter+~and~\verb+\ltjglobalsetparameter+ automatically sets
+\texttt{luatexja.isglobal}. Its meaning is the following.
+\begin{align}
+ \texttt{luatexja.isglobal} =
+\begin{cases}
+ \texttt{'global'}&\text{global}\\
+ \texttt{''}&\text{local}
+\end{cases}
+\end{align}
+This is determined not only by command name
+(\verb+\ltjsetparameter+~or~\verb+\ltjglobalsetparameter+),
+but also by the value of \verb+\globaldefs+.
+%</en>
+%<*ja>
+\paragraph{パラメータの設定}
+\verb+\ltjsetparameter+ と,\verb+\ltjglobalsetparameter+ の定義は図\ref{fig:setpar-def}の
+のようになっている.
+本質的なのは最後の \verb+\setkeys+ で,これは\Pkg{xkeyval}パッケージの提供する命令である.
+
+このため,\verb+\ltjsetparameter+ に指定可能なパラメータを追加するには,
+<prefix>を \texttt{ltj},<family>を \texttt{japaram} としたキーを
+\begin{verbatim}
+\define@key[ltj]{japaram}{...}{...}
+\end{verbatim}
+のように定義すれば良いだけである.
+なお,パラメータ指定がグローバルかローカルかどうかを示す \texttt{luatexja.isglobal} が,
+\begin{align}
+ \texttt{luatexja.isglobal} =
+\begin{cases}
+ \texttt{'global'}&\text{パラメータ設定はグローバル}\\
+ \texttt{''}&\text{パラメータ設定はローカル}
+\end{cases}
+\end{align}
+として自動的にセットされる\footnote{命令が \texttt{\textbackslash ltjglobalsetparameter} かどうかだけでは
+なく,実行時の \texttt{\textbackslash globaldefs} の値にも依存して定まる.}.
+%</ja>
+
+%<*ja>
+\paragraph{パラメータの取得}
+一方,\verb+\ltjgetparameter+ はLuaスクリプトによって実装されている.
+値を取得するのに追加引数の要らないパラメータについては,\verb+luatexja.unary_pars+\
+内に処理内容を記述した関数を定義すれば良い.例えば,Luaスクリプトで
+\begin{lstlisting}[numbers=left]
+function luatexja.unary_pars.hoge (t)
+ return 42
+end
+\end{lstlisting}
+を実行すると,\verb+\ltjgetparameter{hoge}+ は \texttt{42} という\emph{文字列}を返す.
+関数 \verb+luatexja.unary_pars.hoge+ の引数$t$は,\ref{ssec-stack}節で述べた
+\LuaTeX-jaのスタックシステムにおけるスタックレベルである.
+戻り値はいかなる値であっても,最終的には文字列として出力されることに注意.
+
+一方,追加引数(\emph{数値しか許容しない})が必要なパラメータについては,
+まずLuaスクリプトで処理内容の本体を記述しておく:
+\begin{lstlisting}[numbers=left]
+function luatexja.binary_pars.fuga (c, t)
+ return tostring(c) .. ', ' .. tostring(42)
+end
+\end{lstlisting}
+引数$t$は,先に述べた通りのスタックレベルである.一方,引数$c$は\
+\verb+\ltjgetparameter+ の第2引数を表す数値である.
+しかしこれだけでは駄目で,
+\begin{verbatim}
+\ltj@@decl@array@param{fuga}
+\end{verbatim}
+を実行し,\TeX インターフェース側に
+「\verb+\ltjgetparameter{fuga}+ は追加引数が必要」ということを通知する必要がある.
+%</ja>
+
+%<en>\section{Linebreak after a Japanese Character}