yatex

annotate docs/yatexadd.doc @ 566:2ef9f21dd13b

Add note on YaTeX::usepackage-alist-default
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 24 Jan 2019 15:19:32 +0900
parents 44e3a5e1e883
children
rev   line source
yuuji@6 1 ------------------------------------------------------------------------
yuuji@6 2 野鳥用付加関数の作成方法
yuuji@6 3 ------------------------------------------------------------------------
yuuji@6 4
yuuji@6 5
yuuji@6 6 【付加関数とは】
yuuji@6 7
yuuji@49 8 begin 型補完で、「tabular 環境を入力している時に、わたしの好み
yuuji@49 9 のスタイルが入らないなあ」などと思うことはありませんか。tabular
yuuji@49 10 環境に限らず、LaTeX の環境の引数には、各人お決まりのフォーマット
yuuji@49 11 があるものです。たとえば凝った表を書く時の tabular環境の引数は、
yuuji@49 12 かなり複雑なので、デフォルトの自動入力関数よりも、
yuuji@6 13
yuuji@8 14 "{@{\vrule width 1pt\ }|||@{\ \vrule width 1pt}}"
yuuji@6 15
yuuji@6 16 を挿入するだけの単純な関数のほうが、嬉しい人もいるでしょう。あるい
yuuji@6 17 は、「そんなの要らない。他の tabular をコピーして来たほうが早い。」
yuuji@6 18 と思う人もいるでしょう。
yuuji@6 19
yuuji@6 20 YaTeX の付加関数は、あらかじめ○○環境用のお仕着せの特別関数を用
yuuji@6 21 意しておくのではなく、○○環境用の特別関数が欲しくなったら独自の関
yuuji@6 22 数を定義する、というコンセプトに基づくもので、付加関数の登録のため
yuuji@6 23 の手続きをすることなく、関数を定義したその瞬間から使えるようになり
yuuji@6 24 ます。「必要なのは、defun だけ」です。
yuuji@6 25
yuuji@6 26
yuuji@6 27 【準備】
yuuji@6 28
yuuji@6 29 さすがに、関数を書くだけでは使えません:-)。yatex-mode 起動時には、
yuuji@8 30 その関数を定義したファイルがロードされていなくてはなりません。関数
yuuji@25 31 を定義するファイル名を yatexhks.el(またはバイトコンパイルした形式
yuuji@25 32 の yatexhks.elc)にし、そのファイルを load-path 中に置いておけば、
yuuji@8 33 野鳥が自動的にロードします。それ以外のファイル名にする場合は、
yuuji@16 34 yatex-mode-load-hook に付加関数を定義する Emacs-Lisp ファイルをロー
yuuji@16 35 ドするような仕掛けを書いておくのがよいでしょう。
yuuji@6 36
yuuji@6 37
yuuji@12 38 【関数定義】
yuuji@6 39
yuuji@12 40 付加関数には、各LaTeXコマンドのオプション引数を返す形式のもの、
yuuji@79 41 section型補完の引数を返すもの、リジョン括りsection型補完の引数該当
yuuji@79 42 部を処理するためのもの、三種類があります。ここでは便宜上その三つを、
yuuji@12 43
yuuji@79 44 a. 追加型付加関数
yuuji@79 45 b. 引数型付加関数
yuuji@79 46 c. 括り補完時付加関数
yuuji@79 47
yuuji@79 48 と呼ぶことにします。
yuuji@79 49
yuuji@79 50 a は、以下の例のように、begin型補完では\begin{環境名}の直後に付
yuuji@79 51 加する文字列、section型補完では LaTeX コマンド名と第一引数の間に位
yuuji@79 52 置する文字列、maketitle型補完では LaTeX コマンド名の直後に位置する
yuuji@79 53 文字列を返すような関数です。
yuuji@12 54
yuuji@12 55 (例) \begin{table}[ht] (付加関数名 YaTeX:table)
yuuji@12 56 ~~~~
yuuji@12 57 \put(100,200){} (付加関数名 YaTeX:put)
yuuji@12 58 ~~~~~~~~~
yuuji@12 59 \sum_{i=0}^{n} (付加関数名 YaTeX:sum)
yuuji@12 60 ~~~~~~~~~~
yuuji@12 61
yuuji@12 62 追加型付加関数は『LaTeXコマンド名の前に YaTeX: をつけた名前』で定
yuuji@12 63 義します。
yuuji@12 64
yuuji@79 65 b は、以下のようにsection型コマンドの引数となる文字列を返す関数
yuuji@79 66 です。
yuuji@12 67
yuuji@12 68 (例) \newcommand{\foo}{bar} (付加関数名 YaTeX::newcommand)
yuuji@12 69 ~~~~ ~~~
yuuji@12 70
yuuji@12 71 引数型付加関数は『LaTeXコマンド名の前に YaTeX:: をつけた名前』で定
yuuji@16 72 義します。また引数型付加関数が呼ばれる時にはsection型コマンドの何
yuuji@16 73 番目の引数を入力しているのかが関数への引数として渡されます。したがっ
yuuji@16 74 て、引数型付加関数は整数の引数を一つ取るものとして定義し、その引数
yuuji@16 75 の値により処理を決定することになります。
yuuji@12 76
yuuji@79 77 (yatex.1.72の新機能)
yuuji@79 78 c は、既存テキストの一部をsection型コマンドの引数として括るとき
yuuji@79 79 に、指定したりジョンの先頭と末尾の各ポイントを引数として呼ばれます。
yuuji@79 80 たとえば、
yuuji@79 81
yuuji@79 82 5/3
yuuji@79 83
yuuji@79 84 というテキストをリジョン指定して [prefix] S でセクション型コマンド
yuuji@79 85 で括りたいときに、括られるテキストに対してなんらかの処理をほどこし
yuuji@79 86 たいときに呼ばれます。
yuuji@79 87
yuuji@79 88 (例) 5/3 ←5/3をリジョン指定し \frac で括る
yuuji@79 89 \frac{5/3} ←5/3のポイント位置を引数に呼ばれる
yuuji@79 90 ~~~ (付加関数 YaTeX::frac-region)
yuuji@79 91
yuuji@12 92
yuuji@12 93 【定義例】
yuuji@12 94
yuuji@12 95 例えば、tabular環境のフォーマットとして、いつでも {|c|c|c|} を入
yuuji@12 96 れるだけで良いのなら、
yuuji@12 97
yuuji@12 98 (defun YaTeX:tabular ()
yuuji@12 99 "{|c|c|c|}")
yuuji@12 100
yuuji@12 101 とだけ書けばよく、前述の、複雑な定型 tabular フォーマットを挿入す
yuuji@12 102 るための関数を定義する場合は次のようにします。
yuuji@12 103
yuuji@12 104 (defun YaTeX:tabular ()
yuuji@12 105 "{@{\\vrule width 1pt\\ }|||@{\\ \\vrule width 1pt}}")
yuuji@12 106
yuuji@12 107 この時、Emacs-Lisp 中の文字列では、\ 自身は \\ と表記することなど
yuuji@12 108 に注意して下さい。
yuuji@12 109
yuuji@12 110 また、{} の中を、補完時に直接キーボードから読み込ませたい時は、
yuuji@12 111
yuuji@12 112 (defun YaTeX:tabular ()
yuuji@12 113 (concat "{" (read-string "Rule: ") "}"))
yuuji@12 114
yuuji@12 115 などとすれば良いでしょう。
yuuji@12 116
yuuji@12 117 次に、引数型付加関数として \newcommand の引数を読み込む関数を定
yuuji@12 118 義する場合を例示します。\newcommand の第一引数は新たに定義するコマ
yuuji@12 119 ンド名なので、必ず先頭に \ が来ます。第二引数はたいていの場合ミニ
yuuji@12 120 バッファでは編集しづらいような複雑な定義を書くので、何も補完しない
yuuji@12 121 方が良いでしょう。これを考慮して付加関数を定義すると以下のようなも
yuuji@12 122 のになるでしょう。
yuuji@12 123
yuuji@12 124 (defun YaTeX::newcommand (n) ;nは引数の位置
yuuji@12 125 (cond
yuuji@12 126 ((= n 1) ;第一引数ならコマンド名
yuuji@16 127 (read-string "Command: " "\\")) ;\を初期入力とする
yuuji@16 128 ((= n 2) "") ;第二引数なら何もしない
yuuji@12 129 (t nil)))
yuuji@12 130
yuuji@12 131 なお、引数型付加関数が nil を返した場合は、通常の引数入力関数が呼
yuuji@12 132 ばれます。
yuuji@6 133
yuuji@79 134 最後に括り補完時付加関数の例として、既存テキストを \frac で括
yuuji@79 135 る場合の例を示します。\frac は2つの引数を取り、\frac{a}{b} のよ
yuuji@79 136 うにして、分数を表すときに利用するコマンドです。数学的には
yuuji@79 137
yuuji@79 138 a
yuuji@79 139 a/b ⇔ ----
yuuji@79 140 b
yuuji@79 141
yuuji@79 142 と置き換え可能な記法です。LaTeXソースにa/bと書いたものを野鳥の括
yuuji@79 143 り補完で\fracに括ると、以下のようになります。
yuuji@79 144
yuuji@79 145 \frac{a/b}
yuuji@79 146
yuuji@79 147 /の部分を }{ に置き換えれば正しい書き換えになります。このような
yuuji@79 148 ことを対話的に半自動で行なうアドイン関数は以下のようにします。
yuuji@79 149
yuuji@79 150 (defun YaTeX::frac-region (beg end) ;リジョンの先頭と末尾
yuuji@79 151 (catch 'done
yuuji@79 152 (while (search-forward "/" end t) ;/がある間繰り返す
yuuji@79 153 (goto-char (match-beginning 0)) ;/の位置に移動
yuuji@79 154 (if (y-or-n-p "Replace this slash(/) to `}{'")
yuuji@79 155 (throw 'done (replace-match "}{"))) ;置き換えて終了
yuuji@79 156 (goto-char (match-end 0)))))
yuuji@79 157
yuuji@6 158
yuuji@6 159 【呼ばれ方】
yuuji@6 160
yuuji@8 161 野鳥本体は、begin型補完とsection型補完、およびmaketitle型補完の
yuuji@8 162 入力時に付加関数の存在を調べてから呼び出します。begin型補完の場合
yuuji@8 163 \begin{環境名} が自動入力された直後に呼び出されます。section型補完
yuuji@8 164 では第一引数の補完の直前、maketitle型補完の場合は、コマンド名の直
yuuji@12 165 後(一つのスペースを挿入する直前)に呼び出されます。引数型付加関数は、
yuuji@79 166 section型コマンドの引数の入力時にその都度呼ばれます。括り補完時付
yuuji@79 167 加関数は、LaTeXコマンドと{}がテキストに挿入された直後に呼ばれます。
yuuji@6 168
yuuji@6 169
yuuji@6 170 【参考】
yuuji@6 171
yuuji@6 172 付加関数の定義の例を yatexadd.el に用意しました。実際に独自の付
yuuji@6 173 加関数を定義する時の参考として下さい。
yuuji@6 174
yuuji@8 175 有用と思われる関数について、簡単に説明します。
yuuji@8 176
yuuji@8 177 ・関数 YaTeX:read-position
yuuji@8 178 引数 [] の中に入れてもよい文字を羅列した文字列。
yuuji@8 179 説明 [htb] などのような location 指定を作成します。何も入力せず
yuuji@8 180 リターンを押すと、[]自体も省略されます。[]の中に来るべき文
yuuji@8 181 字が htbp に限られているなら、(YaTeX:read-position "htbp")
yuuji@8 182 と呼び出します。
yuuji@8 183
yuuji@52 184 ・関数 YaTeX-cplread-with-learning
yuuji@52 185 引数 プロンプト
yuuji@52 186 デフォルト補完テーブル変数シンボル
yuuji@52 187 ユーザ補完テーブル変数シンボル
yuuji@52 188 ローカル補完テーブル変数シンボル
yuuji@52 189 説明 「プロンプト」というプロンプトを出し、補完入力を行います。
yuuji@52 190 三つの変数のテーブルの値を結合したものが補完候補として用
yuuji@52 191 いられ、新しい単語を入力すると自動的に学習されます。学習
yuuji@52 192 結果は ~/.yatexrc か ./.yatexrc に保存されます。使用例と
yuuji@52 193 して YaTeX::documentstyle 関数の定義をごらんください。
yuuji@52 194
yuuji@54 195 ・関数 YaTeX:read-coordinates
yuuji@54 196 引数 基本プロンプト、X座標プロンプト、Y座標プロンプト(全て省略可)
yuuji@54 197 説明 「基本プロンプト X座標プロンプト:」というプロンプトを出し
yuuji@8 198 て、X座標を読み込み、「基本プロンプト Y座標プロンプト:」を
yuuji@8 199 出して、Y座標を読み込み、(X座標,Y座標) の様な形式を作成します。
yuuji@8 200 何も入力せずリターンを押しても、(,)が返されます。
yuuji@8 201 各プロンプトのデフォルトはそれぞれ、Dimension, X, Y です。
yuuji@8 202
yuuji@8 203 ・関数 YaTeX:check-comletion-type
yuuji@8 204 引数 'begin または、'section または、'maketitle
yuuji@8 205 説明 付加関数が呼ばれる時に、行われている補完の形式が、引数で与
yuuji@8 206 えたものであるかどうか調べ、そうでない場合にエラー終了する。
yuuji@8 207 なお、変数 YaTeX-current-completion-type に現在の補完の型
yuuji@8 208 を表わすシンボル(この関数の引数と同様)が格納されています。
yuuji@8 209
yuuji@6 210
yuuji@6 211 【最後に】
yuuji@6 212
yuuji@6 213 快適な関数を定義したなら、そしてそれを公開してもよいと思われたな
yuuji@6 214 ら、筆者までお送り下さい。次の yatexadd.el に取り込んで行きたいと
yuuji@6 215 思います。
yuuji@6 216
yuuji@6 217
yuuji@69 218 広瀬雄二
yuuji@70 219 yuuji@yatex.org