Wie kann ich Wachteleingabemethoden in LaTeX-Formeln deaktivieren?

7

Wenn Sie eine Eingabemethode festlegen (z. B. über M-x set-input-methodRET cyrillic-translitRET), können Sie kyrillische Zeichen über eine US-Tastatur eingeben: Emacs verwendet Transliterationsregeln, um römische Zeichen in kyrillische Zeichen umzuwandeln. Wenn Sie hineinschauen cyrillic.el, sehen Sie zum Beispiel ("f" ?ф), dh das Geben fgibt ф.

Stellen Sie sich nun vor, Sie bearbeiten eine LaTeX-Datei und LaTeX-mode( AUCTeX ) ist aktiviert. Sie verwenden kyrillische Zeichen im Textkörper und römische Zeichen in Formeln. In diesem Zusammenhang möchten Sie fproduzieren fund nicht ф in Mathematik - Modus (dh in $...$, \[...\], \(...\), und in Mathematik Umgebungen).

Wenn ich die Frage verstehe, wie ich feststellen kann, ob ich mich in einer LaTeX-Mathematikumgebung befinde? und diese Antwort richtig, kann die Funktion texmathperkennen, ob wir uns in einer mathematischen Umgebung befinden.

Meine Frage betrifft die Möglichkeit der folgenden bedingten Transliteration mit quail

Das Tippen fgibt fin einer LaTeX-Mathematikumgebung und фanderswo.

Name
quelle
Verwandte (aber ohne Antwort): tex.stackexchange.com/questions/195369/…
Giordano
@giordano: Beachten Sie, dass die Frage , die Sie Links zu einer Frage Stackoverflow verbunden , die tut haben eine Antwort . Ich habe es jedoch nicht mit meiner Antwort verglichen. (Ich habe vielleicht die Zeit, es später zu tun.)
Constantine
@Constantine Ich mag Ihren Ansatz mehr als den der Antwort auf Stack Overflow. Ich habe nach einer zu beratenden Funktion gesucht, bin aber mit Eingabemethoden nicht wirklich vertraut.
Giordano
@giordano: Ich bin auch nicht so vertraut mit Eingabemethoden, ich habe dies nur als Ausrede benutzt, um herumzuwühlen und etwas darüber zu lernen. :-) Ich habe die Antwort übrigens aktualisiert. Ich denke, es ist jetzt ein bisschen weniger ein Hack.
Konstantin

Antworten:

6

Es ist fast 10 Jahre her, seit ich das letzte Mal ein LaTeX-Dokument auf Russisch bearbeiten musste, aber ich kann mich darauf beziehen. :-)

Gemäß dem Emacs Lisp-Handbuch sollte jede Eingabemethode die Schlüsselübersetzung und -konvertierung deaktivieren, wenn sie festgelegt overriding-local-mapist.

Wir sollten uns darauf verlassen können, dass wir dies quailbedingt deaktivieren .

Fügen Sie dies in Emacs 24.4 und höher (unter Verwendung des neuen Beratungsmechanismus) zu Ihrer Init-Datei hinzu:

(advice-add 'quail-input-method :around
            (lambda (orig key)
              "Disable quail-input-method in TeX and LaTeX formulas. Uses AUCTeX."
              (if (and (eq major-mode 'latex-mode)
                       (fboundp 'texmathp)
                       (texmathp))
                  (let ((overriding-local-map t))
                    (funcall orig key))
                (funcall orig key))))

Beachten Sie, dass ich überprüfe, ob der aktuelle Hauptmodus ist latex-mode; Möglicherweise müssen Sie dies anpassen. (Wir müssen den Hauptmodus überprüfen, da AUCTeX nach dem Laden texmathpin allen Puffern gebunden ist und wir nicht mit Eingabemethoden herumspielen möchten, nur weil der aktuelle Puffer Dollarzeichen enthält.)

In älteren Emacs-Versionen (getestet unter Emacs 23.4.1) müssen wir Folgendes verwenden defadvice:

(defadvice quail-input-method (around disable-quail-in-formulas activate)
  "Disable quail-input-method in TeX and LaTeX formulas. Uses AUCTeX."
  (if (and (eq major-mode 'latex-mode)
           (fboundp 'texmathp)
           (texmathp))
      (let ((overriding-local-map t))
        ad-do-it)
    ad-do-it))
Konstantin
quelle
Vielen Dank für Ihre Antwort. Wenn ich Ihren Code eingebe, wird der Fehler angezeigt. Die Funktionsdefinition des Symbols ist ungültig: Beratung-Hinzufügen . Ich weiß nicht, woher dieses Problem kommt.
Name
@Name: advice-addwurde in Emacs 24.4 hinzugefügt. Ich werde die Antwort aktualisieren, um eine Version des Codes aufzunehmen, die mit älteren Emacs-Versionen funktioniert. (Ich werde Sie wissen lassen, sobald das erledigt ist.)
Constantine
@Name: Ich habe die Antwort aktualisiert. Lassen Sie mich wissen, ob es jetzt für Sie funktioniert.
Konstantin
+1000 für diese wunderbare Antwort funktioniert es perfekt.
Name