見出し画像

『数式組版』を組む技術:図や表のフロート

本稿において,“本書”とは木枝祐介著『数式組版』ラムダノート(2018)のことである.
>>> https://www.lambdanote.com/collections/mathtypo
また,本書はLuaLaTeXを用いて組まれた.したがって本稿ではLuaLaTeXの使用を前提としている.
本書が組まれた当時はTeX Live 2017が用いられたが,多くのコードはそれより後のTeX Live 2019まで共通して使用可能である.
本稿では,バージョンに強く依存する場合を除いて,各バージョンは明記されないことがある.

図や表のフロート

ここでは基本的な図や表のフロートに関する設定を行う.
本書では図と表はそのキャプションの位置が異なる.
すなわち,キャプションは図では下に付き,表では上に付くのである.

◆カウンターのフォーマット
カウンターは章ごとにリセットされ,そのフォーマットは「図1.1:」である.
これは表でも同様である.

\newcounter{figure}[chapter]
\renewcommand{\thefigure}{%
 \ifnum\c@chapter>\z@\thechapter.\fi\@arabic\c@figure}
\newcounter{table}[chapter]
\renewcommand{\thetable}{%
 \ifnum\c@chapter>\z@\thechapter.\fi\@arabic\c@table}
\def\fnum@figure{\figurename\thefigure}
\def\fnum@table{\tablename\thetable}

◆キャプションの設定
キャプションは図と表でそのフロートに対する位置が異なる.
一般にそのようなときは,アキの制御対象箇所がそれぞれ異なる.
本書においても,その状況にある.

本書のキャプションの仕様概要は次のものである.

▶ 和文書体:こぶりなゴシック StdN W3
▶ フォントサイズ:10級
▶ 行送り:17.5歯
▶ フロートとの間隔:行送りの1/2

キャプションの上下方向のアキを図と表で個別に次の名前で制御する.

▶ `\abovefigurecaptionskip`:図用キャプション上方向のアキ(行送りの1/2)
▶ `\belowfigurecaptionskip`:図用キャプション下方向のアキ(0pt)
▶ `\abovetablecaptionskip`:表用キャプション上方向のアキ(0pt)
▶ `\belowtablecaptionskip`:表用キャプション下方向のアキ(行送りの1/2)

\newlength\abovefigurecaptionskip
\newlength\belowfigurecaptionskip
\setlength\abovefigurecaptionskip{.5\baselineskip}
\setlength\belowfigurecaptionskip{\z@}
\newlength\abovetablecaptionskip
\newlength\belowtablecaptionskip
\abovetablecaptionskip\belowfigurecaptionskip
\belowtablecaptionskip\abovefigurecaptionskip

汎用性を持たせるために上下のアキを四つ定義したが,本書を組むというだけの目的では,もちろん二つでも構わない.

図用と表用とのキャプションを出力するために,次のように個別で定義する.
上下にそれぞれのアキを独立に挿入するようにしていることが観測できる.
なお,`\long`であるのは,キャプション内での改段落を想定してものものである.

\long\def\@makefigurecaption#1#2{%
 \vskip\abovefigurecaptionskip
 \captionsize\sffamily\jfontspec{KoburinaGoStdN-W3}%
 \sbox\@tempboxa{#1:#2}%
 \ifdim \wd\@tempboxa >\hsize
   #1:#2\relax\par
 \else
   \global \@minipagefalse
   \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
 \fi
 \vskip\belowfigurecaptionskip}
\long\def\@maketablecaption#1#2{%
 \vskip\abovetablecaptionskip
 \captionsize\sffamily\jfontspec{KoburinaGoStdN-W3}%
 \sbox\@tempboxa{#1:#2}%
 \ifdim \wd\@tempboxa >\hsize
   #1:#2\relax\par
 \else
   \global \@minipagefalse
   \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
 \fi
 \vskip\belowtablecaptionskip}

それぞれ`\ifdim`での分岐は,たとえば「図1.1:○○」を自然に組んだ行が,行長である`\hsize`を越えるか否かで判定を行っている.
これが行長を越えるということは版面領域から溢れることを意味しており,その状況に対応するために`\global`付きの`\@minipagefalse`を行っている.

◆版面領域に対するフロートのデフォルト位置の設定
図のキャプションは下に付くので,基本的な図の位置は版面領域上端である.
一方,表はその逆である.

\def\fps@figure{tp}
\def\fps@table{bp}

◆フロートに対するキャプション位置の設定
上で個別に設定したキャプションを図と表との場合にそれぞれ与える.

\newenvironment{figure}
              {\let\@makecaption\@makefigurecaption\@float{figure}}
              {\end@float}

\newenvironment{table}
              {\let\@makecaption\@maketablecaption\@float{table}}
              {\end@float}

◆版面領域内におけるフロートの数

▶ `topnumber`:版面領域内上部として配置される最大数
▶ `bottomnumber`:版面領域内下部として配置される最大数
▶ `totalnumber`:版面領域内全体に配置される最大数

\setcounter{topnumber}{3}
\setcounter{bottomnumber}{3}
\setcounter{totalnumber}{4}

◆版面領域内におけるフロート本文の関係

▶ `\topfraction`:フロートが占める版面領域上部の割合の上限
▶ `\bottomfraction`:フロートが占める版面領域下部の割合の上限
▶ `\textfraction`:フロートの存在するページで本文の占める割合の下限
▶ `\floatpagefraction`:通常の改ページで起こるフロートのみのページでフロートが占める割合の下限

\renewcommand{\topfraction}{.6}
\renewcommand{\bottomfraction}{.6}
\renewcommand{\textfraction}{.2}
\renewcommand{\floatpagefraction}{.6}

:それぞれ上限と下限が版面領域の割合で定義されていることに注意.

◆フロートと本文の距離

▶ `\floatsep`:フロートどうしの距離
▶ `\textfloatsep`:フロートと本文の距離
▶ `\intextsep`:とくに「h」指定による配置時における“フロート”と本文の距離

\setlength\floatsep    {1.5\Cvs \@plus 2\p@ \@minus 2\p@}
\setlength\textfloatsep{1.5\Cvs \@plus 2\p@ \@minus 4\p@}
\setlength\intextsep   {1.5\Cvs \@plus 2\p@ \@minus 2\p@}

フロートと本文の関係であるから,版面領域内の行運行の範疇であるので,通常の行送りである`\Cvs`を用いている.

◆フロートのみのページの設定

▶ `\@fptop`:フロートと版面領域上端との距離
▶ `\@fpsep`:フロートどうしの距離
▶ `\@fpbot`:フロートと版面領域下端との距離

\setlength\@fptop{0\p@ \@plus 1fil}
\setlength\@fpsep{2\Cvs}
\setlength\@fpbot{0\p@ \@plus 1fil}

この設定により,フロートのみからなる版面領域は,天地中央にフロートが配置され,いくつかフロートが並ぶ場合は,行送りの2倍だけのアキが挿入されることになる.

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