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?


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}

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.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.