emathのyokoenumerateをlualatexで作る

emathのyokoenumerateをlualatexで作る

- あ い の投稿
返信数: 3
続けて質問してしまい大変心苦しいのですが,答えていただければ幸いです。

少し前に「綺麗な横向き箇条書きを作る」という旨のディスカッションが追加されたのを見て,tasksをemathのyokoenumerateのように自動調整できないかなあと思いました(lualatexだとemathが使えないので)。

流れとしては,

① \taskの効力をなくし新たに強制改行のはたらきを与える。
② task環境内の文章がアイテムごとに改行されて表示されるはずなので,その複数行の文章のうち最長のアイテムの横幅を測る。
③ 最長のアイテムの横幅によって条件分岐

を考えましたが,いくつか問題点があります。

① コマンドではなく環境にしたい
② 最大幅を測る際に\yokoenulengthmaxを定義したが,これが引数を取る形だと正常に機能しない。
(他にもあるかも)

解決策をご教示いただければ幸いです。

なお,以下のサイトを参考にしました。

https://tex.stackexchange.com/questions/593800/how-to-find-the-width-of-the-longest-line-in-multi-paragraph-text
あ い への返信

Re: emathのyokoenumerateをlualatexで作る

- ishi hara の投稿
最新のemathはlualatexに対応しています。
添付pdfのようになります。
\documentclass{ltjsarticle}
\usepackage{luatexja}
\usepackage{luatexja-fontspec}
\usepackage{luatexja-otf}
\usepackage{emathP}

\begin{document}

\begin{yokoenumerate}
\item aaaaa
\item aaaaaaaaaa
\item aaaaaaa
\item aaaaa
\item aaaaaaaaaaa
\item aaaaa
\item aaaaaaaaaaaaaaa
\item aaaaa
\item aaaaaaa
\item aaaaa
\item aaaaaaaaa
\item aaaaa
\item aaa
\item aaaaa
\end{yokoenumerate}

\begin{betaenumerate}
\item aaaaa
\item aaaaaaaaaa
\item aaaaaaa
\item aaaaa
\item aaaaaaaaaaa
\item aaaaa
\item aaaaaaaaaaaaaaa
\item aaaaa
\item aaaaaaa
\item aaaaa
\item aaaaaaaaa
\item aaaaa
\item aaa
\item aaaaa
\end{betaenumerate}

\end{document}
ishi hara への返信

Re: emathのyokoenumerateをlualatexで作る

- あ い の投稿
ishi haraさま返信ありがとうございます!
見ていた情報が古かったんですね,申し訳ないです。。。
あ い への返信

Re: emathのyokoenumerateをlualatexで作る

- 本田 知亮 の投稿
横に並ぶ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に入れなおすいう処理を追加すれば,
縦にそろえることができますし,
他にもいろいろな処理ができるようなります

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