Tratar el contenido de un grupo de estilo TeX ({\blah ...}) como argumentos macro

Tratar el contenido de un grupo de estilo TeX ({\blah ...}) como argumentos macro

Estoy intentando realizar ajustes en un documento grande que utiliza macros estilo TeX, como este:

{\defun SomeFunctionName arg1 arg2}

La \defunmacro se define como \newcommand{\defun}{\tt}.

¿Puedo ajustar esta definición para recuperar la SomeFunctionName arg1 arg2parte como argumento y permitir una definición más compleja? Por ejemplo, si defunfuera una macro LaTeX adecuada, podría poner un cuadro alrededor del texto, o poner algo antes y después, etc.

Ejemplo mínimo:

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

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

¿Cómo podría (por ejemplo) agregar algo de texto antes y después de cada invocación de defun? ¿Cuál es el enfoque general para manejar el contenido de {\defun ...}como argumento, sin editar todas las ocurrencias?

Para aclarar: este es un documento extenso que tiene dos décadas de antigüedad. Yo no lo escribí.

Respuesta1

ingrese la descripción de la imagen aquí

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

Aquí

\iffalse}\fi

se expande a nada entonces

\expandafter{\iffalse}\fi

se expande a un único no coincidente {pero es una coincidencia, {}por lo que se puede incluir en una definición.

tan dado

 {\defun SomeFunctionName}

El {comienza un grupo y

\defun SomeFunctionName}

se expande en un solo paso para

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

y en el siguiente paso

\zdefun{SomeFunctionName}

\zdefun#1tiene un argumento normal que está delimitado por el que {acabamos de insertar y el }que estaba originalmente en el archivo. (Tenga en cuenta que }originalmente era un delimitador de cierre de grupo; ahora se usa como delimitador de argumento, por lo que no cierra un grupo).

Entonces esto se expande en un paso para

A \fbox{SomeFunctionName} B\egroup

y el

A \fbox{SomeFunctionName} B

se compone y finalmente el

\egroup

cierra el grupo iniciado por {en el archivo original.

Respuesta2

Mi enfoque preferido sería: utilizar la función de buscar y reemplazar de su editor preferido y reemplazarla {\defuncon \textdefun{.

EDITAR: Como señala @Clément, esto no funciona en casos como \section{\defun abc def}. Me temo que esos casos eludirían incluso un enfoque más sofisticado basado en expresiones regulares, porque habría que agregar una llave de cierre adicional.

Respuesta3

Puedes hacerlo con \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}

Tiene la misma limitación que la respuesta de David Carlisle: las llamadas \defunque no aparecen dentro de un par de llaves se romperán. En el caso de

\section{\defun Whatever}

el error será al procesar \tableofcontents. Pero \section{{\defun Whatever}}se portará bien.

ingrese la descripción de la imagen aquí

información relacionada