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

與大衛卡萊爾的答案相同的限制是:\defun沒有出現在一對大括號內的呼叫將會中斷。如果是

\section{\defun Whatever}

處理時會出現錯誤\tableofcontents。但\section{{\defun Whatever}}會表現得很好。

在此輸入影像描述

相關內容