如何在保留其文本内容的同时删除LaTeX宏?


11

在TeXStudio中,通过像这样在LaTeX宏中按ALT+ DEL\macroname{content}而光标位于第一个光标之前,{将导致删除除光标之外的所有内容content(如下所示)。

在此处输入图片说明
将光标(点)放在第一个大括号之前:

在此处输入图片说明

ALT+ DEL,您将获得:

在此处输入图片说明

如何在Emacs中实现这一目标?

更新
根据T.Verron的说明,存在问题,C-c C-f C-d因为它在LaTeX的某些宏中执行时抱怨括号不平衡的错误。考虑以下示例:
在此处输入图片说明

引发此错误: up-list: Scan error: "Unbalanced parentheses", 8074, 1。\ textenglish {}属于多语制软件包。

如何摆脱这一警告?


m,当前答案的警告不是关于auctex是否将宏字体化,而是关于宏是否为乳胶字体规范(可能由定义TeX-font-list)。例如,尝试使用\section\footnote,AUCTeX知道这些宏并将其字体化,但是C-c C-f C-d会抱怨括号不平衡。
T. Verron 2015年

即使我可以对其进行更新TeX-font-list以包括新引入的宏,这仍然是次优的解决方法。否则,我不知道具有eLISP功能的是什么!
博士学位

Answers:


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

功能强大!现在,它的行为就像一个聪明的巨人!一个警告 当参数很大并且引发错误时,该点将向后跳转。您能站在它的当前位置时抱怨吗?
博士学位

@giordano是否有可能将其纳入AucTex?这非常有用!
泰勒(Tyler)

9

AUCTeX手动节点上,更改字体

C-c C-f C-d

Delete the innermost font specification containing point.

这在我错过的文档中非常方便。谢谢。
博士学位

但这仅适用于字体规范(并且验证很有意义,例如,\emph{\randommacro{test}}它将删除\emph)。
T. Verron 2015年

@ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.