TeXのカスタマイズをnewcommandでのりきる方法

*$\TeX$のマクロが難しい。*
*@とかあるけどよくわからない。簡潔に済ましたい。*


そんな絶望と希望から模索して編み出した方法です。

#はじめに

$\TeX$の最も簡単なマクロはおそらく、`\newcommand`を使う方法ではないでしょうか。なので、一度は使ったことのある人(内容がわからなくても、コピペで使用した人)はかなりいるかと思います。もちろん派生した`\renewcommand`も含めてです。

`\newcommand`は自分で新たに$\TeX$のコマンドを定義することができるコマンドです。非常に単純なコマンドであるため、使用に対する壁は低いと思います。[この](https://qiita.com/zr_tex8r/items/5067307890d36c0e4882 "完全攻略！ LaTeX のマクロ定義")記事や、[この](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2FLaTeX%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE%E4%BD%9C%E6%88%90 "TeX Wiki/LaTeXマクロの作成")記事を見ることで、`\newcommand`について詳しく記述されています。

この`\newcommand`をプログラムの関数の様に使うのが今回の趣旨です。プログラムの関数はユーザーにより呼び出されれば、その内容が実行され、プログラムの結果に反映されます。`\newcommand`をこの関数のように呼び出し、$\TeX$の環境そのものに影響を与えようというものです。

#`\newcommand`

##まずは...

少しだけ`\newcommand`についておさらいです[^1]。使い方は以下の通りが基本です。

```LaTeX
\newcommand{New Command Name}[Number of Arguments]{Definition}
```

*New Command Name*のところに新しいコマンドの名前を入れ、何個引数をとるのかを*Number of Arguments*の部分に書き込み、最後にコマンドが実行された時にどんな挙動をするのかを*Definition*に書きます。

例えば、以下のように定義したとします[^2]。定義場所は、`\begin{document}`前[^3]にしましょう。

```LaTeX:Letter.tex
\newcommand{\Letter}[2]{#1さんから#2さんへお手紙が届きました。}
```

引数は#*番号*で*Definition*のなかで扱います。
そして、以下のように使います[^4]。

```LaTeX:Letter.tex
\Letter{Alice}{Bob}
```

すると、以下のように出力されます[^5]。
![Letter_Alice_Bob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65456/1399e45c-50e8-bd45-48ec-abceeb761c13.png)

これで`\newcommand`については完璧です。と、言いたいところですが後一つ知っておくと便利でしょう。上の例で、手紙がいつ届いたのかを記録したいとします。そんな時は、

```LaTeX:Letter_v2.tex
\newcommand{\Letter}[3][\today]{#1 #2さんから#3さんへお手紙が届きました。}
```

としましょう。2つ目のオプション部分に`\today`コマンドが入っています[^6]。これは1番目の引数のデフォルト値となり、`\Letter`コマンドが実行された時は、`#1`の部分に`\today`の結果が帰ってきます。

以下2つのコマンドを実行して見ます。

```LaTeX:Letter_v2.tex
\Letter[April 11, 2019]{Mallory}{Bob}

\Letter{Alice}{Bob}
```

デフォルト引数への値の渡し方はコマンドのオプションの様にします。
この結果は、以下の様になります[^7]。
![Letter_April_11,.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65456/9bf45690-8d00-58b7-09d0-d201ccd830e7.png)


##さっそく実践

この`\newcommand`をどの様にすれば、$\TeX$をカスタマイズできるのか。
答えは単純です。この`\newcommand`内で色々な処理をしてしまえばいいのです。

例えば、タイトルについて考えて見ましょう。デフォルトの場合は、

```LaTeX:maketitle.tex
\documentclass{article}

\title{Secret Protocol}
\author{Alice and Bob}
\date{\today}

\begin{document}
\maketitle
\end{document}
```
とすれば、
![maketitle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65456/7166488a-ad8b-aff8-ee47-d6ec6254fdaa.png)
の様に表示してくれます。これをもう少し違った形にしたいと思います。

タイトルの表示は太字でもう少し大きく表示させ、著者については右寄せで表示しましょう。日付は著者の前につける様にします。この場合、

```LaTeX:MyTitle.tex
\documentclass{article}
\newcommand{\mytitle}[2]
{%
\begin{center}
{\LARGE\bf#1}
\end{center}
\begin{flushright}
\today\ \ #2
\end{flushright}
}%
\begin{document}
\mytitle{Secret Protocol}{Alice and Bob}
\end{document}
```
とすれば、
![mytitle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65456/0be82598-4748-f7b5-c1a3-4c7c732a5285.png)
となります。この操作は`\renewcommand`やより複雑なマクロにより簡潔に行うことができるのでしょうが、上に示した例の場合、自分が理解できる範囲で$\TeX$で用意された形式を変更することができます。

さらに、chapterやsectionといった用意されたコマンドではなく、Markdownの様にわかりやすい見出しをつけたい場合も有効です。例えば、

```LaTeX:MyHeading.tex
\documentclass{article}
\newcommand{\HeadingOne}[1]
{
\noindent
\rule[-0.7zw]{1zw}{2.3zw}
{\Large \bf #1}

\vspace{-1zw}\rule[0.03zw]{\linewidth}{0.1zw}

}
\begin{document}
\HeadingOne{Interference by Mallory}
Bob has received an e-mail from Mallory. The e-mail is dangerous. Therefore, Alice has warned to him today.
\end{document}
```
とすれば[^8][^9]、
![Myheading.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65456/d7e2c7e4-2e96-d77f-2730-079e676f2c7d.png)
と表すことができます。

#最後に

`\newcommand`内のスペースや、改行は有効であることから、この様なことが実現できるのです[^10]。この様なオリジナルの`\newcommand`をスタイルファイルに保存して、`\usepackage`で呼び出せば[^11]１回限りの使用ではなく、何回でも使い続けることができます[^12]。

どうでしょうか[^13]？




[^1]: 少しだけと言いながらほぼ全てを説明。知ってるよって人は次の章へ。
[^2]: このコマンドは、おそらく事務で郵便を管理している人には便利かもしれませんね!!
[^3]: `\begin{document}`より前をプリアンブル(preamble)と呼んでいる。
[^4]: 当たり前ですが、`\begin{document}`より後で使うことを想定しています。
[^5]: LaTeXITで表示するのが便利ですね。簡単にプリアンブルを編集でき、画像の出力をしてくれるので、こんな表現あったっけと思ったときや、テストしてみようと思ったときは使ってみるといいです。「標準で日本語でないよ！」という方は、環境設定→プログラムで、latex+dvipdf出力にし、LaTeXをplatexへ、dvipdfをdvipdfmxに変更すると良いでしょう。さらにプリアンブルにデフォルトで入っているinputenc packageはコメントアウトするか、消し去ってしまえばOkです。
[^6]: タイプセットした日の日付を出力してくれる。
[^7]: 「え？Bob危ない奴から手紙もらってるな！」と思った方は、その道の方なんですね。「何言ってるの？」という人は[コチラ](https://ja.wikipedia.org/w/index.php?title=%E3%82%A2%E3%83%AA%E3%82%B9%E3%81%A8%E3%83%9C%E3%83%96&oldid=63603666 "アリスとボブ")
[^8]: `\rule`ってなんぞ、と思った方へ。このコマンドは`\rule[Height to Insert]{Height}{Width}`とすることで、好きな高さ(*Height to Insert*)に好きな太さ(*Height*)で好きな長さ(*Width*)の線を引けます。ちなみに`zw`という単位は、和文１文字文の幅です(`zh`は高さ)。そして、`\linewidth`は文字がかける領域の横幅の長さを表します(よく図の貼り付けで、横いっぱいに図を表示したいときに使う)。
[^9]: `\vspace`ってなんぞ、と思った方へ。高さを調節するコマンドであり、`\vspace{Height}`で*Height*分だけ縦方向にスペースを下に空けます。「あれ、例ではマイナスついてるけど。。。？」と思った方、マイナスをつけるということは"マイナス分下に空ける" = "その分上に戻す"ということになります。
[^10]: とは言え、この方法が推奨されているかどうかは知りませんし、コンパイル時間がこれにより長くなって文句を言われても知りません。
[^11]: 「え？どうやるの」って方へ。例えば、上の例で出した`MyHeading.tex`のプリアンブルに記述された`\newcommand`の内容を`MyHeading.sty`とか適当に名前つけたファイルに保存します。このファイルを$\TeX$ファイルで`\usepackage{MyHeading}`で呼び出せば、`\HeadingOne{}`は有効になります。注意としては、`\usepackage`が探せる範囲が限られていることです。一般的なスタイルファイルと同じところ(環境によってどこにあるか違うから自分で探してください→[参考](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E5%90%84%E7%A8%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%88%A9%E7%94%A8 "TeX Wiki/各種パッケージの利用"))か、コンパイルしたい$\TeX$ファイルと同じところにおけば大丈夫です。
[^12]: なんか、CSSみたい。
[^13]: この記事に書かれている内容を"カスタマイズ"と呼ぶかどうかは議論中です。