可変長引数の new コマンドはどのように作成しますか?

可変長引数の new コマンドはどのように作成しますか?

言葉 "可変長引数「"」は、任意の数の入力引数を受け入れることができる関数およびコマンドに使用されます。


以下に、3 つの入力を持つカスタム コマンドの例を示します。

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

\mycmd{1}{2}{3}   

((e^1)^2)^3 のスクリーン キャプチャ

問題は、私が少量のソース コードを提供したコマンドには常に 3 つの入力があることです。

0 入力、1 入力、2 入力、3 入力などを許可する可変長コマンドを作成するにはどうすればよいですか?



入力数
呼び出しまたは呼び出し 写真
0 \mycmd 指数のない文字「e」の画像
1 \mycmd{1} 何かの写真
2 \mycmd{1}{2} 何かの写真
3 \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}

関連情報