จะลบมาโคร LaTeX ในขณะที่รักษาเนื้อหาข้อความได้อย่างไร


11

ใน TeXStudio โดยการกดALT+ DELในแมโคร LaTeX เช่นนี้\macroname{content}ในขณะที่เคอร์เซอร์ยืนอยู่ก่อนหน้าแรก{จะทำให้การลบทั้งหมดยกเว้นcontent(ดังแสดงด้านล่าง)

ป้อนคำอธิบายรูปภาพที่นี่
วางเคอร์เซอร์ (จุด) ไว้หน้าวงเล็บปีกกาแรก:

ป้อนคำอธิบายรูปภาพที่นี่

กดALT+ DELและคุณจะได้รับ:

ป้อนคำอธิบายรูปภาพที่นี่

ทำอย่างไรจึงจะได้สิ่งนี้ใน Emacs?

ปรับปรุง
ตามการชี้แจงของ T.Verron มีปัญหาC-c C-f C-dเนื่องจากมันบ่นจากข้อผิดพลาดของวงเล็บไม่สมดุลเมื่อดำเนินการภายในแมโครบางตัวใน LaTeX ลองพิจารณาตัวอย่างด้านล่าง:
ป้อนคำอธิบายรูปภาพที่นี่

พ่นข้อผิดพลาดนี้: up-list: Scan error: "Unbalanced parentheses", 8074, 1. \ textenglish {} เป็นของแพ็คเกจ polyglossia

วิธีกำจัดข้อแม้นี้


เฮ็มข้อแม้ที่มีคำตอบปัจจุบันไม่ได้เกี่ยวกับว่า auctex fontifies แมโครหรือไม่มันเป็นเรื่องเกี่ยวกับว่าแมโครเป็นสเปคของตัวอักษรลาเท็กซ์ (อาจจะตามที่กำหนดโดยTeX-font-list) หรือไม่ ตัวอย่างเช่นลองใช้\sectionหรือ\footnoteAUCTeX รู้เกี่ยวกับมาโครเหล่านี้และทำให้เป็นแบบอักษร แต่C-c C-f C-dจะบ่นเกี่ยวกับวงเล็บที่ไม่สมดุล
T. Verron

แม้ว่าฉันจะสามารถอัปเดตสิ่งนี้TeX-font-listเพื่อรวมมาโครที่เพิ่งเปิดตัวใหม่ได้ แต่ก็ยังคงเป็นวิธีแก้ปัญหาที่ดีที่สุด มิฉะนั้นฉันไม่ทราบว่าสิ่งที่ prvents มีฟังก์ชั่น eLISP เพื่อจัดการกับมัน!
ปริญญาเอก

คำตอบ:


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

ฟังก์ชั่นที่ยอดเยี่ยม! ตอนนี้มันทำงานเหมือนมาโคร Pac-Man ที่ฉลาด! หนึ่งข้อแม้แม้ว่า; เมื่อการโต้แย้งมีขนาดใหญ่และมีข้อผิดพลาดเกิดขึ้นจุดจะกระโดดไปทางด้านหลัง คุณสามารถทำให้มันบ่นในขณะที่ยืนอยู่ในที่ปัจจุบันได้ไหม?
ปริญญาเอก

@giordano โอกาสใดที่จะทำให้เป็น AucTex? มันมีประโยชน์มาก!
Tyler

9

จากโหนดคู่มือ AUCTeX บนการเปลี่ยนฟอนต์ :

C-c C-f C-d

Delete the innermost font specification containing point.

นั่นเป็นงานที่มีประโยชน์มากในเอกสารที่ฉันพลาด ขอบคุณ
ปริญญาเอก

แต่ใช้งานได้เฉพาะกับข้อกำหนดแบบอักษร (และการตรวจสอบที่สมเหตุสมผลเช่น\emph{\randommacro{test}}มันจะลบ\emph)
T. Verron

@ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.