数据表中的自动拆分行

数据表中的自动拆分行

因此,我尝试将我在实验期间收集的一些数据包含在一个表中。总共有 25 个条目,但每行只能包含大约 13 个条目,这意味着我必须将它们分成两行。我在报告截止时手动完成了此操作,如下面的源代码所示。但如果数据集非常大,这将花费大量时间。

因此我的问题是:是否有一个命令(或者可能是在线生成器)可以根据页面宽度自动分割数据?

任何帮助,将不胜感激!

数据

\begin{table*}[h] \centering
%\ra{1.3}
\begin{small}
\begin{tabular}{@{}lrrrrrrrrrrrrr@{}}\toprule
\textbf{No.} & \textbf{1} & \textbf{2} & \textbf{3} & \textbf{4} & \textbf{5} & \textbf{6} & \textbf{7} & \textbf{8} & \textbf{9} & \textbf{10} & \textbf{11} & \textbf{12} & \textbf{13} \\ \midrule
f(kHz) & 1.743 & 1.800 & 1.957 & 2.000 & 2.080 & 2.100 & 2.150 & 2.175 & 2.192 & 2.200 & 2.223 & 2.240 & 2.251 \\ \hdashline
i(mA) & 1.354 & 1.547 & 2.419 & 2.817 & 3.929 & 4.320 & 5.559 & 6.298 & 6.800 & 7.024 & 7.518 & 7.733 & 7.748 \\ \midrule
\textbf{No.} & \textbf{14} & \textbf{15} & \textbf{16} & \textbf{17} & \textbf{18} & \textbf{19} & \textbf{20} & \textbf{21} & \textbf{22} & \textbf{23} & \textbf{24} & \textbf{25} &  \\ \midrule
f(kHz) & 2.260 & 2.278 & 2.300 & 2.311 & 2.330 & 2.356 & 2.400 & 2.436 & 2.500 & 2.589 & 2.750 & 2.907 &  \\ \hdashline
i(mA) & 7.695 & 7.429 & 6.908 & 6.605 & 6.071 & 5.378 & 4.406 & 3.805 & 3.040 & 2.366 & 1.694 & 1.335 & \\
\bottomrule
\end{tabular}
\end{small}
\caption{some data}
\end{table*}

答案1

更新

此解决方案基于pgfplotstable包。使用多个块来排版宽表。

每个块的宽度和数量都是自动计算的。

除数据格式外,不需要其他用户参数。

首先,将不包含标题和第一列的原始数据存储在宏中。

自动生成编号标题,然后表格由块组成,每个块嵌入第一列,并具有适合文本宽度的列数。

所有块本身都是表格,但只有最后一个块才会收到标题。

第一个例子显示两个 13 + 12 列的数据块。

第二个示例使用相同的数据,但文本宽度减小,从而产生三个 9 + 9 + 7 列的块,显示了自动重新排列。

第三个示例使用更大的数据集,其中包含标题 + 4 行。

(我)一张宽桌子被分成两部分。

g1x

