csvsimple 和 siunitx

csvsimple 和 siunitx

我正在尝试从 csv 文件导入数据并使用S列类型来siunitx格式化数字,代码如下:

\documentclass{article}
\usepackage{siunitx}
\usepackage{csvsimple}

\begin{filecontents*}{input_data.csv}
month, dogs, cats
January, 12.50,12.3e5
February, 3.32, 8.7e3
\end{filecontents*}

\begin{document}
\section{c}
\csvloop{
file=input_data.csv,
tabular={SS},
command=\csvcolii & \csvcoliii}
\end{document}

这导致我出现以下错误:

You can't use a prefix with `\hskip'. command=\csvcolii & \csvcoliii}
Missing number, treated as zero. command=\csvcolii & \csvcoliii}
Illegal unit of measure (pt inserted). command=\csvcolii & \csvcoliii}
Extra }, or forgotten \endgroup. command=\csvcolii & \csvcoliii}
Missing } inserted. command=\csvcolii & \csvcoliii}

如果我将第一列更改为例如c它的排版。

我找到了一种解决方法,即制作一个隐形的列,但感觉很丑陋,而且我不知道它是否有我不知道的副作用。

\documentclass{article}
\usepackage{siunitx}
\usepackage{array}
\usepackage{csvsimple}
\newcolumntype{H}{>{\setbox0=\hbox\bgroup}c<{\egroup}@{}}

\begin{filecontents*}{input_data.csv}
month, dogs, cats
January, 12.50,12.3e5
February, 3.32, 8.7e3
\end{filecontents*}

\begin{document}
\csvloop{
file=input_data.csv,
tabular={HSS},
command={}&\csvcolii & \csvcoliii}
\end{document}

所以问题是是否有更干净的方法来做到这一点。

答案1

似乎S不赞成将 设置为第一列类型cvssimple。但有更简单的方法可以添加虚拟列并规避此问题:

\documentclass{article}
\usepackage{siunitx}
\usepackage{csvsimple}

\begin{filecontents*}{\jobname.csv}
month, dogs, cats
January, 12.50,12.3e5
February, 3.32, 8.7e3
\end{filecontents*}

\begin{document}

X\csvloop{
file=\jobname.csv,
tabular={c@{}SS},
command=\empty & \csvcolii & \csvcoliii}X

\medskip

X\csvreader[
  tabular={c@{}SS},
]{\jobname.csv}{}{& \csvcolii & \csvcoliii}X

\medskip

X\begin{tabular}{SS}
12.50&12.3e5\\
3.32& 8.7e3
\end{tabular}X

\end{document}

第三个表格是“手工制作的”,仅供比较。

在此处输入图片描述

答案2

l这是另一种解决方法。您可以将第一列的列类型更改为、c或,而不是添加虚拟列r。该siunitx包提供了一个宏\tablenum,允许直接格式化数字。

我使用egreg的方法来展示代码(第三个表格是为了比较):

\documentclass{article}
\usepackage{siunitx}
\usepackage{csvsimple}

\begin{filecontents*}{\jobname.csv}
month, dogs, cats
January, 12.50,12.3e5
February, 3.32, 8.7e3
\end{filecontents*}

\begin{document}

X\csvloop{
file=input_data.csv,
tabular={cS},
command=\tablenum{\csvcolii} & \csvcoliii}X

\medskip

X\csvloop{
file=input_data.csv,
tabular={cc},
command=\tablenum{\csvcolii} & \tablenum{\csvcoliii}}X

\medskip

X\begin{tabular}{SS}
12.50&12.3e5\\
3.32& 8.7e3
\end{tabular}X

\end{document}

在此处输入图片描述

相关内容