我正在将一个包含两组数据的文本文件读入 \LaTex。两组数据之间用空行分隔。我试图将一组数据排版到一个表中,将第二组数据排版到用 \hline 分隔的同一个表中。这可能吗?
这是我的数据:(抱歉,我不明白如何 \define 它才能形成真正的 mwe……)
10,100
5,100
2,99
0.85,98
0.425,92
0.25,60
0.15,31
0.075,9
0.0274,9.4
0.0176,9.1
0.0107,8.0
0.007,6.9
0.0059,5.6
0.0031,3.7
0.0013,2.5
以下是我的想法:
\documentclass[letterpaper,11pt]{standalone}
\usepackage{readarray}
\begin{document}
\readarraysepchar{,}
\renewcommand\typesetplanesepchar{\\\hline}
\renewcommand\typesetrowsepchar{\\}
\renewcommand\typesetcolsepchar{&}
\readdef{../01data/data.csv}\data
\readarray\data\array[-,\nrows,\ncols]
\centering
\begin{tabular}{c|c}
Seive& Passing\\
size & \\
(mm) & (\%)\\
\hline
\typesetarray\array[1,\nrows,\ncols]\\
\hline
\typesetarray\array[2,\nrows,\ncols]\\
\end{tabular}
\end{document}
输出如下
我得到的输出不显示第二组数据,而只显示第一组数据。此外,输出最后显示了一些不需要的数据。有人能帮我理解发生了什么吗?
答案1
我不知道如何用 来做这件事readarray
,但我可以用 来做expl3
。
\begin{filecontents*}{\jobname.dat}
10,100
5,100
2,99
0.85,98
0.425,92
0.25,60
0.15,31
0.075,9
0.0274,9.4
0.0176,9.1
0.0107,8.0
0.007,6.9
0.0059,5.6
0.0031,3.7
0.0013,2.5
\end{filecontents*}
\documentclass{article}
\ExplSyntaxOn
% user level command
\NewDocumentCommand{\tablefromfile}{m}
{
\cmp_table_from_file:n { #1 }
}
% the input stream
\ior_new:N \g_cmp_table_from_file_ior
% the table body container
\tl_new:N \l_cmp_table_from_file_body_tl
% the internal function
\cs_new_protected:Nn \cmp_table_from_file:n
{
% keep changes to \endlinechar local
\group_begin:
% no end line character
\int_set:Nn \endlinechar { -1 }
% clear the body
\tl_clear:N \l_cmp_table_from_file_body_tl
% open the input stream
\ior_open:Nn \g_cmp_table_from_file_ior { #1 }
% read line by line and populate the body
\ior_map_inline:Nn \g_cmp_table_from_file_ior
{
\__cmp_table_from_file_add:n { ##1 }
}
% close the stream
\ior_close:N \g_cmp_table_from_file_ior
% print the table
\begin{tabular}{c|c}
Seive & Passing \\
size \\
(mm) & (\%) \\
\hline
\tl_use:N \l_cmp_table_from_file_body_tl
\end{tabular}
% end the group
\group_end:
}
% the auxiliary function
\cs_new_protected:Nn \__cmp_table_from_file_add:n
{
\tl_if_blank:nTF { #1 }
{% the line is empty: add \hline
\tl_put_right:Nn \l_cmp_table_from_file_body_tl { \hline }
}
{% the line is not empty: split the comma list in the components
% and add them to the body
\tl_put_right:Nx \l_cmp_table_from_file_body_tl
{ \clist_item:nn { #1 } { 1 } & \clist_item:nn { #1 } { 2 } \exp_not:N \\ }
}
}
\ExplSyntaxOff
\begin{document}
\tablefromfile{\jobname.dat}
\end{document}
我使用filecontents*
只是为了避免破坏我的文件,您可以在参数中使用任何文件名\tablefromfile
。