我有一些Latex代码,其中包含许多数学表达式,包含在\ mathrm {}中。我想删除表达式周围的\ mathrm {}代码,最好使用emacs。例如,我想替换
\mathrm{\gamma \cdot x_0}
与
\gamma \cdot x_0
删除\ mathrm {只是很简单,但我还需要删除结束括号。我怎么能在emacs中这样做?
非常感谢,
恩诺
答案 0 :(得分:7)
您可以使用返回引用来解决此问题。运行
M-x query-replace-regexp
并在第一个提示符处输入\\mathrm{\([\a-z0-9_ ]+\)}
,在第二个提示符处输入\1
。
query-replace-regexp
的默认键绑定是 C-M - %。
\1
是要替换的正则表达式中第一个带括号的组\([\a-z0-9_ ]+\)
的后向引用。该组以大括号之间的内容为目标。所以你要说的是,对于任何要替换的正则表达式,你只想保留那些内容。
有关替换正则表达式的更多信息可以在here或Emacs手册的相应info
节点中找到。
答案 1 :(得分:2)
命令query-replace-regexp
非常灵活。您可以将replace-re-search-function
设置为您自己的搜索功能。
在此基础上,以下lisp代码定义了一个新命令query-replace-re+sexp
,它用于搜索正则表达式,但在匹配中包含尾随性别。
在评估下面的defun
后,您可以使用M-x query-replace-re+sexp
作为查询替换功能。在您的示例中,输入为“from”-string \\\\mathrm
和“replace-with”-string \\1
。在那里,表达式\\1
指的是由尾随的sexp(没有分隔符)产生的附加子表达式。
(defun re+sexp-search-forward (regexp bound noerror)
"Search forward for REGEXP (like `re-search-forward')
but with appended sexp."
(when (re-search-forward regexp bound noerror)
(let ((md (match-data))
bsub esub)
(setq bsub (1+ (scan-sexps (goto-char (scan-sexps (point) 1)) -1))
esub (1- (point)))
(setcar (cdr md) (set-marker (make-marker) (point)))
(setq md (append md (list (set-marker (make-marker) bsub)
(set-marker (make-marker) esub))))
(set-match-data md)
(point))))
(defun query-replace-re+sexp ()
"Like `query-replace-regexp' but at each match it includes the trailing sexps
into the match as an additional subexpression (the last one)."
(interactive)
(let ((replace-re-search-function 're+sexp-search-forward)) (call-interactively 'query-replace-regexp)))
这应该是一个非常好的功能。不仅用于替换像
这样的LaTeX结构\mathrm{\frac{\gamma}{x_0}}
与
\frac{\gamma}{x_0}
但也适用于程序文本中的替换。例如,替换函数调用,如
doSomethingUseless(x+somethingUseful(y))
与
x+somethingUseful(y)