가변 새 명령을 어떻게 생성합니까?

가변 새 명령을 어떻게 생성합니까?

"라는 단어가변성"는 임의 개수의 입력 인수를 허용할 수 있는 함수 및 명령에 사용됩니다.


아래에서는 세 가지 입력이 있는 사용자 정의 명령의 예를 볼 수 있습니다.

\newcommand{\mycmd}[3]{ {{e^{#1}}^{#2}}^{#3}}

\mycmd{1}{2}{3}   

((e^1)^2)^3 화면 캡처

문제는 제가 제공한 소량의 소스 코드 명령에는 항상 정확히 세 개의 입력이 있다는 것입니다.

0개 입력, 1개 입력, 2개 입력, 3개 입력 등을 허용하는 가변 명령을 어떻게 생성합니까?



입력 수
전화 또는 요청 그림
0 \mycmd 지수가 없는 문자 "e"의 그림
1 \mycmd{1} 뭔가의 사진
2 \mycmd{1}{2} 뭔가의 사진
\mycmd{1}{2}{3} 뭔가의 사진

답변1

다음은 @Teepeemm이 작성한 추가 메모도 고려하여 내 의견에 설명된 인수 구조를 구현합니다.

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand \mycmd { O{} }
  {
    e
    \clist_map_function:nN {#1} \__idlecustard_exponent_chain:nw
    \use_none:n \__idlecustard_exponent_chain_mark:
  }
\cs_new:Npn \__idlecustard_exponent_chain:nw
    #1 #2 \__idlecustard_exponent_chain_mark:
  { \sp { #1 #2 \__idlecustard_exponent_chain_mark: } }
\ExplSyntaxOff

\begin{document}
$\mycmd$

$\mycmd[1]$

$\mycmd[1, 2]$

$\mycmd[1, 2, 3]$
\end{document}

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

답변2

사이트에는 "인수 수가 가변적인 명령"을 요구하는 수십 개의 질문이 있습니다. 너5월하세요. 하지만 하지 않는 것이 가장 좋습니다.

와 같은 구문은 \cmd[1,2,3]훨씬 간단합니다.

여기에는 모든 지수를 중괄호로 묶어야 하는 약간의 복잡성이 있습니다.

e^{1^{2^{3}}}

하지만 우리는 이 상황에서 중괄호 대신에 완벽하게 안전하다는 \bgroup사실 을 활용할 수 있습니다 .\egroup

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand{\mycmd}{o}
 {
  e\IfValueT{#1}{\idle_exponents:n{#1}}
 }

\cs_new_protected:Nn \idle_exponents:n
 {
  \clist_map_function:nN { #1 } \__idle_exponents:n
  \prg_replicate:nn { \clist_count:n { #1 } } { \egroup }
 }
\cs_new_protected:Nn \__idle_exponents:n
 {
  ^\bgroup\scriptstyle #1
 }

\ExplSyntaxOff

\begin{document}

$\mycmd+\mycmd[1]+\mycmd[1,2]+\mycmd[1,2,3]$

\end{document}

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

학문적 관심을 위해서:

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand{\mycmd}{}
 {
  \seq_clear:N \l__idle_exponents_seq
  e\idle_exponents_gather:
 }

\seq_new:N \l__idle_exponents_seq

\cs_new_protected:Nn \idle_exponents_gather:
 {
  \peek_catcode:NTF \c_group_begin_token
   {
    \__idle_exponents_add:n
   }
   {
    \__idle_exponents_deliver:
   }
 }

\cs_new_protected:Nn \__idle_exponents_add:n
 {
  \seq_put_right:Nn \l__idle_exponents_seq { #1 }
  \idle_exponents_gather:
 }

\cs_new_protected:Nn \__idle_exponents_deliver:
 {
  \seq_map_function:NN \l__idle_exponents_seq \__idle_exponents:n
  \prg_replicate:nn { \seq_count:N \l__idle_exponents_seq } { \egroup }
 }

\cs_new_protected:Nn \__idle_exponents:n
 {
  ^\bgroup\scriptstyle #1
 }

\ExplSyntaxOff

\begin{document}

$\mycmd+\mycmd{1}+\mycmd{1}{2}+\mycmd{1}{2}{3}$

\end{document}

관련 정보