TeX の覚え書き

初版 2001.12.21
最終改訂 2013.12.19

Latex 2e を使って教科書を作成する ノウハウを説明します。 このページは latex 2.09 の時代に作成したものを 一部書き換えたものなので、latex 2.09 に関する 記述が含まれている可能性があります。

1. 役に立つ参考図書

本節は 2001 年時点での情報です。 以下の 5 冊は是非とも揃えておきたい本です。
「Latex 美文書作成入門」  奥村晴彦
日本における TeX の第一人者であると思われる 奥村先生が書かれた本です。この本の 13 章の「スタイルファイルの 修正法」の部分は大変有益です。残念ながらこの本は絶版です。 後継本として「Latex 入門 ─美文書作成のポイント─」が出版され、 さらに、「Latex 2ε 美文書作成入門」が出版されています。 しかし、残念ながら Latex2e の本からはスタイルファイルの 修正法の部分が消えてしまいました。
「LaTeX 2ε 階梯 第2版」  藤田眞作
奥村先生と双璧をなすと思われる藤田先生が書かれた本です。 さまざまな実用的なテクニックが満載されています。
「LaTeX 2ε 文典」  生田誠三
様々なコマンドを辞書的に説明した本です。非常に細かいテクニックが 載っていることと、目次や索引が非常に工夫されていることが特徴です。 使い慣れると手放せない一冊です。
「明快 TeX −すぐに使える全機能解説−」  渡辺了介 訳
Latex のスタイルファイルをいじるには、結局 TeX の知識が 必要になります。この本は TeX の全機能を懇切丁寧に解説しており、 索引も充実しています。

2. 役に立つ Web サイト

3. 基礎的な事項

Latex を使うにあたって、知っておくべき知識を箇条書きにします。

4. 図の配置

図を取り込みたい場合は、pdf あるいは eps 形式で 図を作成し、その図を取り込みます。私は eps 形式で作っています。 eps 形式の図の作成は「グラフは独自ソフト」 「回路図などは Illustrator」を使います。

eps の図を取り込むには、\begin{document} の手前で

\usepackage{graphicx}
と宣言し、図を取り込む場所で
\includegraphics[scale=0.6]{op-amp.eps}

のようにファイル名と縮尺を指定します。図のサイズを 指定する方法として、width=6cm のように定義する方法も ありますが、これはお薦めしません。図ごとに縮小率が 異なってしまいます。scale=0.6 のように指定する方が 統一がとれた感じになります。

LaTeX のデフォルトでは 1 ページに納められる図の上限数が 小さすぎます。理系の論文では、図がどんどん後ろのページへ ずれていくことが多くなります。これを防止するために、 以下のように宣言します。

\setcounter{topnumber}{5}%    ページ上部の図表は 5 個まで
\def\topfraction{1.00}%       ページの上 1.00 まで図表で占めて可
\setcounter{bottomnumber}{5}% ページ下部の図表は 5 個まで
\def\bottomfraction{1.00}%    ページの下 1.00 まで図表で占めて可
\setcounter{totalnumber}{10}% ページあたりの図表は 10 個まで
\def\textfraction{0.04}%      ページうち本文が占める割合の下限
%        これを 0 にすると本文が 1 行だけのページが出来る
%        0.04 くらいにすると 1 行だけのページは防げる
%        0.1 くらいが良いかも知れない
\def\floatpagefraction{0.7}%  図表だけのページは少なくとも
                           %  これだけを図表が占める

そして、\begin{figure} や \begin{table} などのフローティング の配置は [tbp] を指定します。[tb] にすると、「図だけのページ」 を作らざるをえなくなった場合、これ以降の全ての図が章末に 集まってしまいます。その場に図を置きたい場合は [htbp] とします。

図を配置する場合、次のように書きます。

