『数式組版』を組む技術:箇条書き
本稿において,“本書”とは木枝祐介著『数式組版』ラムダノート(2018)のことである.
>>> https://www.lambdanote.com/collections/mathtypo
また,本書はLuaLaTeXを用いて組まれた.したがって本稿ではLuaLaTeXの使用を前提としている.
本書が組まれた当時はTeX Live 2017が用いられたが,多くのコードはそれより後のTeX Live 2019まで共通して使用可能である.
本稿では,バージョンに強く依存する場合を除いて,各バージョンは明記されないことがある.
箇条書き
本書での箇条書きには採番ありのもの(1.,2.,3.,…)と,採番なしのもの(行頭ビュレット「・」など)をがある.
◆採番あり
ここでは`enumerate`環境を(再)定義する.
まず採番のフォーマットである.
\renewcommand{\theenumi}{\@arabic\c@enumi}
\renewcommand{\theenumii}{\@alph\c@enumii}
...
\newcommand{\labelenumi}{\theenumi.}
\newcommand{\labelenumii}{(\theenumii)}
...
次は採番ありの場合の第2段階までの箇条書きの設定である.
\def\@listi{\leftmargin\leftmargini
\topsep 16.5\jH \@plus2\p@ \@minus4\p@
\partopsep \z@
\parsep \z@
\itemsep \z@}
...
\def\@listii{\leftmargin\leftmarginii
\topsep \z@
\partopsep \z@
\parsep \z@
\labelwidth\leftmarginii \advance\labelwidth-\labelsep
\itemsep\parsep}
...
`\parsep`は共通して0ptである.
一方,`\topsep`は第一段階に対してのみ正の値をもつ.
これによって,第二段階の開始時点で,通常の行送りのときよりも大きな行間となることはない.
`enumerate`環境自体の再定義はシンプルなものである.
\renewenvironment{enumerate}
{\ifnum \@enumdepth >\thr@@\@toodeep\else
\advance\@enumdepth\@ne
\edef\@enumctr{enum\romannumeral\the\@enumdepth}%
\list{\csname label\@enumctr\endcsname}{%
\usecounter{\@enumctr}%
\def\makelabel##1{\hss\llap{##1}}}%
\fi}{\endlist}
注:`enumerate`環境は`latex.ltx`で定義されているので,LaTeXでは`\renewenvironment`による再定義が必要となる.
◆採番なし
採番なしの箇条書きのオーナメントを設定する.
第一段階のオーナメントである`\textbullet`の位置を調整している.`\labelitemi`は`latex.ltx`では定義されていないので,`\newcommand`により定義している.
\newcommand{\labelitemi}{\raise.11\cwd\hbox{\textbullet}}
...
`itemize`環境は`enumerate`環境とは異なり,いささか複雑である.
`\@listi`などの呪縛から離し,環境内で直接定義している.
またそのとき,`\labelwidth`を1全角分の大きさとしているので,`\makelabel`により,1全角文の中央に配置されることになる.
\newlength{\itemize@leftmargin}
\itemize@leftmargin 3\cwd\relax
\renewenvironment{itemize}
{\ifnum \@itemdepth >\thr@@\@toodeep\else
\advance\@itemdepth\@ne
\edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
\expandafter
\list{\csname \@itemitem\endcsname}{%
\leftmargin\itemize@leftmargin
\topsep \abovedisplayskip
\parsep \z@ \@plus\p@
\itemsep \z@
\listparindent1\cwd
\labelwidth1\cwd
\labelsep.25\cwd
\itemindent\z@
\def\makelabel##1{\hss##1\hss}}%
\fi}{\endlist}
箇条書きの本体
箇条書きを実現を理解するには`\item`および`\@item`の挙動を理解する必要があるが,ここでは図を挙げるに留める.
◆縦方向
◆横方向
この記事が気に入ったらサポートをしてみませんか?