Wie lösche ich ein LaTeX-Makro unter Beibehaltung seines Textinhalts?

11

Wenn Sie in TeXStudio in einem LaTeX-Makro wie diesem ALT+ drücken, während der Cursor kurz vor dem ersten steht, werden alle Elemente außer dem (wie unten gezeigt) gelöscht . DEL\macroname{content}{content

Geben Sie hier die Bildbeschreibung ein
Setzen Sie den Cursor (Punkt) kurz vor die erste geschweifte Klammer:

Geben Sie hier die Bildbeschreibung ein

Drücken Sie ALT+ DELund Sie erhalten:

Geben Sie hier die Bildbeschreibung ein

Wie erreicht man das in Emacs?

Update
Nach der Klarstellung von T.Verron gibt es ein Problem, C-c C-f C-dda es sich über einen Fehler in einer unausgeglichenen Klammer beschwert, wenn es in einigen Makros in LaTeX ausgeführt wird. Betrachten Sie das folgende Beispiel:
Geben Sie hier die Bildbeschreibung ein

löst diesen Fehler aus : up-list: Scan error: "Unbalanced parentheses", 8074, 1. \ textenglish {} gehört zum Polyglossia-Paket.

Wie kann man diese Einschränkung loswerden?

Promotion
quelle
Hem, bei der Einschränkung mit der aktuellen Antwort geht es nicht darum, ob auctex das Makro fontisiert oder nicht, sondern darum, ob das Makro eine Latex-Schriftspezifikation ist (wahrscheinlich wie durch definiert TeX-font-list) oder nicht. Versuchen Sie es beispielsweise mit \sectionoder \footnote, AUCTeX kennt diese Makros und schreibt sie, C-c C-f C-dbeschwert sich jedoch über unausgeglichene Klammern.
T. Verron
Selbst wenn ich dies aktualisieren kann TeX-font-list, um meine neu eingeführten Makros einzuschließen, bleibt dies eine suboptimale Problemumgehung. Ansonsten weiß ich nicht, welche Prvents eine eLISP-Funktion haben, um damit umzugehen!
Promotion am

Antworten:

11

Versuchen Sie diese Funktion:

(defun mg-TeX-delete-current-macro (&optional arg)
  "Remove the current macro.
With an optional argument ARG, delete just the ARG-th macro
starting from the innermost."
  (interactive "*p")
  (let (macro end)
    (when 
    (dotimes (i arg macro)
      (goto-char (TeX-find-macro-start))
      (setq macro (TeX-current-macro)
        end (TeX-find-macro-end))
      ;; If we need to look for an outer macro we have to "exit" from the
      ;; current one.
      (backward-char))
      ;; Return to the beginning of the macro to be deleted.
      (forward-char)
      (re-search-forward
       (concat (regexp-quote TeX-esc) macro "\\(?:\\[[^]]*\\]\\)?"
           TeX-grop "\\(\\(.\\|\n\\)*\\)")
       end t)
      (replace-match "\\1")
      ;; Delete the closing brace.
      (delete-backward-char 1))))

Einschränkung: Funktioniert nicht mit wörtlichen Makros. Diese Funktion gibt einen error ( Wrong type argument: integer-or-marker-p, nil) aus, wenn das universelle Argument größer als die Anzahl der Makros ist, die den Punkt einschließen.

Binden Sie die Funktion an Ihre bevorzugte Verknüpfung. Beispielsweise

(eval-after-load "tex"
  '(local-set-key (kbd "M-DEL") 'mg-TeX-delete-current-macro))

um es zu binden M-DEL.

Wenn Ihr Puffer hat ( !ist Punkt)

\onemacro{\anothermacro{!argument}}

dann C-2 M-DELwirst du geben

\anothermacro{argument}
Giordano
quelle
Wenn der Punkt innerhalb der innersten Gruppe (gr1(gr2(gr3(gr4))))mit einem Präfix gemeint ist, C-udann 2 gibt es mir : (gr1(gr2))? Wenn es so ist, muss das brillant sein. Ich hoffe du hattest die Zeit es zu tun.
Promotion am
Ich habe es gebunden, um M-DELin TexStudio zu mögen. Vielen Dank.
Promotion am
@doctorate Nun, nein, meine Idee ist es, gr3in Ihrem Fall nur das zweite Makro zu löschen . Siehe die aktualisierte Antwort. Sie können implementieren , was Sie durch Umwickeln ein vorgeschlagenes dotimesum whenvon der ursprünglichen Version der Antwort.
Giordano
Tolle Funktion! Jetzt verhält es sich wie ein schlauer Makro-Pacman ! eine Einschränkung; Wenn das Argument groß ist und einen Fehler auslöst, springt der Punkt irgendwo zurück. Können Sie es beschweren, während Sie an seinem aktuellen Platz stehen?
Promotion am
@giordano Gibt es eine Chance, dass dies in AucTex gelingt? Es ist sehr nützlich!
Tyler
9

Vom AUCTeX-Handbuchknoten zum Ändern der Schriftart :

C-c C-f C-d

Delete the innermost font specification containing point.
Dan
quelle
Das war ein sehr praktischer Teil in der Dokumentation, den ich verpasst habe. Vielen Dank.
Promotion am
Es funktioniert jedoch nur für Schriftartenspezifikationen (und die Überprüfung ist sinnvoll, da beispielsweise die Schrift \emph{\randommacro{test}}gelöscht wird \emph).
T. Verron
@ T.Verron: gute Klarstellung. Mir ist keine integrierte Möglichkeit bekannt, dies für beliebige LaTeX-Makros zu tun.
Dan
4

Hier ist eine einfache Funktion, um das enthaltende Makro an Punkt zu entfernen:

(defun TeX-remove-macro ()
  "Remove current macro and return `t'.  If no macro at point,
return `nil'."
  (interactive)
  (when (TeX-current-macro)
    (let ((bounds (TeX-find-macro-boundaries))
          (brace  (save-excursion
                    (goto-char (1- (TeX-find-macro-end)))
                    (TeX-find-opening-brace))))
      (delete-region (1- (cdr bounds)) (cdr bounds))
      (delete-region (car bounds) (1+ brace)))
    t))

Daher mit *als Punkt:

\footnote{Here's a * footnote} 
  => Here's a footnote

In Anbetracht der obigen Funktion ist es ein Einzeiler, alle Makros an Punkt zu entfernen:

(defun TeX-remove-all-macros ()
  "Remove all containing macros for text at point."
  (interactive)
  (while (TeX-remove-macro)))

Daher noch einmal mit *als Punkt:

\footnote{Here's a \textbf{footnote with \emph{emphasized * text}}} 
  => Here's a footnote with emphasized text
Dan
quelle