Как удалить макрос 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 {} относится к пакету полиглоссия.

Как избавиться от этого предостережения?


Hem, предостережение с текущим ответом не о том, определяет ли auctex макрос или нет, а о том, является ли макрос спецификацией латексного шрифта (вероятно, как определено 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. Спасибо.
докторская степень

@ doctorate Ну, нет, моя идея состоит в том, чтобы удалить только второй макрос, gr3в вашем случае. Смотрите обновленный ответ. Вы можете осуществить то , что вы предложили, обернув dotimesвокруг whenоригинальной версии ответа.
Джордано

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

@giordano Есть ли шанс, что это превратится в AucTex? Это очень полезно!
Тайлер

9

Из узла AUCTeX по изменению шрифта :

C-c C-f C-d

Delete the innermost font specification containing point.

это была очень удобная часть документации, которую я пропустил. Спасибо.
докторская степень

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

@ Т.Веррон: хорошие разъяснения. Я не знаю встроенного способа сделать это для произвольных макросов 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.