(二)更窄的页面中的相同数据(使用\newgeometry{...}

b

(三)更大的数据集:43 列、4 行

C

用法

(1)加载数据集并将其分配给宏。数据可以立即使用,也可以在文档的其他部分使用:\pgfplotstableread {<raw data>} {<macro name of the data>}

(2)使用以下方式加载标题和第一列标签

\renewcommand{\HeaderLabel}{<formated text>}

\renewcommand{\FirstRowLabel}{<formated text>}, ETC。

本例中最多实现了四行。添加更多行很简单。

注意,只有已使用行的行名才会排版。其他行名会从列表中截断。

(3)定义最长标签和最宽数据列的模板。它们是计算块大小所必需的。

(4)使用以下方式排版表格

\FormatData{{<macro name of the data>}{<caption text>}

表 1 是使用

\pgfplotstableread{% store table in macro \DataSeti
1.743 & 1.800 & 1.957 & 2.000 & 2.080 & 2.100 & 2.150 & 2.175 & 2.192 & 2.200 & 2.223 & 2.240 & 2.251 & 2.260 & 2.278 & 2.300 & 2.311 & 2.330 & 2.356 & 2.400 & 2.436 & 2.500 & 2.589 & 2.750 & 2.907 \\
1.354 & 1.547 & 2.419 & 2.817 & 3.929 & 4.320 & 5.559 & 6.298 & 6.800 & 7.024 & 7.518 & 7.733 & 7.748 &7.695 & 7.429 & 6.908 & 6.605 & 6.071 & 5.378 & 4.406 & 3.805 & 3.040 & 2.366 & 1.694 & 1.335 \\
}{\DataSeti}
    
%%****************INITIAL SETUP BY USER of \DataSeti
\renewcommand{\HeaderLabel}{\small No.} % header label will be displayed in bold
\renewcommand{\FirstRowLabel}{\small f(kHz)} % first row label
\renewcommand{\SecondRowLabel}{\small i(mA)} % second row label
\renewcommand{\LongestNumber}{\small 0.000} % <<<< needed to calculate columns width
\renewcommand{\LongestLabel}{\small f(kHz)} % <<<< needed to calculate first column width
%%****************END INITIAL SETUP BY USER

\FormatData{\DataSeti}{Splitted table with \textbf{pgfplotstable}; text width: \the\textwidth} 

这是完整的代码

\documentclass[11pt,a4paper]{report}

\usepackage[left=2.0cm, right=1.7cm, top=4.0cm, bottom=3.0cm, marginparwidth=0pt, marginparsep=0pt]{geometry}

\usepackage{pgfplotstable}
\pgfplotsset{compat=1.18}   
\pgfplotstableset{col sep =&, row sep =\\}
\usepackage{forloop}    
\usepackage{ifthen}

\usepackage{booktabs}
\parskip=0pt
    
\usepackage{showframe}% only to show margins
        
%****************DEFAULT SETUP TO BE MODIFIED LATER BY USER
\newcommand{\HeaderLabel}{\small xx} % header label will be displayed in bold
\newcommand{\FirstRowLabel}{\small WXYZ} % first row label
\newcommand{\SecondRowLabel}{\small abc} % second row label
\newcommand{\ThirdRowLabel}{\small def} % third row label
\newcommand{\FourhRowLabel}{\small ghk} % fourth row label
\newcommand{\LongestNumber}{\small 0.000} % <<<< needed to calculate columns width
\newcommand{\LongestLabel}{\small WXYZ} % <<<< needed to calculate the first column width
%****************END INITIAL SETUP BY USER

%*****************  INIT
\arrayrulewidth=0pt 
\newlength{\colwidth}
\newlength{\firstcolwidth}
\newcommand{\MaxCol}{0}
\newcommand{\MaxColi}{0}
\newcommand{\MaxColii}{1}
\newcommand{\Mshifth}{0}
\settowidth{\colwidth}{\LongestNumber}      
\settowidth{\firstcolwidth}{\LongestLabel}
\newcounter{ct} 
\newcounter{ctx}    
%***************** END  INIT

\newcommand{\ResetNumbers}{% reset
    \renewcommand{\MaxCol}{0}
    \renewcommand{\MaxColi}{0}
    \renewcommand{\MaxColii}{1}
    \renewcommand{\Mshifth}{0}
}

\newcommand{\MakeNumbers}[1]{%  blocks structure
    \pgfplotstablegetcolsof{#1}
    \pgfmathtruncatemacro{\finex}{\pgfmathresult}
    \pgfmathint{(\textwidth-\firstcolwidth-\tabcolsep) / (\colwidth+2\tabcolsep) -1 }
    \renewcommand{\MaxCol}{\pgfmathresult}  % number of columns -1 to display <<<<<<<<<<<<<<<<<
    \pgfmathtruncatemacro{\MaxColi}{\MaxColi+\Mshifth}
    \pgfmathtruncatemacro{\MaxColii}{\MaxColi+1}
    \pgfmathtruncatemacro{\MaxLast}{\MaxColi+\MaxCol}
    \pgfmathtruncatemacro{\MaxRemain}{\finex-\MaxLast}
    \pgfmathtruncatemacro{\MaxLastLess}{\MaxRemain+\MaxCol+ \MaxColi-1} 
    \pgfmathtruncatemacro{\Mshifth}{\MaxCol+1}
    \pgfmathtruncatemacro{\NBlocks}{(\finex+2) / (\MaxCol+1) + 2}
}   


\newcommand{\MakeBlock}[2]{% produce one block
    \MakeNumbers{#1}
    \begin{table*}[ht!]
    \ifthenelse{\MaxRemain >0}
    {\pgfplotstabletypeset[columns={z,\MaxColi,\MaxColii,...,\MaxLast}]{#1} \vspace*{-4ex}}{}
    
    \ifthenelse{\MaxRemain < 0}% last block
    {%
    \ifthenelse{\MaxRemain < -\MaxCol}{}    
    {%
    \ifthenelse{\MaxLastLess > \MaxColii}
    {\pgfplotstabletypeset[font=\small,columns={z,\MaxColi,\MaxColii,...,\MaxLastLess}]{#1} \caption{#2}}
    {\pgfplotstabletypeset[font=\small,columns={z,\MaxLastLess},]{#1} \caption{#2}}
    }
    }
    
    \ifthenelse{\MaxRemain = 0}
    {\pgfplotstabletypeset[font=\small,columns={z,\MaxColi,\MaxColii,...,\MaxLastLess}]{#1} \caption{#2}}{}
    \end{table*}
}

\newcommand{\FormatData}[2]{% typeset all blocks => final table #1 macro of dataset, #2 caption
    \pgfplotstablegetcolsof{#1}
    \pgfmathtruncatemacro{\finex}{\pgfmathresult}
    \pgfmathsetmacro{\fine}{\pgfmathresult-1}   
    
    \pgfplotsinvokeforeach{0,1,...,\fine} {% numbered header
    \pgfplotstableset{
        columns/##1/.style = {column name=\pgfmathparse{int(##1+1)}\textbf{\pgfmathresult}},
    }}%
    
    \pgfplotstableset{%
    create on use/z/.style={create col/set list={\FirstRowLabel,\SecondRowLabel,\ThirdRowLabel,\FourhRowLabel}},    
    string type,
    header=false,
    columns/z/.style={column name={\textbf{\HeaderLabel}}, column type=@{}{l}}, 
    every head row/.style={before row=\toprule,
        after row=\midrule,
    },
    every last row/.style={after row=\bottomrule},
    column type={>{\small\centering\arraybackslash}c},
    }
    \setcounter{ctx}{10}    % max default
    \forloop{ct}{1}{\value{ct} < \thectx}{\MakeBlock{#1}{#2}}
    \ResetNumbers
} % end tableset

    
\begin{document}

\pgfplotstableread{% store table in macro \DataSeti
1.743 & 1.800 & 1.957 & 2.000 & 2.080 & 2.100 & 2.150 & 2.175 & 2.192 & 2.200 & 2.223 & 2.240 & 2.251 & 2.260 & 2.278 & 2.300 & 2.311 & 2.330 & 2.356 & 2.400 & 2.436 & 2.500 & 2.589 & 2.750 & 2.907 \\
1.354 & 1.547 & 2.419 & 2.817 & 3.929 & 4.320 & 5.559 & 6.298 & 6.800 & 7.024 & 7.518 & 7.733 & 7.748 &7.695 & 7.429 & 6.908 & 6.605 & 6.071 & 5.378 & 4.406 & 3.805 & 3.040 & 2.366 & 1.694 & 1.335 \\
}{\DataSeti}
    
%%****************INITIAL SETUP BY USER of \DataSeti
\renewcommand{\HeaderLabel}{\small No.} % header label will be displayed in bold
\renewcommand{\FirstRowLabel}{\small f(kHz)} % first row label
\renewcommand{\SecondRowLabel}{\small i(mA)} % second row label
\renewcommand{\LongestNumber}{\small 0.000} % <<<< needed to calculate columns width
\renewcommand{\LongestLabel}{\small f(kHz)} % <<<< needed to calculate first column width
%%****************END INITIAL SETUP BY USER

\FormatData{\DataSeti}{Splitted table with \textbf{pgfplotstable}; text width: \the\textwidth} 

\clearpage

\newgeometry{left=3.0cm, right=5.0cm, top=3.0cm, bottom=3.0cm, marginparwidth=0pt, marginparsep=0pt}

% There is not need to reload nor setup the table again
\FormatData{\DataSeti}{Same dataset; text width: \the\textwidth} 

\clearpage  

\newgeometry{left=3.0cm, right=8.0cm, top=4.0cm, bottom=3.0cm, marginparwidth=0pt, marginparsep=0pt}
\pgfplotstableread{% store table in macro \DataSetii
0.10 &0.11 &0.12 &0.13 &0.14 &0.15 &0.16 &0.17 &0.18 &0.19 &0.20 &0.21 &0.22 &0.23 &0.24 &0.25 &0.26 &0.27 &0.28 &0.29 &0.30 &0.31 &0.32 &0.33 &0.34 &0.35 &0.36 &0.37 &0.38 &0.39 &0.40 &0.41 &0.42 &0.43 &0.44 &0.45 &0.46 &0.47 &0.48 &0.49 &0.50 &0.51 &0.52\\
83 &30 &93 &84 &10 &6 &61 &53 &10 &89 &26 &12 &71 &78 &23 &72 &89 &29 &60 &96 &68 &9 &77 &89 &14 &78 &73 &31 &48 &77 &34 &94 &28 &61 &23 &30 &19 &8 &77 &30 &68 &69 &29\\
4 &7 &7 &5 &9 &3 &8 &1 &4 &7 &9 &4 &8 &4 &6 &9 &9 &3 &5 &9 &3 &7 &5 &5 &4 &7 &2 &3 &2 &6 &4 &8 &8 &3 &3 &9 &6 &8 &8 &8 &6 &7 &7\\
9 &8 &1 &6 &9 &6 &8 &7 &6 &9 &8 &5 &7 &9 &9 &4 &4 &5 &7 &9 &4 &7 &8 &6 &9 &4 &8 &0 &4 &9 &0 &2 &7 &2 &8 &2 &0 &3 &1 &5 &8 &3 &8\\

}{\DataSetii}   

%%****************INITIAL SETUP BY USER \DataSetii
\renewcommand{\HeaderLabel}{\small Step} % header label will be displayed in bold
\renewcommand{\FirstRowLabel}{\small Impulse (s) } % first row label
\renewcommand{\SecondRowLabel}{\small Response (mm)} % second row label
\renewcommand{\ThirdRowLabel}{$\sigma$} % third row label
\renewcommand{\FourhRowLabel}{$x^n + y^n$} % fourth row label
\renewcommand{\LongestNumber}{\small 0.00} % <<<< needed to calculate columns width
\renewcommand{\LongestLabel}{\small Response (mm)} % <<<< needed to calculate first column width
%%****************END INITIAL SETUP BY USER

\FormatData{\DataSetii}{A longer table splitted; text width: \the\textwidth}    

\end{document}

相关内容