\begin{figure}[tbp]
\begin{center}
\includegraphics[scale=0.6]{a.eps}
\end{center}
\vskip -\lastskip \vskip -3pt
\caption{図の説明}
\label{fig:label-1}
\end{figure}

センタリングのため、図とキャプションの間に縦の空白が入って しまうので、それを \vskip -\lastskip で打ち消します。 それでも図とキャプションの間が広すぎるように 思うので、上の例ではさらに 3pt 負の値の \vspace を 挿入して間隔を調整しています。

\def\figcaptionmodify{\vskip -\lastskip \vskip -3pt}

のように、この部分を \figcaptionmodify という命令で 定義すれば、1 命令で済みます。

2 つの図を左右に並べる場合は、次のように ミニページを二つ横に並べ、それぞれの ミニページにおいてセンタリングします。

\begin{figure}[tbp]
\begin{minipage}[b]{0.49\textwidth}
   \begin{center}
   \includegraphics[scale=0.6]{a.eps}\\
   (a) 左側の図の説明
   \end{center}
\end{minipage}   
\hfill
\begin{minipage}[b]{0.49\textwidth}
   \begin{center}
   \includegraphics[scale=0.6]{b.eps}\\
   (b) 右側の図の説明
   \end{center}
\end{minipage}   
\vskip -\lastskip \vskip -3pt
\caption{図の全体説明}
\label{fig:label-2}
\end{figure}

ミニページを並べる場合、上記のように \hfill を 使う方法と、

\begin{center}
  \begin{minipage}[b]{0.4\textwidth}

  \end{minipage}
  \hspace{2zw}
  \begin{minipage}[b]{0.4\textwidth}

  \end{minipage}
\end{center}

のように図の間隔を指定した幅にして、センタリングする する方法の2つがあります。

5. 文字の大きさと baselineskip に関する知識

TeX では、和文フォント(全角文字)の大きさは欧文フォント(半角文字) よりも若干小さめに設定されます。指定した文字サイズ(欧文フォントのサイズ)に 対する和文フォントのサイズ、ベースラインスキップは 以下のようになります。単位はポイントです。 TeX の場合、「1 inch = 2.54 cm = 72.27 point」であり、 通常の「1 inch = 72 point」とは異なりますので注意が必要です。

指定した文字サイズ(=英文フォントサイズ)和文フォントサイズ和文÷英文ベースラインスキップベースラインスキップ÷和文フォントサイズ
10 9.62216 0.962216 15 1.56
11 10.53625 0.95784 15.5 1.47
12 11.54659 0.962216 16.5 1.43

例えば、MS-Word ではデフォルトの和文文字サイズは 10.5 pt です。 これに対応するのは TeX では \documentclass[11pt]{jarticle} です。 11 pt のときだけ、 和文フォントと英文フォントの大きさの比率が 異なっていることに注意してください。

ベースラインスキップのデフォルト値はかなり狭いめになっています。 私は、日本語を読みやすく表示するには、 ベースラインスキップは和文フォントの 1.6 〜 2 倍くらいが良いと思います。 一段組みのときは 1.7 以上は欲しいです。 ベースラインスキップは

\baselineskip  1.9zw

のように再設定する必要があります。 日本語のフォントは正方形なので 1zw と 1zh は等しいはずですが、 10pt のとき 1zw = 9.62216pt, 1zh = 9.16443 pt と異なって います。従って、zh という単位は使わない方が良いでしょう。 なお、デフォルトの フォントサイズなどの値は、文書中に 以下のように書くと表示することが出来ます。

\noindent
1zw          = \settowidth{\dimen0}{\kern1zw}\the\dimen0 \\
1zh          = \settowidth{\dimen0}{\kern1zh}\the\dimen0 \\
headsep      = \the\headsep \\
baselineskip = \the\baselineskip \\
textwidth    = \the\textwidth \\
textheight   = \the\textheight \\
headsep      = \the\headsep \\
このことは、「Latex 2ε 階梯 第2版」の p.210 に 書かれています。

