星付きと星なしのバリエーションを許可し、オプションの引数も許可する新しいコマンドを定義するにはどうすればよいでしょうか?
次のことを試しました:
\documentclass{minimal}
\makeatletter
\newcommand\MyCommand[1][1]{%
\@ifstar{%
The starred variant with parameter: #1%
}{%
The non-starred variant with parameter: #1%
}
}
\makeatother
\begin{document}
\MyCommand \\
\MyCommand* \\
\MyCommand[2] \\
\MyCommand*[2]
\end{document}
しかし、次のようになります:
パラメータ: 1 の星なしバリアント
パラメータ: 1 の
星ありバリアント パラメータ: 2 の
星なしバリアント パラメータ: 1[2]
それでも、\MyCommand[2]*
「パラメータ: 2 を持つスター付きバリアント」を取得するように記述することはできますが、どういうわけか上記のバージョンが機能することを望みます。
答え1
これを使用すると、xparse
オプションの引数とスター付きのバリアントを簡単に操作できます。
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\MyCommand
{
s % optional *
O{1} % first optional argument (default = 1)
}
{%
\IfBooleanTF{#1}
{The starred variant with parameter: #2}
{The non-starred variant with parameter: #2}
}
\begin{document}
\noindent
\MyCommand \\
\MyCommand* \\
\MyCommand[2]\\
\MyCommand*[2]
\end{document}
LaTeX の\newcommand
場合は少し複雑です。\@ifstar
マクロは、マクロが展開されて引数を吸収した後、次のトークンを参照します。そのため、最初に をチェックし、その後でオプションの引数を検索する必要があります*
。
\documentclass{article}
\makeatletter
\newcommand\MyCommand
{%
\@ifstar
{\MyCommand@star}
{\MyCommand@nostar}%
}
\newcommand\MyCommand@star[1][1]{%
The starred variant with parameter: #1%
}
\newcommand\MyCommand@nostar[1][1]{%
The non-starred variant with parameter: #1%
}
\makeatother
\begin{document}
\noindent
\MyCommand \\
\MyCommand* \\
\MyCommand[2]\\
\MyCommand*[2]
\end{document}
どちらのバージョンでも以下が印刷されます:
コードは動作しますが、期待どおりには動作しません。 は\MyCommand[1][1]
オプションの引数「while expand」を探し\MyCommand
、次の結果を返します。
\@ifstar{%
The starred variant with parameter: <optional argument or default>%
}{%
The non-starred variant with parameter: <optional argument or default>%
}
そして、その後テスト\@ifstar
はオプションを探すように拡張され*
、それに応じてテキストが選択されます。したがって、定義したコマンドの実際の構文は次のようになります。
\MyCommand[optional argument]<optional star>
答え2
パラメータを取らず\MyCommand
に、星だけを計算します。そこから分岐します。
\documentclass{minimal}
\makeatletter
\newcommand\MyCommand{%
\@ifstar{\mycommandstar}{\mycommandnostar}
}
\newcommand\mycommandstar[1][1]{The starred variant with parameter: #1}
\newcommand\mycommandnostar[1][1]{The non-starred variant with parameter: #1}
\makeatother
\begin{document}
\MyCommand \\
\MyCommand* \\
\MyCommand[2] \\
\MyCommand*[2]
\end{document}