我发现这个帖子,说明如何用粗体字样排版表格标题。只要我不使用包格式化数字,将它与包\csvreader
中的结合就可以了。下面修复了两个小数点,如下所示csvsimple
siunitx
\sisetup
这个答案。
\documentclass{article}
\usepackage{csvsimple, siunitx, booktabs, array}
\begin{filecontents*}{sample.csv}
Player, Merlin, Mordred
Andrew, 0.6, 0.55
Ben, 0.54, 0.62
\end{filecontents*}
\newcolumntype{+}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{-}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}#1\ignorespaces}
\csvstyle{boldhead}{
no head,
table head=\toprule\rowstyle{\bfseries},
late after first line=\\ \midrule,
table foot=\bottomrule
}
\sisetup{round-mode=places, round-precision=2, round-integer-to-decimal}
\begin{document}
\csvreader[tabular=+l-c-c, boldhead]{sample.csv}{}{\csvcoli & \csvcolii & \csvcoliii}
\end{document}
我认为这个解决方案存在三个问题:
head to column names
由于选项已加载,因此无法使用该选项no head
。有没有更好的方法使用来显示标题,\csvreader
同时保留使用的可能性head to column names
?- 如果我
tabular=+l-c-c
用替换tabular=+l-S-S
,那么表格将不再排版,因为siunitx
包无法识别标题并抛出错误invalid numerical input 'e'
。 - 就我个人而言,我更喜欢输入
lcc
而不是+l-c-c
。
由于包的数字格式siunitx
可以用组进行转义,因此我对第 2 点的想法是将一\bgroup
\egroup
对包含到行样式中,如下所示:
\newcolumntype{+}{>{\global\let\currentrowstyle\relax\global\let\currentrowstylepost\relax}}
\newcolumntype{-}{>{\currentrowstyle}}
\newcolumntype{^}{<{\currentrowstylepost}}
\newcommand{\rowstyle}[1]{%
\gdef\currentrowstylepost{\egroup}%
\gdef\currentrowstyle{#1\bgroup}%
#1\bgroup\ignorespaces%
}
虽然上述代码适用于 option tabular=+l^-c^-c^
,但对于 仍然不起作用tabular=+l^-S^-S^
。我遗漏了什么?
关于第 3 点,有人可能会认为这可以通过软件包来解决tokcycle
。这是我的尝试。
\settcEscapechar{:}
\newif\iffirstchar
\Characterdirective{%
\ifx#1|%
#1%
\else%
\iffirstchar%
\global\firstcharfalse%
+#1%
\else%
-#1%
\fi%
\fi%
}
\newcommand{\csvboldreader}[4]{%
\global\firstchartrue%
\csvreader[tabular=\tokencyclexpress #1\endtokencyclexpress, boldhead]{#2}{#3}{#4}
}
\begin{document}
\csvboldreader{lcc}{sample.csv}{}{\csvcoli & \csvcolii & \csvcoliii}
\end{document}
不幸的是,它会抛出一个错误illegal token 'c' used
。如果我调用
\tokencyclexpress lcc\endtokencyclexpress
单独来看,字符串转换正确。我遗漏了什么?
我必须承认我对这个软件包不太熟悉siunitx
,并且我想我会再问两个关于它的问题:
- 最简洁的方法
\sisetup
是将数字与标题居中对齐,但彼此之间按照小数点对齐?有没有比{S[table-format=1.2]}
手动设置每列更好的方法? @{}
手册中出现的用途是什么siunitx
?我的第一个猜测是不必为每一列使用括号,但这似乎不正确,因为tabular=@{} l S S[table-format=2.2] @{}
不起作用。
答案1
请参阅补充材料以了解替代方案。
至于tokcycle
问题的部分(第 3 项),发布的方法存在两个问题:
在可选参数内运行令牌循环
\csvreader
不起作用。即使传递带有正确标记的宏(如
tabular=\mypreamble
)也不起作用。必须传递实际代币序言tabular
。
因此,需要做几件事。必须在调用之前执行标记循环\csvreader
,并且必须将结果保存在\cytoks
标记列表中。这需要将\Characterdirective
的直接输出更改<tokens>
为等效\addcytoks{<tokens>}
格式。通过使用\tokcyclexpress
(宏)而不是(伪环境),即使结果存储在 中,也可以抑制输出\tokencyclexpress
的自动排版。\the\cytoks
\cytoks
到目前为止,一切顺利。但即使在这里,tabular=\the\cytoks
中的选项\csvreader
也不起作用。因此,必须将调用分为两部分:\def\tmp{\csvreader[tabular=}
后跟\expandafter\tmp\the\cytoks, boldhead]{#2}{#3}{#4}
。这样,\the\cytoks
在调用 之前,将其扩展为实际所需的标记\csvreader
。
\documentclass{article}
\usepackage{csvsimple, siunitx, booktabs, array,tokcycle}
\begin{filecontents*}[overwrite]{sample.csv}
Player, Merlin, Mordred
Andrew, 0.6, 0.55
Ben, 0.54, 0.62
\end{filecontents*}
\newcolumntype{+}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{-}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}#1\ignorespaces}
\csvstyle{boldhead}{
no head,
table head=\toprule\rowstyle{\bfseries},
late after first line=\\ \midrule,
table foot=\bottomrule
}
\sisetup{round-mode=places, round-precision=2, round-integer-to-decimal}
\settcEscapechar{:}
\newif\iffirstchar
\Characterdirective{%
\ifx#1|%
\addcytoks{#1}%
\else%
\iffirstchar%
\global\firstcharfalse%
\addcytoks{+#1}%
\else%
\addcytoks{-#1}%
\fi%
\fi%
}
\newcommand{\csvboldreader}[4]{%
\global\firstchartrue%
\tokcyclexpress{#1}%
\def\tmp{\csvreader[tabular=}%
\expandafter\tmp\the\cytoks, boldhead]{#2}{#3}{#4}
}
\begin{document}
\csvboldreader{lcc}{sample.csv}{}{\csvcoli & \csvcolii & \csvcoliii}
\end{document}
补充
siunitx
以下是支持列类型以及粗体(或其他)第一行的替代方法:
\documentclass{article}
\usepackage{siunitx, booktabs, array, tokcycle, readarray}
\begin{filecontents*}[overwrite]{sample.csv}
Player, Merlin, Mordred
Andrew, 0.6, 0.55
Ben, 0.54, 0.62
\end{filecontents*}
\sisetup{round-mode=places, round-precision=2, round-integer-to-decimal}
\newif\iffirstrow
\Characterdirective{%
\iffirstrow
\tctestifx{,#1}{\addcytoks{&\xxcmd}}{\addcytoks{{#1}}}
\else
\tctestifx{,#1}{\addcytoks{&}}{\addcytoks{#1}}
\fi
}
\Macrodirective{%
\iffirstrow
\tctestifx{\\#1}{\firstrowfalse\addcytoks{#1\midrule}}{\addcytoks{#1}}
\else
\addcytoks{#1}
\fi
}
\newcommand\csvxreader[3][\bfseries]{%
\readarraysepchar{\\}%
\readdef{#3}\mytab
\firstrowtrue
\def\xxcmd{#1}%
\expandafter\tokcyclexpress\expandafter{\mytab}%
\begin{tabular}{#2}%
\toprule
#1%
\the\cytoks
\bottomrule
\end{tabular}%
}
\begin{document}
\csvxreader[\scshape]{lcc}{sample.csv}
\bigskip
\csvxreader{lSS}{sample.csv}
\end{document}