我想创建一个宏来创建多个表。在下面的示例中,创建表的命令\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}