巨集評估參數數量,無限制

巨集評估參數數量,無限制

是否有可能有一個像這樣的巨集:

\documentclass{article}
\usepackage{xparse}
\pagestyle{empty}
\ExplSyntaxOn
\NewDocumentCommand{\HowManyArguments}{ oooooooo }
    {
        \IfNoValueTF {#1} { 0 }{
            \IfNoValueTF {#2} { 1 }{
                \IfNoValueTF {#3}  { 2 }{
                     \IfNoValueTF {#4}  { 3 }{
                          \IfNoValueTF {#5}  { 4 }{
                               \IfNoValueTF {#6}  { 5 }{
                                    \IfNoValueTF {#7}  { 6 }{
                                         \IfNoValueTF {#8}  { 7 }{ So many }
                                    }
                               }
                          }
                     }
                }
            }
        }
    }
\ExplSyntaxOff
\begin{document}

The amount of arguments in this macro is \HowManyArguments[Cake][Chair][Stool][Bicycle] .

\end{document}

除了沒有限制的情況外,有點像線程\powertower,每次都會將結果嵌入到其餘部分:如何使用 LaTeX 排版十倍能量(能量之塔)?

然後,我們的想法是使用巨集的第一個參數來定義參數的數量。

我需要「powertower」方法的原因是因為第 2 部分:我想根據參數的數量在顏色之間旋轉。

嘗試編譯這個:

\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\pagestyle{empty}
\ExplSyntaxOn
\NewDocumentCommand{\HowManyArguments}{ oooooooo }
    {
        \IfNoValueTF {#1} {}{
            \IfNoValueTF {#2} {\textcolor{blue}{#1(}...\textcolor{blue}{)}}{
                \IfNoValueTF {#3}  {\textcolor{blue}{#1(}\textcolor{green}{#2(}...\textcolor{green}{)}\textcolor{blue}{)}}{
                     \IfNoValueTF {#4}  {\textcolor{blue}{#1(}\textcolor{green}{#2(}\textcolor{red}{#3(}...\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}}{
                          \IfNoValueTF {#5}  {\textcolor{blue}{#1(}\textcolor{green}{#2(}\textcolor{red}{#3(}\textcolor{blue}{#4(}...\textcolor{blue}{)}\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}}{
                               \IfNoValueTF {#6}  {\textcolor{blue}{#1(}\textcolor{green}{#2(}\textcolor{red}{#3(}\textcolor{blue}{#4(}\textcolor{green}{#5(}...\textcolor{green}{)}\textcolor{blue}{)}\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}}{
                                    \IfNoValueTF {#7}  {\textcolor{blue}{#1(}\textcolor{green}{#2(}\textcolor{red}{#3(}\textcolor{blue}{#4(}\textcolor{green}{#5(}\textcolor{red}{#6(}...\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}}{
                                         \IfNoValueTF {#8}  {\textcolor{blue}{#1(}\textcolor{green}{#2(}\textcolor{red}{#3(}\textcolor{blue}{#4(}\textcolor{green}{#5(}\textcolor{red}{#6(}\textcolor{blue}{#7(}...\textcolor{blue}{)}\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}}{\textcolor{blue}{#1(}\textcolor{green}{#2(}\textcolor{red}{#3(}\textcolor{blue}{#4(}\textcolor{green}{#5(}\textcolor{red}{#6(}\textcolor{blue}{#7(}\textcolor{green}{#8(}...\textcolor{green}{)}\textcolor{blue}{)}\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}\textcolor{red}{)}\textcolor{green}{)}\textcolor{blue}{)}}
                                    }
                               }
                          }
                     }
                }
            }
        }
    }
\ExplSyntaxOff
\begin{document}

Try this one instead: \HowManyArguments[Mandatory][Argument][What][Have][You][Done]

\end{document}

這是我正在嘗試構建的完整想法,但沒有任何限制。

答案1

使用逗號分隔清單會更符合 LaTeX 的設計:

在此輸入影像描述

在此輸入影像描述

\documentclass{article}

\makeatletter
\newcommand\HowManyArguments[1]{{%
\count@\z@
\@for\tmp:=#1\do{\advance\count@\@ne}%
There are \the\count@\ arguments\par
\@for\tmp:=#1\do{(\tmp}%
\@for\tmp:=#1\do{)}}}
\makeatother


\begin{document}

\HowManyArguments{Lots,of,arguments,in,this,thread}

\end{document}

或搭配顏色

\documentclass{article}

\usepackage{color}
\makeatletter
\newcommand\HowManyArguments[1]{{%
\count@\z@
\@for\tmp:=#1\do{\advance\count@\@ne}%
There are \the\count@\ arguments\par
\@tempcnta\z@
\@for\tmp:=#1\do{%
\advance\@tempcnta\@ne
\textcolor[RGB]{\the\numexpr255*\@tempcnta/(\count@)\relax,
                 0,
                 \the\numexpr255-(255*\@tempcnta/(\count@))\relax}%
                {\tmp(}}%
\@tempcnta\count@
\@for\tmp:=#1\do{%
\textcolor[RGB]{\the\numexpr255*\@tempcnta/(\count@)\relax,
                 0,
                 \the\numexpr255-(255*\@tempcnta/(\count@))\relax}%
                {)}%
\advance\@tempcnta\m@ne
}}}
\makeatother


\begin{document}

\HowManyArguments{Lots,of,arguments,in,this,thread}

\end{document}

答案2

一個expl3解決方案(只是為了取悅大衛)。我只進行一次計算,透過填充兩個令牌列表並傳遞它們。

\documentclass{article}
\usepackage{xparse,xcolor}

\ExplSyntaxOn
\NewDocumentCommand{\HMA}{m}
 {
  \leavevmode
  \group_begin:
  \hma_process_args:n { #1 }
  \group_end:
 }

\seq_new:N \l__hma_args_seq
\tl_new:N \l__hma_opening_tl
\tl_new:N \l__hma_closing_tl
\int_new:N \l__hma_step_int
\int_new:N \l__hma_args_int

\cs_new_protected:Npn \hma_process_args:n #1
 {
  \seq_set_split:Nnn \l__hma_args_seq { , } { #1 }
  \tl_clear:N \l__hma_opening_tl
  \tl_set:Nn \l__hma_closing_tl { \dots }
  \int_zero:N \l__hma_step_int
  \int_set:Nn \l__hma_args_int { \seq_count:N \l__hma_args_seq }
  \color[RGB]{0,0,255}
  \seq_map_inline:Nn \l__hma_args_seq
   {
    \int_incr:N \l__hma_step_int
    \tl_put_right:Nx \l__hma_opening_tl
     {
      \exp_not:n { ##1 ( }
      \group_begin:
      \exp_not:N \color[RGB] { \__hma_set_color: }
     }
    \tl_put_right:Nn \l__hma_closing_tl { \group_end: ) }
   }
  \tl_use:N \l__hma_opening_tl \tl_use:N \l__hma_closing_tl
 }

\cs_new:Npn \__hma_set_color:
 {
  \int_eval:n { 255 * \l__hma_step_int / \l__hma_args_int },
  0,
  \int_eval:n { 255 - ( 255 * \l__hma_step_int / \l__hma_args_int ) }
 }

\ExplSyntaxOff

\begin{document}

\HMA{Lots,of,arguments,in,this,thread}

\end{document}

在此輸入影像描述

只需更改一行就可以避免點並使用最後一項作為最裡面的括號。

\documentclass{article}
\usepackage{xparse,xcolor}

\ExplSyntaxOn
\NewDocumentCommand{\HMA}{m}
 {
  \leavevmode
  \group_begin:
  \hma_process_args:n { #1 }
  \group_end:
 }

\seq_new:N \l__hma_args_seq
\tl_new:N \l__hma_opening_tl
\tl_new:N \l__hma_closing_tl
\int_new:N \l__hma_step_int
\int_new:N \l__hma_args_int

\cs_new_protected:Npn \hma_process_args:n #1
 {
  \seq_set_split:Nnn \l__hma_args_seq { , } { #1 }
  \tl_clear:N \l__hma_opening_tl
  \seq_pop_right:NN \l__hma_args_seq \l__hma_closing_tl % <---- CHANGE
  \int_zero:N \l__hma_step_int
  \int_set:Nn \l__hma_args_int { \seq_count:N \l__hma_args_seq }
  \color[RGB]{0,0,255}
  \seq_map_inline:Nn \l__hma_args_seq
   {
    \int_incr:N \l__hma_step_int
    \tl_put_right:Nx \l__hma_opening_tl
     {
      \exp_not:n { ##1 ( }
      \group_begin:
      \exp_not:N \color[RGB] { \__hma_set_color: }
     }
    \tl_put_right:Nn \l__hma_closing_tl { \group_end: ) }
   }
  \tl_use:N \l__hma_opening_tl \tl_use:N \l__hma_closing_tl
 }

\cs_new:Npn \__hma_set_color:
 {
  \int_eval:n { 255 * \l__hma_step_int / \l__hma_args_int },
  0,
  \int_eval:n { 255 - ( 255 * \l__hma_step_int / \l__hma_args_int ) }
 }

\ExplSyntaxOff

\begin{document}

\HMA{Lots,of,arguments,in,this,thread}

\end{document}

在此輸入影像描述

答案3

為了滿足OP對類似內容的渴望Lots(of(arguments(in(this(thread))))),我創建了巨集\groupargs{{}{}{}{}}並給了一個例子。

雖然我以巢狀層級為模離散地更改顏色(如在 OP 的 MWE 中所做的那樣),但可以插入任何演算法來計算顏色作為巢狀層級的函數。

\documentclass{article}
\usepackage{readarray}
\usepackage{xcolor}
\newcounter{argindex}
\newcounter{colindex}
\def\groupargs#1{\def\lparen{}\def\rparen{}\getargsC{#1}%
  \setcounter{argindex}{0}\setcounter{colindex}{0}\nextarg}
\def\nextarg{\stepcounter{argindex}\stepcounter{colindex}%
  \ifnum\theargindex>\narg\else\lparen%
  \ifnum\thecolindex=1\def\mycolor{blue}\else%
    \ifnum\thecolindex=2\def\mycolor{green}\else%
      \ifnum\thecolindex=3\def\mycolor{red}\setcounter{colindex}{0}%
  \fi\fi\fi%
  \def\lparen{(}%
  \textcolor{\mycolor}{\csname arg\romannumeral\theargindex\endcsname%
  {\def\rparen{)}\nextarg}}\rparen\fi%
}
\begin{document}
\groupargs{Mandatory Argument What Have {You Indeed} Done ...}
\end{document}

在此輸入影像描述

相關內容