如何定义一个超过 9 个参数的 \newenvironment?

如何定义一个超过 9 个参数的 \newenvironment?

我想定义以下具有 10 个参数的新环境,如您所见,第 10 个参数不可用!怎么办?

\newenvironment{newenv}[10]{
\begin{center}
    \begin{tabular}{|m{2cm}<{\centering}|m{2cm}<{\centering}|m{2cm}<{\centering}|m{2cm}<{\centering}|m{2cm}<{\centering}|m{2cm}<{\centering}|}
        \hline
        Name       &{#1}              &{#3}              &{#5}          &{#7}          &{#9}   \\
        \hline
        EN-Name   &{#2}              &{#4}              &{#6}         &{#8}          &{#10}   \\
        \hline
        File-Name     &{#2}.in           &{#4}.in           &{#6}.in       &{#8}.in       &{#10}  \\
        \hline
        Out-Name     &{#2}.out          &{#4}.out          &{#6}.out      &{#8}.out      &{#10}  \\
        \hline
}{
    \end{tabular}
\end{center}
}

答案1

您的环境看起来仅仅像一个命令,因为环境的内容没有任何有意义的用途。

然而,如果您有更实际的用途,我建议将参数作为单个列表提供,使用包的列表处理listofitems(来自的那些etoolbox是替代选项,但更难处理)。

这是一个 MWE(有 13 个“参数”):

\documentclass{article}
\usepackage{listofitems}

\newenvironment{newenv}[1]{
\setsepchar{, }
\readlist\args{#1}
\begin{center}
\begin{tabular}{|*{6}{c|}}
\hline
 Name        & \args[1]    & \args[3]    & \args[5]    & \args[7]    & \args[9]     \\
\hline
 EN-Name     & \args[2]    & \args[4]    & \args[6]    & \args[8]    & \args[10]    \\
\hline
 File-Name   & \args[2].in & \args[4].in & \args[6].in & \args[8].in & \args[10].in \\
\hline
 Out-Name    &\args[2].out &\args[4].out &\args[6].out &\args[8].out &\args[10].out \\
\hline
}{
\end{tabular}
\end{center}
}

\begin{document}

\begin{newenv}{zero, one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve}
Digit &1 & 2 & 3 & 4 & 5 \\
\hline
\end{newenv}

\end{document}

产生: 在此处输入图片描述

答案2

这是一个相当通用的方法,用于定义具有任意多个参数的命令,只要这些参数以逗号分隔的列表形式给出:

\documentclass{article}
\usepackage{array}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\newlistcommand}{mm}
 {
  \NewDocumentCommand{#1}{m}
   {
    \clist_set:Nn \l_xaero_args_clist { ##1 }
    #2
   }
 }
\NewExpandableDocumentCommand{\argx}{m}
 {
  \clist_item:Nn \l_xaero_args_clist { #1 }
 }
\ExplSyntaxOff

\newlistcommand{\mytabular}{%
  \begin{center}
  \begin{tabular}{|*{6}{>{\centering\arraybackslash}p{2cm}|}}
  \hline
  Name      &\argx{1}     &\argx{3}     &\argx{5}     &\argx{7}     &\argx{9}  \\
  \hline
  EN-Name   &\argx{2}     &\argx{4}     &\argx{6}     &\argx{8}     &\argx{10} \\
  \hline
  File-Name &\argx{2}.in  &\argx{4}.in  &\argx{6}.in  &\argx{8}.in  &\argx{10} \\
  \hline
  Out-Name  &\argx{2}.out &\argx{4}.out &\argx{6}.out &\argx{8}.out &\argx{10} \\
  \hline
  \end{tabular}
  \end{center}
}

\begin{document}

\mytabular{one,two,three,four,five,six,seven,eight,nine,ten}

\end{document}

你看到了\argx{n}用来代替#n在 的定义中\mylistcommand

如果您计划嵌套用 定义的命令\newlistcommand,则可以将此概括化,但使用此定义是不可能的。

在此处输入图片描述

相关内容