我正在使用如下所示的乳胶代码从 csv 文件生成一个大表。
\documentclass{article}
\usepackage{booktabs}
\usepackage{csvsimple}
\usepackage{caption}
\usepackage{longtable}
\begin{document}
\csvautobooklongtable[
table head={%
\toprule
\bfseries Name &\bfseries ID \\
\midrule},
table foot={\\\bottomrule}]%
{sample-data.csv}
\end{document}
生成的文档类似于:
现在,我想做:
- 大于 6 的 ID 以粗体和红色显示。我该怎么做?
- 另外,对于小于 6 的 ID,我想附加一个符号
<
。因此 3 变成3 <
。我该怎么做呢?
以下是CSV 文件我正在使用它来创建一个表。
答案1
我很难让它工作,\csvautobooklongtable
因为它相当严格,但我认为(?)使用\csvreader[longtable=ll,...
会创建一个长表。使用此设置csvsimple您可以创建表格
使用代码:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{sample-data.csv}
name, id
Daphne Kub, 1
Karolann Lebsack, 2
Charlotte Parisian, 3
Jairo Mayert, 4
Dr. Adrienne Schulist, 5
Elenora Pacocha, 6
Nikita Mraz, 7
Maya Tremblay, 8
Florine Konopelski, 9
Derrick Volkman, 10
\end{filecontents*}
\usepackage{xcolor}
\usepackage{booktabs}
\usepackage{csvsimple}
\usepackage{caption}
\usepackage{longtable}
\newcommand\ColorID[1]{\ifnum#1>6\color{red}\textbf{#1}\else#1 $<$\fi}
\begin{document}
\csvreader[head to column names,longtable=ll,
table head={\toprule\bfseries Name &\bfseries ID \\ \midrule},
table foot={\\\bottomrule}
]{sample-data.csv}{}
{\name &\ColorID\id}
\end{document}
主要的一点是我习惯于head to column names
命名每一列中的“变量”,并且\ColorID
使用宏将大数字变为粗体红色并添加<
到小数字中。
(我还使用文件内容包裹。)
编辑如果您想要保持数据文件完整并且不添加标题name, id
,那么您应该删除head to column names
然后使用,例如,在表中\csvcoli
:\csvcolii
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{sample-data.csv}
Daphne Kub, 1
Karolann Lebsack, 2
Charlotte Parisian, 3
Jairo Mayert, 4
Dr. Adrienne Schulist, 5
Elenora Pacocha, 6
Nikita Mraz, 7
Maya Tremblay, 8
Florine Konopelski, 9
Derrick Volkman, 10
\end{filecontents*}
\usepackage{xcolor}
\usepackage{booktabs}
\usepackage{csvsimple}
\usepackage{caption}
\usepackage{longtable}
\newcommand\ColorID[1]{\ifnum#1>6\color{red}\textbf{#1}\else#1 $<$\fi}
\begin{document}
\csvreader[longtable=ll,
table head={\toprule\bfseries Name &\bfseries ID \\ \midrule},
table foot={\\\bottomrule}
]{sample-data.csv}{}
{\csvcoli &\ColorID\csvcolii}
\end{document}
答案2
readarray
一种使用和的方法listofitems
。
这里我简单的使用了\readdef
的宏readarray
来将文件内容输入到 中,同时在输入的每条记录的末尾\def\mytabledata
放置。\\
然后,我开发宏\mytable
来使用标记列表构建。我首先通过插入的 执行tabular
两层解析,然后查找每行中的逗号。调用后,例如将包含与第 3 个文件记录关联的名称,而将包含与第 4 个文件记录关联的 id 标签。该宏是完全可扩展的,需要两次扩展才能获得文件数据中实际存在的标记。因此,我提供了内部支持宏,例如获取其参数,将其扩展两次,然后将其添加到标记列表中。\mytabledata
\\
\readlist*\IDlabel{}
\IDlabel[3,1]
\IDlabel[4,2]
\IDlabel[]
\xxaddtotabtoks{}
我设置了一个\foreachitem
循环来遍历每条记录并将标记添加到标记列表中。我必须为第一条记录创建不同的逻辑,因为该记录用于制作标题。对于其他记录,我将数据输出到标记列表中,同时注意 id 标签的值,如果它小于 6,我会添加一个,如果大于 6,我会将$<$
其设为粗体红色。
循环完成后,我只需要输出里面的标记列表tabular
。
\documentclass{article}
\usepackage{listofitems,xcolor,filecontents,readarray,booktabs}
\begin{filecontents*}{sample-data.csv}
Name, ID
Thing 1, 3
Thing 2, 5
Joe Smith, 6
Jane Doe, 11
\end{filecontents*}
\newtoks\tabtoks
\newcommand\addtotabtoks[1]{\tabtoks\expandafter{\the\tabtoks#1}}
\newcommand\xaddtotabtoks[1]{\expandafter\addtotabtoks\expandafter{#1}}
\newcommand\xxaddtotabtoks[1]{\expandafter\xaddtotabtoks\expandafter{#1}}
\newcommand\mytable[2][0]{%
\setsepchar{\\/,}%
\ignoreemptyitems%
\tabtoks{}%
\readlist*\IDlabel{#2}%
\foreachitem\x\in\IDlabel[]{%
\ifnum\xcnt=1\relax
\addtotabtoks{\toprule\bfseries}
\xxaddtotabtoks{\IDlabel[1,1] & \bfseries}
\xxaddtotabtoks{\IDlabel[1,2] \\\midrule}%
\else
\xxaddtotabtoks{\IDlabel[\xcnt,1] & }%
\ifnum\IDlabel[\xcnt,2]>6\relax\addtotabtoks{\bfseries\color{red}}\fi%
\xxaddtotabtoks{\IDlabel[\xcnt,2]}%
\ifnum\IDlabel[\xcnt,2]<6\relax\addtotabtoks{$<$}\fi%
\addtotabtoks{\\}%
\fi%
}%
\centerline{\begin{tabular}{ll}\the\tabtoks\end{tabular}}%
}
\begin{document}
\readarraysepchar{\\}
\readdef{sample-data.csv}\mytabledata
\mytable{\mytabledata}
\end{document}