我正在尝试从 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}