LyX | マクロ引数の順序を変更する

LyX | マクロ引数の順序を変更する

LyX では、マクロの必須引数とオプション引数の順序を変更することは可能ですか?

このマクロでは、オプション引数を必須引数の後に置きたいと思います。

可能であれば、どうすればいいでしょうか?

マクロのスクリーンショット

答え1

これを実行することはお勧めしません。文書を読む他の人を混乱させるからです。また、すべてのマクロ、特に引数を読み取る前にカテゴリ コードを操作するマクロでは機能しません。とはいえ、これは可能です。

\flip以下は、必須引数とオプション引数をそれぞれ 1 つずつ持つように定義されたマクロの必須引数とオプション引数を反転するマクロを定義する LaTeX コードです。

\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

結論としては、それは可能ですが、おそらくやるべきではありません。

関連情報