TeX のスタイルファイル作成入門

TeX を書くときに毎回 \usepackage で同じパッケージを読み込んだり，自作コマンドを作成したり，セクションスタイルを変えるのは，結構だるい．（自作コマンドってなんや？セクションスタイル変えるか？と思った人も，それらのやり方やメリットについても解説していきたい．）そこで登場するのが，スタイルファイルである．スタイルファイルを一度作成してしまえば，それさえ読み込めば，TeX ファイルを作る度に同じ処理を書く必要がなくなる．ぜひ，この記事を読んで，独自のスタイルファイルを作ってみて欲しい．

# 本記事の構成
- スタイルファイルの作成方法
- 自作コマンドの定義
- 自作環境の定義
- セクションスタイルの改変
- タイトルページスタイルの改変

*Mac OS を想定しているが，Linux でも大した差はない．
*文中では，コマンドで\記号を用いているが，Windows では適宜¥に変換して実装すれば良い．

# スタイルファイルの作成方法
スタイルファイルとは，マクロパッケージのことである．すなわち，TeX を書くときに \usepackage するあれである．作り方は，いたって単純であり，拡張子「.tex」を「.sty」に変えれば良いだけである．あとは，TeX ファイルと同じディレクトリにスタイルファイルを配置すれば，\usepackage で読み込むことができる．

　しかし，この方法では，スタイルファイルが存在するディレクトリ以外では読み込めないため，パッケージとして TexLive と同じディレクトリに埋め込む方が良いだろう．作成したスタイルファイルの名前を「hoge.sty」であるとして，話を進める．

まず，スタイルファイルと同じ名前のディレクトリを作成する．

```bash
sudo mkdir /usr/local/texlive/2018/texmf-dist/tex/platex/hoge
```

ここで，「2018」のところは自分の texlive の年を入れる．また，「hoge」は作成したスタイルファイル名に応じて変更すれば良い．

こうして作成したディレクトリの中に，「hoge.sty」を移しておく．その後，該当ディレクトリに移動し，TeX で使えるように mktexlsr コマンドを用いる．

```bash
cd /usr/local/texlive/2018/texmf-dist/tex/platex
sudo mktexlsr
```

こうすれば，自分で作成したスタイルファイルが任意のディレクトリから読み込めるようになる．


# 自作コマンドの定義
## 数学コマンドの作成
自作コマンドを定義するには，\newcommand を用いれば良い．例えば，微分作用素 $\mathrm{d}$ のコマンドを作りたい場合，

```TeX
\newcommand{\diff}{\mathrm{d}}
```

とすれば良い．このように，\newcommand は引数として，コマンド名，コマンドの内容の２つの引数を取る．形式的に書けば，

```TeX
\newcommand{name}{content}
```

ということである．また，

$$\lim_{x\to\infty}f(x)$$

のように，下付き添え字を記号の下に表示さえたい場合は，

```TeX
\newcommand{\argmax}{\mathop{\rm arg~max}\limits}
```

のように打てば，\argmax_{} で下に $x\in\mathbb{R}$ といったようなことを入れられるようになる．このような処理をするためのコマンドが，\mathop である．これは，math operator という用語の略であるが，数学演算子風に入れられるということである．最後の \limits はデフォルトでも \limits モードになるが，一応入れている．\nolimits のモードも用意されている．例えば，

```TeX
\newcommand{\grad}{\mathop{\mathrm{grad}}\nolimits}
```

とすると，ベクトル解析の grad 演算子のコマンドを作成できる．


## 引数を持つコマンドの作成
画像を挿入するとき，どうやって挿入しているだろうか．多くの人は，

```TeX
\begin{figure}[phtb]
\centering\includegraphics[width=9cm, bb=0 0 300 300]{photo.png}
\caption{photo}\label{fig:photo}
\end{figure}
```

のようにして挿入しているのではないだろうか．これは，大変長くて面倒臭い．コピー&ペーストしても大変だし，見にくい．そんなときは，画像の挿入コマンドを独自に作成してしまえば良い．例えば，

```TeX
\newcommand{\figimage}[6]{\begin{figure}[phtb]\centering\includegraphics[width=#4 cm, bb=0 0 #5 #6]{#1}\caption{#2}\label{#3}\end{figure}}
```

のようなコマンドを作成しておけば，

```TeX
\figimage{path}{caption}{label}{width}{image_size_w}{image_size_h}
```

で簡単に画像を挿入できるようになる．さて，先ほど \newcommand は引数を２つ取ると述べたが，実は３つ取ることができる．

