テキストの内容を保持しながらLaTeXマクロを削除する方法は?


11

TeXStudio では、カーソルを最初の直前に置いたまま、このようなLaTeXマクロでALT+ DELを押すと、(以下に示すように)それ以外のすべてが削除されます。 \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がマクロをフォント化するかどうかではなく、マクロが(おそらくで定義されているTeX-font-list)ラテックスフォント仕様であるかどうかに関するものです。例えば、としてみてください\sectionまたは\footnote、AUCTeXは、これらのマクロとfontifiesそれらについて知っているが、C-c C-f C-dアンバランス括弧に文句を言うでしょう。
T. Verron、2015年

これTeX-font-listを更新して、新しく導入したマクロを含めることができたとしても、これは最適ではない回避策のままです。それ以外の場合は、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

バッファに(!is is)がある場合

\onemacro{\anothermacro{!argument}}

それからC-2 M-DELあなたに与えるでしょう

\anothermacro{argument}

最も内側のグループ内のポイントが(gr1(gr2(gr3(gr4))))プレフィックスを意味する場合、C-u2を指定すると次のようになります(gr1(gr2))。もしそうなら、それは素晴らしいはずです。あなたにはそれをする時間があるといいのですが。
博士号

M-DELTexStudioで好きにバインドしました。ありがとう。
博士号

@doctorateまあ、いいえ、私の考えはgr3、あなたの場合、2番目のマクロだけを削除することです。更新された回答をご覧ください。あなたがラップによって提案何実装することができますdotimes周りのwhen答えのオリジナルバージョンのを。
giordano

素晴らしい機能!これで、スマートマクロパックマンのように動作します。ただし、1つの注意点があります。引数が大きく、エラーがスローされると、ポイントどこか後ろにジャンプします。現在の場所に立っているときに不平を言うことができますか?
博士号

@giordanoこれがAucTexになる可能性はありますか?とても便利です!
タイラー

9

フォントの変更に関するAUCTeX手動ノードから:

C-c C-f C-d

Delete the innermost font specification containing point.

これは、私が見逃したドキュメントの非常に便利な部分でした。ありがとう。
博士号

ただし、これはフォント仕様でのみ機能します(検証により、たとえば\emph{\randommacro{test}}が削除されます\emph)。
T. Verron、2015年

@ 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.