我如何定義一個新命令來接受帶有星號和沒有星號的變體,並且還接受可選參數?
我嘗試了以下方法:
\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]
會尋找一個可選參數「whileexpansion」\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}