```TeX
\newcommand{name}[number_of_hikisuu]{content}
```

のように取ることができる．ここで，number_of_hikisuu とは自作コマンドが取ることができる引数の数である．これによって，引数を伴う自作コマンドを作成することができる．content において，引数を入れたいところを #1, #2 のように書けば，その順に引数を入れるようなコマンドを作成できる．

　例えば，コンビネーションの記号 C に引数２つを取りたい場合，次のようにすれば良い．

```TeX
\newcommand{\comb}[2]{\mathop{\mathrm{{}_{#1}C_{#2}}}\nolimits}
```

また，2次元ベクトルをよく使うような場合，

```TeX
\newcommand{\vectortwo}[2]{\mathop{\left(\begin{array}{c}#1\\#2\end{array}\right)}\nolimits}
```

のように定義しておけば，\vectortwo コマンドで簡単に2次元ベクトルを入れられる．


# 自作環境の定義
TeX において，「環境」とは，

```TeX
\begin{environment}

\end{environment}
```

で挟まれている部分のことである．例えば，本文の範囲を規定する document 環境，行列を挿入するための array 環境，数式を挿入するための align, eqnarray, gather 環境等をよく使っているのではないだろうか．

　環境も独自に作成することが可能であり，\newenvironment コマンドを用いる．例えば，証明を書きたいときに，最初に「証明」，最後に「Q.E.D.」と自動で挿入してくれるような proof 環境は次のように作成すれば良い．

```TeX
\newenvironment{proof}{{\bf 証明}}{\begin{flushright}Q.E.D.\end{flushright}}
```

このように，\newenvironment は引数を３つ持ち，形式的には次のように書ける．

```TeX
\newenvironment{name}{begin_content}{end_content}
```

ここで，name は環境の名前であり，begin_content, end_content は環境の最初と最後にそれぞれ挿入したいものを書けば良い．


# セクションスタイルの改変
\section, \subsection 等のスタイルを変えたいと思ったことはあるだろうか．もしない人でも，自分の section スタイルを定義できるとステータスが高そうである．

## セクション名の変更
\section で呼び出したときに「章」，\subsection を呼び出したときに「節」といったように割り振られるのを独自に変更したい場合，次のようにすれば良い．

```TeX
\renewcommand{\thesection}{\arabic{section}部}
\renewcommand{\thesubsection}{\arabic{section}.\arabic{subsection}項}
```

こうすると，\section コマンドで「1部」，\subsection コマンドで「1.1項」のように表示される．

さて，コマンドの説明をしていこう．\renewcommand は既に定義されているコマンドの中身を変更するためのコマンドである．先ほどまで，\newcommand を解説してきたが，既に定義されているコマンド名を \newcommand で作成しようとするとエラーが出てしまう．例えば，ベクトル解析の記号 div を

```TeX
\newcommand{\div}{\mathop{\mathrm{div}}\nolimits}
```

と定義しようとすると，エラーが出てしまう．これは，\div というコマンドが既に割り算の記号 $\div$ に割り当てられているからである．割り算の記号 $\div$ は使わないから上書きしてしまいたいというような場合は，

```TeX
\renewcommand{\div}{\mathop{\mathrm{div}}\nolimits}
```

と書けば良い．

次に，\thesection というコマンドは，\section コマンドの時に呼び出され，\section の引数より前に書く内容を決めているコマンドである．ここを変更すれば，自由なセクション名を定義できる．

\thesection の次のパートが具体的なセクション名を決めている．\arabic{section} というのは，アラビア数字でセクション番号を入れるという意味である．TeX では，アラビア数字以外にも次のようにセクション番号をカウントできる．

|コマンド名|内容|
|---|---|
|\arabic|アラビア数字（1,2,3,...）|
|\roman|小文字ローマ数字（i,ii,iii,...）|
|\Roman|大文字ローマ数字（I,II,III,...）|
|\alph|小文字アルファベット（a,b,c,...）|
|\Alph|大文字アルファベット（A,B,C,...）|


## セクションの前後の変更
例えば，「第1章」のようにセクションの前後に言葉を入れたいような場合は，次のようにすれば良い．

```TeX
\renewcommand{\presectionname}{第}
\renewcommand{\postsectionname}{章}
```

