\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]"확장하는 동안" 선택적 인수를 찾고 다음 \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}

여기에 이미지 설명을 입력하세요

관련 정보