代码之家  ›  专栏  ›  技术社区  ›  Laurent

将emacs latex中的所有类型的括号转换为\left\right格式

  •  2
  • Laurent  · 技术社区  · 9 年前

    在我的.macs中,我有以下功能

    ;; Put the point immediately after a closing paren. replace-matching-parens will
    ;; replace the closing ) with \right) and the matching start paren ( with
    ;; \left(.
    (defun replace-matching-parens ()
      (interactive)
      (save-excursion
      (let ((end-point (point)))
        (backward-list)
        (let ((start-point (point)))
          (goto-char end-point)
          (re-search-backward ")" nil t)
          (replace-match " \\\\right)" nil nil)
          (goto-char start-point)
          (re-search-forward "(" nil t)
          (replace-match "\\\\left( " nil nil)))))
    

    绑定到一个键以将匹配的(和)替换为\left(和\right)。我如何将此扩展到对[]和{}也有效,以便将它们替换为\left[和\right]resp。\左{和\右}。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Drew    9 年前

    这应该会让你开始。本质上,使用 backward-list 你需要给其他字符( ][}{ )暂时使用开括号和闭括号的语法。然后,您需要调整搜索和替换以使用这些字符,而不仅仅是普通的括号。

    (eval-when-compile (require 'cl))   ; case
    
    (defun replace-matching-parens (char)
      (interactive (list (char-before)))
      (unless (memq char '(?\) ?\] ?\}))
        (error "Cursor is not after `)', `]', or `}'"))
      (save-excursion
        (let ((syntable   (copy-syntax-table (syntax-table)))
              (end-point  (point)))
          (modify-syntax-entry ?\[ "(" syntable)
          (modify-syntax-entry ?\] ")" syntable)
          (modify-syntax-entry ?\{ "(" syntable)
          (modify-syntax-entry ?\} ")" syntable)
          (with-syntax-table syntable
            (backward-list)
            (let ((start-point  (point)))
              (goto-char end-point)
              (search-backward (format "%c" char) nil t)
              (replace-match (format " \\\\right%c" char) nil nil)
              (goto-char start-point)
              (search-forward (format "%c" (setq newchar  (case char
                                                            (?\) ?\( )
                                                            (?\] ?\[ )
                                                            (?\} ?\{ ))))
                              nil t)
              (replace-match (format "\\\\left%c " newchar) nil nil))))))