LaTeX
Python等のプログラミング言語では例えばp=p+1
をするとそのときの値によらず+1
してくれる、つまり「再起的定義」をしてくれるという便利な機能があります。LaTeX にもカウンタを1増やす機能はあります。
しかし LaTeX の制御綴全体について考えると例えば\frac
を「もとの分数の横線を広くしたものにしたい!」となっても\frac
を定義するには\frac
そのものが必要になってしまいます。つまり再帰的定義が必要になります。
すると例えば
\renewcommand{\frac}[2]{\frac{\, #1\,}{\, #2 \,}}
とか
\def\frac#1#2{\frac{\, #1\,}{\, #2 \,}}
のようにしようということが考えつきますがこのままでは LaTeX (または TeX)が処理できないらしく、エラーを起こしてしまいます。このような再起的定義を実現するには\let
という制御綴を用います。
\let
とは
\let
とはLaTeXにおいてコマンドの単純な置き換えを行う命令のことです。コピペと考えることもできます。以下の構文で使います。=
はなくてもいいようです。
\let(コピー先のコマンド)=(コピー元のコマンド)
似たものに\def
がありますがこちらと異なり、本当にそのままの置き換えのみが可能になります。例えば\frac
という命令を\orifrac
という命令にコピーしたい場合は
\let\orifrac=\frac
となります。以降\orifrac
は\frac
の意味として使えるようになります。
これのすごいところはコピペ先のコマンドはコピペ元のコマンド定義を変えても変化しないことです。つまり、
\let\orifrac=\frac
\def\frac{あああああ}
として、\def
によってfrac
の定義を改変しても例えば\orifrac{1}{2}
とすれば$\frac{1}{2}$が出力されます。
あるいは\orifrac
(元の分数コマンド)を利用して新しい分数を定義する、いわばp=p+1
のような使い方も可能です。デフォルトのLaTeXの分数は少し線が短いので
\let\orifrac=\frac
\def\frac#1#2{\orifrac{\,#1\,}{\,#2\,}}
のようにすれば\frac{1}{2}
として $\frac{\ 1\ }{\ 2\ }$ が出力されます。
大型演算子について
ここからは大型演算子について述べます。LaTeXでは、例えば
\(\displaystyle\sum_{n=0}^{\infty } a_n\)
\(\sum_{n=0}^{\infty } a_n\)
の出力はそれぞれ
です。自分にとっては文中数式であろうとシグマの上下に数字が来てほしいと思うところです。しかし\displaystyle
にすると、今度はシグマが少し大きいような気がします。LaTeXにはそのための\limits
という便利な命令があります。
\(\sum\limits_{n=0}^{\infty } a_n\)
こうするとシグマがいい感じの大きさになってくれます。
一方インテグラルは
\(\displaystyle \int_{0}^{1} x \,dx \)
\(\int_{0}^{1} x \,dx \)
\(\int\limits_{0}^{1} x\, dx\)
の出力はそれぞれ
のようになります。\limits
は添え字を上下にする命令なので今回は使えません。となると文中の積分記号は\displaystyle
にするのが妥当なようです。
\let
による大型演算子の再帰的定義
とはいえいちいち\limits
とか\displaystyle
とか付けるのは面倒です。先ほど使った\let
を大型演算子に応用してみましょう。プレアンブルで
\let\sumdefcopied=\sum
\def\sum{\sumdefcopied\limits}
として本文で
\(\sum\limits_{n=0}^{\infty } a_n\)
とすれば常に\limits
をかけた状態でsum
が出力されるようになります。逆に一時的に横に添え字をつけたい場合はこのまま本文で
\(\sum\nolimits_{n=0}^{\infty } a_n\)
とすれば横につくようになります。そのため元の定義と互換性があります。
自分は以下のように\let
を使っています。ちなみに元の命令をコピーしたものは(元の制御綴)defcopied
としました。適当につけました。英文法的に(多分)破綻しています。そのためさすがに既存の命令とかぶることはないと思います。
\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
も使いました。
以上\let
を使うと TeX 文書内の内容を変えることなく数式の表記を変えられるよ! という内容でした。
注意
この記事のソースコードでは\sum
等の数式記号を出力するコマンドを再定義しました。本来の意味とは違うコマンドとして出力されるようになるということは忘れないようにしておくべきだと思います。
参考文献