見出し画像

『数式組版』を組む技術:箇条書き

本稿において,“本書”とは木枝祐介著『数式組版』ラムダノート(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`の挙動を理解する必要があるが,ここでは図を挙げるに留める.

◆縦方向

画像1

◆横方向

画像2


この記事が気に入ったらサポートをしてみませんか?