答案1
我不建議這樣做,因為這會讓閱讀您文件的其他人感到困惑。它也不適用於所有宏,特別是在讀取其參數之前使用類別代碼的宏。這就是說這是可能的。
下面是一些 LaTeX 程式碼,它定義了一個宏\flip
,該宏將翻轉宏的必需參數和可選參數,該宏被定義為恰好具有一個必要參數和一個可選參數。
\usepackage{etoolbox}
\makeatletter
\newcommand*\flip[1]{%
\cslet{flip@\string#1}#1%
\long\def#1##1{%
\@ifnextchar[{\@flip{#1}{##1}}{\csuse{flip@\string#1}{##1}}%
}%
}
\long\def\@flip#1#2[#3]{%
\csuse{flip@\string#1}[#3]{#2}%
}
\makeatother
例如,給定宏
\newcommand\foo[2][none]{%
\par
Required argument: #2\\
Optional argument: #1%
}
您可以編寫\flip\foo
一次,它將重新定義\foo
為採用必需參數,後面跟著可選參數。這是說明這一點的完整文件。
\documentclass{article}
\usepackage{parskip}
\usepackage{etoolbox}
\makeatletter
\newcommand*\flip[1]{%
\cslet{flip@\string#1}#1%
\long\def#1##1{%
\@ifnextchar[{\@flip{#1}{##1}}{\csuse{flip@\string#1}{##1}}%
}%
}
\long\def\@flip#1#2[#3]{%
\csuse{flip@\string#1}[#3]{#2}%
}
\makeatother
\newcommand\foo[2][none]{%
\par
Required argument: #2\\
Optional argument: #1%
}
\begin{document}
Normal use:
\foo{blah}
\foo[option]{asdf}
Now we can flip the arguments:
\flip\foo
\foo{blah}
\foo{asdf}[option]
\end{document}
我以前從未使用過 LyX,但我能夠將我的程式碼插入序言中並達到相同的效果。
請注意,這\flip
不考慮\long
巨集上的缺失(即透過\def
不帶\long
或透過系列定義的巨集\newcommand*
)。在某些情況下,這可能會導致令人困惑的錯誤。可以像etoolbox
修補巨集一樣來處理這個問題,但對於這個答案似乎不值得這樣做。
也可以進行定義\flip
,使其不重新定義其參數,而是\flip\foo{required}[optional]
擴展為\foo[optional]{required}
.類似的東西(未經測試)
\long\def\flip#1#2[#3]{#1[#3]{#2}}
這會將可選參數變成必需參數,但如果您沒有可選參數,則沒有理由使用\flip
.
總之,這是可以做的,但你可能不應該這樣做。