Jak usunąć makro LaTeX zachowując jego zawartość tekstową?

11

W TeXStudio, naciskając ALT+ DELw takim makrze LaTeX, jak ten, \macroname{content}gdy kursor stoi tuż przed pierwszym, {spowoduje usunięcie wszystkiego oprócz jego content(jak pokazano poniżej).

wprowadź opis zdjęcia tutaj
Umieść kursor (punkt) tuż przed pierwszym nawiasiem klamrowym:

wprowadź opis zdjęcia tutaj

Naciśnij ALT+, DELa otrzymasz:

wprowadź opis zdjęcia tutaj

Jak to osiągnąć w Emacsie?

Aktualizacja
Zgodnie z wyjaśnieniem T.Verrona występuje problem, C-c C-f C-dponieważ narzeka on na błąd niezrównoważonego nawiasu podczas wykonywania w niektórych makrach w LaTeX. Rozważ poniższy przykład:
wprowadź opis zdjęcia tutaj

zgłasza ten błąd: up-list: Scan error: "Unbalanced parentheses", 8074, 1. \ textenglish {} należy do pakietu polyglossia.

Jak pozbyć się tego zastrzeżenia?

doktorat
źródło
Hem, zastrzeżenie z obecną odpowiedzią nie dotyczy tego, czy auctex czcionkuje makro, czy nie, chodzi o to, czy makro jest specyfikacją czcionki lateksowej (prawdopodobnie zgodnie z definicją TeX-font-list). Na przykład spróbuj za pomocą \sectionlub \footnote, AUCTeX wie o tych makrach i drukuje je czcionkami, ale C-c C-f C-dnarzeka na niezrównoważone nawiasy.
T. Verron
Nawet jeśli mogę to zaktualizować, TeX-font-listaby uwzględnić moje nowo wprowadzone makra, pozostaje to nieoptymalne obejście. W przeciwnym razie nie wiem, jakie przeszkody ma funkcja eLISP, aby sobie z tym poradzić!
doktorat

Odpowiedzi:

11

Wypróbuj tę funkcję:

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

Ograniczenie: nie działa z makrami dosłownie podobnymi. Ta funkcja wyrzuci błąd ( Wrong type argument: integer-or-marker-p, nil), jeśli uniwersalny argument jest większy niż liczba makr otaczających punkt.

Powiąż funkcję z ulubionym skrótem. Na przykład

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

związać to M-DEL.

Jeśli twój bufor ma ( !jest punkt)

\onemacro{\anothermacro{!argument}}

wtedy C-2 M-DELci dam

\anothermacro{argument}
Giordano
źródło
Jeśli punkt w wewnętrznej grupie (gr1(gr2(gr3(gr4))))masz na myśli prefiks, C-uto 2 da mi (gr1(gr2)):? jeśli tak, to musi być genialne. Mam nadzieję, że miałeś czas to zrobić.
doktorat
I wiąże go M-DELjak w TexStudio. Dzięki.
doktorat
@doctorate Cóż, nie, moim pomysłem jest usunięcie tylko drugiego makra, gr3w twoim przypadku. Zobacz zaktualizowaną odpowiedź. Możesz wdrożyć to, co zasugerowałeś, owijając dotimeswokół whenoryginalnej wersji odpowiedzi.
giordano,
Świetna funkcja! Teraz zachowuje się jak inteligentny makro-pacman ! jedno zastrzeżenie; gdy argument jest duży i generuje błąd, punkt skacze gdzieś do tyłu. Czy możesz narzekać, stojąc na obecnym miejscu?
doktorat
@giordano Czy jest jakaś szansa, że ​​trafi do AucTex? To jest bardzo użyteczne!
Tyler
9

Z ręcznego węzła AUCTeX na stronie Zmiana czcionki :

C-c C-f C-d

Delete the innermost font specification containing point.
Dan
źródło
był to bardzo przydatny element w dokumentacji, którą przegapiłem. Dzięki.
doktorat
Ale działa tylko w przypadku specyfikacji czcionek (i weryfikacja ma sens, na przykład, \emph{\randommacro{test}}ponieważ usunie \emph).
T. Verron
@ T.Verron: dobre wyjaśnienie. Nie znam wbudowanego sposobu, aby to zrobić dla dowolnych makr LaTeX.
Dan
4

Oto prosta funkcja usuwania zawierającego makro w punkcie:

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

Stąd *w punkcie:

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

Biorąc pod uwagę powyższą funkcję, jest to jedno-liniowy program do usuwania wszystkich makr w punkcie:

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

Dlatego też ponownie *w punkcie:

\footnote{Here's a \textbf{footnote with \emph{emphasized * text}}} 
  => Here's a footnote with emphasized text
Dan
źródło