我已经编写了一个有超过一百行的表的代码(实际上是一组表,有超过一百行!)和五列。
我们将从左到右的列称为 A、B、C、D、E;
我想要反转列的顺序,
即得到一个表格,从左到右分别为 E、D、C、B、A 列。
是否有任何代码或包可以为我完成此操作?
我的代码如下:
\begin{table}
\caption
{computations of the first class}
\begin{center}
\scalebox{1}
{
\begin{tabular}{| c || c | c | c | c |}
\hline
A0 & C0 & B0 & D0 & E0 \\
\hline \hline
A1 & C1 & B1 & D1 & E1 \\
\hline
A2 & C2 & B2 & D2 & E2 \\
\hline
A3 & C3 & B3 & D3 & E3 \\
\hline
A4 & C4 & B4 & D4 & E4 \\
\hline
A5 & C5 & B5 & D5 & E5 \\
\hline
A6 & C6 & B6 & D6 & E6 \\
\hline
A7 & C7 & B7 & D7 & E7 \\
\hline
A8 & C8 & B8 & D8 & E8 \\
\hline
A9 & C9 & B9 & D9 & E9 \\
\hline
\end{tabular}
}
\end{center}
\end{table}
正如@Alan Munn 引导我做到的那样问题,
我在代码中添加了一行(在 \begin{tabular} 之前):
\def\1#1\\{#5     \\}
但这并没有改变任何事情。问题出在哪里?
答案1
这种方法的理念是https://tex.stackexchange.com/a/317425/4686不需要根据列数重新定义。
优点 1:只需要每个表格行以 , 结尾
\\
(即它不假设\hline
它作为分隔符)优势 2:没有额外的包裹(诚然,这是没有实际意义的,因为上述额外的包裹注定会统治 21 世纪
;-)
)缺点 1:仅限于 8 列(我很懒)现在最多可以使用 9 列。缺点 2(一个大缺点!):它需要额外的
\1
(或其他)标记。遗憾的是,包>{tokens}
的构造array
在这里没有帮助。但我使用数组编译拍摄了快照,所以我把它留在那里。
代码:
\documentclass{article}
\usepackage{array}
\makeatletter
\long\def\REVERSEIT #1\\%
{\@REVERSEIT
#1&\@gobble&\@gobble&\@gobble&\@gobble&\@gobble&\@gobble&\@gobble&\@gobble\\}
\long\def\@REVERSEIT #1	\\%
{#9\\}
\makeatother
\let\1\REVERSEIT
\begin{document}
\begin{tabular}{| c || c | c | c | c |}
\hline
\1 A0 & C0 & B0 & D0 & E0 \\
\hline\hline
\1 A1 & C1 & B1 & D1 & E1 \\
\hline
\1 A2 & C2 & B2 & D2 & E2 \\
\hline
\1 A3 & C3 & B3 & D3 & E3 \\
\1 A4 & C4 & B4 & D4 & E4 \\
\1 A5 & C5 & B5 & D5 & E5 \\
\hline
\1 A6 & C6 & B6 & D6 & E6 \\
\1 A7 & C7 & B7 & D7 & E7 \\
\1 A8 & C8 & B8 & D8 & E8 \\
\1 A9 & C9 & B9 & D9 & E9 \\
\hline
\end{tabular}
\quad
\begin{tabular}{| c || c | c | c |}
\hline
\1 A0 & C0 & B0 & D0 \\
\hline\hline
\1 A1 & C1 & B1 & D1 \\
\hline
\1 A2 & C2 & B2 & D2 \\
\hline
\1 A3 & C3 & B3 & D3 \\
\1 A4 & C4 & B4 & D4 \\
\1 A5 & C5 & B5 & D5 \\
\hline
\1 A6 & C6 & B6 & D6 \\
\1 A7 & C7 & B7 & D7 \\
\1 A8 & C8 & B8 & D8 \\
\1 A9 & C9 & B9 & D9 \\
\hline
\end{tabular}
\quad
\begin{tabular}{| c || c | c |}
\hline
\1 A0 & C0 & B0 \\
\hline\hline
\1 A1 & C1 & B1 \\
\hline
\1 A2 & C2 & B2 \\
\hline
\1 A3 & C3 & B3 \\
\1 A4 & C4 & B4 \\
\1 A5 & C5 & B5 \\
\hline
\1 A6 & C6 & B6 \\
\1 A7 & C7 & B7 \\
\1 A8 & C8 & B8 \\
\1 A9 & C9 & B9 \\
\hline
\end{tabular}
\end{document}
与 OP 相比,我故意删除了一些,\hline
以表明方法不需要它们。请注意,在上面我从原文复制而来,并且 B 和 C 列已经置换了!
使用九列进行测试:
\begin{tabular}{| c || c | c | c | c |c | c | c | c |}
\hline
\1 A1 & B2 & C3 & D4 & E5 & F6 & G7 & H8 & I9 \\
\1 A1 & B2 & C3 & D4 & E5 & F6 & G7 & H8 & I9 \\
\1 A1 & B2 & C3 & D4 & E5 & F6 & G7 & H8 & I9 \\
\1 A1 & B2 & C3 & D4 & E5 & F6 & G7 & H8 & I9 \\
\1 A1 & B2 & C3 & D4 & E5 & F6 & G7 & H8 & I9 \\
\1 A1 & B2 & C3 & D4 & E5 & F6 & G7 & H8 & I9 \\
\hline
\end{tabular}
答案2
假设您使用规则(但您不应该使用)。行数没有限制。
\documentclass{article}
\usepackage{xparse,environ}
\ExplSyntaxOn
\NewEnviron{reversetabular}[1]
{
\famke_revtab_main:nV { #1 } \BODY
}
\seq_new:N \l__famke_revtab_rows_seq
\seq_new:N \l__famke_revtab_out_seq
\seq_new:N \l__famke_revtab_row_seq
\tl_new:N \l__famke_revtab_temp_tl
\cs_new_protected:Nn \famke_revtab_main:nn
{
\seq_set_split:Nnn \l__famke_revtab_rows_seq { \hline } { #2 }
\seq_clear:N \l__famke_revtab_out_seq
\seq_map_inline:Nn \l__famke_revtab_rows_seq
{
\tl_if_blank:nTF { ##1 }
{
\seq_put_right:Nn \l__famke_revtab_out_seq { }
}
{
\tl_set:Nn \l__famke_revtab_temp_tl { ##1 }
\tl_remove_once:Nn \l__famke_revtab_temp_tl { \\ }
\seq_set_split:NnV \l__famke_revtab_row_seq { & } \l__famke_revtab_temp_tl
\seq_reverse:N \l__famke_revtab_row_seq
\seq_put_right:Nx \l__famke_revtab_out_seq
{
\seq_use:Nn \l__famke_revtab_row_seq { & } \exp_not:N \\
}
}
}
\begin{tabular}{#1}
\seq_use:Nn \l__famke_revtab_out_seq { \hline }
\end{tabular}
}
\cs_generate_variant:Nn \famke_revtab_main:nn { nV }
\ExplSyntaxOff
\begin{document}
\begin{reversetabular}{| c || c | c | c | c |}
\hline
A0 & C0 & B0 & D0 & E0 \\
\hline\hline
A1 & C1 & B1 & D1 & E1 \\
\hline
A2 & C2 & B2 & D2 & E2 \\
\hline
A3 & C3 & B3 & D3 & E3 \\
\hline
A4 & C4 & B4 & D4 & E4 \\
\hline
A5 & C5 & B5 & D5 & E5 \\
\hline
A6 & C6 & B6 & D6 & E6 \\
\hline
A7 & C7 & B7 & D7 & E7 \\
\hline
A8 & C8 & B8 & D8 & E8 \\
\hline
A9 & C9 & B9 & D9 & E9 \\
\hline
\end{reversetabular}
\end{document}