![是否可以枚举表中的单元格?](https://linux22.com/image/360396/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E6%9E%9A%E4%B8%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E5%8D%95%E5%85%83%E6%A0%BC%EF%BC%9F.png)
我想使用以下方案枚举表中的单元格:
1. 4. 7.
2. 5. 8.
3. 6. 9.
问题是我不知道表中的行数。
当然,如果我写类似的东西:
\documentclass{article}
\newcounter{cellnum}
\newcommand{\itemtab}{\stepcounter{cellnum}\thecellnum.}
\begin{document}
\begin{tabular}{lll}
\itemtab & \itemtab & \itemtab \\
\itemtab & \itemtab & \itemtab \\
\itemtab & \itemtab & \itemtab \\
\end{tabular}
\end{document}
我得到了转置的结果,其中第一行第二列的单元格得到了数字2.
那么有没有办法使用列优先方案枚举单元格?或者有没有办法在表格的最开始就获取其行数?
答案1
我们需要在每张表的开头声明行号。我们为此创建了一个包装器环境,它接受两个参数 - 行号和列规范。我们还定义了一些列类型来为我们创建单元格编号 - F 表示第一列,G 表示所有其他列。
\documentclass{article}
\usepackage{calc,array}
\newcounter{rownum}
\newcounter{colnum}
\newcounter{totalrows}
\newcounter{cellnum}
\newcommand{\cell}{\stepcounter{colnum}\setcounter{cellnum}{\thecolnum*\thetotalrows+\therownum+1}\thecellnum. }
\newcommand{\firstcell}{\stepcounter{rownum}\setcounter{colnum}{-1}\cell}
\newcolumntype{F}{>{\firstcell}l}
\newcolumntype{G}{>{\cell}l}
\newenvironment{numberedtabular}[2]{%
\setcounter{totalrows}{#1}%
\setcounter{rownum}{-1}%
\setcounter{colnum}{-1}%
\begin{tabular}{#2}}
%
{\end{tabular}}
\begin{document}
Here comes the first table.
\begin{numberedtabular}{3}{FGG}
a & b & c \\
d & e & f \\
g & h & i \\
\end{numberedtabular}
Here comes the second table.
\begin{numberedtabular}{2}{FGG}
a & b & c \\
d & e & f \\
\end{numberedtabular}
And here comes the third.
\begin{numberedtabular}{4}{FGG}
a & b & c \\
d & e & f \\
g & h & i \\
j & l & m \\
\end{numberedtabular}
\end{document}
得出:
答案2
答案3
这是 Michael Palmer 的第二个(现已删除)答案的版本,使用文件.aux
存储每个表的总行数。这样就无需指定每个表的总行数,并且可以处理文档中任意数量的枚举表。我已将大多数命令设为内部命令(包含@
),以便使用的计数器不太可能干扰任何用户定义的计数器。
我已经将环境作为标准环境的包装器,但可以通过让其接受一个参数并将其传递给环境内的tabular
来重写该环境以将其包含在内。tabular
\begin{tabular}
\documentclass{article}
\usepackage{calc,array}
\usepackage{etoolbox}
\makeatletter
\newcounter{row@num}
\newcounter{col@num}
\newcounter{total@rows}
\newcounter{cell@num}
\newcounter{enumtbl@cnt}
\newcommand*{\@resettablcounters}{
\setcounter{row@num}{-1}
\setcounter{cell@num}{-1}
\setcounter{col@num}{-1}
}
\newcommand{\cell}{%
\stepcounter{col@num}
\setcounter{cell@num}
{\value{col@num}*\value{total@rows}+\value{row@num}+1}%
\thecell@num. }
\newcommand{\firstcell}
{\stepcounter{row@num}\setcounter{col@num}{-1}\cell}
\newcolumntype{F}{>{\firstcell}l}
\newcolumntype{G}{>{\cell}l}
\newenvironment{enumtabular}
{\@resettablcounters
\stepcounter{enumtbl@cnt}
\xdef\@tabnum{enumtab\roman{enumtbl@cnt}}
\setcounter{total@rows}{\numexpr\csuse{\@tabnum}+1}
}
{\immediate\write\@auxout{\csgdef{\@tabnum}{\therow@num}}}
\makeatother
\begin{document}
\begin{enumtabular}
\begin{tabular}{FGG}
a & b & c \\
d & e & f \\
g & h & i
\end{tabular}
\end{enumtabular}
\bigskip
\begin{enumtabular}
\begin{tabular}{FGG}
a & b & c \\
d & e & f \\
g & h & i \\
j & k & l \\
m & n & o
\end{tabular}
\end{enumtabular}
\bigskip
\begin{enumtabular}
\begin{tabular}{FGG}
a & b & c \\
d & e & f \\
g & h & i \\
j & k & l\\
m & n & o\\
p & q & r\\
s & t & u
\end{tabular}
\end{enumtabular}
\end{document}