我想定义以下具有 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
,则可以将此概括化,但使用此定义是不可能的。