初版 2001.12.21
最終改訂 2013.12.19
Latex 2e を使って教科書を作成する ノウハウを説明します。 このページは latex 2.09 の時代に作成したものを 一部書き換えたものなので、latex 2.09 に関する 記述が含まれている可能性があります。
図を取り込みたい場合は、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つがあります。
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 に
書かれています。
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 行目のベースラインまでの距離
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}%
}
\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 です。
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 | 表番号 |
以下のような状況を考えます。
-------------------------------------------------------- 1. 見出し これは、手動で作った箇条書きです。見出しの番号なども 自分でつけています。 --------------------------------------------------------
このような場合、見出しの行と 内容の行の間に改ページが入ると困ります。 改ページを抑止するには次のような順序で \nopagebreak 命令を 入れます。この例では \vspace や \hspace を入れる場合の 位置も併せて示しています。
--------------------------------------------------------
\noindent 1. 見出し
\nopagebreak
\vspace{1zw}
\noindent
\hspace{2zw}これは手動で作った箇条書きです。・・・・
--------------------------------------------------------
\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 をカスタマイズすればよいと 思われます。