Latex 的另一个文件问题;这次我尝试从单个文本文件中读取数据并将其直接放入表中。
该文件内容如下:
某物 | 数据 | 东西 | 培根
其他东西 | 数据 | 不同的东西 | 更多培根
第三个 | 第三个数据 | 你明白了 | 培根
要做到这一点我可以使用一个简单的\输入但这样我就必须在文本文件中设置所有表格。由于我不是制作 .txt 文件的人,所以我希望它保持简洁。我的解决方案是使用 expl3 和 xparse。但是,我很难弄清楚如何让 Latex 将文件吐出到表格中。我最接近的方法是使用以下代码并制作出类似于图片的东西。
这个代码不是我自己写的。我是从从单独的文件中解析任意文本通过egreg:https://tex.stackexchange.com/users/4427/egreg。他的回复非常有帮助,我研究了 expl3,开始有了更好的理解。不幸的是,我不太理解这段代码;只是语法(那里也有点不牢靠)。我的一般理解是它在函数中创建一个函数,等等。然后读入一个文件。这段代码将读取文件的所有行,我不确定它是如何循环的,或者它是否是递归的。我也不知道什么\泰勒意思。(Google 帮助我们弄清楚了大部分问题,但是却没能找到 \taylor)。
任何关于代码的解释都将不胜感激。
\NewDocumentCommand{\readdata}{O{|} m}
{
\readdata:nn { #1 } { #2 }%
}
\cs_new_protected:Npn \readdata:nn #1 #2%
{
\ior_open:Nn \g__read_ior { #2 }%
\ior_map_inline:Nn \g__read_ior%
{%
\__process:nn { #1 } { ##1 }%
}%
\ior_close:N \g__read_ior%
}
\cs_new_protected:Npn \__process:nn #1 #2%
{
\seq_set_split:Nnn \l__line_seq { #1 } { #2 }%
\use:x%
{%
\exp_not:N \DataEntry%
\seq_map_function:NN \l__line_seq \__brace:n%
}%
}
\cs_new:Npn \__brace:n #1 { { #1 } }%
\ExplSyntaxOff
\newcommand{\DataEntry}[4] % Predetermined number of columns for data
{
#1 & #2 & #3 & #4 \\%
\hline
}
...later...
\begin{table}[ht]
\head{\caption{Results}}% title of Table
\centering
\begin{tabular}{|p{2.5cm}|p{2.5cm}|p{2.5cm}|p{3.5cm}|}
I'd prefer to use |c| to have them centered, but that doesn't seem to work yet...
\hline\hline
Sample \# & Something & Results & Description \\ [0.5ex] % inserts table headings
\hline
\readdata[|]{data6.txt}
\label{table:nonlin} % is used to refer this table in the text
\end{tabular}
\end{table}
答案1
问题是,您尝试向表格中添加更多行,但这无法通过从一个单元格开始并在另一个单元格结束的循环来完成。必须通过将各个表行存储在标记列表变量中并最终传递此行来完整执行循环。
\begin{filecontents*}{\jobname-data.txt}
something | data | stuff | bacon
something else | data | different stuff | more bacon
3rd | 3rd data | you get the idea | bacon
\end{filecontents*}
\documentclass{article}
\usepackage{xparse,booktabs}
\ExplSyntaxOn
\NewDocumentCommand{\readdata}{O{|} m}
{
\mhag_readdata:nn { #1 } { #2 }
}
\NewDocumentCommand{\DataEntry}{m m m m}% Predetermined number of columns for data
{
#1 & #2 & #3 & #4 \\
}
\ior_new:N \g__mhag_read_stream % an input stream
\seq_new:N \l__mhag_line_seq % a temporary sequence for processing a row
\tl_new:N \l__mhag_body_tl % a container for the table body
\cs_new_protected:Npn \mhag_readdata:nn #1 #2
{
% clear the table body
\tl_clear:N \l__mhag_body_tl
% open the input stream
\ior_open:Nn \g__mhag_read_stream { #2 }
% loop on the file lines
\ior_map_inline:Nn \g__mhag_read_stream
{% process the current line
\__mhag_process:nn { #1 } { ##1 }
}
% the loop has ended, close the stream
\ior_close:N \g__mhag_read_stream
% deliver the table body
\tl_use:N \l__mhag_body_tl
}
\cs_new_protected:Npn \__mhag_process:nn #1 #2
{% split the line at | (or the character specified in the optional argument
\seq_set_split:Nnn \l__mhag_line_seq { #1 } { #2 }
% add a line to the table body
\tl_put_right:Nx \l__mhag_body_tl
{% this will put a in \l__mhag_body_tl the tokens
% \DataEntry{<item 1>}{<item 2>}{<item 3>}{<item 4>}
\DataEntry \seq_map_function:NN \l__mhag_line_seq \__mhag_brace:n
}
}
% the auxiliary function for bracing each item
\cs_new:Npn \__mhag_brace:n #1 { { #1 } }
\ExplSyntaxOff
\begin{document}
\begin{table}[ht]
\centering
\caption{Results}% title of Table
\label{table:nonlin} % is used to refer this table in the text
\medskip
\begin{tabular}{@{}p{2.5cm}p{2.5cm}p{2.5cm}p{2.5cm}@{}}
\toprule
Sample \# & Something & Results & Description \\ % inserts table headings
\midrule
\readdata[|]{\jobname-data.txt}
\bottomrule
\end{tabular}
\end{table}
\end{document}
我曾经filecontents*
让示例保持独立。我也曾经booktabs
得到更好的表格。