emathのyokoenumerateをlualatexで作る

Re: emathのyokoenumerateをlualatexで作る

- 本田 知亮 の投稿
返信数: 0
横に並ぶenumerateの実装は,
いわゆる「緑の本」
(吉永「LaTeX2eマクロ&クラス 実践解説」技術評論社,2003年)
で,かなり詳細に解説されていますが入手が困難すぎます.


横のenunmerateの根本的なアイデアの一つは

\documentclass{jarticle}

\begin{document}

\makeatletter
\newcount\yokocnt

\def\item{\unskip\egroup
\yokocnt=\numexpr\yokocnt+1\relax
\refstepcounter{enumi}%
\expandafter\newbox\csname yoko@\the\yokocnt\endcsname
\expandafter\setbox\csname yoko@\the\yokocnt\endcsname=\hbox\bgroup
(\theenumi)\hskip1zw
}

\setbox0=\hbox\bgroup
\item ああああ
\item いいいい
\item うううう
\egroup
\par\noindent
\copy\csname yoko@1\endcsname\hskip2zw
\copy\csname yoko@2\endcsname\hskip2zw
\copy\csname yoko@3\endcsname

\end{document}

こんな感じです.
pTeXで作ったのでzwは\zwにしてください.
要は,各\itemの項目を一つ一つボックスにいれてしまって,
それを適切に並べるということです.


このサンプルでは,
\itemごとに\newboxしてるのでboxレジスタの枯渇を起こすという
致命的な欠陥があるのでこのままだとNGですが,
基本線はこの形でいけます.

枯渇の回避としては,
「割り当てる前にそのレジスタが割り当て済みかチェックして
割り当て済みならそれを流用,そうでなければ割り当てる」
もしくは
「割り当て済みのレジスタの番号よりも大きい番号のレジスタを一時的に使いまわす」
ことが考えられます.緑の本では後者の方策が使われています.


上の例では以下のようなことは実装していませんが,
一度boxにいれているので各項目の長さが分かるため,
その幅で最大のものを取得して,
各項目をその幅のboxに入れなおすいう処理を追加すれば,
縦にそろえることができますし,
他にもいろいろな処理ができるようなります

ちょっと項目間のアキの扱いが面倒なケースがあって,
今出力している項目が左から数えて何番目なのかのチェックや
いま何行目なのかのチェックもしておくといいかもしれません.