根据特定条件对列值进行着色。我该怎么做?

根据特定条件对列值进行着色。我该怎么做?

我正在使用如下所示的乳胶代码从 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}

在此处输入图片描述

相关内容