我正在尝试对使用 TeX 样式宏的大型文档进行调整,如下所示:
{\defun SomeFunctionName arg1 arg2}
该\defun
宏定义为\newcommand{\defun}{\tt}
。
我可以调整此定义以检索SomeFunctionName arg1 arg2
部分作为参数,以允许更复杂的定义吗?例如,如果defun
是合适的 LaTeX 宏,我可以在文本周围放置一个框,或者在文本前后放置一些内容等。
最小示例:
\documentclass{article}
\newcommand{\defun}{\tt}
\begin{document}
\section{\defun SomeFunctionName arg1 arg2}
Call {\defun SomeFunctionName} to foo the bar.
\end{document}
我如何(例如)在每次调用之前和之后添加一些文本defun
? 除了编辑所有出现的内容之外,将的内容{\defun ...}
作为参数处理的一般方法是什么?
需要澄清的是:这是一份长达二十年的文件。它不是我写的。
答案1
\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}
这里
\iffalse}\fi
扩展到零,所以
\expandafter{\iffalse}\fi
扩展为单个不匹配{
但是匹配,{}
因此可以包含在定义中。
因此
{\defun SomeFunctionName}
开始{
一个组,
\defun SomeFunctionName}
一步扩展为
\expandafter\zdefun\expandafter{\iffalse}\fi SomeFunctionName}
下一步
\zdefun{SomeFunctionName}
\zdefun
有一个普通参数,它由我们刚刚插入的和文件中原来的#1
分隔。(请注意,这最初是一个组结束分隔符,现在用作参数分隔符,因此不会关闭组。){
}
}
因此,这只需一步就可以扩展为
A \fbox{SomeFunctionName} B\egroup
和
A \fbox{SomeFunctionName} B
排版,最后
\egroup
{
关闭原始文件中由 开始的组。
答案2
我喜欢的方法是:使用您选择的编辑器的查找和替换功能,然后替换{\defun
为\textdefun{
。
编辑:正如@Clément 指出的那样,这在以下情况下不起作用\section{\defun abc def}
。我担心这些情况甚至会逃避更复杂的基于正则表达式的方法,因为必须添加额外的右括号。
答案3
你可以这样做\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}
与 David Carlisle 的回答相同的限制仍然存在:\defun
未出现在括号内的调用将会中断。在
\section{\defun Whatever}
处理时会出现错误\tableofcontents
。但\section{{\defun Whatever}}
会表现良好。