Behandeln des Inhalts einer TeX-Gruppe ({\blah ...}) als Makroargumente

Behandeln des Inhalts einer TeX-Gruppe ({\blah ...}) als Makroargumente

Ich versuche, Anpassungen an einem großen Dokument vorzunehmen, das Makros im TeX-Stil verwendet, wie folgt:

{\defun SomeFunctionName arg1 arg2}

Das \defunMakro wird als definiert \newcommand{\defun}{\tt}.

Kann ich diese Definition anpassen, um den SomeFunctionName arg1 arg2Teil als Argument abzurufen und so eine komplexere Definition zu ermöglichen? Wenn es defunsich beispielsweise um ein richtiges LaTeX-Makro handeln würde, könnte ich einen Rahmen um den Text setzen oder etwas davor und danach usw. einfügen.

Minimalbeispiel:

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

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

Wie kann ich (zum Beispiel) vor und nach jedem Aufruf von Text hinzufügen defun? Was ist der allgemeine Ansatz, um den Inhalt von {\defun ...}als Argument zu behandeln, ohne alle Vorkommen zu bearbeiten?

Zur Klarstellung: Dies ist ein umfangreiches, zwei Jahrzehnte altes Dokument. Ich habe es nicht geschrieben.

Antwort1

Bildbeschreibung hier eingeben

\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}

Hier

\iffalse}\fi

dehnt sich zu nichts aus, also

\expandafter{\iffalse}\fi

wird zu einem einzelnen nicht übereinstimmenden Wert erweitert {, ist aber ein Matching {}und kann daher in eine Definition aufgenommen werden.

So gegeben

 {\defun SomeFunctionName}

Das {startet eine Gruppe und

\defun SomeFunctionName}

erweitert sich in einem Schritt auf

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

und im nächsten Schritt

\zdefun{SomeFunctionName}

\zdefunhat ein normales #1Argument, das durch das {gerade eingefügte und das }ursprünglich in der Datei vorhandene Zeichen abgegrenzt wird. (Beachten Sie, dass dies }ursprünglich ein Gruppenabschluss-Trennzeichen war. Jetzt wird es als Argument-Trennzeichen verwendet und schließt daher keine Gruppe.)

Dies erweitert sich also in einem Schritt zu

A \fbox{SomeFunctionName} B\egroup

und das

A \fbox{SomeFunctionName} B

gesetzt und schließlich die

\egroup

{schließt die in der Originaldatei gestartete Gruppe .

Antwort2

Mein bevorzugter Ansatz wäre: Verwenden Sie die Suchen-und-Ersetzen-Funktion des Editors Ihrer Wahl und ersetzen Sie {\defundurch \textdefun{.

EDIT: Wie @Clément anmerkt, funktioniert dies in Fällen wie nicht \section{\defun abc def}. Ich fürchte, diese Fälle würden sogar einem ausgefeilteren, auf regulären Ausdrücken basierenden Ansatz nicht möglich sein, da man eine zusätzliche schließende Klammer hinzufügen müsste.

Antwort3

Sie können dies tun mit \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}

Es gilt die gleiche Einschränkung wie in David Carlisles Antwort: Aufrufe von , \defundie nicht innerhalb einer Klammer erscheinen, werden unterbrochen. Im Fall von

\section{\defun Whatever}

der Fehler tritt bei der Verarbeitung auf \tableofcontents. Aber \section{{\defun Whatever}}es verhält sich gut.

Bildbeschreibung hier eingeben

verwandte Informationen