TeXスタイルのグループ({\blah ...})の内容をマクロ引数として扱う

TeXスタイルのグループ({\blah ...})の内容をマクロ引数として扱う

次のように、TeX スタイルのマクロを使用する大きなドキュメントを調整しようとしています。

{\defun SomeFunctionName arg1 arg2}

マクロ\defunは次のように定義されます\newcommand{\defun}{\tt}

この定義を調整して、SomeFunctionName arg1 arg2部分を引数として取得し、より複雑な定義を可能にすることはできますか? たとえば、defun適切な LaTeX マクロであれば、テキストの周囲にボックスを配置したり、前後に何かを配置したりできます。

最小限の例:

\documentclass{article}
\newcommand{\defun}{\tt}

\begin{document}
\section{\defun SomeFunctionName arg1 arg2}
Call {\defun SomeFunctionName} to foo the bar.
\end{document}

たとえば、 の呼び出しの前後にテキストを追加するにはどうすればよいでしょうか。のすべての出現を編集する以外に、 の内容を引数としてdefun処理する一般的な方法は何ですか。{\defun ...}

明確に言うと、これは 20 年前の大きな文書です。私が書いたものではありません。

答え1

ここに画像の説明を入力してください

\documentclass{article}

\protected\def\defun{\expandafter\zdefun\expandafter{\iffalse}\fi}

\def\zdefun#1{A \fbox{#1} B\egroup}

\begin{document}
\section{\defun SomeFunctionName arg1 arg2}
Call {\defun SomeFunctionName} to foo the bar.
\end{document}

ここ

\iffalse}\fi

何もなくなるので

\expandafter{\iffalse}\fi

単一の一致しないものに展開されます{が、一致する{}ため定義に含めることができます。

そう考えると

 {\defun SomeFunctionName}

{グループを開始し、

\defun SomeFunctionName}

一気に拡大して

\expandafter\zdefun\expandafter{\iffalse}\fi SomeFunctionName}

そして次のステップでは

\zdefun{SomeFunctionName}

\zdefun通常の引数は、先ほど挿入した と、元々ファイルに存在していた#1で区切られます。(これは元々グループ終了区切り文字でしたが、現在は引数区切り文字として使用されているので、グループを閉じません。){}}

これを1ステップで展開すると

A \fbox{SomeFunctionName} B\egroup

そしてその

A \fbox{SomeFunctionName} B

がタイプセットされ、最後に

\egroup

{元のファイルで開始されたグループを閉じます。

答え2

私が推奨する方法は、選択したエディターの検索と置換機能を使用して、{\defunに置き換えることです\textdefun{

編集: @Clément が指摘しているように、これは のような場合には機能しません\section{\defun abc def}。これらのケースでは、閉じ括弧を追加する必要があるため、より洗練された正規表現ベースのアプローチでさえも実行できないのではないかと心配しています。

答え3

以下の方法で実行できます\aftergroup:

\documentclass{article}

\protected\def\defun{\aftergroup\newdefun\aftergroup{}}
\newcommand\newdefun[1]{\fbox{#1}}

\begin{document}

\tableofcontents

\section{Here {\defun SomeFunctionName arg1 arg2}}
Call {\defun SomeFunctionName} to foo the bar.

\end{document}

デビッド・カーライルの回答と同じ制限が適用されます。\defun括弧のペアの中に現れないの呼び出しは壊れます。

\section{\defun Whatever}

処理時にエラーが発生します\tableofcontents。ただし、\section{{\defun Whatever}}正常に動作します。

ここに画像の説明を入力してください

関連情報