将 TeX 样式组 ({\blah ...}) 的内容视为宏参数

将 TeX 样式组 ({\blah ...}) 的内容视为宏参数

我正在尝试对使用 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}}会表现良好。

在此处输入图片描述

相关内容