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.