yuuji@6: ------------------------------------------------------------------------ yuuji@6: 野鳥用付加関数の作成方法 yuuji@6: ------------------------------------------------------------------------ yuuji@6: yuuji@6: yuuji@6: 【付加関数とは】 yuuji@6: yuuji@8: begin 型補完で、「tabular 環境を入力している時に、"{|c|c|c|}" と yuuji@8: か、また、table 環境の入力時に"[tbp]" とかも一緒に入力すればいいの yuuji@8: に」などと思うことはありませんか。もちろんこれを自動入力する関数は yuuji@8: 簡単にサポートできるでしょう。 yuuji@6: yuuji@6: しかし、tabular 環境に限らず、LaTeX の環境の引数には、各人お決ま yuuji@6: りのフォーマットがあるものです。たとえば凝った表を書く時の tabular yuuji@6: 環境の引数は、かなり複雑なので、上のような自動入力関数よりも、 yuuji@6: yuuji@8: "{@{\vrule width 1pt\ }|||@{\ \vrule width 1pt}}" yuuji@6: yuuji@6: を挿入するだけの単純な関数のほうが、嬉しい人もいるでしょう。あるい yuuji@6: は、「そんなの要らない。他の tabular をコピーして来たほうが早い。」 yuuji@6: と思う人もいるでしょう。 yuuji@6: yuuji@6: YaTeX の付加関数は、あらかじめ○○環境用のお仕着せの特別関数を用 yuuji@6: 意しておくのではなく、○○環境用の特別関数が欲しくなったら独自の関 yuuji@6: 数を定義する、というコンセプトに基づくもので、付加関数の登録のため yuuji@6: の手続きをすることなく、関数を定義したその瞬間から使えるようになり yuuji@6: ます。「必要なのは、defun だけ」です。 yuuji@6: yuuji@6: yuuji@6: 【準備】 yuuji@6: yuuji@6: さすがに、関数を書くだけでは使えません:-)。yatex-mode 起動時には、 yuuji@8: その関数を定義したファイルがロードされていなくてはなりません。関数 yuuji@25: を定義するファイル名を yatexhks.el(またはバイトコンパイルした形式 yuuji@25: の yatexhks.elc)にし、そのファイルを load-path 中に置いておけば、 yuuji@8: 野鳥が自動的にロードします。それ以外のファイル名にする場合は、 yuuji@16: yatex-mode-load-hook に付加関数を定義する Emacs-Lisp ファイルをロー yuuji@16: ドするような仕掛けを書いておくのがよいでしょう。 yuuji@6: yuuji@6: yuuji@12: 【関数定義】 yuuji@6: yuuji@12: 付加関数には、各LaTeXコマンドのオプション引数を返す形式のもの、 yuuji@12: section型補完の引数を返すもの、の二種類があります。 yuuji@12: yuuji@12: 前者は、以下の例のように、begin型補完では\begin{環境名}の直後に yuuji@12: 付加する文字列、section型補完では LaTeX コマンド名と第一引数の間に yuuji@12: 位置する文字列、maketitle型補完では LaTeX コマンド名の直後に位置す yuuji@12: る文字列を返すような関数です。便宜上この形の付加関数を、追加型付加 yuuji@12: 関数と呼ぶことにします。 yuuji@12: yuuji@12: (例) \begin{table}[ht] (付加関数名 YaTeX:table) yuuji@12: ~~~~ yuuji@12: \put(100,200){} (付加関数名 YaTeX:put) yuuji@12: ~~~~~~~~~ yuuji@12: \sum_{i=0}^{n} (付加関数名 YaTeX:sum) yuuji@12: ~~~~~~~~~~ yuuji@12: yuuji@12: 追加型付加関数は『LaTeXコマンド名の前に YaTeX: をつけた名前』で定 yuuji@12: 義します。 yuuji@12: yuuji@12: 後者は、以下のようにsection型コマンドの引数となる文字列を返す yuuji@12: 関数です。この形の付加関数を引数型付加関数と呼ぶことにします。 yuuji@12: yuuji@12: (例) \newcommand{\foo}{bar} (付加関数名 YaTeX::newcommand) yuuji@12: ~~~~ ~~~ yuuji@12: yuuji@12: 引数型付加関数は『LaTeXコマンド名の前に YaTeX:: をつけた名前』で定 yuuji@16: 義します。また引数型付加関数が呼ばれる時にはsection型コマンドの何 yuuji@16: 番目の引数を入力しているのかが関数への引数として渡されます。したがっ yuuji@16: て、引数型付加関数は整数の引数を一つ取るものとして定義し、その引数 yuuji@16: の値により処理を決定することになります。 yuuji@12: yuuji@12: yuuji@12: 【定義例】 yuuji@12: yuuji@12: 例えば、tabular環境のフォーマットとして、いつでも {|c|c|c|} を入 yuuji@12: れるだけで良いのなら、 yuuji@12: yuuji@12: (defun YaTeX:tabular () yuuji@12: "{|c|c|c|}") yuuji@12: yuuji@12: とだけ書けばよく、前述の、複雑な定型 tabular フォーマットを挿入す yuuji@12: るための関数を定義する場合は次のようにします。 yuuji@12: yuuji@12: (defun YaTeX:tabular () yuuji@12: "{@{\\vrule width 1pt\\ }|||@{\\ \\vrule width 1pt}}") yuuji@12: yuuji@12: この時、Emacs-Lisp 中の文字列では、\ 自身は \\ と表記することなど yuuji@12: に注意して下さい。 yuuji@12: yuuji@12: また、{} の中を、補完時に直接キーボードから読み込ませたい時は、 yuuji@12: yuuji@12: (defun YaTeX:tabular () yuuji@12: (concat "{" (read-string "Rule: ") "}")) yuuji@12: yuuji@12: などとすれば良いでしょう。 yuuji@12: yuuji@12: 次に、引数型付加関数として \newcommand の引数を読み込む関数を定 yuuji@12: 義する場合を例示します。\newcommand の第一引数は新たに定義するコマ yuuji@12: ンド名なので、必ず先頭に \ が来ます。第二引数はたいていの場合ミニ yuuji@12: バッファでは編集しづらいような複雑な定義を書くので、何も補完しない yuuji@12: 方が良いでしょう。これを考慮して付加関数を定義すると以下のようなも yuuji@12: のになるでしょう。 yuuji@12: yuuji@12: (defun YaTeX::newcommand (n) ;nは引数の位置 yuuji@12: (cond yuuji@12: ((= n 1) ;第一引数ならコマンド名 yuuji@16: (read-string "Command: " "\\")) ;\を初期入力とする yuuji@16: ((= n 2) "") ;第二引数なら何もしない yuuji@12: (t nil))) yuuji@12: yuuji@12: なお、引数型付加関数が nil を返した場合は、通常の引数入力関数が呼 yuuji@12: ばれます。 yuuji@6: yuuji@6: yuuji@6: 【呼ばれ方】 yuuji@6: yuuji@8: 野鳥本体は、begin型補完とsection型補完、およびmaketitle型補完の yuuji@8: 入力時に付加関数の存在を調べてから呼び出します。begin型補完の場合 yuuji@8: \begin{環境名} が自動入力された直後に呼び出されます。section型補完 yuuji@8: では第一引数の補完の直前、maketitle型補完の場合は、コマンド名の直 yuuji@12: 後(一つのスペースを挿入する直前)に呼び出されます。引数型付加関数は、 yuuji@12: section型コマンドの引数の入力時にその都度呼ばれます。 yuuji@6: yuuji@6: yuuji@6: 【参考】 yuuji@6: yuuji@6: 付加関数の定義の例を yatexadd.el に用意しました。実際に独自の付 yuuji@6: 加関数を定義する時の参考として下さい。 yuuji@6: yuuji@8: 有用と思われる関数について、簡単に説明します。 yuuji@8: yuuji@8: ・関数 YaTeX:read-position yuuji@8: 引数 [] の中に入れてもよい文字を羅列した文字列。 yuuji@8: 説明 [htb] などのような location 指定を作成します。何も入力せず yuuji@8: リターンを押すと、[]自体も省略されます。[]の中に来るべき文 yuuji@8: 字が htbp に限られているなら、(YaTeX:read-position "htbp") yuuji@8: と呼び出します。 yuuji@8: yuuji@8: ・関数 YaTeX:read-coordinates yuuji@8: 引数 基本プロンプト, X座標プロンプト, Y座標プロンプト(全て省略可) yuuji@8: 説明 「基本プロンプト X座標プロンプト:」というプロンプトを出し yuuji@8: て、X座標を読み込み、「基本プロンプト Y座標プロンプト:」を yuuji@8: 出して、Y座標を読み込み、(X座標,Y座標) の様な形式を作成します。 yuuji@8: 何も入力せずリターンを押しても、(,)が返されます。 yuuji@8: 各プロンプトのデフォルトはそれぞれ、Dimension, X, Y です。 yuuji@8: yuuji@8: ・関数 YaTeX:check-comletion-type yuuji@8: 引数 'begin または、'section または、'maketitle yuuji@8: 説明 付加関数が呼ばれる時に、行われている補完の形式が、引数で与 yuuji@8: えたものであるかどうか調べ、そうでない場合にエラー終了する。 yuuji@8: なお、変数 YaTeX-current-completion-type に現在の補完の型 yuuji@8: を表わすシンボル(この関数の引数と同様)が格納されています。 yuuji@8: yuuji@6: yuuji@6: 【最後に】 yuuji@6: yuuji@6: 快適な関数を定義したなら、そしてそれを公開してもよいと思われたな yuuji@6: ら、筆者までお送り下さい。次の yatexadd.el に取り込んで行きたいと yuuji@6: 思います。 yuuji@6: yuuji@6: yuuji@14: 広瀬雄二 yuuji@14: yuuji@ae.keio.ac.jp yuuji@14: pcs39334@asciinet.or.jp