+\label{sec-dir-imp}
+\ref{sec-direction}章の最初でも述べたように,
+\LuaTeX-jaは横組(\texttt{TLT})で組んだボックスを回転させる方式で
+縦組を実装している.
+
+\LuaTeX-jaにおける縦組の実装は
+\pTeX における実装(\cite{ptexdoc,ptextug})をベースにしている.
+
+\subsection{direction~whatsit}
+\textit{direction}~whatsitとは,\textit{direction}という特定の \verb+user_id+ を持つ
+whatsitのことであり,以下のタイミングで作られる.
+\begin{itemize}
+ \item 組方向を \cs{tate} 等で変更したとき.
+ \item \cs{hbox}, \cs{vbox}, \cs{vtop} による明示的なボックスの開始時.\\
+\verb+\hbox{}+, \verb+\vbox{}+ といった,
+\begin{itemize}
+ \item \cs{tate} 等によりボックス内部の組方向を変更していない
+ \item ボックスの中身のリストが空である
+\end{itemize}
+場合は,\LuaTeX の \verb+hpack_filter+, \verb+vpack_filter+ といった
+callbackに処理が回らない.そこで,\LuaTeX-ja では,\cs{everyhbox}, \cs{everyvbox} を利用す
+ ることで各ボックスの先頭に確実に追加するようにしている\footnote{%
+ 問題は \cs{hbox to 25pt\{\}} という状況である.実際のこのボックスの中身は空でない(少な
+ くともdirection whatsitがある)ため,何も対策をしなければhpack時にUnderfill警告が発
+ 生してしまうことになる.\LuaTeX-jaではそうならないように「\cs{hbadness},
+ \cs{vbadness} を一時的に10000に変更し,hpack, vpack後に元の値に戻す」処理を行ってい
+ る.
+}.
+ \item \cs{vsplit}によってvboxを分割した時の「残り」の先頭.
+ \item \LuaTeX-ja読み込み前に作成したボックスの寸法を \cs{ltjsetwd} 等によって変更した時.
+ \item \cs{insert} によるinsertionでは,中身の先頭に\textit{direction}~whatsitは作られず,
+その代わりに中身の各ボックス・罫線の直前に作られる\footnote{%
+ これは,ページ分割の過程でinsertionが分割される時,「現在のページで出力される部分」が空と
+ なることがあることによる.先頭にwhatsitを置くと,最悪でも「現在のページにwhatsitが
+ 残る」ことになってしまう.}.
+\end{itemize}
+なお,\verb+\vtop{...}+ の場合は,先頭にdirection whatsitを置くと
+ボックスの高さが常に0\,ptになるという問題が発生する.そのため,この場合に限っては
+vpack時にdirection whatsitをリストの2番目に移動させている.
+
+direction whatsitはあくまでも組方向処理のための補助的なノードであるので,
+\cs{unhbox}, \cs{unhcopy} によってボックスの中身が展開される時には展開直前に削除される.
+これは
+\begin{lstlisting}
+ % yoko direction
+\setbox0=\hbox{\tate B}
+\noindent % 水平モードに入る.この時点でのリストの中身は空
+\unhbox0 A
+\end{lstlisting}
+といった場合に,段落が縦組で組まれたり,あるいは
+\begin{lstlisting}
+\setbox0=\hbox{}
+\leavevmode \hbox{A}\unhbox0
+\setbox1=\lastbox % \box1 はどうなる?
+\end{lstlisting}
+で \cs{box1} が \cs{hbox\{A\}} でなく空になってしまうことを防ぐためである.
+
+
+\subsection{\textit{dir\_box}}
+縦中横など異方向のボックスを配置する場合に,周囲の組方向と大きさを整合させるため,
+\LuaTeX-jaでは \verb+\ltj@dir+ が128以降の\textit{hlist\_node}, \textit{vlist\_node}を
+用いる.これらは\pTeX における\textit{dir\_node}の役割と同じ果たしており,
+この文章中では\textit{dir\_box}と呼称する.
+
+\subsubsection{異方向のボックスの整合}
+\textit{dir\_box}の第一の使用目的は,異方向のボックスの大きさを整合させることである.
+例えば,
+\begin{lstlisting}
+ % yoko direction
+平成\hbox{\tate 26}年
+\end{lstlisting}
+は段落中で
+\[
+ \xymatrix{
+ {}\Node{glyph}{`平'}\ar[r]&{}\Node{glyph}{`成'}\ar[r]&
+ {}\HNode{hbox}{10.00003}{3.02779}{0.0}\ar[r]\ar[d]^{\text{中身}}&{}\Node{glyph}{`年'}\\
+ &&{}\Node{whatsit}{\cs{tate}}\ar[r]&{}\Node{glyph}{`2'}\ar[r]&{}\Node{glyph}{`6'}
+ }
+\]
+というリストを作る.その後,この段落が終了したときに,
+\LuaTeX-jaの\textbf{JAglue}挿入処理が行われ
+\[
+ \xymatrix{
+ {}\Node{glyph}{`平'}\ar[r]
+ &{}\textcolor{blue}{\Node{glue}{\Param{xkanjiskip}}}\ar[r]
+ &{}\Node{glyph}{`成'}\ar[r]
+ &{}\textcolor{blue}{\Node{penalty}{0}}
+ \ar`r[d] `[l] `[ddll] `[dl] [dl]
+ \\
+ &&{}\textcolor{red}{\HNode{\textit{dir\_box} (\cs{yoko})}{3.02779}{10.00003}{0.0}}\ar[r]\ar[d]^{\text{中身}}
+ &{}\textcolor{blue}{\Node{penalty}{0}}\ar[r]
+ &{}\Node{glyph}{`年'}\\
+ &&{}\HNode{hbox}{10.00003}{3.02779}{0.0}\ar[d]^{\text{中身}}\\
+ &&{}\Node{whatsit}{\cs{tate}}\ar[r]&{}\Node{glyph}{`2'}\ar[r]&{}\Node{glyph}{`6'}
+ }
+\]
+のようになる(青字は\textbf{JAglue},赤字が整合処理のための\textit{dir\_box}である).
+\TeX の \cs{showbox} 形式で書けば
+
+\medskip{\narrowbaselines\ttfamily\obeylines\parindent0pt
+\catcode`\@=0 @catcode`@\=12
+.\tenmin 平
+@textcolor{blue}{.\glue 0.0 plus 0.4 minus 0.4}
+.\tenmin 成
+@textcolor{blue}{.\penalty 0}
+@textcolor{red}{.\hbox(10.00003+0.0)x3.02779, direction TLT}
+..\hbox(3.02779+0.0)x10.00003, direction TLT
+...\whatsit4=[]
+...\tenrm 2
+...\tenrm 6
+@textcolor{blue}{.\penalty 0}
+.\tenmin 年
+}\medskip
+
+\noindent である.
+
+なお,\cs{raise},~\cs{lower}, \cs{moveleft},~\cs{moveright} といったボックス移動命令では.
+移動を正しく表現するために段落やボックスの途中でも異方向のボックスは\textit{dir\_box}にカ
+プセル化している.
+例えば
+\begin{lstlisting}
+ % yoko direction
+平成\raise1pt\hbox{\tate 26}年\showlists
+\end{lstlisting}
+は以下のような結果を得る.
+
+\medskip{\narrowbaselines\ttfamily\obeylines\parindent0pt
+\catcode`\@=0 @catcode`@\=12
+(前略)
+\tenrm 平
+\tenrm 成
+@textcolor{red}{\hbox(10.00003+0.0)x3.02779, shifted -1.0, direction TLT}
+.\hbox(3.02779+0.0)x10.00003, direction TLT
+..\whatsit4=[]
+..\tenrm 2
+..\tenrm 6
+\tenrm 年
+}\medskip
+
+また,メインの垂直リストに異方向のボックスが追加される場合にも同様に即座に
+\textit{dir\_box}にカプセル化している.ページ分割のタイミングを正
+しく\TeX が判断するためである.
+\cs{lastbox} によるボックスの取得では,\textit{dir\_box}は削除される.
+
+\subsubsection{異方向のボックス寸法の格納}
+第二の使用目的は,現在の組方向がボックス本来の組方向とは異なる状況で,
+\cs{ltjsetwd} によってボックス寸法を設定されたことを記録することである.
+
+例えば
+\begin{lstlisting}[numbers=left]
+\setbox0=\hbox{\vrule width 10pt height 5pt depth 2pt}
+\setbox1=\hbox{\tate\ltjsetwd0=20pt}
+\wd0=9pt
+\setbox1=\hbox{\dtou\ltjsetwd0=20pt}
+\setbox0=\hbox{\dtou a\box0}
+\end{lstlisting}
+というコードを考える.1行目で \cs{box0} には横組の
+幅10\,pt,高さ5\,pt,深さ2\,ptのボックスが代入される.
+よって,
+\begin{itemize}
+ \item 縦組下では \cs{box0} は幅7\,pt,高さ・深さ5\,ptのボックスとして扱われる.
+ \item \cs{dtou} 下では \cs{box0} は幅7\,pt,高さ10\,pt,深さ0\,ptのボックスとして扱われる.
+\end{itemize}
+このとき,\cs{box0} の\emph{中身}は
+\[
+ \xymatrix{
+ {}\Node{whatsit}{\cs{yoko}}\ar[r]&{}\Node{rule}{}
+ }
+\]
+である.
+
+さて,2行目で縦組時の \cs{box0} の幅が20\,ptに設定される.この情報が
+direction~whatsit内部のノードリストに,\textit{dir\_box}として格納される:
+\[
+ \xymatrix{
+ {}\Node{whatsit}{\cs{yoko}}\ar[r]\ar[d]_{\text{中身}}&{}\Node{rule}{}\\
+ {}\textcolor{red}{\HNode{\textit{dir\_box} (\cs{tate})}{20.0}{5.0}{5.0}}
+ }
+\]
+
+次に,3行目では横組時の,つまり \cs{box0} 本来の組方向での深さが9\,ptに変更される.
+このとき,\cs{box0} は
+\begin{itemize}
+ \item 縦組下では寸法代入が既に行われているので,2行目で作成された\textit{dir\_box}の通り
+ に幅20\,pt,高さ・深さ5\,ptのボックスとして扱われる.
+ \item \cs{dtou} 下ではまだ寸法代入が行われていないので,
+\cs{box0} の寸法変更に追従し,幅7\,pt,高さ9\,pt,深さ0\,ptのボックスとして扱われる.
+\end{itemize}