별표가 있는 변형과 별표가 없는 변형을 허용하고 선택적 인수도 허용하는 새 명령을 어떻게 정의할 수 있습니까?
나는 다음을 시도했다:
\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]
"확장하는 동안" 선택적 인수를 찾고 다음 \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}