このように，セクション名の前後に入れる内容は \presectionname, \postsectionname で変更することができる．サブセクション名以降も変更することができ，「[jsreportのchapter名を変更する
](https://qiita.com/ryunryunryun/items/46b01f847d7b28b1d41b)」という記事で以前知り合いが書いている．これは，jsreport,jsarticle で有効であるが，jarticle では機能しないことに注意したい．


## セクションのフォント
パッケージ titlesec を用いれば，セクションのフォントや大きさを変更できる．パッケージ titlesec に備わっているコマンド \titleformat を用いれば良い．例えば，

```TeX
\usepackage{titlesec}
\titleformat*{\section}{\LARGE\bfseries}
\titleformat*{\subsection}{\Large\bfseries}
\titleformat*{\subsubsection}{\large\bfseries}
```

とすれば良い．\titleformat の第2引数は，文字の大きさとフォントを指定できる．TeX では，次のフォントサイズをコマンドで呼び出すことができる．

|コマンド名|フォントサイズ|
|---|---|
|\tiny|5pt|
|\scriptsize|7pt|
|\footnotesize|8pt|
|\small|9pt|
|\normalsize|10pt|
|\large|12pt|
|\Large|14.4pt|
|\LARGE|17.28pt|
|\huge|20.74pt|
|\Huge|24.88pt|


## セクション後の深さ
セクション名やその前後に入れる内容だけでなく，セクション後の行間等の深さも全て変更したい場合は，\renewcommand してしまえば良い．元の設定は，jsarticle.cls ファイルを見れば良い．ターミナル上で，

```bash
find /usr -name jsarticle.cls
```

と打てば，jsarticle を規定している cls ファイルがどこにあるかわかる．あとは，ターミナル上で cat コマンドを用いればファイルの中身を見ることができる．その中で \newcommand{\section} と定義しているところをコピーしてきて，変えたいところだけ \renewcommand してやれば良い．

例えば，TexLive2018 の jsarticle.cls では，\section コマンドは次のように規定している．

```TeX
\newcommand{\section}{%
    \if@slide\clearpage\fi
    \@startsection{section}{1}{\z@}%
    {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ
    {.5\Cvs \@plus.3\Cdp}% 後アキ
    {\normalfont\large\headfont\raggedright}}
```

4行目でセクションの前の行間の入れる量，5行目でセクションの後の行間の入れる量，6行目でセクションの大きさ，フォントを規定している．\Cvs, \Cdp は深さの量を規定しており，その前の .5, .3 は 0.5\Cvs, 0.3\Cdp の量だけ間を開けるということである．この量を増やせば，セクション後の行間を広げることができる．


# タイトルページスタイルの改変
タイトルページスタイルに関しても， jsarticle.cls の \newcommand{\titlepage} を見て renewcommand すれば良い．例えば，TexLive2018 では， 

```TeX
\newcommand{\maketitle}{%
    \begin{titlepage}%
      \let\footnotesize\small
      \let\footnoterule\relax
      \let\footnote\thanks
      \null\vfil
      \if@slide
        {\footnotesize \@date}%
        \begin{center}
          \mbox{} \\[1zw]
          \large
          {\maybeblue\hrule height0\jsc@mpt depth2\jsc@mpt\relax}\par
          \jsc@smallskip
          \@title
          \jsc@smallskip
          {\maybeblue\hrule height0\jsc@mpt depth2\jsc@mpt\relax}\par
          \vfill
          {\small \@author}%
        \end{center}
      \else
      \vskip 60\jsc@mpt %60\jsc@mpt % 開け幅を規定
      \begin{center}%
        {\LARGE \@title \par} % title の大きさを規定
        \vskip 10em%3em % 開け幅を規定
        {\large % author の大きさを規定
          \lineskip .75em
          \begin{tabular}[t]{c}%
            \@author % author を挿入
          \end{tabular}\par}%
        \vskip 1.5em % 開け幅を規定
        {\large \@date \par} % date の大きさ規定
      \end{center}%
      \fi
      \par
      \@thanks\vfil\null
    \end{titlepage}%
    \setcounter{footnote}{0}%
    \global\let\thanks\relax
    \global\let\maketitle\relax
    \global\let\@thanks\@empty
    \global\let\@author\@empty
    \global\let\@date\@empty
    \global\let\@title\@empty
    \global\let\title\relax
    \global\let\author\relax
    \global\let\date\relax
    \global\let\and\relax
  }%
```

のようになっている．ここで，% でコメントアウトした箇所で役割を書いておいた．開け幅を規定しているところを大きくすれば，title と author の間を広げたりできる．また，大きさを規定している \large 等を変更すれば，title, author 等のサイズを変更できる．