按一定步骤自动用数字填表

按一定步骤自动用数字填表

在此处输入图片描述

让我举一个例子来说明我如何开始解决这个问题(但没有成功):

\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

相关内容