Làm cách nào để xóa macro LaTeX trong khi bảo tồn nội dung văn bản của nó?


11

Trong TeXStudio bằng cách nhấn ALT+ DELtrong macro LaTeX như thế này \macroname{content}trong khi con trỏ đứng ngay trước dấu đầu tiên {sẽ dẫn đến xóa tất cả những thứ đó ngoại trừ nó content(như hiển thị bên dưới).

nhập mô tả hình ảnh ở đây
Đặt con trỏ (điểm) ngay trước dấu ngoặc nhọn đầu tiên:

nhập mô tả hình ảnh ở đây

Lượt ALT+ DELvà bạn nhận được:

nhập mô tả hình ảnh ở đây

Làm thế nào để đạt được điều này trong Emacs?

Cập nhật
Theo sự làm rõ của T.Verron, có một vấn đề C-c C-f C-dvì nó phàn nàn về lỗi của dấu ngoặc đơn không cân bằng khi được thực thi trong một số macro trong LaTeX. Hãy xem xét ví dụ dưới đây:
nhập mô tả hình ảnh ở đây

ném lỗi này : up-list: Scan error: "Unbalanced parentheses", 8074, 1. \ textenglish {} thuộc gói polyglossia.

Làm thế nào để thoát khỏi cảnh báo này?


Hem, cảnh báo với câu trả lời hiện tại không phải là về việc auctex có phông chữ macro hay không, mà là về việc macro có phải là một đặc tả phông chữ latex (có thể như được định nghĩa bởi TeX-font-list) hay không. Ví dụ: hãy thử với \sectionhoặc \footnote, AocateeX biết về các macro này và phông chữ chúng, nhưng C-c C-f C-dsẽ phàn nàn về dấu ngoặc đơn không cân bằng.
T. Verron

Ngay cả khi tôi có thể cập nhật điều này TeX-font-listđể bao gồm các macro mới được giới thiệu của mình, đây vẫn là một cách giải quyết tối ưu. Mặt khác, tôi không biết những gì prvents có chức năng eLISP để đối phó với nó!
tiến sĩ

Câu trả lời:


11

Hãy thử chức năng này:

(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))))

Giới hạn: không hoạt động với các macro giống như nguyên văn. Hàm này sẽ đưa ra một lỗi ( Wrong type argument: integer-or-marker-p, nil) nếu đối số phổ quát lớn hơn số lượng điểm bao quanh macro.

Liên kết các chức năng với phím tắt yêu thích của bạn. Ví dụ

(eval-after-load "tex"
  '(local-set-key (kbd "M-DEL") 'mg-TeX-delete-current-macro))

để ràng buộc nó M-DEL.

Nếu bộ đệm của bạn có ( !là điểm)

\onemacro{\anothermacro{!argument}}

sau đó C-2 M-DELsẽ cho bạn

\anothermacro{argument}

Nếu điểm bên trong nhóm trong cùng (gr1(gr2(gr3(gr4))))có nghĩa là bạn có tiền tố C-uthì 2 nó sẽ cho tôi : (gr1(gr2))? nếu nó là như vậy, đó phải là rực rỡ. Tôi hy vọng bạn đã có thời gian để làm điều đó.
tiến sĩ

Tôi ràng buộc nó M-DELnhư thế nào trong TexStudio. Cảm ơn.
tiến sĩ

@doctorate Vâng, không, ý tưởng của tôi là chỉ xóa macro thứ hai, gr3trong trường hợp của bạn. Xem câu trả lời cập nhật. Bạn có thể thực hiện những gì bạn đề xuất bằng cách gói dotimesxung quanh whenphiên bản gốc của câu trả lời.
giordano

Chức năng tuyệt vời! Bây giờ nó hoạt động như một pacman vĩ mô thông minh ! một cảnh báo mặc dù; khi đối số lớn và nó ném một lỗi, điểm sẽ nhảy ở đâu đó lùi lại. Bạn có thể làm cho nó phàn nàn trong khi đứng ở vị trí hiện tại của nó?
tiến sĩ

@giordano Bất cứ cơ hội nào điều này sẽ biến nó thành AucTex? Nó rất hữu ích!
Tyler

9

Từ nút thủ công AocateeX về Thay đổi phông chữ :

C-c C-f C-d

Delete the innermost font specification containing point.

đó là một phần rất tiện dụng trong tài liệu mà tôi đã bỏ lỡ. Cảm ơn.
tiến sĩ

Nhưng nó chỉ hoạt động cho các đặc tả phông chữ (và xác minh có ý nghĩa, ví dụ như \emph{\randommacro{test}}nó sẽ xóa \emph).
T. Verron

@ T.Verron: làm rõ tốt. Tôi không biết một cách tích hợp để thực hiện việc này đối với các macro LaTeX tùy ý.
Dan

4

Đây là một chức năng đơn giản để loại bỏ macro chứa tại điểm:

(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))

Do đó, với *điểm:

\footnote{Here's a * footnote} 
  => Here's a footnote

Với chức năng trên, đây là một lớp lót để loại bỏ tất cả các macro tại điểm:

(defun TeX-remove-all-macros ()
  "Remove all containing macros for text at point."
  (interactive)
  (while (TeX-remove-macro)))

Do đó, một lần nữa với *quan điểm:

\footnote{Here's a \textbf{footnote with \emph{emphasized * text}}} 
  => Here's a footnote with emphasized text
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.