萊克斯|更改巨集參數順序

萊克斯|更改巨集參數順序

在 LyX 中,是否可以變更巨集的必要參數和選項參數的順序?

我想讓選項參數出現在這個巨集中的必要參數之後。

如果可以的話我該怎麼做?

巨集的螢幕截圖

答案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.

總之,這是可以做的,但你可能不應該這樣做。

相關內容