Maximaの数式をそのままTeX形式の数式に出力する

Emacsユーザーとしては、imaximaを使ってTeXフォントで出力されるmaximaを使うのは常識だよね。もう設定の手順忘れたけど。これだからブログにメモっておけという話だよ。

先輩がガウス関数微分の二乗の積分の値を計算していたので、便乗。
暇人に思われそうだ。断じて違う。
いや、日本に居たときよりは暇だな。

(%i1) 1/(sqrt(2*%pi*sigma^2))*exp(-(x-mu)^2/(2*sigma^2));

驚くなかれ、これで以下のように表示されるのだ。
(%o1) \frac{e^ {- \frac{\left(x-\mu\right)^2}{\sigma^2} }}{\sqrt{2}\sqrt{\pi}\,\left| \sigma\right| }
まぁ理想的には
\frac{1}{\sqrt{2\pi}\sigma}\exp\{ - \frac{\left(x-\mu\right)^2}{\sigma^2} \}
こんな感じになって欲しいのだが、それはなかなか難しいだろう。
むしろ、muとかsigmaとか入力するだけで、ちゃんと自動的にギリシア文字に変換されたことに感動したくらいだ。


↑のソースをどうやって出力したか。
昔の俺ならいちいち手打ちしていただろう。なんという面倒くささ。
しかし

(%i2) tex(%o1);

こう入力するだけで

$$\ifrac{e^ {- \ifrac{\left(x-\mu\right)^2}{2\,\sigma^2} }}{\isqrt{2} \,\isqrt{\pi}\,\left| \sigma\right| }$$
(%o2) false

と返ってくる。
もちろんまだ修正を加えないと使い物にならないこともあるが、それでもこれは便利過ぎる。


さらに、Emacsでimaximaを使っていた場合、嬉しい特典がある。

M-x imaxima-latex

と入力すると、今までのインプットとアウトプットの結果全てが、TeXソースになって返ってくる。
例えば、先輩の考えていた計算を解く過程はこうなるだろう。

(%i1) 1/(sqrt(2*%pi*sigma^2))*exp(-(x-mu)^2/(2*sigma^2));

(\%o1) \ifrac{e^ {- \ifrac{\left(x-\mu\right)^2}{2\,\sigma^2} }}{\isqrt{2}\,\isqrt{\pi}\,\left| \sigma\right| }
(%i2) diff(%o1,x);

(\%o2) -\ifrac{\left(x-\mu\right)\,e^ {- \ifrac{\left(x-\mu\right)^2}{2\,\sigma^2} }}{\isqrt{2}\,\isqrt{\pi}\,\sigma^2\,\left| \sigma\right| }
(%i3) (%o2)^2;

(\%o3) \ifrac{\left(x-\mu\right)^2\,e^ {- \ifrac{\left(x-\mu\right)^2}{\sigma^2} }}{2\,\pi\,\sigma^6}
(%i4) integrate(%o3,x,minf,inf);

(*) \verb|Is  |\linebreak[0]\sigma\linebreak[0]\verb|  positive or negative?|
positive;
(\%o4) \ifracd{1}{4\,\isqrt{\pi}\,\sigma^3}
(%i5) 

これを、先ほどのimaxima-latexを使ってTeXソースに変換するとこうなる。

\documentclass[leqno]{article}
\usepackage{verbatim}
\usepackage[cmbase]{flexisym}
\usepackage{breqn}
\setkeys{breqn}{compact}

\setlength{\textwidth}{180mm}
\setlength{\oddsidemargin}{15mm}
\addtolength{\oddsidemargin}{-1in}
\setlength{\evensidemargin}{15mm}
\addtolength{\evensidemargin}{-1in}

\newcommand{\ifrac}[2]{\frac{#1}{#2}}
\newcommand{\ifracd}[2]{\frac{#1}{#2}}
\newcommand{\ifracn}[2]{\frac{#1}{#2}}
\newcommand{\isubscript}[2]{{#1}_{#2}}
\newcommand{\iexpt}[2]{{#1}^{#2}}
\newcommand{\isqrt}[1]{\sqrt{#1}}
\begin{document}
\begin{verbatim}Maxima 5.19.2 http://maxima.sourceforge.net
Using Lisp CLISP 2.44.1 (2008-02-23)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1) 1/(sqrt(2*%pi*sigma^2))*exp(-(x-mu)^2/(2*sigma^2));

\end{verbatim}

\begin{dmath}[number={\%o1}]
 \ifrac{e^ {- \ifrac{\left(x-\mu\right)^2}{2\,\sigma^2} }}{\isqrt{2}\,\isqrt{\pi}\,\left| \sigma\right| }\end{dmath}

\begin{verbatim}
(%i2) diff(%o1,x);

\end{verbatim}

\begin{dmath}[number={\%o2}]
 -\ifrac{\left(x-\mu\right)\,e^ {- \ifrac{\left(x-\mu\right)^2}{2\,\sigma^2} }}{\isqrt{2}\,\isqrt{\pi}\,\sigma^2\,\left| \sigma\right| }\end{dmath}

\begin{verbatim}
(%i3) (%o2)^2;

\end{verbatim}

\begin{dmath}[number={\%o3}]
 \ifrac{\left(x-\mu\right)^2\,e^ {- \ifrac{\left(x-\mu\right)^2}{\sigma^2} }}{2\,\pi\,\sigma^6}\end{dmath}

\begin{verbatim}
(%i4) integrate(%o3,x,minf,inf);

\end{verbatim}

\begin{dmath}[number={*}]
 \verb|Is  |\linebreak[0]\sigma\linebreak[0]\verb|  positive or negative?|\end{dmath}

\begin{verbatim}
positive;
\end{verbatim}

\begin{dmath}[number={\%o4}]
 \ifracd{1}{4\,\isqrt{\pi}\,\sigma^3}\end{dmath}

\begin{verbatim}
(%i5) \end{verbatim}


\end{document}

これはそのままコンパイルできてしまうではないか。優秀にも程がある。鼻血吹きそうになった。