longtable
我有一个包含多行的 CSV 文件。我想使用和包将这些行排版到表格中datatool
。
- 然而就在“最后一脚”之前(它说总结) 我得到了一个不需要的空行。如何删除该多余的行?
- 日期下方的列间距不均匀。有人能帮我把它们间距弄均匀吗?
我给出了示例代码。我的 CSV 文件的名称是namelist.csv
,它看起来像这样。
number,degree,Name
1,Dr,Abdul Ali
2,Mrs,Francesca Joestar
3,Mr,Chan Ker Mei
4,Dr,Hikaru Yagami
5,Dr,Harish Kumar
我的 LaTeX 代码如下。
\documentclass[12pt]{article}
\usepackage{setspace}
\usepackage{bookman}
\usepackage{longtable}
\usepackage{pdflscape}
\usepackage[a4paper,left=1in,right=0.8in,top=0.5in,bottom=0.5in]{geometry}
\usepackage{tgschola}
\usepackage{microtype}
\usepackage{datatool}
\DTLloaddb{names}{namelist.csv}
%==================================================================
\begin{document}
%
\begin{landscape}
%
\doublespacing
%
\begin{longtable}{|l|l|c|c|r|r|r|c|c|c|c|c|c|c|c|c|c|c|}\hline
%
No.&\multicolumn{1}{c|}{Name}& \multicolumn{2}{c|}{13.12.2010}&
\multicolumn{2}{c|}{14.12.2010}&\multicolumn{2}{c|}{15.12.2010}&
\multicolumn{2}{c|}{16.12.2010}
&\multicolumn{2}{c|}{17.12.2010}&\multicolumn{2}{c|}{18.12.2010}
&\multicolumn{2}{c|}{19.12.2010} &\multicolumn{2}{c|}{20.12.2010}\\ \hline\hline
\endfirsthead
%
\multicolumn{18}{c}%
{{\bfseries Continued from previous page}} \\
\hline
%
No.&\multicolumn{1}{c|}{Name}& \multicolumn{2}{c|}{13.12.2010}&
\multicolumn{2}{c|}{14.12.2010}&\multicolumn{2}{c|}{15.12.2010}&
\multicolumn{2}{c|}{16.12.2010}
&\multicolumn{2}{c|}{17.12.2010}&\multicolumn{2}{c|}{18.12.2010}
&\multicolumn{2}{c|}{19.12.2010} &\multicolumn{2}{c|}{20.12.2010}\\ \hline\hline
\endhead
%
\hline \multicolumn{18}{|r|}{{Continued on next page}} \\ \hline
\endfoot
%
\hline
\multicolumn{18}{|r|}{{Concluded}} \\ \hline
\endlastfoot
%
\DTLforeach{names}{
\no=number, \dg=degree, \name=Name}{
\no& \dg. \name & & & & & & & &
& & & & & & & & \\ \hline
}
\end{longtable}%
%
\end{landscape}
%
\end{document}
答案1
\DTLforeach
使用时,\hline
通常最好使用以下示意图结构,将\\
和放在\hline
每个非初始行的开头而不是每行的结尾。
\DTLforeach{<database>}{<assignments>}{%
\DTLiffirstrow{}{\\\hline}
rest of table with no final \\
}
对于第二个问题,可能有不同的解决方案,但最简单的方法可能是使用固定列宽。如果单元格始终为空白,则只需一p{2em}
列即可;如果您随后要在单元格中插入居中文本,则需要一个稍微复杂一些的版本,这就是我在示例中使用的版本。
使用该array
包,我定义了一个C
列:
\newcolumntype{C}{>{\centering\arraybackslash}p{2em}}
并以此作为主要柱子的基础c
。
因此对于您的代码具体来说:
\documentclass[12pt]{article}
\usepackage{setspace}
\usepackage{longtable,array}
\usepackage{pdflscape}
\usepackage[a4paper,left=1in,right=0.8in,top=0.5in,bottom=0.5in]{geometry}
\usepackage{datatool}
\DTLloaddb{names}{namelist.csv}
%==================================================================
\begin{document}
%
\begin{landscape}
%
\doublespacing
%
\newcolumntype{C}{>{\centering\arraybackslash}p{2em}} % THIS COMMAND ADDED
\begin{longtable}{|r|l|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|} % THIS COMMAND CHANGED
\hline
%
No.&\multicolumn{1}{c|}{Name}& \multicolumn{2}{c|}{13.12.2010}&
\multicolumn{2}{c|}{14.12.2010}&\multicolumn{2}{c|}{15.12.2010}&
\multicolumn{2}{c|}{16.12.2010}
&\multicolumn{2}{c|}{17.12.2010}&\multicolumn{2}{c|}{18.12.2010}
&\multicolumn{2}{c|}{19.12.2010} &\multicolumn{2}{c|}{20.12.2010}\\ \hline\hline
\endfirsthead
%
\multicolumn{18}{c}%
{{\bfseries Continued from previous page}} \\
\hline
%
No.&\multicolumn{1}{c|}{Name}& \multicolumn{2}{c|}{13.12.2010}&
\multicolumn{2}{c|}{14.12.2010}&\multicolumn{2}{c|}{15.12.2010}&
\multicolumn{2}{c|}{16.12.2010}
&\multicolumn{2}{c|}{17.12.2010}&\multicolumn{2}{c|}{18.12.2010}
&\multicolumn{2}{c|}{19.12.2010} &\multicolumn{2}{c|}{20.12.2010}\\ \hline\hline
\endhead
%
\hline \multicolumn{18}{|r|}{{Continued on next page}} \\ \hline
\endfoot
%
\hline
\multicolumn{18}{|r|}{{Concluded}} \\ \hline
\endlastfoot
%
\DTLforeach{names}{%
\no=number, \dg=degree, \name=Name}{%
\DTLiffirstrow{}{\\\hline} % THIS LINE HAS BEEN ADDED
\no& \dg. \name & & & & & & & &
& & & & & & & & % THIS LINE HAS BEEN CHANGED
}
\end{longtable}%
%
\end{landscape}
%
\end{document}
答案2
LT 中的空白行很可能是\\
某个地方的伪造行。从您的描述来看,不清楚它是在表格底部作为空白的第一行,还是在表格主体中作为空白的最后一行,这些在输出中可能看起来相同,但在源代码中当然是完全分开的。
答案3
不要忘记在这行中添加 %。这与下面这一行有所不同
\DTLiffirstrow{}{\\\hline}
到
\DTLiffirstrow{}{\\\hline} % THIS LINE HAS BEEN ADDED
如果您将第一行添加到表格中,有时会发生意外行为。数据库的第一个条目将在第 1 列、第 1 行添加一个空格。
如果您添加第二行(特别是您至少应该添加%符号),那么这种行为将被阻止。
这只是我因为这个案例而发现的附加信息。我记住了这个条目以防这个命令,并想将此信息提交给社区。