\newcommand:組合(可選)星號和可選參數

\newcommand:組合(可選)星號和可選參數

我如何定義一個新命令來接受帶有星號和沒有星號的變體,並且還接受可選參數?

我嘗試了以下方法:

\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}

在此輸入影像描述

相關內容