Automatisches Einfügen der zuletzt verwendeten tiefgestellten / hochgestellten Werte in mathematische Formeln

8

Ich benutze AUCTeX zum Setzen von mathematischen Texten. Oft muss ich Gleichungen mit Summen, Integralen usw. eingeben, die alle die gleichen hoch- oder hochgestellten Zeichen haben. Ich möchte den aktuellen tiefgestellten / hochgestellten Index automatisch mit dem Wert füllen, den er zuvor hatte. Beispiel:

\sum_{i=1}^{\infty} a_i = \sum…

Wenn ich _auf die obige Gleichung drücke, sollte Emacs schreiben _{i=1}. Optional wäre es gut, wenn auch der zweite hochgestellte Index ausgefüllt würde.

Wie kann das realisiert werden?

Jens Kubieziel
quelle

Antworten:

9

Zu Ihrer Init-Datei hinzufügen:

(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)))))

Stellen Sie sicher TeX-electric-sub-and-superscript, dass nicht Null eingestellt ist.

Giordano
quelle
Ich wusste, dass du irgendwann hier landen würdest :) nette Herangehensweise.
Sean Allred
3

Hier ist eine Version, die nicht interaktiv das letzte Sub- / Superskript einfügt, das für das Token an Punkt auftritt:

(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)

Das folgende Beispiel zeigt die Reihenfolge der Pufferzustände, die durch Beginnen mit der ersten Zeile und Eingeben erhalten werden _^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▮
François Févotte
quelle