6. textwidth, textheight の設定

TeX は左端と右端を揃えようとするので、textwidth の 指定方法として、

\textwidth = 15cm

のような指定方法はいけません。こうすると、

□ □ □ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □
□□□□□□。

のような体裁になってしまいます。TeX はデフォルトでは ベタ組(文字と文字の間の間隔は 0 pt)です。ですから、 最終行はベタ組になっています。しかし、その他の行は textwidth の幅の左端と右端を合わせるために、文字と 文字の間にすき間を作ります(あるいは詰めます)。 これでは、美しくありません。 textwidth は必ず

\textwidth = 40zw    %  全角文字 40 字分

のように全角文字の文字幅の整数倍になるように 設定してください。

textheight に関しては、

\textheight 20cm

のように指定しても大丈夫です。行間は baselineskip で 設定された値になります。しかし、章の見出しや図を含むページ だけが他のページよりも縦に長くなります。それは、美しくない ので、例えば、行数を 34 行に設定するとき 以下のように記述します。

\setlength{\textheight}{33\baselineskip}
\addtolength{\textheight}{\topskip}
% topskip は文字領域の上端から 1 行目のベースラインまでの距離

7. 箇条書きのカスタマイズ

Latex のデフォルトの中で箇条書きには不満点があります。 箇条書きの前後に大きな行間が空き、箇条書きの文章の行間も 普通の文書より広い目になります。これは、美しくありません。 そこで、私は箇条書きの環境として itemize2 , enumerate2 という 環境を自作して使っています。以下に示します。

%------------------ 箇条書き --------------------

\newenvironment{itemize2}%  
{%
   \begin{list}{$\bullet$\ \ }% 見出し記号/直後の空白を調節
   {%
      \setlength{\itemindent}{0pt}
      \setlength{\leftmargin}{3zw}%  左のインデント
      \setlength{\rightmargin}{0zw}% 右のインデント
      \setlength{\labelsep}{0zw}%    黒丸と説明文の間
      \setlength{\labelwidth}{3zw}%  ラベルの幅
      \setlength{\itemsep}{0em}%     項目ごとの改行幅
      \setlength{\parsep}{0em}%      段落での改行幅
      \setlength{\listparindent}{0zw}% 段落での一字下り
   }
}{%
   \end{list}%
}

%---------- 番号つき箇条書き -----------

\newcounter{enum2}
\newenvironment{enumerate2}{%
   \begin{list}%
   {%
      \arabic{enum2}.\ \,%  見出し記号/直後の空白を調節
   }%
   {%
      \usecounter{enum2}
      \setlength{\itemindent}{0zw}%  ここは 0 に固定
      \setlength{\leftmargin}{3zw}%  左のインデント
      \setlength{\rightmargin}{0zw}% 右のインデント
      \setlength{\labelsep}{0zw}%    黒丸と説明文の間
      \setlength{\labelwidth}{3zw}%  ラベルの幅
      \setlength{\itemsep}{0em}%     項目ごとの改行幅
      \setlength{\parsep}{0em}%      段落での改行幅
      \setlength{\listparindent}{0zw}% 段落での一字下り
   }
}{%
   \end{list}%
}

8. 数式

\eqnarray 環境は使いにくいので、 私は Roland Winkler 氏が作成された eqnarray.sty (equationarray という命令が 使えるようになる) を使って います。 ここ にあります。zip ファイルをダウンロードして

% platex eqnarray.ins

で eqnarray.sty が生成されます。 使用例を以下に示します。

\begin{equationarray}{cclc}
a & b & c & d \\
e & f & g & h \\*
i & j & k & l \\* [3em]
m & n & o & p
\end{equationarray}

このように、縦の列が 3 列以外の場合にも使えます。 \\* は改ページを抑止します。

\\ [3em] のように記述すると、 特定の行だけ行間を指定できます。 全ての行について指定するには

