\frac自体の定義を変える方法



# LaTeX

Python等のプログラミング言語では例えば`p=p+1`をするとそのときの値によらず`+1`してくれる、つまり「再起的定義」をしてくれるという便利な機能があります。LaTeX にもカウンタを1増やす機能はあります。

しかし LaTeX の制御綴全体について考えると例えば`\frac`を「もとの分数の横線を広くしたものにしたい！」となっても`\frac`を定義するには`\frac`そのものが必要になってしまいます。つまり再帰的定義が必要になります。

すると例えば
```latex
\renewcommand{\frac}[2]{\frac{\, #1\,}{\, #2 \,}}
```
とか
```tex
\def\frac#1#2{\frac{\, #1\,}{\, #2 \,}}
```
のようにしようということが考えつきますがこのままでは LaTeX （または TeX）が処理できないらしく、エラーを起こしてしまいます。このような再起的定義を実現するには`\let`という制御綴を用います。

# `\let`とは

`\let`とはLaTeXにおいてコマンドの単純な置き換えを行う命令のことです。コピペと考えることもできます。以下の構文で使います。`=`はなくてもいいようです。

```latex
\let(コピー先のコマンド)=(コピー元のコマンド)
```

似たものに`\def`がありますがこちらと異なり、本当にそのままの置き換えのみが可能になります。例えば`\frac`という命令を`\orifrac`という命令にコピーしたい場合は

```latex
\let\orifrac=\frac
```

となります。以降`\orifrac`は`\frac`の意味として使えるようになります。

これのすごいところはコピペ先のコマンドはコピペ元のコマンド定義を変えても変化しないことです。つまり、

```latex
\let\orifrac=\frac
\def\frac{あああああ}
```

として、`\def`によって`frac`の定義を改変しても例えば`\orifrac{1}{2}`とすれば$\frac{1}{2}$が出力されます。

あるいは`\orifrac`（元の分数コマンド）を利用して新しい分数を定義する、いわば`p=p+1`のような使い方も可能です。デフォルトのLaTeXの分数は少し線が短いので

```latex
\let\orifrac=\frac
\def\frac#1#2{\orifrac{\,#1\,}{\,#2\,}}
```

のようにすれば`\frac{1}{2}`として $\frac{\ 1\ }{\ 2\ }$ が出力されます。

# 大型演算子について

ここからは大型演算子について述べます。LaTeXでは、例えば

```latex
\(\displaystyle\sum_{n=0}^{\infty } a_n\)
```

```latex
\(\sum_{n=0}^{\infty } a_n\)
```

の出力はそれぞれ
![oogataimg-nt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/20e882dd-216b-e0ff-c75a-7ceafff52309.png)
![oogataimg-nt-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/f2e54c3c-c3ea-ea49-441b-414c67b14289.png)
です。自分にとっては文中数式であろうとシグマの上下に数字が来てほしいと思うところです。しかし`\displaystyle`にすると、今度はシグマが少し大きいような気がします。LaTeXにはそのための`\limits`という便利な命令があります。

```latex 
\(\sum\limits_{n=0}^{\infty } a_n\)
```

![oogataimg-nt-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/88c88364-8624-6deb-7dc5-870864de2d84.png)

こうするとシグマがいい感じの大きさになってくれます。

一方インテグラルは
```latex
\(\displaystyle \int_{0}^{1} x \,dx \)
```

```latex
\(\int_{0}^{1} x \,dx \)
```

```latex
\(\int\limits_{0}^{1} x\, dx\)
```

の出力はそれぞれ

![oogataimg-nt-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/230aa250-890c-e1ad-4c60-6f6113cef4bc.png)
![oogataimg-nt-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/711795c5-12ed-b588-d209-3d724fc3486d.png)
![oogataimg-nt-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/006218ad-ff4b-a285-9930-6e915069a83a.png)
のようになります。`\limits`は添え字を上下にする命令なので今回は使えません。となると文中の積分記号は`\displaystyle`にするのが妥当なようです。


