Metin içeriğini korurken bir LaTeX makrosu nasıl silinir?


11

TeXStudio'da imleç böyle bir LaTeX makrosunda ALT+ düğmesine basarak ilkinden hemen önce dururken (aşağıda gösterildiği gibi) dışındaki tüm öğelerin silinmesine neden olur . DEL\macroname{content}{content

resim açıklamasını buraya girin
İmleci (nokta) ilk süslü ayraçtan hemen önce getirin:

resim açıklamasını buraya girin

ALT+ Tuşuna basın DELve şunları elde edin:

resim açıklamasını buraya girin

Emacs'ta bunu nasıl başarabilirim?

Güncelleme
T.Verron'un açıklamasına göre, LaTeX'teki C-c C-f C-dbazı makrolarda yürütüldüğünde dengesiz parantez hatasından şikayet ettiği için bir sorun var . Aşağıdaki örneği düşünün:
resim açıklamasını buraya girin

Bu hatayı atar: up-list: Scan error: "Unbalanced parentheses", 8074, 1. \ textenglish {} çok eşlilikli pakete aittir.

Bu uyarıdan nasıl kurtuluruz?


Hem, mevcut cevabı olan uyarı, auctex'in makroyu fontive edip etmediği değil, makronun lateks yazı tipi spesifikasyonu (muhtemelen tarafından tanımlandığı gibi TeX-font-list) olup olmadığı ile ilgilidir. Örneğin, \sectionveya ile deneyin \footnote, AUCTeX bu makroları bilir ve fondanlar, ancak C-c C-f C-ddengesiz parantezlerden şikayet eder.
T. Verron

Bunu TeX-font-listyeni tanıtılan makrolarımı içerecek şekilde güncelleyebilsem bile , bu yetersiz bir geçici çözüm olmaya devam ediyor. Aksi takdirde, hangi eLISP işlevine sahip önleyicilerin bununla başa çıkacağını bilmiyorum!
doktora

Yanıtlar:


11

Bu işlevi deneyin:

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

Sınırlama: kelimesi kelimesine benzeyen makrolarla çalışmaz. Wrong type argument: integer-or-marker-p, nilEvrensel bağımsız değişken, makroları kapsayan nokta sayısından büyükse bu işlev bir error ( ) atar .

İşlevi favori kısayolunuza bağlayın. Örneğin

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

bağlamak için M-DEL.

Tamponunuz ( !nokta) ise

\onemacro{\anothermacro{!argument}}

o zaman C-2 M-DELsana verecek

\anothermacro{argument}

İçteki grup içinde nokta ise (gr1(gr2(gr3(gr4)))), bir önek demek istiyorsunuz C-usonra 2 beni verecektir: (gr1(gr2))? eğer öyleyse, bu parlak olmalı. Umarım bunu yapacak vaktin olmuştur.
doktora

Ben bunu bağlı M-DELTexStudio olduğu gibi. Teşekkürler.
doktora

@doctorate Eh, hayır, benim fikrim gr3senin durumunda sadece ikinci makroyu silmek . Güncellenmiş cevaba bakınız. Eğer bir sararak önerdi uygulayabilir dotimesetrafta whencevap orijinal versiyonunun.
Giordano

Harika fonksiyon! Şimdi akıllı bir makro pacman gibi davranıyor ! bir uyarı olsa; argüman büyük olduğunda ve hata verirse nokta geriye doğru bir yere atlar . Mevcut yerinde dururken şikayet edebilir misiniz?
doktora

@giordano Bunun AucTex'e dönüşme şansı var mı? Bu çok kullanışlı!
Tyler

9

Gönderen yazı tipinin değiştirilmesi üzerine AUCTeX manuel düğümü :

C-c C-f C-d

Delete the innermost font specification containing point.

kaçırdığım belgelerde çok kullanışlı bir parçaydı. Teşekkürler.
doktora

Ancak yalnızca yazı tipi spesifikasyonları için çalışır (ve doğrulama mantıklıdır, örneğin \emph{\randommacro{test}}, siler \emph).
T. Verron

@ T.Verron: iyi açıklama. Bunu keyfi LaTeX makroları için yapmanın yerleşik bir yolunun farkında değilim.
Dan

4

Noktadaki makroyu kaldırmak için basit bir fonksiyon:

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

Dolayısıyla, *nokta olarak:

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

Yukarıdaki işlev göz önüne alındığında, noktadaki tüm makroları kaldırmak için bir astar vardır:

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

Bu nedenle, yine *nokta olarak:

\footnote{Here's a \textbf{footnote with \emph{emphasized * text}}} 
  => Here's a footnote with emphasized text
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.