Estoy intentando realizar ajustes en un documento grande que utiliza macros estilo TeX, como este:
{\defun SomeFunctionName arg1 arg2}
La \defun
macro se define como \newcommand{\defun}{\tt}
.
¿Puedo ajustar esta definición para recuperar la SomeFunctionName arg1 arg2
parte como argumento y permitir una definición más compleja? Por ejemplo, si defun
fuera 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
\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
#1
tiene 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 {\defun
con \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 \defun
que 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.