
다음과 같은 매크로를 가질 수 있습니까?
\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를 사용하여 10배의 파워링(힘의 탑)을 어떻게 조판합니까?
그런 다음 매크로의 첫 번째 인수를 사용하여 인수 수를 정의하는 것이 아이디어입니다.
"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
(David를 기쁘게 하기 위한 것). 두 개의 토큰 목록을 채우고 전달하여 계산을 한 번만 수행합니다.
\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}