从计数器创建类似循环的行表

从计数器创建类似循环的行表

我有一个计数器,我想自动创建一个与计数器一样多行的表格。每行都应该编号。

谢谢

答案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}

生成的行

相关内容