Tratando o conteúdo de um grupo estilo TeX ({\blah ...}) como argumentos macro

Tratando o conteúdo de um grupo estilo TeX ({\blah ...}) como argumentos macro

Estou tentando fazer ajustes em um documento grande que usa macros estilo TeX, assim:

{\defun SomeFunctionName arg1 arg2}

A \defunmacro é definida como \newcommand{\defun}{\tt}.

Posso ajustar esta definição para recuperar a SomeFunctionName arg1 arg2parte como argumento, para permitir uma definição mais complexa? Exemplo do Fox, se defunfosse uma macro LaTeX adequada, eu poderia colocar uma caixa ao redor do texto, ou colocar algo antes e depois, etc.

Exemplo mínimo:

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

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

Como eu poderia (por exemplo) adicionar algum texto antes e depois de cada invocação de defun? Qual é a abordagem geral para lidar com o conteúdo {\defun ...}como um argumento, sem editar todas as ocorrências?

Para esclarecer: este é um documento grande, com duas décadas de existência. Eu não escrevi.

Responder1

insira a descrição da imagem aqui

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

Aqui

\iffalse}\fi

se expande para nada então

\expandafter{\iffalse}\fi

se expande para um único sem correspondência, {mas é uma correspondência, {}portanto pode ser incluído em uma definição.

Tão dado

 {\defun SomeFunctionName}

O {inicia um grupo e

\defun SomeFunctionName}

se expande em uma etapa para

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

e na próxima etapa para

\zdefun{SomeFunctionName}

\zdefuntem um argumento normal #1que é delimitado pelo {que acabamos de inserir e pelo }que estava originalmente no arquivo. (Observe que este }era originalmente um delimitador de fechamento de grupo, agora é usado como um delimitador de argumento, portanto não fecha um grupo.)

Então isso se expande em uma etapa para

A \fbox{SomeFunctionName} B\egroup

e a

A \fbox{SomeFunctionName} B

é digitado e, finalmente, o

\egroup

fecha o grupo iniciado por {no arquivo original.

Responder2

Minha abordagem preferida seria: use a função localizar e substituir do editor de sua preferência e substitua {\defunpor \textdefun{.

EDIT: Como aponta @Clément, isso não funciona em casos como \section{\defun abc def}. Receio que esses casos escapem até mesmo a uma abordagem mais sofisticada baseada em regexp, porque seria necessário adicionar uma chave de fechamento adicional.

Responder3

Você pode fazer isso com \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}

A mesma limitação da resposta de David Carlisle é válida: chamadas \defunque não aparecem dentro de um par de colchetes serão interrompidas. No caso de

\section{\defun Whatever}

o erro será durante o processamento \tableofcontents. Mas \section{{\defun Whatever}}vai se comportar bem.

insira a descrição da imagem aqui

informação relacionada