0

我有以下 Emacs 宏,它评估TeX-insert-macro选定文本上的 AucTex 命令:

(eval-after-load "latex"
  '(progn
     (define-key LaTeX-mode-map (kbd "C-c (")
       (lambda ()
     (interactive)
     (TeX-insert-macro "command")))))

但是,我将如何对所选文本执行正则表达式并将其传递给TeX-insert-macro

有关更多详细信息,请参阅此问题。

例如:假设我有以下文本:

…如图 (24) 所示。

现在,假设我选择“(24)”。然后,我想要一个命令将其转换为:

…如图 \command{eq:24} 所示。

即,我将如何定义一个新的 Emacs 命令,我可以放置在~/.emacs该命令中,该命令将C-C RET command RET在所选文本的正则表达式版本上运行?

为什么下面的正则表达式不起作用?

(eval-after-load "latex"
  '(progn
     (define-key LaTeX-mode-map (kbd "C-c )")
       (lambda ()
     (interactive)
     (query-replace-regexp "\(([0-9]+)\)" "\1")
     (TeX-insert-macro "eq")
))))

小改进:

如果我从左到右选择例如“(45)”然后通过键入运行代码,这会很好用C-c )

(eval-after-load "latex"
  '(progn
     (define-key LaTeX-mode-map (kbd "C-c )")
       (lambda ()
     (interactive)
     (exchange-point-and-mark)
     (replace-regexp "[\(\)]" "")
     (TeX-insert-macro "eq")
))))

但是,如果我从右到左选择“(45)”,它就不起作用,因为点和标记被翻转了。有没有办法确保点和标记不翻转,例如在exchange-point-and-mark翻转时运行?

此外,正则表达式还有其他问题,例如,如果附近有其他括号,它会变得贪婪。

谢谢

4

1 回答 1

1

我没有安装必要的库,也不知道 TeX 函数是如何工作的,但这样的事情可能会奏效。

(eval-after-load "latex"
  '(progn
     (defun my-insert-latex-command-macro (beginning end)
       (interactive "r")
       (goto-char beginning)
       (when (not (looking-at "(\\(.+?\\))"))
         (error "Region does not match expected pattern."))
       (push-mark)
       (replace-match "eq:\\1")
       (exchange-point-and-mark)
       (TeX-insert-macro "command")
       (goto-char (mark))
       (pop-mark))
     (define-key LaTeX-mode-map (kbd "C-c (") 'my-insert-latex-command-macro)))

使用"r"交互式参数可以方便地按升序为您提供区域边界,无论您在哪个方向标记它。

为避免正则表达式中的贪婪匹配,请使用非贪婪运算符 ( *?, +?, ??)。

请注意,您的正则表达式中没有足够的反斜杠转义。为了首先在正则表达式字符串中添加反斜杠,您首先需要考虑字符串转义。基本上,将反斜杠加倍。例如:这个:

(query-replace-regexp "\(([0-9]+)\)" "\1")

需要是这样的:

(query-replace-regexp "\\(([0-9]+)\\)" "\\1")
于 2013-10-06T05:47:15.160 回答