매크로에 저장된 인수 지정자를 포함한 NewDocumentCommand

매크로에 저장된 인수 지정자를 포함한 NewDocumentCommand

옵션 등에 따라 자동으로 다른 매크로를 생성하는 일부 매크로를 작성하려고 합니다.

을 사용할 수 있는지 \NewDocumentCommand{\somename}{\standardargs}, 즉 인수 목록 자체가 매크로에 '숨겨져' 있는지 궁금합니다.

다음은 작동하지 않는 짧은 예입니다(물론 불필요한 오버헤드는 제거됩니다).

\documentclass{article}

\usepackage{xparse}

\newcommand{\standardargs}{O{}+m}

\NewDocumentCommand{\somecmd}{\standardargs}{%
  % Do something more or less useful
  My args: #2
}


\begin{document}
\somecmd{Hello World}
\end{document}

오류 메시지는 다음과 같습니다

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! LaTeX error: "xparse/unknown-argument-type"
! 
! Unknown argument type '\standardargs' replaced by 'm'.
! 
! See the LaTeX3 documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

l.10 }

일부 메모

  • 나는 확신합니다. 이것은 확장 문제입니다.
  • ~이다대괄호 {}\NewDocumentCommand.
  • 이러한 표준 인수 목록의 사용/유용성은 의심스러울 수 있습니다. 이에 동의합니다.

답변1

\NewDocumentCommand예, 두 번째(매크로 정의) 인수를 가져오기 전에 매크로를 확장합니다 .

\documentclass{article}

\usepackage{xparse}

\newcommand{\standardargs}{O{}+m}

\expandafter\NewDocumentCommand\expandafter\somecmd\expandafter{\standardargs}{%
  % Do something more or less useful
  My args: #2
}


\begin{document}
\somecmd{Hello World}
\end{document}

답변2

l3을 사용하면 다음을 피할 수 있습니다.\expandafter

\documentclass{article}

\usepackage{xparse}

\newcommand{\standardargs}{O{}+m}

\ExplSyntaxOn
\def\MyNewDocumentCommand{\exp_args:NNo\NewDocumentCommand}
\ExplSyntaxOn
\MyNewDocumentCommand{\somecmd}{\standardargs}{%
  % Do something more or less useful
  My args: #2
}


\begin{document}
\somecmd{Hello World}
\end{document}

답변3

바로 확장 문제입니다. 정의는 다음과 같습니다 \NewDocumentCommand.

\cs_new_protected:Npn \NewDocumentCommand #1#2#3
  {
    \cs_if_exist:NTF #1
      {
        \__msg_kernel_error:nnx { xparse } { command-already-defined }
          { \token_to_str:N #1 }
      }
      { \__xparse_declare_cmd:Nnn #1 {#2} {#3} }
  }

공개 함수에 포함된 경우 확장 인수를 허용하는 변형을 정의하는 것은 매우 쉽지만 \__xparse_declare_cmd:Nnn그렇지 않습니다. 프로그래밍 규칙에 어긋나지 않고 스스로 할 수 있습니다.

\ExplSyntaxOn
\cs_set_eq:NN \hupfer_newdocumentcommand:Nnn \NewDocumentCommand
\cs_generate_variant:Nn \hupfer_newdocumentcommand:Nnn { No }
\NewDocumentCommand\NewDocumentCommandExp{mmm}
 {
  \hupfer_newdocumentcommand:Non #1 { #2 } { #3 }
 }
\ExplSyntaxOff

그런 다음 구문

\NewDocumentCommandExp{\somecmd}{\standardargs}{%
  % Do something more or less useful
  My args: #2
}

작동 할 것이다. 이것이 어떤 용도로 유용할 수 있는지는 잘 모르겠습니다.

관련 정보