Як видалити макрос LaTeX, зберігаючи його текстовий вміст?


11

У TeXStudio, натиснувши ALT+ DELу такому макросі LaTeX, \macroname{content}поки курсор стоїть безпосередньо перед першим {, призведе до видалення всього, крім його content(як показано нижче).

введіть тут опис зображення
Поставте курсор (крапку) безпосередньо перед першою фігурною дужкою:

введіть тут опис зображення

Натисніть ALT+, DELі ви отримаєте:

введіть тут опис зображення

Як цього досягти в Emacs?

Оновлення
Відповідно до роз'яснення Т.Веррона, існує проблема, C-c C-f C-dоскільки вона скаржиться на помилку незбалансованих дужок при виконанні в деяких макросах LaTeX. Розглянемо нижченаведений приклад:
введіть тут опис зображення

видає цю помилку: up-list: Scan error: "Unbalanced parentheses", 8074, 1. \ textenglish {} належить до пакету polyglossia.

Як позбутися цього застереження?


Так, застереження з поточною відповіддю полягає не в тому, чи auctex fontifies макрос чи ні, а в тому, чи є макрос специфікацією шрифту латексу (можливо, як визначено TeX-font-list) чи ні. Наприклад, спробуйте \sectionабо \footnote, AUCTeX знає про ці макроси та підтримує їх, але C-c C-f C-dскаржиться на незбалансовані дужки.
Т. Веррон

Навіть якщо я можу оновити це TeX-font-listдля включення моїх нещодавно введених макросів, це залишається неоптимальним рішенням. В іншому випадку я не знаю, які prvents, що мають функцію eLISP, щоб боротися з цим!
докторантура

Відповіді:


11

Спробуйте цю функцію:

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

Обмеження: не працює з дословно схожими макросами. Ця функція видасть помилку ( Wrong type argument: integer-or-marker-p, nil), якщо універсальний аргумент більший за кількість точок, що оточують макросів.

Прив’яжіть функцію до улюбленого ярлика. Наприклад

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

зв’язати це M-DEL.

Якщо у буфера є ( !є точка)

\onemacro{\anothermacro{!argument}}

то C-2 M-DELдасть тобі

\anothermacro{argument}

Якщо точка всередині найпотаємнішої групи (gr1(gr2(gr3(gr4))))ви маєте на увазі приставку, C-uто 2 вона дасть мені (gr1(gr2)):? якщо так, то це повинно бути геніальним. Я сподіваюся, що ви встигли це зробити.
докторантура

Я зв'язав це, M-DELяк у TexStudio. Дякую.
докторантура

@docto Ну, ні, моя ідея полягає у тому, щоб gr3у вашому випадку видалити лише другий макрос . Дивіться оновлену відповідь. Ви можете реалізувати те, що запропонували, обернувши dotimesнавколо whenоригінальної версії відповіді.
giordano

Відмінна функція! Тепер він поводиться, як розумний макропакман ! одна застереження, хоча; коли аргумент великий і він видає помилку, точка стрибає кудись назад. Чи можете ви змусити скаржитися, стоячи на своєму нинішньому місці?
докторантура

@giordano Будь-який шанс це перетворить на AucTex? Це дуже корисно!
Тайлер

9

З вузла вручну AUCTeX про зміну шрифту :

C-c C-f C-d

Delete the innermost font specification containing point.

це було дуже зручно в документації, яку я пропустив. Дякую.
докторантура

Але він працює лише для специфікацій шрифту (і перевірка має сенс, наприклад, \emph{\randommacro{test}}він видалить \emph).
Т. Веррон

@ T.Verron: добре уточнення. Мені невідомий вбудований спосіб зробити це для довільних макросів LaTeX.
Дан

4

Ось проста функція для видалення містять макрос у точці:

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

Отже, з *точки:

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

З огляду на вищевказану функцію, це однолінійне видалення всіх макросів у точці:

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

Отже, знову з *точкою:

\footnote{Here's a \textbf{footnote with \emph{emphasized * text}}} 
  => Here's a footnote with emphasized text
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.