我有一个计数器,我想自动创建一个与计数器一样多行的表格。每行都应该编号。
谢谢
答案1
例如使用forloop
包和计数器作为循环变量。
我使用计数器numofrows
作为阈值(这里设置为 25)
长度\fillinboxwidth
可以改变。
虽然我不喜欢表格中有太多行,但我认为,如果人们手写表格的话,保留太多行是合理的。
\documentclass{article}
\newlength{\fillinboxwidth}
\setlength{\fillinboxwidth}{8cm}
\usepackage{forloop}
\newcounter{loopcounter}
\newcounter{numofrows}
\setcounter{numofrows}{25}
\begin{document}
\begingroup
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{ |r|p{\fillinboxwidth}|}
\hline
\forloop{loopcounter}{1}{\value{loopcounter} < \numexpr\value{numofrows}}{%
\number\value{loopcounter} & \tabularnewline
\hline
}
\number\value{loopcounter} & \tabularnewline
\hline
\end{tabular}
\endgroup
\end{document}
答案2
一个奇特的解决方案是expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\filltheblanks}{om}
{% #1 = width, default fill; #2 = number of lines
\IfNoValueTF{ #1 }
{% no optional argument given, compute the available width
\jlanza_compute_width:n { #2 }
}
{% set the width of the column of blanks to the optional argument
\dim_set:Nn \l_tmpa_dim { #1 }
}
% build the table using the specified number of lines
\jlanza_build_table:n { #2 }
}
\cs_new_protected:Npn \jlanza_compute_width:n #1
{% #1 contains the number of rows, so we compute the width of the last number
\hbox_set:Nn \l_tmpa_box { #1 }
% set the width of the column of blanks to
% \columnwidth - (four intercolumn separators) - (width of the three rules)
% - the width of the last number
\dim_set:Nn \l_tmpa_dim
{
\columnwidth-4\tabcolsep-3\arrayrulewidth-\box_wd:N \l_tmpa_box
}
}
\cs_new_protected:Npn \jlanza_build_table:n #1
{
% set the temporary register to zero; we need a global one because we'll
% increment it inside a column cell, which forms a group
\int_gzero:N \g_tmpa_int
% start printing the table; issue \noindent to start at the left margin
\noindent
% the tabular specification: a right aligned column and a p column
% with the width established before
\begin{tabular}{|r|p{\l_tmpa_dim}|}
% top rule
\hline
% do as many times as stated (#1 is the number of rows)
\prg_replicate:nn { #1 }
{
% increment the counter
\int_gincr:N \g_tmpa_int
% print the counter's value
\int_to_arabic:n { \g_tmpa_int }
% advance to the next cell, finish it and draw a rule
& \\ \hline
}
% finish off the tabular
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\filltheblanks{10}
\filltheblanks[5cm]{6}
\end{document}
如果未给出可选参数,则空白的宽度将根据当前列宽计算,因此表格将填充列宽。否则,可选参数将设置空白的宽度。
& \\ \hline
该表是通过根据需要重复指令“数字”来构建的\prg_replicate:nn
。
如果数字存储在计数器中,则\newcounter{rows}
可以使用以下命令调用命令
\filltheblanks{\value{rows}}
答案3
这里是 LaTeX2e 中的另一种定义宏的方法\blanklist[<width>]{<number>}
:
\documentclass{article}
\newcounter{tablinegen}
\newcounter{tabrow}
\newcommand{\nl}{\stepcounter{tabrow}\\ \hline}
\newcommand{\blankline}{\thetabrow & \nl}
\newcommand{\blanklist}[2][.8\textwidth]{%
\begingroup
\setcounter{tablinegen}{0}
\let\tablines\empty%
\loop\ifnum\thetablinegen<#2
\stepcounter{tablinegen}
\expandafter\def\expandafter\tablines\expandafter{%
\tablines
\blankline
}%
\repeat
\blanklistformat{#1}}
\newcommand{\blanklistformat}[1]{
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{|c|p{#1}|}
\hline
\# & Name \nl
\tablines
\end{tabular}
\endgroup
\setcounter{tabrow}{0}}
\begin{document}
\blanklist{10}
\end{document}
笔记。@egreg 的解决方案的所有功能都保留在此解决方案中。
答案4
来自\xintiloop
新工具是一个可扩展的循环,它通过宏提供迭代索引\xintiloopindex
,因此这提供了一个简单的工具,用于在表格内生成行(\xintiloop
其本身的代码只有几行长,因此如果不想加载任何包,可以直接将其放在源文件中)。
根据需要进行自定义。行本身不使用计数器,只用于总行数,如 OP 的问题中所述。第二个示例也使用明确的数字而不是计数器来表示生成的总行数。
如果人们需要制作多个相同类型但有细微差别的表,则可以将这些东西放入宏中。
老实说,虽然在这里做这项工作\xintiloopindex
有相当严格的限制,但不能在括号内使用它,例如\textbf{\xintiloopindex}
,而在这里必须这样做\expandafter\bfseries\xintiloopindex
。因此,我不能向普通的 LaTeX 用户推荐我的解决方案,因为要让它在更高级的环境中工作,需要对如何TeX
构建对齐有更深入的理解。
因此,我现在包含了另一种使用的方法\xintloop
,而不是\xintiloop
,但是随后使用一些计数器来索引行。
更新: 如果您不想使用任何包,这里是\xintloop
第三个表中使用的代码。我已将其重命名\xloop
。包xinttools
添加了一些额外内容(\xintbreakloop
,, ) \xintbreakloopanddo
,\xintloopskiptonext
我在这里不翻译。
% code for an expandable loop, allowing nesting. See third table below for
% use example, with the original denomination \xintloop from package xinttools.
% the code is built in this way to allow extra structure (break, breakanddo, skip)
% which is not included here.
\makeatletter
\long\def\xloop #1#2\repeat {#1#2\xloop@again\fi\@gobble {#1#2}}%
\long\def\xloop@again\fi\@gobble #1{\fi #1\xloop@again\fi\@gobble {#1}}%
\makeatother
\documentclass[a4paper]{article}
\usepackage{geometry}
\usepackage{xinttools}
\newcounter{nbofrows}
\begin{document}
\setcounter{nbofrows}{7}
\begin{table}[htbp]
\centering
\begin{tabular}{c|c|c|c|c|}
\#&Last name&First name&Age&Citizenship\\
\hline
\xintiloop [1+1]
\xintiloopindex&&&&\\\hline
\unless
\ifnum\xintiloopindex=\value{nbofrows}%
\repeat
\end{tabular}
\caption{First table}
\end{table}
% we don't *have* to use a counter for the number of rows.
\begin{table}[htbp]
\centering
\begin{tabular}{c|c|c|c|c|}
\#&\makebox[.2\columnwidth]{Last name}&
\makebox[.2\columnwidth]{First name}&
\makebox[.2\columnwidth]{Age}&
\makebox[.2\columnwidth]{Citizenship}\\
\hline
\xintiloop [1+1]
\xintiloopindex &&&&\\\hline
\unless\ifnum \xintiloopindex=13 % leave a space after explicit number
\repeat
\end{tabular}
\caption{Second table}
\end{table}
\begin{table}[htbp]
\centering
\begin{tabular}{c|c|c|c|c|}
\#&\makebox[.2\columnwidth]{Last name}&
\makebox[.2\columnwidth]{First name}&
\makebox[.2\columnwidth]{Age}&
\makebox[.2\columnwidth]{Citizenship}\\
\hline
\setcounter{nbofrows}{0}%
\xintloop % braces are needed to hide the tabulation and \\ (technical reason)
{\stepcounter{nbofrows}\textbf{\arabic{nbofrows}}&&&&\\\hline }%
\unless\ifnum \value{nbofrows}=17 % leave a space after explicit number
\repeat
\end{tabular}
\caption{Third table}
\end{table}
\end{document}