如何创建接受超过 10 个参数的表宏

如何创建接受超过 10 个参数的表宏

我想创建一个宏来创建多个表。在下面的示例中,创建表的命令\chungeltable将对表中的每一列(超过 10 列)使用一个参数。每个参数包含一个逗号分隔的列表,该列表必须是每行的信息:

\chungeltable{1,2,3}{a,b,c}{one,two,three}{uno,dos,tres}{um, dois, três}{um,dois,treis}{Eins,zwei,drei}{Ett, två, tre}{un, deux, trois}{En, to, tre}

我正在使用以下方法(请参阅我之前的问题)。

但是,由于无法定义超过 10 个参数,因此我收到错误:

"kernel/bad-number-of-arguments"Function '\chungeltable' cannot be defined with 10 arguments" 

这是我的表格:

\documentclass{article}
\usepackage[a4paper,landscape]{geometry}
\usepackage{multirow,longtable}
\usepackage{xparse}

\NewDocumentCommand{\chungeltable}{mmmmmmmmmmm}
{%
\begingroup\scriptsize
\begin{longtable}{ | p{4cm} | p{3cm} | *{13}{l|} p{3cm} | }

    \hline
    \multirow{3}{*}{Name} &
    \multirow{3}{*}{Description} &
    \multicolumn{14}{c|}{Observation} \\
    \cline{3-16} 
    &  & \multicolumn{3}{c|}{A} & \multicolumn{3}{c|}{B}  &    \multicolumn{2}{c|}{C} &
    \multicolumn{2}{c|}{D} & E & \multirow{2}{*}{F} & \multirow{2}{*}{G} & \multirow{2}{*}{Other} \\
    \cline{3-13} 
    &  & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & & & \\ \hline
    \endhead
    \chungeltablebody{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}{#a}{#b}
\end{longtable}
\endgroup
}

\ExplSyntaxOn
 \NewDocumentCommand{\chungeltablebody}{mmmmmmmmmmm}
{
      \tl_clear:N \l_tmpa_tl
      \int_step_inline:nnnn { 1 } { 1 } { \clist_count:n { #1 } }
      {
      \tl_put_right:Nx \l_tmpa_tl
       {
        \clist_item:nn { #1 } { ##1 } &
        \clist_item:nn { #2 } { ##1 } &
        \clist_item:nn { #3 } { ##1 } &
        \clist_item:nn { #4 } { ##1 } & 
        \clist_item:nn { #5 } { ##1 } & 
        \clist_item:nn { #6 } { ##1 } & 
        \clist_item:nn { #7 } { ##1 } & 
        \clist_item:nn { #8 } { ##1 } & 
        \clist_item:nn { #9 } { ##1 } & 
        \clist_item:nn { #a } { ##1 } &
        \clist_item:nn { #b } { ##1 }
        &  &  &  &  & 
     \exp_not:n { \\ \hline }
     }
    }
     \tl_use:N \l_tmpa_tl    
 }
\ExplSyntaxOff

\begin{document}

  \chungeltable{1,2,3}{a,b,c}{one,two,three}{uno,dos,tres}{um, dois, três}{um,dois,treis}{Eins,zwei,drei}{Ett, två, tre}{un, deux, trois}{En, to, tre}

\end{document}

我的问题是:如何在表中定义超过 10 个参数,其中每个参数代表表的列,列表中的每个项目代表行中的信息?

答案1

虽然问题询问的是吸收超过 10 个论点,但从问题的角度来看,OP 的真正动机是“如何tabular按列而不是按行输入数据,包括超过 9 列的情况?”

我不是multicolumn和方面的专家multirow,我不知道如何在表格的最后一列后恢复最后的垂直线,但在这里,我展示了如何按列而不是按行来整理表格,即使列数超过 9。

我使用该listofitems包解析列式数据,然后设置一个双循环将数据转置为标准的行式格式并将其放置在令牌寄存器中\transposedtoks。最后,我只是将其重新\the\transposedtoks放入长表中。我在这里显示它有 13 列。

数据输入格式目前

\chungeltable{1,2,3&a,b,c&one,two,three&uno,dos,tres&um, dois, três&
um,dois,treis&Eins,zwei,drei&Ett, två, tre&un, deux, trois
&En, to, tre&eleven,th,col&twelve,th,col&thirteen,th,col}

但是,可以通过编辑行来更改&列分隔符和行分隔符。奇迹发生在宏中。,\setsepchar{&/,}listofitems\transposedata

\documentclass{article}
\usepackage[a4paper,landscape]{geometry}
\usepackage{multirow,longtable}
\usepackage{xparse}
\usepackage{listofitems}
\NewDocumentCommand{\chungeltable}{m}
{%
\transposedata{#1}%
\begingroup\scriptsize
\renewcommand\arraystretch{1.1}
\begin{longtable}{ | p{4cm} | p{3cm} | *{13}{l|} p{3cm} | }
    \hline
    \multirow{3}{*}{Name} &
    \multirow{3}{*}{Description} &
    \multicolumn{14}{c|}{Observation} \\
    \cline{3-16} 
    &  & \multicolumn{3}{c|}{A} & \multicolumn{3}{c|}{B}  &    \multicolumn{2}{c|}{C} &
    \multicolumn{2}{c|}{D} & E & \multirow{2}{*}{F} & \multirow{2}{*}{G} & \multirow{2}{*}{Other} \\
    \cline{3-13} 
    &  & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & & & \\ \hline
    \endhead
    \the\transposedtoks
\end{longtable}
\endgroup
}
\newtoks\transposedtoks
\newcommand\transposedata[1]{%
  \transposedtoks{}%
  \setsepchar{&/,}%
  \greadlist*\rawdata{#1}
  \foreachitem\y\in\rawdata[1]{%
    \foreachitem\x\in\rawdata[]{%
      \ifnum\xcnt>1\transposedtoks\expandafter{\the\transposedtoks&}\fi%
      \edef\tmp{\rawdata[\xcnt,\ycnt]}%
      \expandafter\transposedtoks\expandafter\expandafter\expandafter{%
        \expandafter\the\expandafter\transposedtoks\tmp}%
    }%
  \transposedtoks\expandafter{\the\transposedtoks\\\hline}%
  }%
}
\begin{document}
\chungeltable{1,2,3&a,b,c&one,two,three&uno,dos,tres&um, dois, três&um,dois,treis&Eins,zwei,drei&Ett, två, tre&un, deux, trois
&En, to, tre&eleven,th,col&twelve,th,col&thirteen,th,col}
\end{document}

在此处输入图片描述

下面是一个使用 的示例\transposedata,不包含所有的chungeljumbo:

\documentclass{article}
\usepackage{listofitems}

\newtoks\transposedtoks
\newcommand\transposedata[2][&/,]{%
  \setsepchar{#1}%
  \transposedtoks{}%
  \greadlist*\rawdata{#2}
  \foreachitem\y\in\rawdata[1]{%
    \foreachitem\x\in\rawdata[]{%
      \ifnum\xcnt>1\transposedtoks\expandafter{\the\transposedtoks&}\fi%
      \edef\tmp{\rawdata[\xcnt,\ycnt]}%
      \expandafter\transposedtoks\expandafter\expandafter\expandafter{%
        \expandafter\the\expandafter\transposedtoks\tmp}%
    }%
  \transposedtoks\expandafter{\the\transposedtoks\\\hline}%
  }%
}
\begin{document}
\transposedata[&/\\]{a\\b\\c&d\\e\\f}
\begin{tabular}{|c|c|}
\hline
\the\transposedtoks
\end{tabular}
\end{document}

在此处输入图片描述

相关内容