\def\arraystretch{1.9}
のようにします。\arraystretch のデフォルト値は 1 です。

9. 変数やマクロの使い方

Latex で整数型変数を使う場合は次のようにします。

\newcounter{count}%        変数の宣言
\setcounter{count}{6}%     値の代入
\addtocounter{count}{3}%   足し算
\addtocounter{count}{-2}%  引き算
\thecount%                 値を表示 ( TeX の命令 )
\arabic{count}%            値を表示 ( Latex の命令 )

長さを表す変数を使う場合は次のようにします。

\newlength{\len}%            変数の宣言
\setlength{\len}{10cm}%      値の代入
\addtolength{\len}{-5cm}%    引き算
\setlength{\len}{0.5\len}%   かけ算
\the\len%                    値の表示
\vspace{\len}%               使い方の例

マクロを定義する場合は \def コマンドを使います。 引数を取らないマクロの例を示します。

\def\myscale{0.6}%           マクロの定義  \myscale = 0.6
\includegraphics[scale=\myscale]{a.eps}
引数を取る場合は #1 #2 ... で表します。例を示します。
\def\mycommand#1{-- #1 --}%   マクロの定義
\mycommand{あ}%               使用例
実用的な例としてページ番号の形式を -1- のようにするときは、 以下のように記述します。
\renewcommand{\thepage}{-- \arabic{page} --}

Latex で使われる主要なカウンタ変数を以下に示します。
変数名意味
pageページ番号
figure図番号
table表番号

10. 改ページの抑止

以下のような状況を考えます。

--------------------------------------------------------
1. 見出し

  これは、手動で作った箇条書きです。見出しの番号なども
自分でつけています。
--------------------------------------------------------

このような場合、見出しの行と 内容の行の間に改ページが入ると困ります。 改ページを抑止するには次のような順序で \nopagebreak 命令を 入れます。この例では \vspace や \hspace を入れる場合の 位置も併せて示しています。

--------------------------------------------------------
\noindent 1. 見出し

\nopagebreak
\vspace{1zw}
\noindent
\hspace{2zw}これは手動で作った箇条書きです。・・・・
--------------------------------------------------------

11. カスタマイズ

\documentclass{jbook} のとき jbook.cls という クラスファイルが使われます。 クラスファイルの中に \chapter などの コマンドの定義が \newcommand 命令を使って書かれています。 FreeBSD の場合 jbook.cls は /usr/local/share/texmf/ptex/platex/base 以下に あります。

\chapter などのコマンドをカスタマイズするには、 jbook.cls の内容を上書きする必要があります。

例えば、図のキャプションの付き方が デフォルトでは「図1: キャプション」と なるのを「図1 キャプション」にするには、 jbook.cls の中の \long\def\@makecaption#1#2{% 以下の 部分を上書きする必要があります。

そのためには、\begin{document} の手前に 再定義した命令を書きます。 私はカスタマイズした設定を customize.sty という ファイルに書き、

\usepackage{customize}

として取り込みます。 customize.sty では @ を含む命令をカスタマイズします。 通常の tex ファイルでは @ は無視されるので、 上記の \usepackage を \input で書く場合、

\makeatletter
\input{customize.sty}
\makeatother

と書きます。

私が教科書を書く場合、レイアウトは 以下のように設定します。

項目設定値
用紙サイズA4
文字サイズ11 pt
マージン上下左右に約 3cm
ベースラインスキップ1.9 zw

以下のようにカスタマイズします。

スケルトンファイル
skeleton.tex からインクルードされる(jbook.cls を 上書き)
skeleton.tex からインクルードされる(自分独自のコマンド)

索引を作るコマンドは \printindex ですが、 これをカスタマイズするには FreeBSD の場合、 /usr/local/share/texmf/tex/latex/base 以下の makeidx.sty をカスタマイズすればよいと 思われます。