Bagaimana cara menghapus makro LaTeX sambil mempertahankan konten teksnya?

11

Di TeXStudio dengan menekan ALT+ DELdi makro LaTeX seperti ini, \macroname{content}sedangkan kursor yang berdiri tepat sebelum yang pertama {akan menghasilkan penghapusan semua itu kecuali content(seperti yang ditunjukkan di bawah).

masukkan deskripsi gambar di sini
Letakkan kursor (titik) tepat sebelum braket keriting pertama:

masukkan deskripsi gambar di sini

Tekan ALT+ DELdan Anda mendapatkan:

masukkan deskripsi gambar di sini

Bagaimana cara mencapai ini di Emacs?

Pembaruan
Menurut klarifikasi T.Verron ada masalah dengan C-c C-f C-dkarena ia mengeluhkan kesalahan kurung yang tidak seimbang ketika dijalankan di dalam beberapa makro di LaTeX. Perhatikan contoh di bawah ini:
masukkan deskripsi gambar di sini

melempar kesalahan ini: up-list: Scan error: "Unbalanced parentheses", 8074, 1. \ textenglish {} milik paket polyglossia.

Bagaimana cara menyingkirkan peringatan ini?

gelar doktor
sumber
Hem, peringatan dengan jawaban saat ini bukan tentang apakah auctex mengklasifikasikan makro atau tidak, ini tentang apakah makro adalah spesifikasi font lateks (mungkin seperti yang didefinisikan oleh TeX-font-list) atau tidak. Misalnya, coba dengan \sectionatau \footnote, AUCTeX tahu tentang makro ini dan membuat font mereka, tetapi C-c C-f C-dakan mengeluh tentang tanda kurung tidak seimbang.
T. Verron
Bahkan jika saya dapat memperbarui ini TeX-font-listuntuk memasukkan makro saya yang baru diperkenalkan, ini tetap merupakan solusi yang kurang optimal. Kalau tidak, saya tidak tahu apa yang mencegah fungsi eLISP untuk menghadapinya!
doktoral

Jawaban:

11

Coba fungsi ini:

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

Batasan: tidak berfungsi dengan makro seperti kata demi kata. Fungsi ini akan melempar kesalahan ( Wrong type argument: integer-or-marker-p, nil) jika argumen universal lebih besar dari jumlah makro yang melampirkan titik.

Ikat fungsi ke pintasan favorit Anda. Sebagai contoh

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

untuk mengikatnya M-DEL.

Jika buffer Anda memiliki ( !is point)

\onemacro{\anothermacro{!argument}}

maka C-2 M-DELakan memberimu

\anothermacro{argument}
giordano
sumber
Jika titik di dalam grup terdalam yang (gr1(gr2(gr3(gr4))))Anda maksud dengan awalan C-umaka 2 akan memberi saya (gr1(gr2)):? jika demikian, itu pasti brilian. Saya harap Anda punya waktu untuk melakukannya.
doktoral
Saya terikat M-DELsuka di TexStudio. Terima kasih.
doktoral
@doktorasikan Ya, tidak, ide saya adalah menghapus hanya makro kedua, gr3dalam kasus Anda. Lihat jawaban yang diperbarui. Anda dapat menerapkan apa yang disarankan oleh membungkus dotimessekitar whendari versi asli dari jawabannya.
giordano
Fungsi hebat! Sekarang ia berperilaku seperti makro-pacman yang pintar ! satu peringatan; ketika argumennya besar dan melempar kesalahan, titiknya melompat ke belakang. Bisakah Anda membuatnya mengeluh sambil berdiri di tempatnya saat ini?
doktoral
@giordano Mungkinkah ini berhasil masuk ke AucTex? Ini sangat berguna!
Tyler
9

Dari simpul manual AUCTeX tentang Mengubah font :

C-c C-f C-d

Delete the innermost font specification containing point.
Dan
sumber
itu adalah bagian yang sangat berguna dalam dokumentasi yang saya lewatkan. Terima kasih.
doktoral
Tapi itu hanya berfungsi untuk spesifikasi font (dan verifikasi masuk akal, misalnya untuk \emph{\randommacro{test}}itu akan menghapus \emph).
T. Verron
@ T. Verron: klarifikasi yang baik. Saya tidak mengetahui cara bawaan untuk melakukan ini untuk makro LaTeX yang sewenang-wenang.
Dan
4

Berikut adalah fungsi sederhana untuk menghapus makro yang mengandung di titik:

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

Oleh karena itu, dengan *poin:

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

Dengan fungsi di atas, itu adalah satu-baris untuk menghapus semua makro pada titik:

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

Maka, sekali lagi dengan *poin:

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