Come eliminare una macro LaTeX preservandone il contenuto testuale?


11

In TeXStudio premendo ALT+ DELin una macro LaTeX in questo modo \macroname{content}mentre il cursore si trova appena prima del primo, si {otterrà l'eliminazione di tutto ciò tranne il suo content(come mostrato di seguito).

inserisci qui la descrizione dell'immagine
Posiziona il cursore (punto) appena prima della prima parentesi graffa:

inserisci qui la descrizione dell'immagine

Premi ALT+ DELe otterrai:

inserisci qui la descrizione dell'immagine

Come raggiungere questo obiettivo in Emacs?

Aggiornamento
Secondo il chiarimento di T.Verron c'è un problema in C-c C-f C-dquanto si lamenta dell'errore di parentesi sbilanciata quando eseguita all'interno di alcune macro in LaTeX. Considera l'esempio seguente:
inserisci qui la descrizione dell'immagine

getta questo errore: up-list: Scan error: "Unbalanced parentheses", 8074, 1. \ textenglish {} appartiene al pacchetto poliglossia.

Come sbarazzarsi di questo avvertimento?


Ehm, l'avvertenza con la risposta attuale non riguarda se auctex fontifica la macro o meno, si tratta se la macro è una specifica del carattere in lattice (probabilmente come definita da TeX-font-list) oppure no. Ad esempio, prova con \sectiono \footnote, AUCTeX conosce queste macro e le differenzia, ma C-c C-f C-dsi lamenterà di parentesi sbilanciate.
T. Verron,

Anche se posso aggiornarlo TeX-font-listper includere le mie macro appena introdotte, questo rimane una soluzione alternativa non ottimale. Altrimenti, non so quali soggetti hanno una funzione eLISP per gestirli!
dottorato il

Risposte:


11

Prova questa funzione:

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

Limitazione: non funziona con macro simili a parole. Questa funzione genererà un errore ( Wrong type argument: integer-or-marker-p, nil) se l'argomento universale è maggiore del numero di macro che racchiudono il punto.

Associa la funzione al tuo collegamento preferito. Per esempio

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

per vincolarlo M-DEL.

Se il buffer ha ( !è il punto)

\onemacro{\anothermacro{!argument}}

allora C-2 M-DELti darà

\anothermacro{argument}

Se il punto all'interno del gruppo più interno (gr1(gr2(gr3(gr4))))si intende per un prefisso C-u, allora 2 che mi darà: (gr1(gr2))? se è così, deve essere geniale. Spero che tu abbia avuto il tempo di farlo.
dottorato il

L'ho legato a Mi M-DELpiace in TexStudio. Grazie.
dottorato il

@doctorate Bene, no, la mia idea è quella di eliminare solo la seconda macro, gr3nel tuo caso. Vedi la risposta aggiornata. È possibile implementare quello che hai suggerito avvolgendo un dotimesgiro whendella versione originale della risposta.
giordano,

Ottima funzione! Ora si comporta come un macro-pacman intelligente ! un avvertimento però; quando l'argomento è grande e genera un errore il punto salta da qualche parte all'indietro. Puoi farti lamentare mentre ti trovi nel suo posto attuale?
dottorato il

@giordano Qualche possibilità che lo trasformi in AucTex? È molto utile!
Tyler,

9

Dal nodo manuale AUCTeX su Modifica del carattere :

C-c C-f C-d

Delete the innermost font specification containing point.

quello era un pezzo molto utile nella documentazione che mi mancava. Grazie.
dottorato il

Ma funziona solo per le specifiche dei caratteri (e la verifica ha senso, ad esempio perché \emph{\randommacro{test}}eliminerà il \emph).
T. Verron,

@ T.Verron: buon chiarimento. Non sono a conoscenza di un modo integrato per farlo per macro LaTeX arbitrarie.
Dan

4

Ecco una semplice funzione per rimuovere la macro contenente al punto:

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

Quindi, con *come punto:

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

Data la funzione sopra, è un one-liner per rimuovere tutte le macro al punto:

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

Quindi, sempre con *il punto:

\footnote{Here's a \textbf{footnote with \emph{emphasized * text}}} 
  => Here's a footnote with emphasized text
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.