0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-09-09

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\)

の出力はそれぞれ
oogataimg-nt.png
oogataimg-nt-2.png
です。自分にとっては文中数式であろうとシグマの上下に数字が来てほしいと思うところです。しかし\displaystyleにすると、今度はシグマが少し大きいような気がします。LaTeXにはそのための\limitsという便利な命令があります。

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

oogataimg-nt-3.png

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

一方インテグラルは

\(\displaystyle \int_{0}^{1} x \,dx \)
\(\int_{0}^{1} x \,dx \)
\(\int\limits_{0}^{1} x\, dx\)

の出力はそれぞれ

oogataimg-nt-4.png
oogataimg-nt-5.png
oogataimg-nt-6.png
のようになります。\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も使いました。
oogataimg-nt-7.png

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

注意

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

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?