![CSV 阅读器偏移表中的前两行](https://linux22.com/image/440792/CSV%20%E9%98%85%E8%AF%BB%E5%99%A8%E5%81%8F%E7%A7%BB%E8%A1%A8%E4%B8%AD%E7%9A%84%E5%89%8D%E4%B8%A4%E8%A1%8C.png)
我正在尝试使用 CSV 阅读器(来自csvsimple
包)将一些数据打印到表中。但是,我观察到第一列的前两个单元格中存在奇怪的偏移:
\documentclass[12pt,a4paper]{report}
\usepackage{csvsimple}
\usepackage{filecontents}
\begin{document}
\begin{filecontents*}[overwrite]{data.csv}
x,y,z
42,43,44
42,43,44
42,43,44
42,43,44
42,43,44
\end{filecontents*}
\begin{table}[h]
\centering
\begin{tabular}{|l|l|l|}
\hline
$x$ & $y$ & $z$
\tabularnewline
\hline\hline
42 & 43 & 44 \tabularnewline\hline
\csvreader[
head to column names,
late after line=\tabularnewline\hline]
{data.csv}{}{
\x & \y & \z
}
\end{tabular}
\end{table}
\end{document}
这个问题显然来自\csvreader
宏(删除第一行硬编码数据不会影响偏移量);使用p{0.5cm}
而不是 可以l
解决这个问题,但我最好坚持使用l
。我在这里遗漏了什么?
我的 TeX 是pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2020.10.20)
我csvsimple
的Package: csvsimple 2019/04/09 version 1.21 LaTeX CSV file processing
UPD:理想情况下,我想保留表格主体和标题的分离,因为这是一个更大的难题的一小部分,我希望能够设计一个复杂的表格标题)
答案1
\documentclass{article}
\usepackage{csvsimple}
\begin{document}
\begin{filecontents*}[overwrite]{test.csv}
x,y,z
42,43,44
42,43,44
42,43,44
42,43,44
42,43,44
\end{filecontents*}
\csvautotabular{test.csv}
\csvreader[
tabular = |l|l|l|,
table head = \hline $X$&$Y$ &$Z$\\\hline\hline,
late after line = \\\hline
]{test.csv}{}{%
\csvcoli&\csvcolii & \csvcoliii
}
\end{document}
根据 OP 要求进行编辑
\documentclass{article}
\usepackage{csvsimple}
\begin{document}
\begin{filecontents*}[overwrite]{test.csv}
x,y,z
42,43,44
42,43,44
42,43,44
42,43,44
42,43,44
\end{filecontents*}
\csvautotabular{test.csv}
%
\begin{tabular}{|l|l|l|}\hline%
$x$ & $y$ & $z$ \\\hline\hline
\csvreader[
late after line = \\\hline
]
{test.csv}{}{%
\csvcoli & \csvcolii & \csvcoliii
}%
\end{tabular}
\end{document}
答案2
这是使用 的方法readarray
。请确保使用 v3.1 2021-09-17。
\begin{filecontents*}[overwrite]{data.csv}
x,y,z
42,43,44
42,43,44
42,43,44
42,43,44
42,43,44
\end{filecontents*}
\documentclass[12pt,a4paper]{report}
\usepackage{readarray}
\def\firstrow{\hline}
\renewcommand\typesetrowsepchar{\\\firstrow\hline\gdef\firstrow{}}
\renewcommand\typesetcolsepchar{&}
\renewcommand\typesetcell[1]{$#1$}
\begin{document}
\begin{table}[h]
\centering
\readarraysepchar{,}
\readdef{data.csv}\tabdata
\readarray*\tabdata\tabarray[-,\ncols]
\begin{tabular}{|l|l|l|}
\hline
\typesetarray\tabarray
\\\hline
\end{tabular}
\end{table}
\end{document}
\hline
如果从 的定义中去掉\typesetrowsepchar
,则得到
答案3
尽管@js bibra 的回答从技术上解决了这个问题,原来是由于行声明中的换行符(即传递给的最后一个参数\csvreader
)而产生了额外的间距。只需更改
\csvreader[
head to column names,
late after line=\tabularnewline\hline]
{data.csv}{}{
\x & \y & \z
}
到
\csvreader[
head to column names,
late after line=\tabularnewline\hline]
{data.csv}{}{%
\x & \y & \z
}
无需任何进一步修改即可解决问题。
更多信息:行末百分号(%)有什么用?