如何建立一個可變的新命令?

如何建立一個可變的新命令?

這個單字 ”可變參數" 用於函數和命令,它們可以接受任意數量的輸入參數。


下面,我們看到一個具有三個輸入的自訂命令的範例:

\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} 某物的圖片
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

網站上有數十個問題詢問「具有可變數量參數的命令」。你可能做,但最好不要做。

像這樣的語法\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}

相關內容