トップ «前の日記(2012 年 12 月 11 日 (火)) 最新 次の日記(2012 年 12 月 18 日 (火))»
編集 RSS

ワタタツの日記


2012 年 12 月 12 日 (水)

Emacs で LaTeX を書いている人が今すぐ yasnippet を最新版にすべきたった1つの理由

Emacs で LaTeX を書いている人が今すぐ yasnippet を最新版にすべきたった1つの理由。それは「type: command が利用できるから」です。

Advent Calendar 初参戦!

TeX & LaTeX Advent Calendar 2012 の第12日目に性懲りもなくエントリしてしまいました。第11日目の ut さんの続きです。

この TeX の Advent Calendar はすさまじく変態なレベルの高い記事がのオンパレートでしたのでエントリするのをためらいましたが、12日で途絶えそうだったので思い切ってエントリしてみました。「※初心者大歓迎。 いやマジで。」を信じてエントリっっ。

Emacs + yasnippet で TeX/LaTeX

Emacs ユーザであれば yasnippet を導入されている方も多いと思われます。 スニペットというコード片をさくっと挿入できて、しかもなかなか融通が利くという高機能っぷりです。 いろんなときに Emacs 上で生活しているわしにはとても重宝しているものであります。 詳しくは YouTube をご覧いただくことに致しましょう。

TeX を書くのにももちろんとても便利です。enum[tab キー] で「ばっ!」と

\begin{enumerate}
\item 
\end{enumerate}

が出て、しかも \item の右にカーソルがいるなんて素敵です。

しかし、使っていると、サイズを可変にして行列を出す snippet が欲しいと思うようになりました。そのときに見つけた機能が今回ご紹介したい機能です。

行列を書く

それまでは mat でサイズ固定で3行3列の行列を出すようにしていました。 そのうち、「行数と列数を動的に変更できるようにしたいなあ」と思うようになり調べ始めたのです。

するとなんと開発版 (0.7 ごろから) には type: command という設定でき、emacs lisp が書けるようになっているではありませんか!

smart-snippet and YASnippet という Google グループ で見つけました。

commit log には

commit 088ba32300cdda96bde07a4d5efc3fffb8ec88a9
Author: capitaomorte <***************>
Date:   Fri Oct 16 14:56:49 2009 +0000

    * Commands are now identified by a new "# type: command" directive.

と出ています。2009年て!! おいおいおいおいめちゃんこ昔じゃないか!!! ずっと type: command が使えない版を使っていたわ!!

あのパッケージ版のチュートリアルビデオがあちこちに貼ってあるのを見て yasnippet を使い始めたので、わしもそのまま yasnippet-0.6.1c を使っていて気づかなかったんでしょう。 早速 M-x el-get-list-package。yasnippet はさっくり最新版にしました。 (現在の開発版は version 0.8.0)

emacs lisp が書けるならもう何でもありです。

上のグループにあったものをそのままコピペして snippet ディレクトリの latex-mode/ の下に matrix という名前で入れました。

# -*- mode: snippet -*-
# name: an (n,m)-matrix
# key: mat
# type: command
# --
 (insert "\begin{pmatrix}\n")
 (let ((width (read-number "Matrix width?" 3))
       (height (read-number "Matrix height?" 3))
       (snippet-text ""))
   (dotimes (i height)
     (dotimes (j width)
       (setq snippet-text (format "%s ${%d:m%d%d} %s"
                                  snippet-text
                                  (1+ (+ (* height i) j))
                                  (1+ i)
                                  (1+ j)
 
                                  (if (= j (1- width))
                                      (if (/= i (1- height)) "\\\" "")
                                    "&"))))
     (setq snippet-text (format "%s\n" snippet-text)))
   (yas/expand-snippet (format "%s\end{pmatrix}" snippet-text)))

これです。 ディフォルトでは3行3列の行列になるようになっています。

連立方程式の動的なスニペット

これでもういろいろできますね。 というわけでまねして連立方程式を出すスニペットを作ってみました。

# -*- mode: snippet -*-
# name: dynamic version of simultanious equation
# key: dysimeq
# type: command
# --
(insert "\setcounter{MaxMatrixCols}{99}\n\left\{\begin{matrix}\n")
(let ((variable-number (read-number "Number of variables?" 3))
      (line-number (read-number "Number of equations?" 3))
      (snippet-text ""))
  (dotimes (i line-number)
    (dotimes (j variable-number)
      (setq snippet-text (format "%s %s ${a_{%d%s%d}} %s %s"
                                 snippet-text
                                 (if (= j 0) "" "+ &")
                                 ;;(+ (1+ (+ (* line-number i) j)) variable-number)
                                 (1+ i)
                                 (if (or (>= i 9) (>= j 9)) "," "")
                                 (1+ j)
                                 (if (= i 0) (format "${%d:%s}" (1+ j) (if (<= variable-number 4) (nth j '(x y z w)) (format "x_%d" (1+ j))))
                                     (format "$%d" (1+ j)))
                                 (if (= j (1- variable-number))
                                     "& = & ${0} \\\" "&"))))
    (setq snippet-text (format "%s\n" snippet-text)))
  (yas/expand-snippet (format "%s\end{matrix}\right." snippet-text)))

使い方
  1. 変数の数と方程式の本数を聞いてきます。
  2. まずは変数の名前を打ちます。yasnippet によって自動的に同じ変数は同じ名前になります。変数名がよければ C-i か tab で次に行って下さい。(4変数以下は自動的に x, y, z, w を使い、5変数以上からは x_1, x_2, ... がプレイスホルダに入るようにしています。)
  3. 次に係数を打ち込んでいって下さい。どうでもよければ線形代数の教科書によくある a_{ij} が入ります。

このように簡単に連立方程式を入力できます。 連立方程式 dysimeq 展開の様子 変数が多いときは添え字付き変数になっている様子 連立方程式 dysimeq 展開の様子

コード置き場

いい機会なので github に自分用の snippet を置いてみました。

https://github.com/Nyoho/my-snippets

git clone https://github.com/Nyoho/my-snippets

是非 fork したり pull request を下さい。

まとめ

Emacs で LaTeX を書いている人としては、yasnippet の最新版を入れることで、emacs lisp による動的なスニペットを作ることができ、最高に気分がいいです。

この動的なスニペットによるさくさく講義ノート作成・演習問題作成を楽しみましょう。

TeX & LaTeX Advent Calendar、明日12月13日は @neruko3114 さんのneruko3114's Blog: "fp-package"でジャネーの法則 です。


トップ «前の日記(2012 年 12 月 11 日 (火)) 最新 次の日記(2012 年 12 月 18 日 (火))»
Copyright © 2024 KITADAI, Yukinori. All rights reserved.