LaTeX は、文字も数式も図も、いったん ボックス(箱) に詰めてからページに並べます。ボックスとは、幅・高さ・深さという 3 つの寸法を持った長方形の塊で、行分割器はその中身を覗かず、ひとかたまりとして扱います。この「箱に詰める」発想を理解すると、文字をずらす・重ねる・枠で囲む・段組みを作るといった操作が、すべて同じ仕組みの応用として見えてきます。
ボックスという考え方
TeX の内部では、組まれた素材はすべて寸法を持つ箱です。1 文字も箱、単語も箱、行も箱、ページも箱。LaTeX が行や段落を作るとき、これらの箱を糊(グルー、伸縮する空白)でつなぎ、最適な位置で改行・改ページします。ここで重要なのは、いったん 1 つの箱にまとめてしまうと、その中身はもう分割されない ということです。箱の内部で改行が起きることはなく、箱は丸ごと 1 単位として次の行へ送られます。
LaTeX の箱は大きく 2 種類に分かれます。1 つは LR ボックス(左から右へのボックス)。中身を一列に並べるだけで、決して途中で改行しません。横に長くなれば行からはみ出します。\mbox や \makebox、枠付きの \fbox がこれです。もう 1 つは 段落ボックス(パラグラフボックス)。あらかじめ決めた幅の中で中身を折り返し、複数行・複数段落を収められます。\parbox と minipage 環境がこれにあたります。
この違いは TeX の モード に対応します。LR ボックスの中は LR モード で、入力を左から右へ流すだけで改行しません。段落ボックスの中は (内部)段落モード に切り替わり、ふつうの本文と同じように行分割が働きます。どのコマンドがどちらのモードを作るのかを意識すると、「なぜここで折り返さないのか」「なぜ縦に伸びるのか」がはっきり見えてきます。
LR ボックス:1 行に詰める
最も基本的な LR ボックスが **\mbox{...} です。中身を 1 つの箱に閉じ込め、改行もハイフネーションもさせません**。たとえば製品名 Mac OS X や電話番号、長い化合物名のように「途中で折れてほしくない」語句を \mbox で囲むと、必ず 1 行に収まります。脚注番号と語が離ればなれにならないようにする、といった細かな調整にも使えます。
その幅を自分で決めたいときは **\makebox[幅][位置]{中身}** を使います。[幅] で箱の幅を指定し、[位置] で中身をその中のどこに置くかを選びます。l は左寄せ、c は中央(既定)、r は右寄せ、s は単語間の空白を伸ばして両端揃え(justify)にします。幅には \textwidth のような長さのほか、中身の自然な寸法を表す特殊な長さ が使えます。\width(中身の幅)、\height・\depth(高さ・深さ)、\totalheight(高さ+深さ)です。たとえば \makebox[2\width]{語} は語の 2 倍の幅の箱を作ります。
特に強力なのが 幅ゼロの箱 \makebox[0pt][位置]{中身} です。箱の幅が 0 なので、LaTeX は中身を組んでも 横方向の現在位置を進めません。つまり後続の素材と重ねて印刷できます。中央寄せ [c] なら現在位置を中心に左右へはみ出し、[r] なら左へ、[l] なら右へ伸びます。打ち消し線・重ね印字・余白への注記づけなどに使われ、\rlap/\llap という短縮形(それぞれ右・左へはみ出す幅ゼロ箱)も同じ仕組みです。
枠を描きたいときは **\fbox{中身} と \framebox[幅][位置]{中身}** です。中身の箱の四辺に罫線を引きます。\framebox の [幅][位置] は \makebox とまったく同じ。枠の見た目は 2 つの長さで決まります。線の太さ **\fboxrule(既定 0.4pt) と、枠と中身のあいだの余白 \fboxsep(既定 3pt)** です。\setlength で変更でき、たとえば \setlength{\fboxsep}{0pt} とすると中身にぴったり接した枠になります。これらは 1 行用の LR ボックスなので、複数行を囲みたいときは次節の段落ボックスと組み合わせます(より凝った枠は「枠で囲む」を参照)。
Do not break \mbox{Mac OS X} here.
% a 4cm box, contents flush right, then framed
\framebox[4cm][r]{right} \\[1ex]
% zero-width box: the word overprints what follows
X\makebox[0pt][l]{\,/} Y % prints an X/ over the gap before Y上の例では、\mbox で囲んだ語が必ず 1 行に収まり、\framebox[4cm][r] は幅 4cm の枠の中に中身を右寄せで置き、最後の幅ゼロ箱は斜線を X の直後に重ねて印字します。
段落ボックス:parbox と minipage
幅を決めて中身を折り返したいときは、段落ボックスの出番です。手軽なのが **\parbox[位置]{幅}{中身}**。指定した {幅} の中で中身を 1 つの段落として折り返します。[位置] は、この箱を 周囲の行のどこに合わせるか を指定するもので、c(既定、箱の中央を行の中央にそろえる)、t(箱の先頭行のベースラインを周囲のベースラインにそろえる)、b(箱の末尾行のベースラインにそろえる)から選びます。さらに \parbox[位置][高さ][内部位置]{幅}{中身} と高さや内部の縦揃え(t/c/b/s)まで細かく指定できますが、\parbox が扱えるのは 単一の段落 までで、複数段落やリストは入れられません。
もっと自由な段落ボックスが **minipage 環境** です。\begin{minipage}[位置][高さ][内部位置]{幅} … \end{minipage} と書き、引数の意味は \parbox と同じですが、中身は 本物の小さなページ のように扱われます。複数の段落、itemize などのリスト、さらには verbatim まで入れられる、まさに段落ボックスの本命です。注意点として、内部では **段落の字下げ(\parindent)が 0 に初期化** されます。必要なら \setlength{\parindent}{1em} のように自分で設定します。
minipage には独特の 脚注の扱い があります。中で \footnote を使うと、その脚注はページ末ではなく minipage の直下 に、a, b, … という小文字の記号付きで印字されます(mpfootnote という専用カウンタが使われます)。表や囲み記事の中で注釈を完結させたいときに便利です。一方で、minipage は フロート(figure/table)を内部に置けず、ページをまたいで分割もされません。1 つの箱としてページに収まる必要があります。
そして minipage の最もよく使われる応用が 横並びの段組み です。2 つの minipage を続けて置き、あいだに \hfill などの空白を挟むと、簡単な 2 段組みのレイアウトになります。図と説明文を左右に並べる、2 枚の画像を並べる、といった用途で多用されます。縦揃えを [t] にそろえておくと、高さの違う 2 つの箱の上端がきれいにそろいます(より本格的な配置は「フロートと配置」を参照)。
\noindent
\begin{minipage}[t]{0.48\textwidth}
Left column. This minipage wraps text within 48\%
of the text width, and can hold several paragraphs,
lists, and even its own footnote.\footnote{Local note.}
\end{minipage}\hfill
\begin{minipage}[t]{0.48\textwidth}
Right column, top-aligned with the left one because
both use the optional \verb|[t]| argument.
\end{minipage}2 つの minipage はそれぞれ本文幅の 48% を占め、あいだの \hfill が残りを埋めて左右いっぱいに広がります。両方に [t] を付けたので、行数が違っても上端がそろいます。左の箱の \footnote は、ページ末ではなく minipage の下に小文字記号付きで現れます。
ずらす・線を引く:raisebox と rule
箱を縦にずらすのが **\raisebox{移動量}[高さ][深さ]{中身}** です。{移動量} が正なら上へ、負なら下へ中身を持ち上げます。おもしろいのは省略可能な [高さ] と [深さ] で、これは 「LaTeX に対して、この箱はこれだけの高さ・深さがあると思わせる」 ための申告です。実際の見た目とは別に、周囲の行間はこの申告値で計算されます。たとえば \raisebox{0pt}[0pt][0pt]{大きな記号} とすると、中身を実際には大きく描きつつ「高さも深さもゼロ」と申告するので、周囲の行送りを乱さずに装飾を置けます。ここでも \height・\depth・\totalheight などの特殊な長さが使えます。
\rule[持ち上げ]{幅}{高さ}** は、塗りつぶした長方形(黒い箱)を描きます。{幅} と {高さ} でその寸法を決め、省略可能な [持ち上げ] でベースラインからの上下位置を調整します(負で下げる)。水平線を引くのに最適で、たとえば \rule{0.5\linewidth}{0.4pt} は行幅の半分の細い横線になります。
そして \rule のもう 1 つの顔が 支柱(ストラット) です。幅を 0 にした \rule{0pt}{高さ} は、出力には現れないのに その高さの分だけ場所を確保する 見えない箱になります。行の最低高さを強制したり、表のセルに余裕を持たせたりするのに使います。たとえば \rule{0pt}{2.6ex} を行頭に置けば、その行は必ず 2.6ex 以上の高さになります。LaTeX 標準の \strut 命令も、実体は \rule[-0.3\baselineskip]{0pt}{\baselineskip}、つまり現在の行送りいっぱいの高さと深さを持つ幅ゼロの支柱です。表の罫線と文字が窮屈に重なるのを防ぐ定番のテクニックです。
% a centered horizontal rule
\noindent\hfil\rule{0.5\linewidth}{0.4pt}\hfil
% a strut forces a taller line / roomier table cell
\begin{tabular}{|l|}
\hline
\rule{0pt}{2.6ex}Tall, uncramped row \\
\hline
\end{tabular}
% align two differently sized boxes on a common baseline
big \raisebox{-0.4ex}{\Huge A} smallボックスを保存して再利用する
同じ素材を何度も使うなら、一度だけ組んで箱に保存し、あとは取り出すだけ にできます。まず \newsavebox{\箱名} で保存用の箱(レジスタ)を 1 つ宣言します。次に \sbox{\箱名}{中身} か \savebox{\箱名}[幅][位置]{中身} で中身を組み込みます。中身が実際に組版されるのはこの瞬間の 1 回だけ です。そして使いたい場所で \usebox{\箱名} と書くと、保存済みの箱がそのまま出力されます。長い表や複雑な図など、組むのに手間のかかる素材を複数箇所で使う場合に、処理を速くし、見た目を完全に一致させられます。
保存用の箱は LR ボックスなので、複数行の中身を入れたいときは \parbox や minipage でくるんでから保存します。\begin{lrbox}{\箱名} … \end{lrbox} という環境形式も使え、こちらは verbatim を含む中身を保存するのに向いています。なお \sbox は堅牢(robust)ですが \savebox は脆弱(fragile)なので、見出しなどの「動く引数」の中で使うときは注意が必要です。
保存した箱の寸法を測りたいときは、\settowidth{\長さ}{中身}、\settoheight{\長さ}{中身}、\settodepth{\長さ}{中身} が使えます。中身を組んだときの幅・高さ・深さを、指定した長さ変数に代入します。箱の寸法に合わせて枠や下線を引く、といった精密な調整に役立ちます。
\newsavebox{\mylogo}
\sbox{\mylogo}{\fbox{\textbf{Draft}}} % typeset once
% reuse the identical box as many times as you like
Header: \usebox{\mylogo} \dots\ Footer: \usebox{\mylogo}
% measure a box into a length, then rule under it
\newlength{\w}
\settowidth{\w}{Signature}
Signature\par\rule{\w}{0.4pt}\sbox の行で「Draft」を枠囲みにして一度だけ組み、その箱を 2 か所で \usebox して取り出しています。下半分では「Signature」の幅を \settowidth で測り、その幅ちょうどの下線を \rule で引いています。
ボックス命令のまとめ
| 命令 | 種類 | 役割 |
|---|---|---|
\mbox | LR ボックス | 中身を 1 行に固定し、改行とハイフネーションを禁止 |
\makebox | LR ボックス | 幅と位置を指定。[0pt] で幅ゼロの重ね印字 |
\framebox | LR ボックス | \makebox に枠付き(\fbox は幅指定なし版) |
\parbox | 段落ボックス | 指定幅で折り返す単一段落の箱 |
minipage | 段落ボックス | 複数段落・リスト・脚注を収める小さなページ |
\raisebox | 変形 | 中身を上下にずらし、見かけの高さ・深さも申告可 |
\rule | 塗り箱 | 塗りつぶした長方形。幅ゼロで支柱(ストラット) |
\usebox | 保存 | \newsavebox+\sbox で保存した箱を取り出す |