Ich versuche, Anpassungen an einem großen Dokument vorzunehmen, das Makros im TeX-Stil verwendet, wie folgt:
{\defun SomeFunctionName arg1 arg2}
Das \defun
Makro wird als definiert \newcommand{\defun}{\tt}
.
Kann ich diese Definition anpassen, um den SomeFunctionName arg1 arg2
Teil als Argument abzurufen und so eine komplexere Definition zu ermöglichen? Wenn es defun
sich 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
\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}
\zdefun
hat ein normales #1
Argument, 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 {\defun
durch \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 , \defun
die 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.