<!-- \int を常に\displaystyleにする；大型演算子（forallも？）の再帰的定義（let）によりCSSみたいにstyを使う、frac自体の定義を変えてphysic内部にも適用させる -->


# `\let`による大型演算子の再帰的定義

とはいえいちいち`\limits`とか`\displaystyle`とか付けるのは面倒です。先ほど使った`\let`を大型演算子に応用してみましょう。プレアンブルで

```latex
\let\sumdefcopied=\sum
\def\sum{\sumdefcopied\limits}
```

として本文で

```latex 
\(\sum\limits_{n=0}^{\infty } a_n\)
```

とすれば常に`\limits`をかけた状態で`sum`が出力されるようになります。逆に一時的に横に添え字をつけたい場合はこのまま本文で

```latex 
\(\sum\nolimits_{n=0}^{\infty } a_n\)
```

とすれば横につくようになります。そのため元の定義と互換性があります。

自分は以下のように`\let`を使っています。ちなみに元の命令をコピーしたものは`(元の制御綴)defcopied`としました。適当につけました。英文法的に（多分）破綻しています。そのためさすがに既存の命令とかぶることはないと思います。

```tex
\usepackage{amsmath}
\usepackage{graphicx}%\neqで\reflectbox使うため
%定義のコピー
\let\sumdefcopied\sum
\let\proddefcopied\prod
\let\limdefcopied\lim
\let\supdefcopied\sup
\let\infdefcopied\inf
\let\intdefcopied\int
\let\limsupdefcopied\limsup
\let\liminfdefcopied\liminf
\let\varlimsupdefcopied\varlimsup
\let\varliminfdefcopied\varliminf
\let\maxdefcopied\max
\let\mindefcopied\min
\let\varinjlimdefcopied\varinjlim
\let\geqdefcopied\geq
\let\leqdefcopied\leq
\let\neqdefcopied\neq
%再定義
\def\sum{\sumdefcopied\limits}
\def\prod{\proddefcopied\limits}
\def\lim{\limdefcopied\limits}
\def\sup{\supdefcopied\limits}
\def\inf{\infdefcopied\limits}
\def\limsup{\limsupdefcopied\limits}
\def\liminf{\liminfdefcopied\limits}
\def\varlimsup{\varlimsupdefcopied\limits}
\def\varliminf{\varliminfdefcopied\limits}
\def\int{\displaystyle\intdefcopied}
\def\max{\maxdefcopied\limits}
\def\min{\mindefcopied\limits}
\def\varinjlim{\varinjlimdefcopied\limits}
\def\geq{\geqq}
\def\leq{\leqq}
\def\neq{\mathchoice{\displaystyle\mathrel{\reflectbox{\text{\(\neqdefcopied\)}}}}{\textstyle\mathrel{\reflectbox{\text{\(\neqdefcopied\)}}}}{\scriptsize\mathrel{\reflectbox{\text{\(\neqdefcopied\)}}}}{\tiny\mathrel{\reflectbox{\text{\(\neqdefcopied\)}}}}}
```

タイトルの大型演算子だけでなく結構いろんなものを定義し直しました。不等号周りは自分の中でも作る文書によって使い分ける必要があると思うので一概に置き換えるべきだとは思いません（例えば数学の論文を書くのだったら元の`\geq`の方がいいと思います）。

なおバックスラッシュになっている`\neq`はなかったのでテキスト扱いした上で`\reflectbox`に入れたものを`mathrel`として無理やり演算子扱いするという荒仕事をしています。下のような数式のために大きさを変える必要があると気づいたので`\mathchoice`も使いました。
![oogataimg-nt-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/3c62a4c8-d6f8-97a7-e6d8-26e8308c1ceb.png)

以上`\let`を使うと TeX 文書内の内容を変えることなく数式の表記を変えられるよ！ という内容でした。

# 注意

この記事のソースコードでは`\sum`等の数式記号を出力するコマンドを再定義しました。本来の意味とは違うコマンドとして出力されるようになるということは忘れないようにしておくべきだと思います。


# 参考文献

https://qiita.com/takahashim/items/899fb1d40f3f5032c08a