我正在嘗試對使用 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}}
會表現得很好。