Estou tentando fazer ajustes em um documento grande que usa macros estilo TeX, assim:
{\defun SomeFunctionName arg1 arg2}
A \defun
macro é definida como \newcommand{\defun}{\tt}
.
Posso ajustar esta definição para recuperar a SomeFunctionName arg1 arg2
parte como argumento, para permitir uma definição mais complexa? Exemplo do Fox, se defun
fosse 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
\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}
\zdefun
tem um argumento normal #1
que é 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 {\defun
por \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 \defun
que 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.