組版の数学テキストにはAUCTeXを使用しています。合計、積分などがすべて同じ下付き文字または上付き文字の方程式を入力しなければならないことがよくあります。現在の下付き文字/上付き文字を以前の値で自動入力したいのですが。例:
\sum_{i=1}^{\infty} a_i = \sum…
_上記の方程式を押すと、Emacsは次のように書くはず_{i=1}
です。オプションで、2番目の上付き文字も入力されているとよいでしょう。
これはどのように実現できますか?
組版の数学テキストにはAUCTeXを使用しています。合計、積分などがすべて同じ下付き文字または上付き文字の方程式を入力しなければならないことがよくあります。現在の下付き文字/上付き文字を以前の値で自動入力したいのですが。例:
\sum_{i=1}^{\infty} a_i = \sum…
_上記の方程式を押すと、Emacsは次のように書くはず_{i=1}
です。オプションで、2番目の上付き文字も入力されているとよいでしょう。
これはどのように実現できますか?
回答:
initファイルに追加します。
(defvar mg-TeX-insert-subscript-history nil)
(defvar mg-TeX-insert-superscript-history nil)
(defun TeX-insert-sub-or-superscript (arg)
"Insert typed key ARG times and possibly a pair of braces.
Brace insertion is only done if point is in a math construct and
`TeX-electric-sub-and-superscript' has a non-nil value."
(interactive "*p")
(self-insert-command arg)
(when (and TeX-electric-sub-and-superscript (texmathp))
(let* ((history (cond
((equal last-input-event ?_)
'mg-TeX-insert-subscript-history)
((equal last-input-event ?^)
'mg-TeX-insert-superscript-history)))
(content (read-string "Content: " (car (symbol-value history)) history)))
(insert (concat TeX-grop content TeX-grcl))
(if (zerop (length content))
(backward-char)))))
TeX-electric-sub-and-superscript
が非nilに設定されていることを確認してください。
以下は、トークンに対して発生する最後のサブスクリプトまたはスーパースクリプトを非対話的に挿入するバージョンです。
(defun my/electric-sub-super-script (arg)
"Insert typed character ARG times and possibly a sub/super-script.
Sub/super-script insertion is done only in a (La)TeX math mode region.
The inserted sub/super-script is copied from the last occurence of a
sub/superscript for the token at point."
(interactive "p")
(self-insert-command arg)
(when (texmathp)
(insert
(save-excursion
(let ((current-token (let ((end (point)))
(backward-sexp 1)
(buffer-substring-no-properties (point) end))))
(if (search-backward current-token nil t)
(progn
(search-forward current-token)
(let ((begin (point)))
(forward-sexp 1)
(buffer-substring-no-properties begin (point))))
""))))))
(define-key TeX-mode-map (kbd "_") #'my/electric-sub-super-script)
(define-key TeX-mode-map (kbd "^") #'my/electric-sub-super-script)
質問の例をとると、以下は最初の行から始めて入力することで得られる一連のバッファ状態_^SPCa_です:
\sum_{i=1}^{\infty} a_i = \sum▮
\sum_{i=1}^{\infty} a_i = \sum_{i=1}▮
\sum_{i=1}^{\infty} a_i = \sum_{i=1}^{\infty}▮
\sum_{i=1}^{\infty} a_i = \sum_{i=1}^{\infty} a▮
\sum_{i=1}^{\infty} a_i = \sum_{i=1}^{\infty} a_i▮