让我举一个例子来说明我如何开始解决这个问题(但没有成功):
\documentclass[a4paper,12pt]{article}
\usepackage{caption}
\usepackage{colortbl}
\usepackage{ifthen}
\begin{document}
\begin{table}[ht]
\caption{Example table with different initial numbers and equal step}
\centering
\begin{tabular}{|l|l|l|l|}
\hline
A & B & C & D \\
\hline
\newcounter{currentA}
\newcounter{currentB}
\newcounter{currentC}
\newcounter{currentD}
\setcounter{currentA}{1}
\setcounter{currentB}{10}
\setcounter{currentC}{100}
\setcounter{currentD}{1000}
\whiledo{\value{currentA} < 21}{
\thecurrentA &
\thecurrentB &
\thecurrentC &
\thecurrentD \\
\hline
\stepcounter{currentA}
\stepcounter{currentB}
\stepcounter{currentC}
\stepcounter{currentD}
}
\end{tabular}
\end{table}
\end{document}
答案1
我定义了一个\makerows
带有三个参数的命令:第一个参数是行数;第二个参数是起点列表;最后一个参数是步骤列表。
行构建函数将按指定次数重复执行。在每一步中,当前的值序列都以适当的方式存储;然后通过添加步骤来计算新的值序列。
\documentclass[a4paper,12pt]{article}
\ExplSyntaxOn
\NewDocumentCommand{\makerows}{mmm}
{% #1 = number of rows, #2 = list of initial points, #3 = list of steps
\tl_clear:N \l__anton_rows_tl
% store the steps
\seq_set_from_clist:Nn \l__anton_row_steps_seq { #3 }
% initialize
\seq_set_from_clist:Nn \l__anton_row_current_seq { #2 }
% build the rows
\prg_replicate:nn { #1 } { \__anton_row: }
% deliver them
\tl_use:N \l__anton_rows_tl
}
\tl_new:N \l__anton_rows_tl
\seq_new:N \l__anton_row_previous_seq
\seq_new:N \l__anton_row_current_seq
\seq_new:N \l__anton_row_steps_seq
\cs_new_protected:Nn \__anton_row:
{
% build the current row
\tl_put_right:Ne \l__anton_rows_tl { \seq_use:Nn \l__anton_row_current_seq { & } }
\tl_put_right:Nn \l__anton_rows_tl { \\ }
% compute the next one
\seq_set_eq:NN \l__anton_row_previous_seq \l__anton_row_current_seq
\seq_clear:N \l__anton_row_current_seq
\seq_map_indexed_inline:Nn \l__anton_row_steps_seq
{
\seq_put_right:Ne \l__anton_row_current_seq
{
\fp_eval:n { ##2 + \seq_item:Nn \l__anton_row_previous_seq { ##1 } }
}
}
}
\ExplSyntaxOff
\begin{document}
\begin{table}[htp]
\centering
\begin{tabular}{|r|r|r|r|}
\hline
\multicolumn{1}{|c|}{A} &
\multicolumn{1}{c|}{B} &
\multicolumn{1}{c|}{C} &
\multicolumn{1}{c|}{D} \\
\hline
\makerows{10}{1,0.1,0.2,10}{1,0.01,0.2,2}
\hline
\end{tabular}
\caption{Example table with different initial numbers and different steps}
\end{table}
\end{document}
答案2
[已编辑,以回应评论中的后续问题。]
这基本上是一个扩展问题。这可能没有告诉你太多;据我所知,几乎所有事情都是扩展问题。
您希望tabular
查看单元格的内容以及和&
。\\
因此,您需要先组装内容,扩展和增加计数器,然后才能tabular
一次性查看结果。
目前控制扩展的最简单方法是使用expl3
。由于此语法实际上并非用于文档,因此我们定义了一个\ahtoh[<key-value list>]
带有可选 的命令<key-value list>
。这允许您改变起始值、循环次数和步骤大小。
\documentclass[a4paper,12pt]{article}
\usepackage{caption}
% ateb: https://tex.stackexchange.com/a/702971/ i gwestiwn ahtoh: https://tex.stackexchange.com/q/702968/
\ExplSyntaxOn
\tl_new:N \l_ahtoh_fordos_tl
\keys_define:nn { ahtoh }
{
a .int_set:N = \l_ahtoh_currenta_int,
b .int_set:N = \l_ahtoh_currentb_int,
c .int_set:N = \l_ahtoh_currentc_int,
d .int_set:N = \l_ahtoh_currentd_int,
loops .int_set:N = \l_ahtoh_loops_int,
step .int_set:N = \l_ahtoh_step_int,
a .initial:n = 1,
b .initial:n = 10,
c .initial:n = 100,
d .initial:n = 1000,
loops .initial:n = 20,
step .initial:n = 1,
}
\cs_generate_variant:Nn \int_add:Nn { NV }
\NewDocumentCommand \ahtohnos { O{} }
{
\keys_set:nn { ahtoh } { #1 }
\tl_clear:N \l_ahtoh_fordos_tl
\int_step_inline:nn { \l_ahtoh_loops_int }
{%
\tl_put_right:Ne \l_ahtoh_fordos_tl {
\int_to_arabic:n { \l_ahtoh_currenta_int } \noexpand&
\int_to_arabic:n { \l_ahtoh_currentb_int } \noexpand&
\int_to_arabic:n { \l_ahtoh_currentc_int } \noexpand&
\int_to_arabic:n { \l_ahtoh_currentd_int } \noexpand\\
\noexpand\hline
}
\int_add:NV \l_ahtoh_currenta_int \l_ahtoh_step_int
\int_add:NV \l_ahtoh_currentb_int \l_ahtoh_step_int
\int_add:NV \l_ahtoh_currentc_int \l_ahtoh_step_int
\int_add:NV \l_ahtoh_currentd_int \l_ahtoh_step_int
}
\l_ahtoh_fordos_tl
}
\ExplSyntaxOff
\begin{document}
\begin{table}[ht]
\caption{Example table with different initial numbers and equal step}
\centering
\begin{tabular}{|l|l|l|l|}
\hline
A & B & C & D \\
\hline
\ahtohnos
\end{tabular}
\begin{tabular}{|l|l|l|l|}
\hline
A & B & C & D \\
\hline
\ahtohnos[a=-10,b=-100,c=100,d=10,loops=20,step=-5]
\end{tabular}
\end{table}
\end{document}
如果您只想要一个表,您可以完全省去变量并简单地计算等等0+<loop number>
。9+<loop number>
但我假设您的实际用例比问题中的示例要复杂一些。
答案3
可以使用以下代码使用 OpTeX 创建与 egreg 的答案中所示的相同的表:
\def\B{0.1} \def\C{0.2} \def\D{10}
\table{|c|c|c|c|}{\crl
A & B & C & D \crl
\fornum 1..10 \do{
#1 & \B & \C & \D
\xdef\B{\expr[2]{\B+.01}}%
\xdef\C{\expr[1]{\C+.2}}%
\xdef\D{\expr[0]{\D+2}} \cr}
\crl}
\bye