Migrating from EmacsWiki to EmacsMuse on my MacBook Pro(2)

先日までのエントリで、EmacsMuseLaTeXのインストールを紹介しました。最後に、Carbon Emacsの環境を整えましょう。以下が.emacsに追加した設定です。

;; Additional exec-path variable and PATH environment variable
;;   call-process and shell-command-to-string functions require
;;   exec-path variable and PATH environment variable to be
;;   respectively configured properly

(let ((path (split-string (getenv "PATH") ":")))
  (add-to-list 'path "/usr/local/teTeX/bin")
  (setenv "PATH"
	  (mapconcat (lambda (dir)
		       (expand-file-name dir))
		     path ":")))

(setq exec-path (split-string (getenv "PATH") ":"))

                                :

;; muse-latex2png

(require 'muse-latex2png)

(setq muse-latex2png-scale-factor 1.25)

(setq muse-latex2png-img-dest "./latex")


大きく分けると、以下の設定をしています。

  • LaTeX関連のコマンドへのパスを設定
  • muse-latex2pngの読み込みおよび設定


さて、順を追って見ていきましょう。

;; Additional exec-path variable and PATH environment variable
;;   call-process and shell-command-to-string functions require
;;   exec-path variable and PATH environment variable to be
;;   respectively configured properly

(let ((path (split-string (getenv "PATH") ":")))
  (add-to-list 'path "/usr/local/teTeX/bin")
  (setenv "PATH"
	  (mapconcat (lambda (dir)
		       (expand-file-name dir))
		     path ":")))

(setq exec-path (split-string (getenv "PATH") ":"))

Carbon Emacsのみならず、バンドルされているアプリケーションに関して一般的に言えることだと思いますが、DockやFinderから直接起動したアプリケーションは、ユーザーが設定したランコマンドを参照しません。ユーザーのログインシェルの子プロセスとしては起動していない、ということです*1。そのため、Carbon Emacs側で補っています。

私の環境では、TeX関連のコマンド群を/usr/local/teTeX/bin以下に格納していますので、まずそのディレクトリへのパスを通します。さらに、そのパス群をリストとしてexec-pathに設定します。

muse-latex2png.elでは、latexとdvipngコマンドの起動にそれぞれ、call-processとshell-command-to-string関数を使っています。call-processはコマンドの検索パスにexec-path変数を用い、shell-command-to-string関数は検索パスにPATH環境変数を用いているため、双方に設定する必要があります。


次に、muse-latex2pngの設定を行います。

;; muse-latex2png

(require 'muse-latex2png)

(setq muse-latex2png-scale-factor 1.25)

(setq muse-latex2png-img-dest "./latex")

まず、muse-latex2pngを読み込みます。muse-latex2png-scale-factorのデフォルト値は2.5ですが、私の感覚では出力が大きすぎたので、適当に1.25を入れてやりました。

muse-latex2png-img-destには、muse-project-alistに指定したプロジェクトの発行ディレクトリからの相対パスを指定します。デフォルト値も同じく、"./latex"です。例えば、私の設定している"Wiki"プロジェクトの発行するディレクトリは~/Sites/wikiですので、muse-latex2pngは~/Sites/wiki/latex以下にpngフォーマットの画像を格納します。


さて、これで設定は終了です。実際にlatexタグを含むmuseファイルを発行してみましょう。以下は、簡単な例です。

latexタグを用いて数式をインラインイメージで埋め込んでいます。

<latex>
$$
\begin{array}{lcl}
M&
=&
\begin{bmatrix}
a & b\\
c & d\\
\end{bmatrix}\\
M^{-1}&
=&
\frac{1}{ad - bc}
\begin{bmatrix}
 d & -b\\
-c &  a\\
\end{bmatrix}\\
\end{array}
$$
</latex>



latexタグには2つの引数(プロパティ)を指定できます。prefixとpreamble引数です。


muse-latex2png関数は、prefixとして指定した文字列をプレフィックスとしてファイル名を構成します。prefixを明示的に指定しない場合、プレフィックスは"muse-latex2png"となります。

また、latex2png関数は、latexタグ内の記述からsxhash関数によって整数のハッシュ値を生成し、その絶対値もファイル名に付記します。結果として作成されるpngファイルの名前は、"<prefix>_<sxhash>.png"となります。


例えば、prefixを"2006.12.09"として与えた場合、ファイル名は"2006.12.09_<sxhash>.png"となります。

<latex prefix="2006.12.09">
            :


preamble引数に何らかの値を指定した場合、一時的に作成されるLaTeXファイルのプリアンブルにその値を挿入します。例えば、上述の例では分数が小さく出力されていますので、preamble引数として、\everymath{\displaystyle}を与えてみましょう。

latexタグを用いて数式をインラインイメージで埋め込んでいます。

引数として、<code>preamble="\everymath{\displaystyle}"</code>を付けました。

<latex preamble="\everymath{\displaystyle}>
$$
\begin{array}{lcl}
M&
=&
\begin{bmatrix}
a & b\\
c & d\\
\end{bmatrix}\\
M^{-1}&
=&
\frac{1}{ad - bc}
\begin{bmatrix}
 d & -b\\
-c &  a\\
\end{bmatrix}\\
\end{array}
$$
</latex>


プリアンブルを含むLaTeXのテンプレートは、muse-latex2png-templateに設定されています。この値をオーバーライトするのも選択枝の一つでしょう。

muse-latex2png-template is a variable defined in `muse-latex2png.el'.
Its value is 
"\\documentclass{article}
\\usepackage{fullpage}
\\usepackage{amssymb}
\\usepackage[usenames]{color}
\\usepackage{amsmath}
\\usepackage{latexsym}
\\usepackage[mathscr]{eucal}
%preamble%
\\pagestyle{empty}
\\begin{document}
{%code%}
\\end{document}\n"

Documentation:
The LaTeX template to use.

You can customize this variable.

まとめ

LaTeXLaTeXとして記述することが出来るmuse-latex2pngは本当に快適です。以前はテキストを工夫して数式を書いていましたが、忘れた頃に読み返すと誤読する可能性が非常に高かったのと、記述自体に手間をかけなければならいため、無駄に時間を浪費していました。

今回の環境構築では、かなり短時間で自由度の高い記述をすることが可能で、また誤読する可能性はほとんどないと言っても過言ではない表現力を持ち合わせた発行環境を構築することが出来ました。

*1:シェルからopen -a Emacsとした場合は、環境を引き継ぎます